ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/readobj.c
Revision: 2.23
Committed: Sat May 4 00:36:58 2019 UTC (5 years ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R3
Changes since 2.22: +2 -2 lines
Log Message:
Eliminated cases where stdin was being closed

File Contents

# User Rev Content
1 greg 1.1 #ifndef lint
2 greg 2.23 static const char RCSid[] = "$Id: readobj.c,v 2.22 2017/04/08 03:56:44 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 schorsch 2.16 #include <string.h>
14 schorsch 2.14 #include <stdio.h>
15 schorsch 2.13
16 greg 2.17 #include "platform.h"
17 greg 2.21 #include "paths.h"
18 greg 1.1 #include "standard.h"
19     #include "object.h"
20     #include "otypes.h"
21    
22    
23     OBJREC *objblock[MAXOBJBLK]; /* our objects */
24 greg 1.4 OBJECT nobjects = 0; /* # of objects */
25 greg 1.1
26    
27 greg 2.8 void
28 greg 2.22 readobj( /* read in an object file or stream */
29     char *inpspec
30     )
31 greg 1.1 {
32 greg 2.4 OBJECT lastobj;
33 greg 1.1 FILE *infp;
34 greg 2.19 char buf[2048];
35 greg 2.22 int c;
36 greg 1.1
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 greg 2.23 else if (infp != stdin)
67 greg 1.1 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 2.22 getobject( /* read the next object */
77     char *name,
78     FILE *fp
79     )
80 greg 1.1 {
81 greg 2.11 #define OALIAS -2
82 greg 1.1 OBJECT obj;
83     char sbuf[MAXSTR];
84 greg 1.6 int rval;
85 greg 2.22 OBJREC *objp;
86 greg 1.1
87     if ((obj = newobject()) == OVOID)
88     error(SYSTEM, "out of object space");
89     objp = objptr(obj);
90     /* get modifier */
91 greg 1.7 strcpy(sbuf, "EOF");
92     fgetword(sbuf, MAXSTR, fp);
93 greg 2.20 if (strchr(sbuf, '\t')) {
94     sprintf(errmsg, "(%s): illegal tab in modifier \"%s\"",
95     name, sbuf);
96     error(USER, errmsg);
97     }
98 greg 1.1 if (!strcmp(sbuf, VOIDID))
99     objp->omod = OVOID;
100 greg 2.11 else if (!strcmp(sbuf, ALIASMOD))
101     objp->omod = OALIAS;
102 greg 1.1 else if ((objp->omod = modifier(sbuf)) == OVOID) {
103     sprintf(errmsg, "(%s): undefined modifier \"%s\"", name, sbuf);
104     error(USER, errmsg);
105     }
106     /* get type */
107 greg 1.7 strcpy(sbuf, "EOF");
108     fgetword(sbuf, MAXSTR, fp);
109 greg 2.11 if ((objp->otype = otype(sbuf)) < 0) {
110 greg 1.1 sprintf(errmsg, "(%s): unknown type \"%s\"", name, sbuf);
111     error(USER, errmsg);
112     }
113     /* get identifier */
114 greg 1.7 sbuf[0] = '\0';
115     fgetword(sbuf, MAXSTR, fp);
116 greg 2.20 if (strchr(sbuf, '\t')) {
117     sprintf(errmsg, "(%s): illegal tab in identifier \"%s\"",
118     name, sbuf);
119     error(USER, errmsg);
120     }
121 greg 1.1 objp->oname = savqstr(sbuf);
122     /* get arguments */
123 greg 2.11 if (objp->otype == MOD_ALIAS) {
124 greg 2.22 OBJECT alias;
125 greg 1.7 strcpy(sbuf, "EOF");
126     fgetword(sbuf, MAXSTR, fp);
127 greg 1.1 if ((alias = modifier(sbuf)) == OVOID) {
128 greg 2.11 sprintf(errmsg, "(%s): bad reference \"%s\"",
129     name, sbuf);
130     objerror(objp, USER, errmsg);
131     }
132     if (objp->omod == OALIAS ||
133     objp->omod == objptr(alias)->omod) {
134     objp->omod = alias;
135     } else {
136     objp->oargs.sarg = (char **)malloc(sizeof(char *));
137     if (objp->oargs.sarg == NULL)
138     error(SYSTEM, "out of memory in getobject");
139     objp->oargs.nsargs = 1;
140     objp->oargs.sarg[0] = savestr(sbuf);
141 greg 1.1 }
142 greg 1.6 } else if ((rval = readfargs(&objp->oargs, fp)) == 0) {
143 greg 1.1 sprintf(errmsg, "(%s): bad arguments", name);
144     objerror(objp, USER, errmsg);
145 greg 1.6 } else if (rval < 0) {
146     sprintf(errmsg, "(%s): error reading scene", name);
147     error(SYSTEM, errmsg);
148 greg 1.1 }
149 greg 2.11 if (objp->omod == OALIAS) {
150     sprintf(errmsg, "(%s): inappropriate use of '%s' modifier",
151     name, ALIASMOD);
152     objerror(objp, USER, errmsg);
153     }
154 greg 1.1 /* initialize */
155     objp->os = NULL;
156    
157     insertobject(obj); /* add to global structure */
158 greg 2.11 #undef OALIAS
159 greg 1.1 }
160    
161    
162 greg 2.10 OBJECT
163 greg 2.22 newobject(void) /* get a new object */
164 greg 1.1 {
165 greg 2.22 int i;
166 greg 1.1
167 gwlarson 2.7 if ((nobjects & (OBJBLKSIZ-1)) == 0) { /* new block */
168 greg 1.1 errno = 0;
169 gwlarson 2.7 i = nobjects >> OBJBLKSHFT;
170 greg 1.1 if (i >= MAXOBJBLK)
171     return(OVOID);
172 greg 2.8 objblock[i] = (OBJREC *)calloc(OBJBLKSIZ, sizeof(OBJREC));
173 greg 1.1 if (objblock[i] == NULL)
174     return(OVOID);
175     }
176     return(nobjects++);
177 greg 2.8 }
178    
179     void
180 greg 2.22 freeobjects( /* free a range of objects */
181     int firstobj,
182     int nobjs
183     )
184 greg 2.8 {
185 greg 2.22 int obj;
186 greg 2.8 /* check bounds */
187     if (firstobj < 0)
188     return;
189     if (nobjs <= 0)
190     return;
191     if (firstobj + nobjs > nobjects)
192     return;
193     /* clear objects */
194     for (obj = firstobj+nobjs; obj-- > firstobj; ) {
195 greg 2.22 OBJREC *o = objptr(obj);
196 greg 2.8 free_os(o); /* free client memory */
197     freeqstr(o->oname);
198     freefargs(&o->oargs);
199 schorsch 2.16 memset((void *)o, '\0', sizeof(OBJREC));
200 greg 2.8 }
201     clearobjndx();
202     /* free objects off end */
203     for (obj = nobjects; obj-- > 0; )
204     if (objptr(obj)->oname != NULL)
205     break;
206     ++obj;
207     while (nobjects > obj) /* free empty end blocks */
208     if ((--nobjects & (OBJBLKSIZ-1)) == 0) {
209     int i = nobjects >> OBJBLKSHFT;
210     free((void *)objblock[i]);
211     objblock[i] = NULL;
212     }
213 greg 1.1 }