--- ray/src/rt/data.c 1992/11/12 10:11:51 2.4 +++ ray/src/rt/data.c 1992/11/22 10:47:51 2.6 @@ -19,13 +19,18 @@ static char SCCSid[] = "$SunId$ LBL"; #include "data.h" +#define TABSIZ 97 /* table size (prime) */ + +#define hash(s) (shash(s)%TABSIZ) + + extern char *fgetword(); extern char *libpath; /* library search path */ -static DATARRAY *dlist = NULL; /* data array list */ +static DATARRAY *dtab[TABSIZ]; /* data array list */ -static DATARRAY *plist = NULL; /* picture list */ +static DATARRAY *ptab[TABSIZ]; /* picture list */ DATARRAY * @@ -39,13 +44,13 @@ char *dname; register int i, j; register DATARRAY *dp; /* look for array in list */ - for (dp = dlist; dp != NULL; dp = dp->next) + for (dp = dtab[hash(dname)]; dp != NULL; dp = dp->next) if (!strcmp(dname, dp->name)) return(dp); /* found! */ /* * If we haven't loaded the data already, we will look - * for it in the directorys specified by the library path. + * for it in the directories specified by the library path. * * The file has the following format: * @@ -127,8 +132,9 @@ char *dname; dp->arr[i] = atof(word); } fclose(fp); - dp->next = dlist; - return(dlist = dp); + i = hash(dname); + dp->next = dtab[i]; + return(dtab[i] = dp); memerr: error(SYSTEM, "out of memory in getdata"); @@ -165,7 +171,7 @@ char *pname; register int x, i; register DATARRAY *pp; /* look for array in list */ - for (pp = plist; pp != NULL; pp = pp->next) + for (pp = ptab[hash(pname)]; pp != NULL; pp = pp->next) if (!strcmp(pname, pp->name)) return(pp); /* found! */ @@ -232,10 +238,11 @@ char *pname; } free((char *)scanin); fclose(fp); + i = hash(pname); pp[0].next = pp[1].next = - pp[2].next = plist; - return(plist = pp); + pp[2].next = ptab[i]; + return(ptab[i] = pp); memerr: error(SYSTEM, "out of memory in getpict"); @@ -248,44 +255,62 @@ readerr: freedata(dname) /* free memory associated with dname */ char *dname; { + DATARRAY head; + int hval, nents; register DATARRAY *dp, *dpl; register int i; - for (dpl = NULL, dp = dlist; dp != NULL; dpl = dp, dp = dp->next) - if (!strcmp(dname, dp->name)) { - if (dpl == NULL) - dlist = dp->next; - else + if (dname == NULL) { /* free all if NULL */ + hval = 0; nents = TABSIZ; + } else { + hval = hash(dname); nents = 1; + } + while (nents--) { + head.next = dtab[hval]; + dpl = &head; + while ((dp = dpl->next) != NULL) + if (dname == NULL || !strcmp(dname, dp->name)) { dpl->next = dp->next; - free((char *)dp->arr); - for (i = 0; i < dp->nd; i++) - if (dp->dim[i].p != NULL) - free((char *)dp->dim[i].p); - freestr(dp->name); - free((char *)dp); - return; - } + free((char *)dp->arr); + for (i = 0; i < dp->nd; i++) + if (dp->dim[i].p != NULL) + free((char *)dp->dim[i].p); + freestr(dp->name); + free((char *)dp); + } else + dpl = dp; + dtab[hval++] = head.next; + } } freepict(pname) /* free memory associated with pname */ char *pname; { + DATARRAY head; + int hval, nents; register DATARRAY *pp, *ppl; - for (ppl = NULL, pp = plist; pp != NULL; ppl = pp, pp = pp->next) - if (!strcmp(pname, pp->name)) { - if (ppl == NULL) - plist = pp->next; - else + if (pname == NULL) { /* free all if NULL */ + hval = 0; nents = TABSIZ; + } else { + hval = hash(pname); nents = 1; + } + while (nents--) { + head.next = ptab[hval]; + ppl = &head; + while ((pp = ppl->next) != NULL) + if (pname == NULL || !strcmp(pname, pp->name)) { ppl->next = pp->next; - free((char *)pp[0].arr); - free((char *)pp[1].arr); - free((char *)pp[2].arr); - freestr(pp[0].name); - free((char *)pp); - return; - } + free((char *)pp[0].arr); + free((char *)pp[1].arr); + free((char *)pp[2].arr); + freestr(pp[0].name); + free((char *)pp); + } else + ppl = pp; + ptab[hval++] = head.next; + } }