ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/readobj.c
Revision: 2.12
Committed: Tue May 13 17:58:32 2003 UTC (20 years, 11 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.11: +1 -1 lines
Log Message:
Changed (char *) casts for memory copies to (void *) and other fixes

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 greg 2.11 #define OALIAS -2
77 greg 1.1 OBJECT obj;
78     char sbuf[MAXSTR];
79 greg 1.6 int rval;
80 greg 1.1 register OBJREC *objp;
81    
82     if ((obj = newobject()) == OVOID)
83     error(SYSTEM, "out of object space");
84     objp = objptr(obj);
85     /* get modifier */
86 greg 1.7 strcpy(sbuf, "EOF");
87     fgetword(sbuf, MAXSTR, fp);
88 greg 1.1 if (!strcmp(sbuf, VOIDID))
89     objp->omod = OVOID;
90 greg 2.11 else if (!strcmp(sbuf, ALIASMOD))
91     objp->omod = OALIAS;
92 greg 1.1 else if ((objp->omod = modifier(sbuf)) == OVOID) {
93     sprintf(errmsg, "(%s): undefined modifier \"%s\"", name, sbuf);
94     error(USER, errmsg);
95     }
96     /* get type */
97 greg 1.7 strcpy(sbuf, "EOF");
98     fgetword(sbuf, MAXSTR, fp);
99 greg 2.11 if ((objp->otype = otype(sbuf)) < 0) {
100 greg 1.1 sprintf(errmsg, "(%s): unknown type \"%s\"", name, sbuf);
101     error(USER, errmsg);
102     }
103     /* get identifier */
104 greg 1.7 sbuf[0] = '\0';
105     fgetword(sbuf, MAXSTR, fp);
106 greg 1.1 objp->oname = savqstr(sbuf);
107     /* get arguments */
108 greg 2.11 if (objp->otype == MOD_ALIAS) {
109 greg 1.1 register OBJECT alias;
110 greg 1.7 strcpy(sbuf, "EOF");
111     fgetword(sbuf, MAXSTR, fp);
112 greg 1.1 if ((alias = modifier(sbuf)) == OVOID) {
113 greg 2.11 sprintf(errmsg, "(%s): bad reference \"%s\"",
114     name, sbuf);
115     objerror(objp, USER, errmsg);
116     }
117     if (objp->omod == OALIAS ||
118     objp->omod == objptr(alias)->omod) {
119     objp->omod = alias;
120     } else {
121     objp->oargs.sarg = (char **)malloc(sizeof(char *));
122     if (objp->oargs.sarg == NULL)
123     error(SYSTEM, "out of memory in getobject");
124     objp->oargs.nsargs = 1;
125     objp->oargs.sarg[0] = savestr(sbuf);
126 greg 1.1 }
127 greg 1.6 } else if ((rval = readfargs(&objp->oargs, fp)) == 0) {
128 greg 1.1 sprintf(errmsg, "(%s): bad arguments", name);
129     objerror(objp, USER, errmsg);
130 greg 1.6 } else if (rval < 0) {
131     sprintf(errmsg, "(%s): error reading scene", name);
132     error(SYSTEM, errmsg);
133 greg 1.1 }
134 greg 2.11 if (objp->omod == OALIAS) {
135     sprintf(errmsg, "(%s): inappropriate use of '%s' modifier",
136     name, ALIASMOD);
137     objerror(objp, USER, errmsg);
138     }
139 greg 1.1 /* initialize */
140     objp->os = NULL;
141    
142     insertobject(obj); /* add to global structure */
143 greg 2.11 #undef OALIAS
144 greg 1.1 }
145    
146    
147 greg 2.10 OBJECT
148 greg 1.1 newobject() /* get a new object */
149     {
150     register int i;
151    
152 gwlarson 2.7 if ((nobjects & (OBJBLKSIZ-1)) == 0) { /* new block */
153 greg 1.1 errno = 0;
154 gwlarson 2.7 i = nobjects >> OBJBLKSHFT;
155 greg 1.1 if (i >= MAXOBJBLK)
156     return(OVOID);
157 greg 2.8 objblock[i] = (OBJREC *)calloc(OBJBLKSIZ, sizeof(OBJREC));
158 greg 1.1 if (objblock[i] == NULL)
159     return(OVOID);
160     }
161     return(nobjects++);
162 greg 2.8 }
163    
164     void
165     freeobjects(firstobj, nobjs) /* free a range of objects */
166     OBJECT firstobj, nobjs;
167     {
168     register int obj;
169     /* check bounds */
170     if (firstobj < 0)
171     return;
172     if (nobjs <= 0)
173     return;
174     if (firstobj + nobjs > nobjects)
175     return;
176     /* clear objects */
177     for (obj = firstobj+nobjs; obj-- > firstobj; ) {
178     register OBJREC *o = objptr(obj);
179     free_os(o); /* free client memory */
180     freeqstr(o->oname);
181     freefargs(&o->oargs);
182 greg 2.12 bzero((void *)o, sizeof(OBJREC));
183 greg 2.8 }
184     clearobjndx();
185     /* free objects off end */
186     for (obj = nobjects; obj-- > 0; )
187     if (objptr(obj)->oname != NULL)
188     break;
189     ++obj;
190     while (nobjects > obj) /* free empty end blocks */
191     if ((--nobjects & (OBJBLKSIZ-1)) == 0) {
192     int i = nobjects >> OBJBLKSHFT;
193     free((void *)objblock[i]);
194     objblock[i] = NULL;
195     }
196 greg 1.1 }