ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/readobj.c
Revision: 2.13
Committed: Sat Jun 7 12:50:20 2003 UTC (20 years, 10 months ago) by schorsch
Content type: text/plain
Branch: MAIN
Changes since 2.12: +8 -4 lines
Log Message:
Various small changes to reduce compile warnings/errors on Windows.

File Contents

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