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.1 by greg, Tue Nov 12 16:56:08 1991 UTC vs.
Revision 2.14 by greg, Sun Dec 8 18:59:53 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   *  Routines for tracking object modifiers
6 + *
7 + *  External symbols declared in object.h
8   */
9  
10 + #include "copyright.h"
11 +
12   #include  "standard.h"
13  
14   #include  "object.h"
# Line 15 | Line 16 | static char SCCSid[] = "$SunId$ LBL";
16   #include  "otypes.h"
17  
18  
18 extern int  (*addobjnotify[])();        /* people to notify of new objects */
19
19   static struct ohtab {
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();
24 > static int  otndx(char *, struct ohtab *);
25  
26  
27 + OBJECT
28 + objndx(                         /* get object number from pointer */
29 +        OBJREC  *op
30 + )
31 + {
32 +        int  i, j;
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);
40 + }
41 +
42 +
43 + OBJECT
44 + lastmod(                        /* find modifier definition before obj */
45 +        OBJECT  obj,
46 +        char  *mname
47 + )
48 + {
49 +        OBJREC  *op;
50 +        int  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))
59 +                        return(i);
60 +        }
61 +        return(OVOID);
62 + }
63 +
64 +
65 + OBJECT
66 + modifier(                       /* get a modifier number from its name */
67 +        char  *mname
68 + )
69 + {
70 +        int  ndx;
71 +
72 +        ndx = otndx(mname, &modtab);
73 +        return(modtab.htab[ndx]);
74 + }
75 +
76 +
77   #ifdef  GETOBJ
78 < int
79 < object(oname)                   /* get an object number from its name */
80 < char  *oname;
78 > OBJECT
79 > object(                         /* get an object number from its name */
80 >        char  *oname
81 > )
82   {
83 <        register int  ndx;
83 >        int  ndx;
84  
85          ndx = otndx(oname, &objtab);
86          return(objtab.htab[ndx]);
# Line 38 | Line 88 | char  *oname;
88   #endif
89  
90  
91 + static int
92 + eqreal(                         /* are two real values close enough to equal? */
93 +        double  d1,
94 +        double  d2
95 + )
96 + {
97 +        if (d2 != 0.0)
98 +                d1 = d1/d2 - 1.0;
99 +        return((-FTINY <= d1) & (d1 <= FTINY));
100 + }
101 +
102 +
103   int
104 < modifier(mname)                 /* get a modifier number from its name */
105 < char  *mname;
104 > eqobjects(                      /* check if two objects are equal */
105 >        OBJECT  obj1,
106 >        OBJECT  obj2
107 > )
108   {
109 <        register int  ndx;
109 >        OBJREC  *op1, *op2;
110 >        int     i;
111  
112 <        ndx = otndx(mname, &modtab);
113 <        return(modtab.htab[ndx]);
112 >        if (obj1 == OVOID)
113 >                return(obj2 == OVOID);
114 >        if (obj2 == OVOID)
115 >                return(0);
116 >        op1 = objptr(obj1);
117 >        op2 = objptr(obj2);
118 >        if (op1->omod != op2->omod)
119 >                return(0);
120 >        if (op1->otype != op2->otype)
121 >                return(0);
122 >        if (strcmp(op1->oname, op2->oname))
123 >                return(0);
124 >        if (op1->oargs.nsargs != op2->oargs.nsargs)
125 >                return(0);
126 >        if (op1->oargs.nfargs != op2->oargs.nfargs)
127 >                return(0);
128 > #ifdef IARGS
129 >        if (op1->oargs.niargs != op2->oargs.niargs)
130 >                return(0);
131 >        for (i = op1->oargs.niargs; i-- > 0; )
132 >                if (op1->oargs.iarg[i] != op2->oargs.iarg[i])
133 >                        return(0);
134 > #endif
135 >        for (i = op1->oargs.nfargs; i-- > 0; )
136 >                if (!eqreal(op1->oargs.farg[i], op2->oargs.farg[i]))
137 >                        return(0);
138 >        for (i = op1->oargs.nsargs; i-- > 0; )
139 >                if (strcmp(op1->oargs.sarg[i], op2->oargs.sarg[i]))
140 >                        return(0);
141 >        return(1);
142   }
143  
144  
145 < insertobject(obj)               /* insert new object into our list */
146 < register OBJECT  obj;
145 > void
146 > insertobject(                   /* insert new object into our list */
147 >        OBJECT  obj
148 > )
149   {
150 <        register int  i;
150 >        int  i;
151  
57 #ifdef  GETOBJ
58        i = otndx(objptr(obj)->oname, &objtab);
59        objtab.htab[i] = obj;
60 #endif
152          if (ismodifier(objptr(obj)->otype)) {
153                  i = otndx(objptr(obj)->oname, &modtab);
154 +                if (eqobjects(obj, modtab.htab[i]))
155 +                        return;
156                  modtab.htab[i] = obj;
157          }
158 + #ifdef  GETOBJ
159 +        else {
160 +                i = otndx(objptr(obj)->oname, &objtab);
161 +                objtab.htab[i] = obj;
162 +        }
163 + #endif
164          for (i = 0; addobjnotify[i] != NULL; i++)
165                  (*addobjnotify[i])(obj);
166   }
167  
168  
169 + void
170 + clearobjndx(void)               /* clear object hash tables */
171 + {
172 +        if (modtab.htab != NULL) {
173 +                free((void *)modtab.htab);
174 +                modtab.htab = NULL;
175 +                modtab.hsiz = 100;
176 +        }
177 +        if (objtab.htab != NULL) {
178 +                free((void *)objtab.htab);
179 +                objtab.htab = NULL;
180 +                objtab.hsiz = 100;
181 +        }
182 + }
183 +
184 +
185   static int
186 < nexthsiz(oldsiz)                /* return next hash table size */
187 < int  oldsiz;
186 > nexthsiz(                       /* return next hash table size */
187 >        int  oldsiz
188 > )
189   {
190          static int  hsiztab[] = {
191                  251, 509, 1021, 2039, 4093, 8191, 16381, 0
192          };
193 <        register int  *hsp;
193 >        int  *hsp;
194  
195          for (hsp = hsiztab; *hsp; hsp++)
196                  if (*hsp > oldsiz)
# Line 84 | Line 200 | int  oldsiz;
200  
201  
202   static int
203 < shash(s)                        /* hash a string */
204 < register char  *s;
203 > otndx(                          /* get object table index for name */
204 >        char  *name,
205 >        struct ohtab  *tab
206 > )
207   {
90        register int  h = 0;
91
92        while (*s)
93                h = (h<<1 & 0x7fff) ^ *s++;
94        return(h);
95 }
96
97
98 static int
99 otndx(name, tab)                /* get object table index for name */
100 char  *name;
101 register struct ohtab  *tab;
102 {
208          OBJECT  *oldhtab;
209          int  hval, i;
210 <        register int  ndx;
210 >        int  ndx;
211  
212          if (tab->htab == NULL) {                /* new table */
213                  tab->hsiz = nexthsiz(tab->hsiz);
# Line 117 | Line 222 | register struct ohtab  *tab;
222          hval = shash(name);
223   tryagain:
224          for (i = 0; i < tab->hsiz; i++) {
225 <                ndx = (hval + i*i) % tab->hsiz;
225 >                ndx = (hval + (unsigned long)i*i) % tab->hsiz;
226                  if (tab->htab[ndx] == OVOID ||
227                                  !strcmp(objptr(tab->htab[ndx])->oname, name))
228                          return(ndx);
# Line 131 | Line 236 | tryagain:
236                          i = otndx(objptr(oldhtab[ndx])->oname, tab);
237                          tab->htab[i] = oldhtab[ndx];
238                  }
239 <        free((char *)oldhtab);
239 >        free((void *)oldhtab);
240          goto tryagain;                  /* should happen only once! */
241   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines