ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/ot/readobj2.c
Revision: 2.14
Committed: Tue Apr 22 14:51:29 2025 UTC (9 days, 16 hours ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 2.13: +2 -2 lines
Log Message:
fix: Changed some errors to warnings for pclose()

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: readobj2.c,v 2.13 2025/04/22 04:45:25 greg Exp $";
3 #endif
4 /*
5 * readobj2.c - routines for reading in object descriptions.
6 */
7
8 #include <ctype.h>
9 #include <stdio.h>
10
11 #include "platform.h"
12 #include "paths.h"
13 #include "rtmath.h"
14 #include "rtio.h"
15 #include "rterror.h"
16 #include "object.h"
17 #include "otypes.h"
18 #include "oconv.h"
19
20
21 static void getobject2(char *name, FILE *fp, ro_cbfunc f);
22
23
24 void
25 readobj2( /* read in an object file or stream */
26 char *input,
27 ro_cbfunc callback
28 )
29 {
30 FILE *infp;
31 char buf[2048];
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 readobj2(buf, callback);
55 } else { /* object */
56 ungetc(c, infp);
57 getobject2(input, infp, callback);
58 }
59 }
60 if (input[0] == '!') {
61 if (pclose(infp) != 0) {
62 sprintf(errmsg, "bad status from \"%s\"", input);
63 error(WARNING, errmsg);
64 }
65 } else
66 fclose(infp);
67 }
68
69
70 static void
71 getobject2( /* read the next object */
72 char *name,
73 FILE *fp,
74 ro_cbfunc f
75 )
76 {
77 char sbuf[MAXSTR];
78 OBJREC thisobj;
79 /* get modifier */
80 fgetword(sbuf, MAXSTR, fp);
81 thisobj.omod = OVOID;
82 /* get type */
83 fgetword(sbuf, MAXSTR, fp);
84 if ((thisobj.otype = otype(sbuf)) < 0) {
85 sprintf(errmsg, "(%s): unknown type \"%s\"", name, sbuf);
86 error(USER, errmsg);
87 }
88 /* get identifier */
89 fgetword(sbuf, MAXSTR, fp);
90 thisobj.oname = sbuf;
91 /* get arguments */
92 if (thisobj.otype == MOD_ALIAS) {
93 fscanf(fp, "%*s");
94 return;
95 }
96 if (readfargs(&thisobj.oargs, fp) <= 0) {
97 sprintf(errmsg, "(%s): bad arguments", name);
98 objerror(&thisobj, USER, errmsg);
99 }
100 thisobj.os = NULL;
101 /* call function */
102 (*f)(&thisobj);
103 /* free memory */
104 freefargs(&thisobj.oargs);
105 free_os(&thisobj);
106 }