/*** * SymbolsGetLabelIndex() * funkce pro runtime, kt. vrati index do pasky u labelu * parametr - adresa symbolu */ unsigned SymbolsGetLabelIndex(PSymbol symbol) { #ifndef NDEBUG if(symbol == NULL) ErrorFatal("Internal error - no symbol"); if(symbol->type != stLabel) ErrorFatal("Internal error - symbol is no label"); #endif return(symbol->addr.LabelIndex); }
/*** * SymbolsGetVariable() * funkce pro runtime, kt. vrati odkaz na promenou * parametr - adresa symbolu */ PVariable SymbolsGetVariable(PSymbol symbol) { #ifndef NDEBUG if(symbol == NULL) ErrorFatal("Internal error - no symbol"); if(symbol->type != stVariable) ErrorFatal("Internal error - symbol is no variable"); #endif return(symbol->addr.VariablePtr); }
/*** * SymbolsInsert() * vlozi symbol do tabulky; jestlize existuje, vrati jen * ukazatel na nej, jinak provede vlozeni a take vrati ukazatel na nej; * parametr - nazev symbolu */ PSymbol SymbolsInsert(PSymbols table, char *strName, PVariableTable vartable) { #ifndef NDEBUG if(strName == NULL) ErrorFatal("Internal error - no symbol name"); if(table == NULL) ErrorFatal("Internal error - no symbol table"); #endif return(SymbolInsert(&(table->root),strName,vartable)); }
/*** * SymbolsCreate() * vytvori prazdnou tabulku symbolu a vrati ukazatel na ni */ PSymbols SymbolsCreate() { PSymbols table = (PSymbols)malloc(sizeof(TSymbols)); if(table == NULL) ErrorFatal("Not enough of memory"); table->root = NULL; return(table); }
/*** * SymbolsGetName() * funkce pro runtime, kt. vrati jmeno symbolu (pro vypis chyb) * parametr - adresa symbolu */ char *SymbolsGetName(PSymbol symbol) { #ifndef NDEBUG if(symbol == NULL) ErrorFatal("Internal error - no symbol"); #endif return(symbol->name); }
/*** * SymbolsGetType() * funkce pro runtime, kt. vrati typ symbolu * parametr - adresa symbolu */ TSymbolType SymbolsGetType(PSymbol symbol) { #ifndef NDEBUG if(symbol == NULL) ErrorFatal("Internal error - no symbol"); #endif return(symbol->type); }
/*** * SymbolsDestroy() * uvolni vsechny symboly + tabulku symbolu z pameti * parametr - adresa tabulky symbolu */ void SymbolsDestroy(PSymbols table) { #ifndef NDEBUG if(table == NULL) ErrorFatal("Internal error - no symbol table"); #endif SymbolDestroy(table->root); free(table); }
/*** * SymbolInsert() * rekurzivni funkce vkladani; pomocna funkce SymbolsInsert() * vraci ukazatel na vlozeny (existujici) symbol * 1. parametr - adresa ukazatele na soucasny prvek * 2. parametr - adresa jmena symbolu */ PSymbol SymbolInsert(PSymbol *parent, char *name, PVariableTable vartable) { #ifndef NDEBUG if(parent == NULL) ErrorFatal("Internal error - NULL symbol pointer"); if(name == NULL) ErrorFatal("Internal error - no new symbol name"); #endif // zjisteni existence prvku if(*parent == NULL) { // mame ho, sem budeme vkladat PSymbol symbol = (PSymbol)malloc(sizeof(TSymbol)); if(symbol == NULL) ErrorFatal("Not enough of memory"); symbol->name = name; // na pocatku je kazdy identifikator promena symbol->type = stVariable; // musi se vytvorit zaznam v tabulce promenych!!!!!! symbol->addr.VariablePtr = VariablesInsert(vartable); symbol->LPtr = symbol->RPtr = NULL; *parent = symbol; return(symbol); } else { // uz je tam? if(0 == strcmp((*parent)->name,name)) { free(name); return(*parent); } else { // je vlevo ci vpravo? if(0 < strcmp((*parent)->name,name)) return( SymbolInsert( &((*parent)->RPtr), name, vartable) ); else return( SymbolInsert( &((*parent)->LPtr), name, vartable) ); } } }
/*** * SymbolsSetLabel() * udela z identifikatoru label * 1. parametr - adresa symbolu vracena funkci SymbolsInsert() * 2. parametr - index do pasky, kam label ukazuje * ! pri pokusu o redefinici labelu vraci nenulovou hodnotu, jinak 0 */ int SymbolsSetLabel(PSymbol symbol, unsigned index) { #ifndef NDEBUG if(symbol == NULL) ErrorFatal("Internal error - NULL symbol"); #endif if(symbol->type == stLabel) return(1/*+symbol->addr.LabelIndex*/); symbol->type = stLabel; symbol->addr.LabelIndex = index; return(0); }
void fstk_RunMacroArg (SLONG s) { char *sym; if (s == '@') s = -1; else s -= '0'; if ((sym=sym_FindMacroArg(s))!=NULL) { pushcontext (); nCurrentStatus = STAT_isMacroArg; sprintf (tzCurrentFileName, "%c", (UBYTE)s); CurrentFlexHandle = yy_scan_bytes (sym, strlen (sym)); yy_switch_to_buffer (CurrentFlexHandle); } else ErrorFatal ("No such macroargument"); }
void pushcontext (void) { struct sContext **ppFileStack; ppFileStack = &pFileStack; while (*ppFileStack) ppFileStack = &((*ppFileStack)->pNext); if ((*ppFileStack=(struct sContext *)malloc(sizeof (struct sContext)))!=NULL) { (*ppFileStack)->FlexHandle = CurrentFlexHandle; (*ppFileStack)->pNext = NULL; strcpy ((char *)(*ppFileStack)->tzFileName, (char *)tzCurrentFileName); (*ppFileStack)->nLine = nLineNo; switch ((*ppFileStack)->nStatus = nCurrentStatus) { case STAT_isMacroArg: case STAT_isMacro: sym_SaveCurrentMacroArgs ((*ppFileStack)->tzMacroArgs); (*ppFileStack)->pMacro = pCurrentMacro; break; case STAT_isInclude: (*ppFileStack)->pFile = pCurrentFile; break; case STAT_isREPTBlock: sym_SaveCurrentMacroArgs ((*ppFileStack)->tzMacroArgs); (*ppFileStack)->pREPTBlock = pCurrentREPTBlock; (*ppFileStack)->nREPTBlockSize = nCurrentREPTBlockSize; (*ppFileStack)->nREPTBlockCount = nCurrentREPTBlockCount; break; } nLineNo = 0; } else ErrorFatal ("No memory for context"); }