ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/readobj.c
Revision: 2.20
Committed: Tue Mar 30 12:42:33 2010 UTC (14 years, 1 month ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad4R2P2, rad5R0, rad4R2, rad4R1, rad4R2P1
Changes since 2.19: +11 -1 lines
Log Message:
Added check against tab in modifier or identifier, which breaks rtrace

File Contents

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