ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/otypes.c
(Generate patch)

Comparing ray/src/common/otypes.c (file contents):
Revision 1.1 by greg, Thu Feb 2 10:34:38 1989 UTC vs.
Revision 2.1 by greg, Tue Nov 12 16:54:51 1991 UTC

# Line 5 | Line 5 | static char SCCSid[] = "$SunId$ LBL";
5   #endif
6  
7   /*
8 < *  otypes.c - object lookup functions.
9 < *
10 < *     7/29/85
8 > * Object type lookup and error reporting
9   */
10  
11   #include  "standard.h"
# Line 17 | Line 15 | static char SCCSid[] = "$SunId$ LBL";
15   #include  "otypes.h"
16  
17  
20 FUN  ofun[NUMOTYPE] = INIT_OTYPE;       /* our object function table */
21
22 static struct ohtab {
23        int  hsiz;                      /* current table size */
24        OBJECT  *htab;                  /* table, if allocated */
25 }  modtab = {100, NULL}, objtab = {1000, NULL}; /* modifiers and objects */
26
27
18   int
19   otype(ofname)                   /* get object function number from its name */
20   register char  *ofname;
# Line 39 | Line 29 | register char  *ofname;
29   }
30  
31  
42 #ifdef  GETOBJ
43 int
44 object(oname)                   /* get an object number from its name */
45 char  *oname;
46 {
47        register int  ndx;
48
49        ndx = otndx(oname, &objtab);
50        return(objtab.htab[ndx]);
51 }
52 #endif
53
54
55 int
56 modifier(mname)                 /* get a modifier number from its name */
57 char  *mname;
58 {
59        register int  ndx;
60
61        ndx = otndx(mname, &modtab);
62        return(modtab.htab[ndx]);
63 }
64
65
66 insertobject(obj)               /* insert new object into our list */
67 register OBJECT  obj;
68 {
69        register int  ndx;
70
71 #ifdef  GETOBJ
72        ndx = otndx(objptr(obj)->oname, &objtab);
73        objtab.htab[ndx] = obj;
74 #endif
75        if (ismodifier(objptr(obj)->otype)) {
76                ndx = otndx(objptr(obj)->oname, &modtab);
77                modtab.htab[ndx] = obj;
78        }
79 }
80
81
32   objerror(o, etyp, msg)          /* report error related to object */
33   OBJREC  *o;
34   int  etyp;
# Line 89 | Line 39 | char  *msg;
39          sprintf(msgbuf, "%s for %s \"%s\"",
40                          msg, ofun[o->otype].funame, o->oname);
41          error(etyp, msgbuf);
92 }
93
94
95 static int
96 nexthsiz(oldsiz)                /* return next hash table size */
97 int  oldsiz;
98 {
99        static int  hsiztab[] = {
100                251, 509, 1021, 2039, 4093, 8191, 16381, 0
101        };
102        register int  *hsp;
103
104        for (hsp = hsiztab; *hsp; hsp++)
105                if (*hsp > oldsiz)
106                        return(*hsp);
107        return(oldsiz*2 + 1);           /* not always prime */
108 }
109
110
111 static int
112 shash(s)                        /* hash a string */
113 register char  *s;
114 {
115        register int  h = 0;
116
117        while (*s)
118                h = (h<<1 & 0x7fff) ^ *s++;
119        return(h);
120 }
121
122
123 static int
124 otndx(name, tab)                /* get object table index for name */
125 char  *name;
126 register struct ohtab  *tab;
127 {
128        OBJECT  *oldhtab;
129        int  hval, i;
130        register int  ndx;
131
132        if (tab->htab == NULL) {                /* new table */
133                tab->hsiz = nexthsiz(tab->hsiz);
134                tab->htab = (OBJECT *)malloc(tab->hsiz*sizeof(OBJECT));
135                if (tab->htab == NULL)
136                        error(SYSTEM, "out of memory in tputo");
137                ndx = tab->hsiz;
138                while (ndx--)                   /* empty it */
139                        tab->htab[ndx] = OVOID;
140        }
141                                        /* look up object */
142        hval = shash(name);
143        for (i = 0; i < tab->hsiz; i++) {
144                ndx = (hval + i*i) % tab->hsiz;
145                if (tab->htab[ndx] == OVOID ||
146                                !strcmp(objptr(tab->htab[ndx])->oname, name))
147                        return(ndx);
148        }
149                                        /* table is full, reallocate */
150        oldhtab = tab->htab;
151        ndx = tab->hsiz;
152        tab->htab = NULL;
153        while (ndx--)
154                if (oldhtab[ndx] != OVOID) {
155                        i = otndx(objptr(oldhtab[ndx])->oname, tab);
156                        tab->htab[i] = oldhtab[ndx];
157                }
158        free((char *)oldhtab);
159        return(otndx(name, tab));
42   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines