Esempio n. 1
0
/***
 * 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);
}
Esempio n. 2
0
/***
 * 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);
}
Esempio n. 3
0
/***
 * 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));
}
Esempio n. 4
0
/***
 * 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);
}
Esempio n. 5
0
/***
 * 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);
}
Esempio n. 6
0
/***
 * 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);
}
Esempio n. 7
0
/***
 * 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);
}
Esempio n. 8
0
/***
 * 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) );
        }
    }
}
Esempio n. 9
0
/***
 * 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");
}