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.4 by greg, Fri Jan 12 11:15:40 1990 UTC vs.
Revision 2.6 by greg, Sat Mar 9 19:20:31 2013 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines