ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/readobj.c
Revision: 2.8
Committed: Sat Feb 22 02:07:22 2003 UTC (21 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.7: +96 -10 lines
Log Message:
Changes and check-in for 3.5 release
Includes new source files and modifications not recorded for many years
See ray/doc/notes/ReleaseNotes for notes between 3.1 and 3.5 release

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id$";
3 #endif
4 /*
5 * readobj.c - routines for reading in object descriptions.
6 *
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"
70
71 #include "otypes.h"
72
73 #include <ctype.h>
74
75 OBJREC *objblock[MAXOBJBLK]; /* our objects */
76 OBJECT nobjects = 0; /* # of objects */
77
78
79 void
80 readobj(inpspec) /* read in an object file or stream */
81 char *inpspec;
82 {
83 OBJECT lastobj;
84 FILE *infp;
85 char buf[1024];
86 register int c;
87
88 lastobj = nobjects;
89 if (inpspec == NULL) {
90 infp = stdin;
91 inpspec = "standard input";
92 } else if (inpspec[0] == '!') {
93 if ((infp = popen(inpspec+1, "r")) == NULL) {
94 sprintf(errmsg, "cannot execute \"%s\"", inpspec);
95 error(SYSTEM, errmsg);
96 }
97 } else if ((infp = fopen(inpspec, "r")) == NULL) {
98 sprintf(errmsg, "cannot open scene file \"%s\"", inpspec);
99 error(SYSTEM, errmsg);
100 }
101 while ((c = getc(infp)) != EOF) {
102 if (isspace(c))
103 continue;
104 if (c == '#') { /* comment */
105 fgets(buf, sizeof(buf), infp);
106 } else if (c == '!') { /* command */
107 ungetc(c, infp);
108 fgetline(buf, sizeof(buf), infp);
109 readobj(buf);
110 } else { /* object */
111 ungetc(c, infp);
112 getobject(inpspec, infp);
113 }
114 }
115 if (inpspec[0] == '!')
116 pclose(infp);
117 else
118 fclose(infp);
119 if (nobjects == lastobj) {
120 sprintf(errmsg, "(%s): empty file", inpspec);
121 error(WARNING, errmsg);
122 }
123 }
124
125
126 void
127 getobject(name, fp) /* read the next object */
128 char *name;
129 FILE *fp;
130 {
131 OBJECT obj;
132 char sbuf[MAXSTR];
133 int rval;
134 register OBJREC *objp;
135
136 if ((obj = newobject()) == OVOID)
137 error(SYSTEM, "out of object space");
138 objp = objptr(obj);
139 /* get modifier */
140 strcpy(sbuf, "EOF");
141 fgetword(sbuf, MAXSTR, fp);
142 if (!strcmp(sbuf, VOIDID))
143 objp->omod = OVOID;
144 else if ((objp->omod = modifier(sbuf)) == OVOID) {
145 sprintf(errmsg, "(%s): undefined modifier \"%s\"", name, sbuf);
146 error(USER, errmsg);
147 }
148 /* get type */
149 strcpy(sbuf, "EOF");
150 fgetword(sbuf, MAXSTR, fp);
151 if (!strcmp(sbuf, ALIASID))
152 objp->otype = -1;
153 else if ((objp->otype = otype(sbuf)) < 0) {
154 sprintf(errmsg, "(%s): unknown type \"%s\"", name, sbuf);
155 error(USER, errmsg);
156 }
157 /* get identifier */
158 sbuf[0] = '\0';
159 fgetword(sbuf, MAXSTR, fp);
160 objp->oname = savqstr(sbuf);
161 /* get arguments */
162 if (objp->otype == -1) {
163 register OBJECT alias;
164 strcpy(sbuf, "EOF");
165 fgetword(sbuf, MAXSTR, fp);
166 if ((alias = modifier(sbuf)) == OVOID) {
167 sprintf(errmsg,
168 "(%s): bad reference \"%s\" for %s \"%s\"",
169 name, sbuf, ALIASID, objp->oname);
170 error(USER, errmsg);
171 }
172 objp->otype = objptr(alias)->otype;
173 copystruct(&objp->oargs, &objptr(alias)->oargs);
174 } else if ((rval = readfargs(&objp->oargs, fp)) == 0) {
175 sprintf(errmsg, "(%s): bad arguments", name);
176 objerror(objp, USER, errmsg);
177 } else if (rval < 0) {
178 sprintf(errmsg, "(%s): error reading scene", name);
179 error(SYSTEM, errmsg);
180 }
181 /* initialize */
182 objp->os = NULL;
183
184 insertobject(obj); /* add to global structure */
185 }
186
187
188 int
189 newobject() /* get a new object */
190 {
191 register int i;
192
193 if ((nobjects & (OBJBLKSIZ-1)) == 0) { /* new block */
194 errno = 0;
195 i = nobjects >> OBJBLKSHFT;
196 if (i >= MAXOBJBLK)
197 return(OVOID);
198 objblock[i] = (OBJREC *)calloc(OBJBLKSIZ, sizeof(OBJREC));
199 if (objblock[i] == NULL)
200 return(OVOID);
201 }
202 return(nobjects++);
203 }
204
205 void
206 freeobjects(firstobj, nobjs) /* free a range of objects */
207 OBJECT firstobj, nobjs;
208 {
209 register int obj;
210 /* check bounds */
211 if (firstobj < 0)
212 return;
213 if (nobjs <= 0)
214 return;
215 if (firstobj + nobjs > nobjects)
216 return;
217 /* clear objects */
218 for (obj = firstobj+nobjs; obj-- > firstobj; ) {
219 register OBJREC *o = objptr(obj);
220 free_os(o); /* free client memory */
221 freeqstr(o->oname);
222 freefargs(&o->oargs);
223 bzero(o, sizeof(OBJREC));
224 }
225 clearobjndx();
226 /* free objects off end */
227 for (obj = nobjects; obj-- > 0; )
228 if (objptr(obj)->oname != NULL)
229 break;
230 ++obj;
231 while (nobjects > obj) /* free empty end blocks */
232 if ((--nobjects & (OBJBLKSIZ-1)) == 0) {
233 int i = nobjects >> OBJBLKSHFT;
234 free((void *)objblock[i]);
235 objblock[i] = NULL;
236 }
237 }