/*
Adriane Boyd

Class for linked list of tokens.

*/

#include <iostream.h>
#include <string.h>
#include "tlist.h"

// Constructor
TList::TList()
{
	head = NULL;
}

// Destructor
TList::~TList()
{
	makeEmpty();
}

// deletes each element in the list
void TList::makeEmpty()
{
	token *node = head, *temp;
	while(node != NULL)
	{
		temp = (*node).next;
		delete node;
		node = temp;
	}
}

// insert symbol at the beginning of the list
void TList::insertFirst(char name[MAX_NAME_LEN], int term)
{
	token *node = new token;
	strncpy(node->name, name, MAX_NAME_LEN);
	node->term = term;
	node->next = head;
	head = node;
}

// insert symbol at the beginning of the list
void TList::insertFirst(char name[MAX_NAME_LEN], char type[MAX_NAME_LEN])
{
	token *node = new token;
	strncpy(node->name, name, MAX_NAME_LEN);
	strncpy(node->type, type, MAX_NAME_LEN);
	node->next = head;
	head = node;
}

// insert symbol at the end of the list
void TList::insertLast(char name[MAX_NAME_LEN], int term)
{
	token *node = new token;
	token *temp, *pretemp;

	strncpy(node->name, name, MAX_NAME_LEN);
	node->term = term;
	node->next = NULL;

	if(head == NULL)
	{
		head = node;
	}
	else
	{
		temp = head;
		while(temp != NULL)
		{
			pretemp = temp;
			temp = temp->next;
		}
	
		pretemp->next = node;
	}
}

// insert symbol at the end of the list
void TList::insertLast(token *oldtoken)
{
	token *node = new token;
	token *temp, *pretemp;

	strncpy(node->name, oldtoken->name, MAX_NAME_LEN);
	strncpy(node->type, oldtoken->type, MAX_NAME_LEN);
	node->term = oldtoken->term;
	node->next = NULL;

	if(head == NULL)
	{
		head = node;
	}
	else
	{
		temp = head;
		while(temp != NULL)
		{
			pretemp = temp;
			temp = temp->next;
		}
	
		pretemp->next = node;
	}
}

// append the given list to the current list
void TList::append(TList *alist)
{
	TList *newlist = alist->duplicate();
	token *temp = head;

	while(temp->next != NULL)
	{
		temp = temp->next;
	}

	temp->next = newlist->getHead();
}

// delete the first token in the list
void TList::deleteFirst()
{
	token *temp = head;
	head = head->next;
	delete temp;
}

// return the name of the element at the given position
char *TList::getName(int pos)
{
	int i;
	token *temp = head;

	for(i = 0; i < pos && temp != NULL; i++)
	{
		temp = temp->next;
	}

	if(temp != NULL)
	{
		return temp->name;
	}
	return NULL;
}

// return the type of the element at the given position
char *TList::getType(int pos)
{
	int i;
	token *temp = head;

	for(i = 0; i < pos && temp != NULL; i++)
	{
		temp = temp->next;
	}

	return temp->type;
}

// return the pointer to the head of the list
token *TList::getHead()
{
	return head;
}

// return the number of elements in the list
int TList::count()
{
	int count = 0;
	token *temp = head;

	while(temp != NULL)
	{
		temp = temp->next;
		count++;
	}

	return count;
}

// return the value in term for the head token, if there is one
int TList::termStart()
{
	if(head != NULL)
	{
		return head->term;
	}
	return 0;
}

// print each of the tokens in the list
void TList::print()
{
	token *node = head;

	while(node != NULL)
	{
		cout << node->name << " ";
		cout << node->type << " ";
		node = node->next;
	}
	cout << endl;
}

// prints the term values for each of the tokens in the list (used to print out
// rule sequences)
void TList::printTerms()
{
	token *node = head;

	while(node != NULL)
	{
		cout << node->term << " ";
		node = node->next;
	}
	cout << endl;
}

// return a pointer to a copy of the list
TList *TList::duplicate()
{
	TList *tempcopy = new TList;
	token *node = head;

	while(node != NULL)
	{
		tempcopy->insertLast(node);
		node = node->next;
	}

	return tempcopy;
}

