ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/ot/readobj2.c
(Generate patch)

Comparing ray/src/ot/readobj2.c (file contents):
Revision 1.2 by greg, Wed May 29 17:44:18 1991 UTC vs.
Revision 2.9 by schorsch, Sat Mar 27 12:41:45 2004 UTC

# Line 1 | Line 1
1 /* Copyright (c) 1991 Regents of the University of California */
2
1   #ifndef lint
2 < static char SCCSid[] = "$SunId$ LBL";
2 > static const char       RCSid[] = "$Id$";
3   #endif
6
4   /*
5   *  readobj2.c - routines for reading in object descriptions.
6   */
7  
8 < #include  "standard.h"
8 > #include  <ctype.h>
9 > #include  <stdio.h>
10  
11 + #include  "platform.h"
12 + #include  "rtprocess.h"
13 + #include  "rtmath.h"
14 + #include  "rtio.h"
15 + #include  "rterror.h"
16   #include  "object.h"
14
17   #include  "otypes.h"
18 + #include  "oconv.h"
19  
17 #include  <ctype.h>
20  
21 < OBJREC  *objblock[MAXOBJBLK];           /* our objects */
20 < OBJECT  nobjects = 0;                   /* # of objects */
21 < int newobject() {return(0);}
21 > static void getobject2(char  *name, FILE  *fp, ro_cbfunc f);
22  
23  
24 < readobj(input, callback)        /* read in an object file or stream */
25 < char  *input;
26 < int  (*callback)();
24 > void
25 > readobj2(       /* read in an object file or stream */
26 >        char  *input,
27 >        ro_cbfunc callback
28 > )
29   {
30 <        FILE  *popen();
29 <        char  *fgets(), *fgetline();
30 >        char  *fgetline();
31          FILE  *infp;
32          char  buf[512];
33          register int  c;
# Line 51 | Line 52 | int  (*callback)();
52                  } else if (c == '!') {                  /* command */
53                          ungetc(c, infp);
54                          fgetline(buf, sizeof(buf), infp);
55 <                        readobj(buf, callback);
55 >                        readobj2(buf, callback);
56                  } else {                                /* object */
57                          ungetc(c, infp);
58 <                        getobject(input, infp, callback);
58 >                        getobject2(input, infp, callback);
59                  }
60          }
61          if (input[0] == '!')
# Line 64 | Line 65 | int  (*callback)();
65   }
66  
67  
68 < getobject(name, fp, f)                  /* read the next object */
69 < char  *name;
70 < FILE  *fp;
71 < int  (*f)();
68 > static void
69 > getobject2(                     /* read the next object */
70 >        char  *name,
71 >        FILE  *fp,
72 >        ro_cbfunc f
73 > )
74   {
75          char  sbuf[MAXSTR];
76          OBJREC  thisobj;
77                                          /* get modifier */
78 <        fscanf(fp, "%*s");
78 >        fgetword(sbuf, MAXSTR, fp);
79          thisobj.omod = OVOID;
80                                          /* get type */
81 <        fscanf(fp, "%s", sbuf);
82 <        if (!strcmp(sbuf, ALIASID))
80 <                thisobj.otype = -1;
81 <        else if ((thisobj.otype = otype(sbuf)) < 0) {
81 >        fgetword(sbuf, MAXSTR, fp);
82 >        if ((thisobj.otype = otype(sbuf)) < 0) {
83                  sprintf(errmsg, "(%s): unknown type \"%s\"", name, sbuf);
84                  error(USER, errmsg);
85          }
86                                          /* get identifier */
87 <        fscanf(fp, "%s", sbuf);
87 >        fgetword(sbuf, MAXSTR, fp);
88          thisobj.oname = sbuf;
89                                          /* get arguments */
90 <        if (thisobj.otype == -1) {
90 >        if (thisobj.otype == MOD_ALIAS) {
91                  fscanf(fp, "%*s");
92                  return;
93          }
94 <        if (readfargs(&thisobj.oargs, fp) < 0) {
94 >        if (readfargs(&thisobj.oargs, fp) <= 0) {
95                  sprintf(errmsg, "(%s): bad arguments", name);
96                  objerror(&thisobj, USER, errmsg);
97          }
98          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                }
102          freefargs(&thisobj.oargs);
103 < }
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);
103 >        free_os(&thisobj);
104   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines