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

# User Rev Content
1 greg 1.1 #ifndef lint
2 schorsch 2.13 static const char RCSid[] = "$Id: readobj.c,v 2.12 2003/05/13 17:58:32 greg Exp $";
3 greg 1.1 #endif
4     /*
5     * readobj.c - routines for reading in object descriptions.
6     *
7 greg 2.8 * External symbols declared in object.h
8     */
9    
10 greg 2.9 #include "copyright.h"
11 greg 1.1
12 schorsch 2.13 #include <ctype.h>
13     #include <stdio.h>
14     #ifdef _WIN32
15     #define popen _popen
16     #define pclose _pclose
17     #endif
18    
19 greg 1.1 #include "standard.h"
20     #include "object.h"
21     #include "otypes.h"
22    
23    
24     OBJREC *objblock[MAXOBJBLK]; /* our objects */
25 greg 1.4 OBJECT nobjects = 0; /* # of objects */
26 greg 1.1
27    
28 greg 2.8 void
29 greg 2.4 readobj(inpspec) /* read in an object file or stream */
30     char *inpspec;
31 greg 1.1 {
32 greg 2.4 OBJECT lastobj;
33 greg 1.1 FILE *infp;
34 greg 2.5 char buf[1024];
35 greg 1.1 register int c;
36    
37 greg 2.4 lastobj = nobjects;
38     if (inpspec == NULL) {
39 greg 1.1 infp = stdin;
40 greg 2.4 inpspec = "standard input";
41     } else if (inpspec[0] == '!') {
42     if ((infp = popen(inpspec+1, "r")) == NULL) {
43     sprintf(errmsg, "cannot execute \"%s\"", inpspec);
44 greg 1.1 error(SYSTEM, errmsg);
45     }
46 greg 2.4 } else if ((infp = fopen(inpspec, "r")) == NULL) {
47     sprintf(errmsg, "cannot open scene file \"%s\"", inpspec);
48 greg 1.1 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 greg 1.2 } else if (c == '!') { /* command */
56 greg 1.1 ungetc(c, infp);
57 greg 1.2 fgetline(buf, sizeof(buf), infp);
58 greg 1.1 readobj(buf);
59     } else { /* object */
60     ungetc(c, infp);
61 greg 2.4 getobject(inpspec, infp);
62 greg 1.1 }
63     }
64 greg 2.4 if (inpspec[0] == '!')
65 greg 1.1 pclose(infp);
66     else
67     fclose(infp);
68 greg 2.4 if (nobjects == lastobj) {
69     sprintf(errmsg, "(%s): empty file", inpspec);
70     error(WARNING, errmsg);
71     }
72 greg 1.1 }
73    
74    
75 greg 2.8 void
76 greg 1.1 getobject(name, fp) /* read the next object */
77     char *name;
78     FILE *fp;
79     {
80 greg 2.11 #define OALIAS -2
81 greg 1.1 OBJECT obj;
82     char sbuf[MAXSTR];
83 greg 1.6 int rval;
84 greg 1.1 register OBJREC *objp;
85    
86     if ((obj = newobject()) == OVOID)
87     error(SYSTEM, "out of object space");
88     objp = objptr(obj);
89     /* get modifier */
90 greg 1.7 strcpy(sbuf, "EOF");
91     fgetword(sbuf, MAXSTR, fp);
92 greg 1.1 if (!strcmp(sbuf, VOIDID))
93     objp->omod = OVOID;
94 greg 2.11 else if (!strcmp(sbuf, ALIASMOD))
95     objp->omod = OALIAS;
96 greg 1.1 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 greg 1.7 strcpy(sbuf, "EOF");
102     fgetword(sbuf, MAXSTR, fp);
103 greg 2.11 if ((objp->otype = otype(sbuf)) < 0) {
104 greg 1.1 sprintf(errmsg, "(%s): unknown type \"%s\"", name, sbuf);
105     error(USER, errmsg);
106     }
107     /* get identifier */
108 greg 1.7 sbuf[0] = '\0';
109     fgetword(sbuf, MAXSTR, fp);
110 greg 1.1 objp->oname = savqstr(sbuf);
111     /* get arguments */
112 greg 2.11 if (objp->otype == MOD_ALIAS) {
113 greg 1.1 register OBJECT alias;
114 greg 1.7 strcpy(sbuf, "EOF");
115     fgetword(sbuf, MAXSTR, fp);
116 greg 1.1 if ((alias = modifier(sbuf)) == OVOID) {
117 greg 2.11 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 greg 1.1 }
131 greg 1.6 } else if ((rval = readfargs(&objp->oargs, fp)) == 0) {
132 greg 1.1 sprintf(errmsg, "(%s): bad arguments", name);
133     objerror(objp, USER, errmsg);
134 greg 1.6 } else if (rval < 0) {
135     sprintf(errmsg, "(%s): error reading scene", name);
136     error(SYSTEM, errmsg);
137 greg 1.1 }
138 greg 2.11 if (objp->omod == OALIAS) {
139     sprintf(errmsg, "(%s): inappropriate use of '%s' modifier",
140     name, ALIASMOD);
141     objerror(objp, USER, errmsg);
142     }
143 greg 1.1 /* initialize */
144     objp->os = NULL;
145    
146     insertobject(obj); /* add to global structure */
147 greg 2.11 #undef OALIAS
148 greg 1.1 }
149    
150    
151 greg 2.10 OBJECT
152 greg 1.1 newobject() /* get a new object */
153     {
154     register int i;
155    
156 gwlarson 2.7 if ((nobjects & (OBJBLKSIZ-1)) == 0) { /* new block */
157 greg 1.1 errno = 0;
158 gwlarson 2.7 i = nobjects >> OBJBLKSHFT;
159 greg 1.1 if (i >= MAXOBJBLK)
160     return(OVOID);
161 greg 2.8 objblock[i] = (OBJREC *)calloc(OBJBLKSIZ, sizeof(OBJREC));
162 greg 1.1 if (objblock[i] == NULL)
163     return(OVOID);
164     }
165     return(nobjects++);
166 greg 2.8 }
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 greg 2.12 bzero((void *)o, sizeof(OBJREC));
187 greg 2.8 }
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 greg 1.1 }