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

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