ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/ot/readobj2.c
Revision: 1.4
Committed: Fri Jul 19 09:29:24 1991 UTC (32 years, 9 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.3: +1 -78 lines
Log Message:
added separate readfargs.o module

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 greg 1.4 if (readfargs(&thisobj.oargs, fp) <= 0) {
94 greg 1.1 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     }