ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/readobj.c
Revision: 2.14
Committed: Sun Jun 8 12:03:09 2003 UTC (20 years, 10 months ago) by schorsch
Content type: text/plain
Branch: MAIN
Changes since 2.13: +3 -5 lines
Log Message:
Reduced compile warnings/errors on Windows.

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: readobj.c,v 2.13 2003/06/07 12:50:20 schorsch Exp $";
3 #endif
4 /*
5 * readobj.c - routines for reading in object descriptions.
6 *
7 * External symbols declared in object.h
8 */
9
10 #include "copyright.h"
11
12 #include <ctype.h>
13 #include <stdio.h>
14 #include <stdio.h>
15
16 #include "standard.h"
17 #include "platform.h"
18 #include "object.h"
19 #include "otypes.h"
20
21
22 OBJREC *objblock[MAXOBJBLK]; /* our objects */
23 OBJECT nobjects = 0; /* # of objects */
24
25
26 void
27 readobj(inpspec) /* read in an object file or stream */
28 char *inpspec;
29 {
30 OBJECT lastobj;
31 FILE *infp;
32 char buf[1024];
33 register int c;
34
35 lastobj = nobjects;
36 if (inpspec == NULL) {
37 infp = stdin;
38 inpspec = "standard input";
39 } else if (inpspec[0] == '!') {
40 if ((infp = popen(inpspec+1, "r")) == NULL) {
41 sprintf(errmsg, "cannot execute \"%s\"", inpspec);
42 error(SYSTEM, errmsg);
43 }
44 } else if ((infp = fopen(inpspec, "r")) == NULL) {
45 sprintf(errmsg, "cannot open scene file \"%s\"", inpspec);
46 error(SYSTEM, errmsg);
47 }
48 while ((c = getc(infp)) != EOF) {
49 if (isspace(c))
50 continue;
51 if (c == '#') { /* comment */
52 fgets(buf, sizeof(buf), infp);
53 } else if (c == '!') { /* command */
54 ungetc(c, infp);
55 fgetline(buf, sizeof(buf), infp);
56 readobj(buf);
57 } else { /* object */
58 ungetc(c, infp);
59 getobject(inpspec, infp);
60 }
61 }
62 if (inpspec[0] == '!')
63 pclose(infp);
64 else
65 fclose(infp);
66 if (nobjects == lastobj) {
67 sprintf(errmsg, "(%s): empty file", inpspec);
68 error(WARNING, errmsg);
69 }
70 }
71
72
73 void
74 getobject(name, fp) /* read the next object */
75 char *name;
76 FILE *fp;
77 {
78 #define OALIAS -2
79 OBJECT obj;
80 char sbuf[MAXSTR];
81 int rval;
82 register OBJREC *objp;
83
84 if ((obj = newobject()) == OVOID)
85 error(SYSTEM, "out of object space");
86 objp = objptr(obj);
87 /* get modifier */
88 strcpy(sbuf, "EOF");
89 fgetword(sbuf, MAXSTR, fp);
90 if (!strcmp(sbuf, VOIDID))
91 objp->omod = OVOID;
92 else if (!strcmp(sbuf, ALIASMOD))
93 objp->omod = OALIAS;
94 else if ((objp->omod = modifier(sbuf)) == OVOID) {
95 sprintf(errmsg, "(%s): undefined modifier \"%s\"", name, sbuf);
96 error(USER, errmsg);
97 }
98 /* get type */
99 strcpy(sbuf, "EOF");
100 fgetword(sbuf, MAXSTR, fp);
101 if ((objp->otype = otype(sbuf)) < 0) {
102 sprintf(errmsg, "(%s): unknown type \"%s\"", name, sbuf);
103 error(USER, errmsg);
104 }
105 /* get identifier */
106 sbuf[0] = '\0';
107 fgetword(sbuf, MAXSTR, fp);
108 objp->oname = savqstr(sbuf);
109 /* get arguments */
110 if (objp->otype == MOD_ALIAS) {
111 register OBJECT alias;
112 strcpy(sbuf, "EOF");
113 fgetword(sbuf, MAXSTR, fp);
114 if ((alias = modifier(sbuf)) == OVOID) {
115 sprintf(errmsg, "(%s): bad reference \"%s\"",
116 name, sbuf);
117 objerror(objp, USER, errmsg);
118 }
119 if (objp->omod == OALIAS ||
120 objp->omod == objptr(alias)->omod) {
121 objp->omod = alias;
122 } else {
123 objp->oargs.sarg = (char **)malloc(sizeof(char *));
124 if (objp->oargs.sarg == NULL)
125 error(SYSTEM, "out of memory in getobject");
126 objp->oargs.nsargs = 1;
127 objp->oargs.sarg[0] = savestr(sbuf);
128 }
129 } else if ((rval = readfargs(&objp->oargs, fp)) == 0) {
130 sprintf(errmsg, "(%s): bad arguments", name);
131 objerror(objp, USER, errmsg);
132 } else if (rval < 0) {
133 sprintf(errmsg, "(%s): error reading scene", name);
134 error(SYSTEM, errmsg);
135 }
136 if (objp->omod == OALIAS) {
137 sprintf(errmsg, "(%s): inappropriate use of '%s' modifier",
138 name, ALIASMOD);
139 objerror(objp, USER, errmsg);
140 }
141 /* initialize */
142 objp->os = NULL;
143
144 insertobject(obj); /* add to global structure */
145 #undef OALIAS
146 }
147
148
149 OBJECT
150 newobject() /* get a new object */
151 {
152 register int i;
153
154 if ((nobjects & (OBJBLKSIZ-1)) == 0) { /* new block */
155 errno = 0;
156 i = nobjects >> OBJBLKSHFT;
157 if (i >= MAXOBJBLK)
158 return(OVOID);
159 objblock[i] = (OBJREC *)calloc(OBJBLKSIZ, sizeof(OBJREC));
160 if (objblock[i] == NULL)
161 return(OVOID);
162 }
163 return(nobjects++);
164 }
165
166 void
167 freeobjects(firstobj, nobjs) /* free a range of objects */
168 OBJECT firstobj, nobjs;
169 {
170 register int obj;
171 /* check bounds */
172 if (firstobj < 0)
173 return;
174 if (nobjs <= 0)
175 return;
176 if (firstobj + nobjs > nobjects)
177 return;
178 /* clear objects */
179 for (obj = firstobj+nobjs; obj-- > firstobj; ) {
180 register OBJREC *o = objptr(obj);
181 free_os(o); /* free client memory */
182 freeqstr(o->oname);
183 freefargs(&o->oargs);
184 bzero((void *)o, sizeof(OBJREC));
185 }
186 clearobjndx();
187 /* free objects off end */
188 for (obj = nobjects; obj-- > 0; )
189 if (objptr(obj)->oname != NULL)
190 break;
191 ++obj;
192 while (nobjects > obj) /* free empty end blocks */
193 if ((--nobjects & (OBJBLKSIZ-1)) == 0) {
194 int i = nobjects >> OBJBLKSHFT;
195 free((void *)objblock[i]);
196 objblock[i] = NULL;
197 }
198 }