ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/readobj.c
Revision: 2.10
Committed: Mon Mar 10 17:13:29 2003 UTC (21 years, 1 month ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.9: +2 -2 lines
Log Message:
Compile error fixes for Linux and other improvements

File Contents

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