/*=====<< Create Symbol Table >>=====*/ void EnableSymbols() { symbol = (symrec *)malloc(sizeof(symrec)); symbol[0].name = (char *)malloc(1); symbol[0].name[0] = 0; symbol[0].index = 0; symbol[0].type = TP_NULL; symLast = 0; } /*=====<< Dim Variable >>=====*/ int Dim(char *name, int index, int type) { int x; /*-----< If non-existant, create symbol table >-----*/ if(symbol == 0) { EnableSymbols(); } /*-----< Error, If Already Exists >-----*/ if(VarKey(name)) { yyerror("Variable already exists."); } /*-----< Add New Space to Symbol Table >-----*/ symLast++; symbol = (symrec *)realloc(symbol, sizeof(symrec) * (symLast + 1)); /*-----< Add New Variable to Symbol Table >-----*/ symbol[symLast].name = name; symbol[symLast].index = index; symbol[symLast].type = type; switch(type) { case TP_STRING: symbol[symLast].string = (char **)malloc(sizeof(char *)*(index+1)); for(x = 0; x <= index; x++) { symbol[symLast].string[x] = 0; } break; case TP_NUMBER: symbol[symLast].number = (double *)malloc(sizeof(double)*(index+1)); for(x = 0; x <= index; x++) { symbol[symLast].number[x] = 0; } break; case TP_BOOLEAN: symbol[symLast].boolean = (int *)malloc(sizeof(int)*(index+1)); for(x = 0; x <= index; x++) { symbol[symLast].boolean[x] = 0; } break; } return symLast; } /*=====<< Typeof Value >>=====*/ int TypeOf(int key) { return symbol[key].type; } /*=====<< Variable Key from Name >>=====*/ int VarKey(char *name) { int retval = 0; int x; if(symbol == 0) { EnableSymbols(); } for(x=0; x <= symLast; x++) { if(!strcmp(symbol[x].name,name)) { retval = x; } } return retval; } /*=====<< Put Number >>=====*/ void PutNumber(int key, int index, double value) { symbol[key].number[index] = value; } /*=====<< Put String >>=====*/ void PutString(int key, int index, char *value) { if(symbol[key].string[index] == 0) { symbol[key].string[index] = (char *)malloc(strlen(value)+1); } if(strlen(value) > strlen(symbol[key].string[index])) { symbol[key].string[index] = (char *)realloc(symbol[key].string[index],strlen(value)+1); } strcpy(symbol[key].string[index],value); } /*=====<< Put Boolean >>=====*/ void PutBoolean(int key, int index, int value) { symbol[key].boolean[index] = value; } /*=====<< Get Number >>=====*/ double GetNumber(int key, int index) { return symbol[key].number[index]; } /*=====<< Get String >>=====*/ char *GetString(int key, int index) { char *retval; retval = (char *)malloc(strlen(symbol[key].string[index])+1); strcpy(retval,symbol[key].string[index]); return retval; } /*=====<< Get Boolean >>=====*/ int GetBoolean(int key, int index) { return symbol[key].boolean[index]; } /*=====<< Input Number >>=====*/ void InputNumber(FILE *fin, int key, int index) { char retval[200]; fgets(retval,199,fin); PutNumber(key,index,Val(retval)); } /*=====<< Input String >>=====*/ void InputString(FILE *fin, int key, int index) { char retval[200]; fgets(retval,199,fin); PutString(key,index,retval); } /*=====<< Val() >>=====*/ double Val(char *value) { float retval; sscanf(value,"%f",&retval); return (double)retval; } /*=====<< Str() >>=====*/ char *Str(double value) { char *retval; retval = (char *)malloc(100); sprintf(retval,"%f",value); return retval; } /*=====<< Concat >>=====*/ char *ConcatString(char *str1, char *str2) { char *retval; retval = (char *)malloc(strlen(str1) + strlen(str2) + 1); strcpy(retval,str1); strcat(retval,str2); return retval; }