ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/readobj.c
Revision: 1.7
Committed: Mon Jul 22 11:48:04 1991 UTC (32 years, 9 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.6: +10 -4 lines
Log Message:
eliminated calls to scanf()

File Contents

# User Rev Content
1 greg 1.1 /* Copyright (c) 1986 Regents of the University of California */
2    
3     #ifndef lint
4     static char SCCSid[] = "$SunId$ LBL";
5     #endif
6    
7     /*
8     * readobj.c - routines for reading in object descriptions.
9     *
10     * 7/28/85
11     */
12    
13     #include "standard.h"
14    
15     #include "object.h"
16    
17     #include "otypes.h"
18    
19     #include <ctype.h>
20    
21 greg 1.7 extern char *fgetword(), *strcpy();
22    
23 greg 1.1 OBJREC *objblock[MAXOBJBLK]; /* our objects */
24 greg 1.4 OBJECT nobjects = 0; /* # of objects */
25 greg 1.1
26    
27     readobj(input) /* read in an object file or stream */
28     char *input;
29     {
30     FILE *popen();
31 greg 1.2 char *fgets(), *fgetline();
32 greg 1.1 FILE *infp;
33     char buf[512];
34     register int c;
35    
36     if (input == NULL) {
37     infp = stdin;
38     input = "standard input";
39     } else if (input[0] == '!') {
40     if ((infp = popen(input+1, "r")) == NULL) {
41     sprintf(errmsg, "cannot execute \"%s\"", input);
42     error(SYSTEM, errmsg);
43     }
44     } else if ((infp = fopen(input, "r")) == NULL) {
45     sprintf(errmsg, "cannot open scene file \"%s\"", input);
46     error(SYSTEM, errmsg);
47     }
48     while ((c = getc(infp)) != EOF) {
49     if (isspace(c))
50     continue;
51     if (c == '#') { /* comment */
52     fgets(buf, sizeof(buf), infp);
53 greg 1.2 } else if (c == '!') { /* command */
54 greg 1.1 ungetc(c, infp);
55 greg 1.2 fgetline(buf, sizeof(buf), infp);
56 greg 1.1 readobj(buf);
57     } else { /* object */
58     ungetc(c, infp);
59     getobject(input, infp);
60     }
61     }
62     if (input[0] == '!')
63     pclose(infp);
64     else
65     fclose(infp);
66     }
67    
68    
69     getobject(name, fp) /* read the next object */
70     char *name;
71     FILE *fp;
72     {
73     OBJECT obj;
74     char sbuf[MAXSTR];
75 greg 1.6 int rval;
76 greg 1.1 register OBJREC *objp;
77    
78     if ((obj = newobject()) == OVOID)
79     error(SYSTEM, "out of object space");
80     objp = objptr(obj);
81     /* get modifier */
82 greg 1.7 strcpy(sbuf, "EOF");
83     fgetword(sbuf, MAXSTR, fp);
84 greg 1.1 if (!strcmp(sbuf, VOIDID))
85     objp->omod = OVOID;
86     else if ((objp->omod = modifier(sbuf)) == OVOID) {
87     sprintf(errmsg, "(%s): undefined modifier \"%s\"", name, sbuf);
88     error(USER, errmsg);
89     }
90     /* get type */
91 greg 1.7 strcpy(sbuf, "EOF");
92     fgetword(sbuf, MAXSTR, fp);
93 greg 1.1 if (!strcmp(sbuf, ALIASID))
94     objp->otype = -1;
95     else if ((objp->otype = otype(sbuf)) < 0) {
96     sprintf(errmsg, "(%s): unknown type \"%s\"", name, sbuf);
97     error(USER, errmsg);
98     }
99     /* get identifier */
100 greg 1.7 sbuf[0] = '\0';
101     fgetword(sbuf, MAXSTR, fp);
102 greg 1.1 objp->oname = savqstr(sbuf);
103     /* get arguments */
104     if (objp->otype == -1) {
105     register OBJECT alias;
106 greg 1.7 strcpy(sbuf, "EOF");
107     fgetword(sbuf, MAXSTR, fp);
108 greg 1.1 if ((alias = modifier(sbuf)) == OVOID) {
109     sprintf(errmsg,
110     "(%s): bad reference \"%s\" for %s \"%s\"",
111     name, sbuf, ALIASID, objp->oname);
112     error(USER, errmsg);
113     }
114     objp->otype = objptr(alias)->otype;
115 greg 1.3 copystruct(&objp->oargs, &objptr(alias)->oargs);
116 greg 1.6 } else if ((rval = readfargs(&objp->oargs, fp)) == 0) {
117 greg 1.1 sprintf(errmsg, "(%s): bad arguments", name);
118     objerror(objp, USER, errmsg);
119 greg 1.6 } else if (rval < 0) {
120     sprintf(errmsg, "(%s): error reading scene", name);
121     error(SYSTEM, errmsg);
122 greg 1.1 }
123     /* initialize */
124     objp->os = NULL;
125     objp->lastrno = -1;
126    
127     insertobject(obj); /* add to global structure */
128     }
129    
130    
131     int
132     newobject() /* get a new object */
133     {
134     register int i;
135    
136     if ((nobjects & 077) == 0) { /* new block */
137     errno = 0;
138     i = nobjects >> 6;
139     if (i >= MAXOBJBLK)
140     return(OVOID);
141 greg 1.5 objblock[i] = (OBJREC *)bmalloc(0100*sizeof(OBJREC));
142 greg 1.1 if (objblock[i] == NULL)
143     return(OVOID);
144     }
145     return(nobjects++);
146     }