#include "hp2graph.h" Entry **entrydata; int entrysize; static int hashStr(char *s) { int r; for (r = 0; *s; s++) { r = r + r + r + *s; } if (r < 0) r = -r; return r % ENTRYMAX; } static int hashInt(UInt i) { int r; union { struct { char c1,c2,c3,c4; } c; int i; } v; v.i = i; r = 3*v.c.c1+2*v.c.c2+v.c.c3+v.c.c4; if (r < 0) r = -r; return r % ENTRYMAX; } Entry *newEntry(Key key, Entry *next) { Entry *ep = (Entry *)new(sizeof(Entry)); if(ep) { ep->next = next; ep->key = key; ep->value = 0; } else { fprintf(stderr,"Out of memory when allocating memory for new entry at %d\n",lexline); abort(); } return ep; } Entry *lookupEntryStr(SharedToken s) { int hash = hashStr(s); Key key; Entry *ep; for(ep = entrydata[hash]; ep; ep = ep->next) if(!strcmp(ep->key.token,s)) return ep; key.token = clone(s); entrydata[hash] = ep = newEntry(key,entrydata[hash]); return ep; } Entry *lookupEntryInt(UInt i) { int hash = hashInt(i); Key key; Entry *ep; for(ep = entrydata[hash]; ep; ep = ep->next) if(ep->key.binfo.all == i) return ep; key.binfo.all = i; entrydata[hash] = ep = newEntry(key,entrydata[hash]); return ep; } void addValue(Entry *ep, int census, BInfo binfo, UInt size) { Value *vp = (Value *)new(sizeof(Value)); if(vp) { vp->next = ep->value; vp->census = census; vp->binfo = binfo; vp->size = size; ep->value = vp; } else { fprintf(stderr,"Out of memory when allocating memory for new value at %d\n",lexline); abort(); } } void freeEntries(Entry *ep) { while(ep) { Entry *t = ep; ep = ep->next; free(t); } } void freeEntriesT(void) { int i; for(i=0; inext; ep->next = l; l = ep; ep = t; } } return l; }