#include #include #include #include "symbolMgt.h" int TREE_NODE = 0, TREE_STRUCT = 1; static char * typeNames[] = { "TREE_NODE", "TREE_STRUCT" }; typedef struct _Symbol { char * name; // symbol name int type; // symbol type void * ref; // ref of the object storing the symbol } Symbol; #define INITIAL_SYMBOL_SIZE 50 Symbol *symbolTable = NULL; int symbolSize = 0; int symbolNb = 0; /* Compares 2 symbol name (for qsort and bsearch) */ static int compar(const void *p1, const void *p2) { return strcmp(((Symbol *) p1)->name, ((Symbol *) p2)->name); } int insertInSymbolTable( char * symbolName, int type ){ /* On verifie que le symbole n'est pas deja present. */ Symbol symbolToFind; Symbol *pSymbol; symbolToFind.name = symbolName; pSymbol = bsearch(&symbolToFind, symbolTable, symbolNb, sizeof(Symbol), compar); if (pSymbol != NULL) { fprintf(stderr, "%s already at %d\n", symbolName, ((int)pSymbol - (int)symbolTable)/sizeof(Symbol)); return EXIT_FAILURE; } /* On agrandit symbolTable si elle est trop petite pour accueillir */ /* ce nouveau symbole. */ if (symbolNb >= symbolSize){ if (symbolSize == 0) { symbolSize = INITIAL_SYMBOL_SIZE; }else{ symbolSize *= 2; } symbolTable = realloc(symbolTable,symbolSize*sizeof(Symbol)); if (symbolTable == NULL){ error_at_line(EXIT_FAILURE, 0, "No more memory"); } } /* On ajoute le symbole */ symbolTable[symbolNb].name = strdup(symbolName); if (symbolTable[symbolNb].name == NULL) { error_at_line(EXIT_FAILURE, 0, "No more memory"); } symbolTable[symbolNb].type = type; symbolTable[symbolNb].ref = NULL; symbolNb++; fprintf(stderr, "%s inserted\n", symbolName); /* On trie la table avec ce nouvel element. */ qsort(symbolTable, symbolNb, sizeof(Symbol), compar); return EXIT_SUCCESS; } int isInSymbolTable( char * symbolName) { Symbol symbolToFind; symbolToFind.name = symbolName; return (bsearch(&symbolToFind, symbolTable, symbolNb, sizeof(Symbol), compar) != NULL); } void printSymbolTable(){ int i; for (i=0; iref; } } int setRefForSymbolInTable( char * symbolName , void * ref){ Symbol symbolToFind; Symbol *pSymbol; symbolToFind.name = symbolName; pSymbol = bsearch(&symbolToFind, symbolTable, symbolNb, sizeof(Symbol), compar); if (pSymbol != NULL){ pSymbol->ref = ref; } return 0; /* Specification is not clear what should be returned :-( */ } char * firstTreeStructSymbolName( ){ int i; for (i=0; i #include #include "symbolMgt.h" int main( int argc, char *argv[] ) { int p; char *treeName; p = isInSymbolTable("AA"); if (p == 0) { fprintf(stderr, "AA not found\n"); } else { fprintf(stderr, "AA found\n"); } insertInSymbolTable( "YY", TREE_NODE ); insertInSymbolTable( "VV", TREE_NODE ); insertInSymbolTable( "WW", TREE_STRUCT ); insertInSymbolTable( "XX", TREE_NODE ); insertInSymbolTable( "ZZ", TREE_NODE ); insertInSymbolTable( "VV", TREE_NODE ); p = isInSymbolTable("XX"); if (p == 0) { fprintf(stderr, "XX not found\n"); } else { fprintf(stderr, "XX found\n"); } fprintf( stderr, "------------ symbolTable :\n"); printSymbolTable( ); fprintf( stderr, "\n" ); treeName = firstTreeStructSymbolName( ); fprintf( stderr, "treeName = %s\n", treeName); return EXIT_SUCCESS; } #endif #ifdef TEST2 int main( int argc, char *argv[] ) { int *ref1, *ref2; insertInSymbolTable( "AA", TREE_NODE ); insertInSymbolTable( "BB", TREE_NODE ); insertInSymbolTable( "WW", TREE_STRUCT ); ref1 = malloc(sizeof(int)); ref2 = malloc(sizeof(int)); fprintf(stderr, "ref1 = %p\n", ref1); fprintf(stderr, "ref2 = %p\n", ref2); setRefForSymbolInTable("AA", ref1); setRefForSymbolInTable("BB", ref2); setRefForSymbolInTable("CC", ref2); /* incorrect but should not crash */ fprintf( stderr, "------------ symbolTable :\n"); printSymbolTable( ); fprintf( stderr, "\n" ); fprintf(stderr, "AA ref1 = %p\n", getRefForSymbolInTable("AA")); fprintf(stderr, "BB ref2 = %p\n", getRefForSymbolInTable("BB")); fprintf(stderr, "WW ref3 = %p\n", getRefForSymbolInTable("WW")); /* incorrect but should not crash */ return EXIT_SUCCESS; } #endif