#include #include #include #include #include #include #include #include /* * Typdeklaration, etc */ union identTypes { s_expVal * base; s_identList * idl; }; struct ident { char * key; int idx; int queued; union identTypes val; }; /* * statische Funktionen (interner gebrauch) */ /* * nicht statische Funktionen (Interface) */ /* * Contructors / Destructors for ident */ s_ident * identNew(int idx, const char * key) { int keyLen = (key == NULL) ? 2 : 2 + strlen(key); s_ident * ident = (s_ident*)malloc(sizeof(s_ident)); ident->idx = idx; ident->key = (char*)malloc(sizeof(char) * keyLen); ident->key[0] = ID_TYP_UNDEF; ident->key[1] = '\0'; if (key != NULL) strcpy(ident->key + 1, key); ident->queued = 0; return ident; } s_ident * identUndefNew(int idx, const char * key) { #ifdef DEBUG2 printf("[!DEBUG!] identUndefNew: %d/%s\n", idx, key); #endif return identNew(idx, key); } s_ident * identExpNew(int idx, const char * key, s_expVal * val) { s_ident * ident = identNew(idx, key); #ifdef DEBUG2 printf("[!DEBUG!] identExpNew: %d/%s\n", idx, key); #endif ident->key[0] = ID_TYP_EXP; ident->val.base = expValueClone(val); return ident; } s_ident * identIdlNew(int idx, const char * key, s_identList * val) { s_ident * ident = identNew(idx, key); #ifdef DEBUG2 printf("[!DEBUG!] identIdlNew: %d/%s\n", idx, key); #endif ident->key[0] = ID_TYP_IDL; ident->val.idl = val; return ident; } void identFree(s_ident * id) { #ifdef DEBUG2 printf("[!DEBUG!] identFree: %d/%s\n", id->idx, id->key); #endif switch (identGetType(id)) { case ID_TYP_EXP: expValueFree (id->val.base); break; case ID_TYP_IDL: identListFree (id->val.idl); break; } free(id->key); free(id); } /* * analyse ident */ int identIsQueued(s_ident * id) { return id->queued; } void identEnqueue(s_ident * id) { id->queued++; } void identDequeue(s_ident * id) { id->queued--; } int identGetType(s_ident * id) { return id->key[0]; } char * identGetKey(s_ident * id) { return id->key + 1; } int identGetIdx(s_ident * id) { return id->idx; } /* identifier to value */ s_expVal * identExp(s_ident * id) { s_expVal * ret = NULL; if (id == NULL) exitError (ERR_UNDEF_VAR, identGetKey (id)); if (identGetType (id) == ID_TYP_EXP) ret = expValueClone(id->val.base); return ret; } s_identList * identIdl(s_ident * id) { s_identList * ret = NULL; if (identGetType(id) == ID_TYP_IDL) ret = id->val.idl; return ret; } s_ident * identSetExp(s_ident * id, s_expVal * val) { switch (identGetType(id)) { case ID_TYP_EXP: expValueFree(id->val.base); break; case ID_TYP_IDL: identListFree(id->val.idl); break; } id->key[0] = ID_TYP_EXP; id->val.base = expValueClone(val); return id; } s_ident * identSetIdl(s_ident * id, s_identList * val) { switch (identGetType (id)) { case ID_TYP_EXP: expValueFree (id->val.base); case ID_TYP_IDL: identListFree (id->val.idl); } id->key[0] = ID_TYP_IDL; id->val.idl = val; return id; }