ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/ot/readobj2.c
Revision: 1.2
Committed: Wed May 29 17:44:18 1991 UTC (32 years, 10 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.1: +3 -3 lines
Log Message:
bug fix in recursive call

File Contents

# User Rev Content
1 greg 1.1 /* Copyright (c) 1991 Regents of the University of California */
2    
3     #ifndef lint
4     static char SCCSid[] = "$SunId$ LBL";
5     #endif
6    
7     /*
8     * readobj2.c - routines for reading in object descriptions.
9     */
10    
11     #include "standard.h"
12    
13     #include "object.h"
14    
15     #include "otypes.h"
16    
17     #include <ctype.h>
18    
19     OBJREC *objblock[MAXOBJBLK]; /* our objects */
20     OBJECT nobjects = 0; /* # of objects */
21     int newobject() {return(0);}
22    
23    
24     readobj(input, callback) /* read in an object file or stream */
25     char *input;
26     int (*callback)();
27     {
28     FILE *popen();
29     char *fgets(), *fgetline();
30     FILE *infp;
31     char buf[512];
32     register int c;
33    
34     if (input == NULL) {
35     infp = stdin;
36     input = "standard input";
37     } else if (input[0] == '!') {
38     if ((infp = popen(input+1, "r")) == NULL) {
39     sprintf(errmsg, "cannot execute \"%s\"", input);
40     error(SYSTEM, errmsg);
41     }
42     } else if ((infp = fopen(input, "r")) == NULL) {
43     sprintf(errmsg, "cannot open scene file \"%s\"", input);
44     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     } else if (c == '!') { /* command */
52     ungetc(c, infp);
53     fgetline(buf, sizeof(buf), infp);
54 greg 1.2 readobj(buf, callback);
55 greg 1.1 } else { /* object */
56     ungetc(c, infp);
57     getobject(input, infp, callback);
58     }
59     }
60     if (input[0] == '!')
61     pclose(infp);
62     else
63     fclose(infp);
64     }
65    
66    
67     getobject(name, fp, f) /* read the next object */
68     char *name;
69     FILE *fp;
70     int (*f)();
71     {
72     char sbuf[MAXSTR];
73     OBJREC thisobj;
74     /* get modifier */
75 greg 1.2 fscanf(fp, "%*s");
76     thisobj.omod = OVOID;
77 greg 1.1 /* get type */
78     fscanf(fp, "%s", sbuf);
79     if (!strcmp(sbuf, ALIASID))
80     thisobj.otype = -1;
81     else if ((thisobj.otype = otype(sbuf)) < 0) {
82     sprintf(errmsg, "(%s): unknown type \"%s\"", name, sbuf);
83     error(USER, errmsg);
84     }
85     /* get identifier */
86     fscanf(fp, "%s", sbuf);
87     thisobj.oname = sbuf;
88     /* get arguments */
89     if (thisobj.otype == -1) {
90     fscanf(fp, "%*s");
91     return;
92     }
93     if (readfargs(&thisobj.oargs, fp) < 0) {
94     sprintf(errmsg, "(%s): bad arguments", name);
95     objerror(&thisobj, USER, errmsg);
96     }
97     thisobj.os = NULL;
98     thisobj.lastrno = -1;
99     /* call function */
100     (*f)(&thisobj);
101     /* free memory */
102     if (thisobj.os != NULL)
103     switch (thisobj.otype) {
104     case OBJ_CONE:
105     case OBJ_CUP:
106     case OBJ_CYLINDER:
107     case OBJ_TUBE:
108     case OBJ_RING:
109     freecone(&thisobj);
110     break;
111     case OBJ_FACE:
112     freeface(&thisobj);
113     break;
114     case OBJ_INSTANCE:
115     freeinstance(&thisobj);
116     break;
117     }
118     freefargs(&thisobj.oargs);
119     }
120    
121    
122     readfargs(fa, fp) /* read function arguments from stream */
123     register FUNARGS *fa;
124     FILE *fp;
125     {
126     char sbuf[MAXSTR];
127     int n;
128     register int i;
129    
130     if (fscanf(fp, "%d", &n) != 1 || n < 0)
131     return(-1);
132     if (fa->nsargs = n) {
133     fa->sarg = (char **)malloc(n*sizeof(char *));
134     if (fa->sarg == NULL)
135     goto memerr;
136     for (i = 0; i < fa->nsargs; i++) {
137     if (fscanf(fp, "%s", sbuf) != 1)
138     return(-1);
139     fa->sarg[i] = savestr(sbuf);
140     }
141     } else
142     fa->sarg = NULL;
143     if (fscanf(fp, "%d", &n) != 1 || n < 0)
144     return(-1);
145     #ifdef IARGS
146     if (fa->niargs = n) {
147     fa->iarg = (long *)malloc(n*sizeof(long));
148     if (fa->iarg == NULL)
149     goto memerr;
150     for (i = 0; i < n; i++)
151     if (fscanf(fp, "%ld", &fa->iarg[i]) != 1)
152     return(-1);
153     } else
154     fa->iarg = NULL;
155     #else
156     if (n != 0)
157     return(-1);
158     #endif
159     if (fscanf(fp, "%d", &n) != 1 || n < 0)
160     return(-1);
161     if (fa->nfargs = n) {
162     fa->farg = (double *)malloc(n*sizeof(double));
163     if (fa->farg == NULL)
164     goto memerr;
165     for (i = 0; i < n; i++)
166     if (fscanf(fp, "%lf", &fa->farg[i]) != 1)
167     return(-1);
168     } else
169     fa->farg = NULL;
170     return(0);
171     memerr:
172     error(SYSTEM, "out of memory in readfargs");
173     }
174    
175    
176     freefargs(fa) /* free arguments */
177     register FUNARGS *fa;
178     {
179     register int i;
180    
181     if (fa->nsargs) {
182     for (i = 0; i < fa->nsargs; i++)
183     free(fa->sarg[i]);
184     free((char *)fa->sarg);
185     }
186     #ifdef IARGS
187     if (fa->niargs)
188     free((char *)fa->iarg);
189     #endif
190     if (fa->nfargs)
191     free((char *)fa->farg);
192     }