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

Comparing ray/src/common/modobject.c (file contents):
Revision 2.16 by greg, Mon Dec 9 17:57:44 2013 UTC vs.
Revision 2.22 by greg, Fri Dec 6 20:54:23 2024 UTC

# Line 17 | Line 17 | static const char RCSid[] = "$Id$";
17  
18  
19   static struct ohtab {
20 <        int  hsiz;                      /* current table size */
21 <        OBJECT  *htab;                  /* table, if allocated */
20 >        int     hsiz;                   /* current table size */
21 >        OBJECT  *htab;                  /* table, if allocated */
22   }  modtab = {100, NULL}, objtab = {1000, NULL}; /* modifiers and objects */
23  
24   static int  otndx(char *, struct ohtab *);
# Line 29 | Line 29 | objndx(                                /* get object number from pointer */
29          OBJREC  *op
30   )
31   {
32 <        int  i, j;
32 >        int     i;
33 >        ssize_t j;
34  
35 <        for (i = nobjects>>OBJBLKSHFT; i >= 0; i--) {
35 >        for (i = (nobjects-1)>>OBJBLKSHFT; i >= 0; i--) {
36                  j = op - objblock[i];
37 <                if ((j >= 0) & (j < OBJBLKSIZ))
38 <                        return((i<<OBJBLKSHFT) + j);
37 >                if ((0 <= j) & (j < OBJBLKSIZ))
38 >                        return(((OBJECT)i<<OBJBLKSHFT) + (OBJECT)j);
39          }
40 <        return(OVOID);
40 >        return(OVOID);          /* not in our array -- may still be valid */
41   }
42  
43  
# Line 47 | Line 48 | lastmod(                       /* find modifier definition before obj */
48   )
49   {
50          OBJREC  *op;
51 <        int  i;
51 >        OBJECT  i;
52  
53          i = modifier(mname);            /* try hash table first */
54          if ((obj == OVOID) | (i < obj))
55                  return(i);
56          for (i = obj; i-- > 0; ) {      /* need to search */
57                  op = objptr(i);
58 <                if (ismodifier(op->otype) && op->oname[0] == mname[0] &&
59 <                                        !strcmp(op->oname, mname))
58 >                if ((ismodifier(op->otype) != 0) & (op->oname[0] == mname[0])
59 >                                && !strcmp(op->oname, mname))
60                          return(i);
61          }
62          return(OVOID);
# Line 107 | Line 108 | eqobjects(                     /* check if two objects are equal */
108   )
109   {
110          OBJREC  *op1, *op2;
111 <        int     i;
111 >        int     i, n;
112  
113          while (obj1 != obj2) {
114                  if (obj1 == OVOID)
# Line 132 | Line 133 | eqobjects(                     /* check if two objects are equal */
133                  for (i = op1->oargs.nfargs; i-- > 0; )
134                          if (!eqreal(op1->oargs.farg[i], op2->oargs.farg[i]))
135                                  return(0);
136 <                for (i = op1->oargs.nsargs; i-- > 0; )
136 <                        if (strcmp(op1->oargs.sarg[i], op2->oargs.sarg[i]))
137 <                                return(0);
138 <                i = 0;
136 >                n = 0;
137                  switch (op1->otype) {   /* special cases (KEEP CONSISTENT!) */
138                  case MOD_ALIAS:
139                  case MAT_ILLUM:
140                  case MAT_MIRROR:
141 <                        i = (op1->oargs.nsargs > 0);
141 >                        n = (op1->oargs.nsargs > 0);
142                          break;
143                  case MIX_FUNC:
144                  case MIX_DATA:
145                  case MIX_TEXT:
146                  case MIX_PICT:
147 <                        i = 2*(op1->oargs.nsargs >= 2);
147 >                        n = 2*(op1->oargs.nsargs >= 2);
148                          break;
149                  case MAT_CLIP:
150 <                        i = op1->oargs.nsargs;
150 >                        n = op1->oargs.nsargs;
151                          break;
152                  }
153 <                while (i-- > 0)         /* check modifier references */
154 <                        if (!eqobjects( lastmod(obj1, op1->oargs.sarg[i]),
155 <                                        lastmod(obj2, op2->oargs.sarg[i]) ))
153 >                                        /* check other string arguments */
154 >                for (i = op1->oargs.nsargs; i-- > n; )
155 >                        if (strcmp(op1->oargs.sarg[i], op2->oargs.sarg[i]))
156                                  return(0);
157 +                while (n-- > 0)         /* check modifier references */
158 +                        if (!eqobjects( lastmod(obj1, op1->oargs.sarg[n]),
159 +                                        lastmod(obj2, op2->oargs.sarg[n]) ))
160 +                                return(0);
161                  obj1 = op1->omod;
162                  obj2 = op2->omod;
163          }
# Line 188 | Line 190 | insertobject(                  /* insert new object into our list */
190  
191  
192   void
193 < clearobjndx(void)               /* clear object hash tables */
193 > truncobjndx(void)               /* remove bogus table entries past end */
194   {
195 <        if (modtab.htab != NULL) {
196 <                free((void *)modtab.htab);
197 <                modtab.htab = NULL;
198 <                modtab.hsiz = 100;
195 >        int     ndx;
196 >
197 >        if (nobjects <= 0) {
198 >                if (modtab.htab != NULL) {
199 >                        free(modtab.htab);
200 >                        modtab.htab = NULL;
201 >                        modtab.hsiz = 100;
202 >                }
203 >                if (objtab.htab != NULL) {
204 >                        free(objtab.htab);
205 >                        objtab.htab = NULL;
206 >                        objtab.hsiz = 100;
207 >                }
208 >                return;
209          }
210 <        if (objtab.htab != NULL) {
211 <                free((void *)objtab.htab);
212 <                objtab.htab = NULL;
213 <                objtab.hsiz = 100;
214 <        }
210 >        for (ndx = modtab.hsiz*(modtab.htab != NULL); ndx--; )
211 >                if (modtab.htab[ndx] >= nobjects)
212 >                        modtab.htab[ndx] = OVOID;
213 >
214 >        for (ndx = objtab.hsiz*(objtab.htab != NULL); ndx--; )
215 >                if (objtab.htab[ndx] >= nobjects)
216 >                        objtab.htab[ndx] = OVOID;
217   }
218  
219  
# Line 209 | Line 223 | nexthsiz(                      /* return next hash table size */
223   )
224   {
225          static int  hsiztab[] = {
226 <                251, 509, 1021, 2039, 4093, 8191, 16381, 0
226 >                251, 509, 1021, 2039, 4093, 8191, 16381,
227 >                32749, 65521, 131071, 262139, 0
228          };
229          int  *hsp;
230  
# Line 226 | Line 241 | otndx(                         /* get object table index for name */
241          struct ohtab  *tab
242   )
243   {
244 +        char    *onm;
245          OBJECT  *oldhtab;
246          int  hval, i;
247          int  ndx;
# Line 244 | Line 260 | otndx(                         /* get object table index for name */
260   tryagain:
261          for (i = 0; i < tab->hsiz; i++) {
262                  ndx = (hval + (unsigned long)i*i) % tab->hsiz;
263 <                if (tab->htab[ndx] == OVOID ||
248 <                                !strcmp(objptr(tab->htab[ndx])->oname, name))
263 >                if (tab->htab[ndx] == OVOID)
264                          return(ndx);
265 +                onm = objptr(tab->htab[ndx])->oname;
266 +                if (onm != NULL && !strcmp(onm, name))
267 +                        return(ndx);
268          }
269                                          /* table is full, reallocate */
270          oldhtab = tab->htab;
# Line 254 | Line 272 | tryagain:
272          tab->htab = NULL;
273          while (ndx--)
274                  if (oldhtab[ndx] != OVOID) {
275 <                        i = otndx(objptr(oldhtab[ndx])->oname, tab);
275 >                        onm = objptr(oldhtab[ndx])->oname;
276 >                        if (onm == NULL)
277 >                                continue;
278 >                        i = otndx(onm, tab);
279                          tab->htab[i] = oldhtab[ndx];
280                  }
281 <        free((void *)oldhtab);
281 >        free(oldhtab);
282          goto tryagain;                  /* should happen only once! */
283   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines