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

Comparing ray/src/common/modobject.c (file contents):
Revision 2.18 by greg, Sat Oct 17 16:39:23 2020 UTC vs.
Revision 2.24 by greg, Sat Jun 21 00:15:30 2025 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  
34 <        for (i = nobjects>>OBJBLKSHFT; i >= 0; i--) {
35 <                j = op - objblock[i];
36 <                if ((j >= 0) & (j < OBJBLKSIZ))
37 <                        return((i<<OBJBLKSHFT) + j);
38 <        }
39 <        return(OVOID);
34 >        for (i = (nobjects-1)>>OBJBLKSHFT; i >= 0; i--)
35 >                if ((objblock[i] <= op) & (op < objblock[i]+OBJBLKSIZ))
36 >                        return( ((OBJECT)i << OBJBLKSHFT) +
37 >                                        (OBJECT)(op - objblock[i]) );
38 >
39 >        return(OVOID);          /* not in our array -- may still be valid */
40   }
41  
42  
# Line 47 | Line 47 | lastmod(                       /* find modifier definition before obj */
47   )
48   {
49          OBJREC  *op;
50 <        int  i;
50 >        OBJECT  i;
51  
52          i = modifier(mname);            /* try hash table first */
53          if ((obj == OVOID) | (i < obj))
54                  return(i);
55          for (i = obj; i-- > 0; ) {      /* need to search */
56                  op = objptr(i);
57 <                if (ismodifier(op->otype) && op->oname[0] == mname[0] &&
58 <                                        !strcmp(op->oname, mname))
57 >                if ((ismodifier(op->otype) != 0) & (op->oname[0] == mname[0])
58 >                                && !strcmp(op->oname, mname))
59                          return(i);
60          }
61          return(OVOID);
# Line 195 | Line 195 | truncobjndx(void)              /* remove bogus table entries past
195  
196          if (nobjects <= 0) {
197                  if (modtab.htab != NULL) {
198 <                        free((void *)modtab.htab);
198 >                        free(modtab.htab);
199                          modtab.htab = NULL;
200                          modtab.hsiz = 100;
201                  }
202                  if (objtab.htab != NULL) {
203 <                        free((void *)objtab.htab);
203 >                        free(objtab.htab);
204                          objtab.htab = NULL;
205                          objtab.hsiz = 100;
206                  }
# Line 222 | Line 222 | nexthsiz(                      /* return next hash table size */
222   )
223   {
224          static int  hsiztab[] = {
225 <                251, 509, 1021, 2039, 4093, 8191, 16381, 0
225 >                251, 509, 1021, 2039, 4093, 8191, 16381,
226 >                32749, 65521, 131071, 262139, 0
227          };
228          int  *hsp;
229  
# Line 239 | Line 240 | otndx(                         /* get object table index for name */
240          struct ohtab  *tab
241   )
242   {
243 +        char    *onm;
244          OBJECT  *oldhtab;
245          int  hval, i;
246          int  ndx;
# Line 257 | Line 259 | otndx(                         /* get object table index for name */
259   tryagain:
260          for (i = 0; i < tab->hsiz; i++) {
261                  ndx = (hval + (unsigned long)i*i) % tab->hsiz;
262 <                if (tab->htab[ndx] == OVOID ||
261 <                                !strcmp(objptr(tab->htab[ndx])->oname, name))
262 >                if (tab->htab[ndx] == OVOID)
263                          return(ndx);
264 +                onm = objptr(tab->htab[ndx])->oname;
265 +                if (onm != NULL && !strcmp(onm, name))
266 +                        return(ndx);
267          }
268                                          /* table is full, reallocate */
269          oldhtab = tab->htab;
# Line 267 | Line 271 | tryagain:
271          tab->htab = NULL;
272          while (ndx--)
273                  if (oldhtab[ndx] != OVOID) {
274 <                        i = otndx(objptr(oldhtab[ndx])->oname, tab);
274 >                        onm = objptr(oldhtab[ndx])->oname;
275 >                        if (onm == NULL)
276 >                                continue;
277 >                        i = otndx(onm, tab);
278                          tab->htab[i] = oldhtab[ndx];
279                  }
280 <        free((void *)oldhtab);
280 >        free(oldhtab);
281          goto tryagain;                  /* should happen only once! */
282   }

Diff Legend

Removed lines
+ Added lines
< Changed lines (old)
> Changed lines (new)