/**************************************************

 * File: var.h          Project by: David Hodgdon *

 * Class: ECE476        Instructor: Bruce Land    *         

 *************************************************/
#ifndef VAR_H
#define VAR_H
#define MAXSTR 30
// pass in variable (with matching identifier), dimension of array, 

// and indices (all three required) and it will tell you if variable is a match

#define ARRAYIDENTCHECK(VAR, NUM, X, Y, Z) ( (NUM==3&&(VAR->i1==X && VAR->i2==Y && VAR->i3==Z)) || (NUM==2 && (VAR->i1==X && VAR->i2==Y)) || (NUM==1 && (VAR->i1==X)) || NUM==0 )
#define ARRAYIDENTSET(VAR, X, Y, Z) {\
	VAR->x=X;\
	VAR->y=Y;\
	VAR->z=Z;\
}
enum VarType{Integer=0, Real=1, String=2, IntegerArray=4, RealArray=5, StringArray=6, InvalidType=8};


struct VarDesc{
	enum VarType type;
	char ident[3];		// variable name 

	char i1;		// array index 1

	char i2;		// array index 2

	char i3;		// array index 3

	char* str;		// string if string type

	unsigned char len;	// length if string type 

	int intVal;		// integer value

	float realVal;		// real value

	struct VarDesc* next;  	// pointer to next 

	struct VarDesc* prev;	// pointer to previous

	char isTemp;		// 1=temp, 0=variable

};
typedef struct VarDesc* Var;


void VarDestroyVar(Var v);
void VarInit();
Var VarNewVar(enum VarType type, char * ident, char i1, char i2, char i3, char isTemp);
Var VarGetVar(char* str, char num, char i1, char i2, char i3, Var head, Var tail, enum VarType varType);
void VarNewStr(Var v, unsigned char size);
void xfree(char * ptr);
#endif