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.3 by greg, Fri Jan 5 09:16:40 1990 UTC vs.
Revision 2.2 by greg, Sat Feb 22 02:07:22 2003 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 + /* ====================================================================
11 + * The Radiance Software License, Version 1.0
12 + *
13 + * Copyright (c) 1990 - 2002 The Regents of the University of California,
14 + * through Lawrence Berkeley National Laboratory.   All rights reserved.
15 + *
16 + * Redistribution and use in source and binary forms, with or without
17 + * modification, are permitted provided that the following conditions
18 + * are met:
19 + *
20 + * 1. Redistributions of source code must retain the above copyright
21 + *         notice, this list of conditions and the following disclaimer.
22 + *
23 + * 2. Redistributions in binary form must reproduce the above copyright
24 + *       notice, this list of conditions and the following disclaimer in
25 + *       the documentation and/or other materials provided with the
26 + *       distribution.
27 + *
28 + * 3. The end-user documentation included with the redistribution,
29 + *           if any, must include the following acknowledgment:
30 + *             "This product includes Radiance software
31 + *                 (http://radsite.lbl.gov/)
32 + *                 developed by the Lawrence Berkeley National Laboratory
33 + *               (http://www.lbl.gov/)."
34 + *       Alternately, this acknowledgment may appear in the software itself,
35 + *       if and wherever such third-party acknowledgments normally appear.
36 + *
37 + * 4. The names "Radiance," "Lawrence Berkeley National Laboratory"
38 + *       and "The Regents of the University of California" must
39 + *       not be used to endorse or promote products derived from this
40 + *       software without prior written permission. For written
41 + *       permission, please contact [email protected].
42 + *
43 + * 5. Products derived from this software may not be called "Radiance",
44 + *       nor may "Radiance" appear in their name, without prior written
45 + *       permission of Lawrence Berkeley National Laboratory.
46 + *
47 + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
48 + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
49 + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
50 + * DISCLAIMED.   IN NO EVENT SHALL Lawrence Berkeley National Laboratory OR
51 + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
52 + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
53 + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
54 + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
55 + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
56 + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
57 + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
58 + * SUCH DAMAGE.
59 + * ====================================================================
60 + *
61 + * This software consists of voluntary contributions made by many
62 + * individuals on behalf of Lawrence Berkeley National Laboratory.   For more
63 + * information on Lawrence Berkeley National Laboratory, please see
64 + * <http://www.lbl.gov/>.
65 + */
66 +
67   #include  "standard.h"
68  
69   #include  "object.h"
# Line 17 | Line 71 | static char SCCSid[] = "$SunId$ LBL";
71   #include  "otypes.h"
72  
73  
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
74   int
75   otype(ofname)                   /* get object function number from its name */
76   register char  *ofname;
# Line 39 | Line 85 | register char  *ofname;
85   }
86  
87  
88 < #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 <
88 > void
89   objerror(o, etyp, msg)          /* report error related to object */
90   OBJREC  *o;
91   int  etyp;
# Line 89 | Line 96 | char  *msg;
96          sprintf(msgbuf, "%s for %s \"%s\"",
97                          msg, ofun[o->otype].funame, o->oname);
98          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 otndx");
137                ndx = tab->hsiz;
138                while (ndx--)                   /* empty it */
139                        tab->htab[ndx] = OVOID;
140        }
141                                        /* look up object */
142        hval = shash(name);
143 tryagain:
144        for (i = 0; i < tab->hsiz; i++) {
145                ndx = (hval + i*i) % tab->hsiz;
146                if (tab->htab[ndx] == OVOID ||
147                                !strcmp(objptr(tab->htab[ndx])->oname, name))
148                        return(ndx);
149        }
150                                        /* table is full, reallocate */
151        oldhtab = tab->htab;
152        ndx = tab->hsiz;
153        tab->htab = NULL;
154        while (ndx--)
155                if (oldhtab[ndx] != OVOID) {
156                        i = otndx(objptr(oldhtab[ndx])->oname, tab);
157                        tab->htab[i] = oldhtab[ndx];
158                }
159        free((char *)oldhtab);
160        goto tryagain;                  /* should happen only once! */
99   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines