ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/loadvars.c
Revision: 2.16
Committed: Sat May 4 00:36:58 2019 UTC (5 years ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R3
Changes since 2.15: +3 -2 lines
Log Message:
Eliminated cases where stdin was being closed

File Contents

# User Rev Content
1 greg 2.1 #ifndef lint
2 greg 2.16 static const char RCSid[] = "$Id: loadvars.c,v 2.15 2015/05/22 14:44:11 greg Exp $";
3 greg 2.1 #endif
4     /*
5     * Routines for loading and checking variables from file.
6     */
7    
8 greg 2.10 #include "copyright.h"
9 greg 2.9
10 greg 2.1 #include <stdio.h>
11 greg 2.9 #include <stdlib.h>
12 greg 2.1 #include <ctype.h>
13 schorsch 2.12
14     #include "standard.h"
15 greg 2.1 #include "vars.h"
16    
17     #define NOCHAR 127 /* constant for character to delete */
18    
19 greg 2.4 extern char *fgetline();
20    
21 greg 2.1
22 greg 2.9 void
23 greg 2.15 loadvars( /* load variables into vv from file */
24     char *rfname
25     )
26 greg 2.1 {
27     FILE *fp;
28     char buf[512];
29 greg 2.15 char *cp;
30 greg 2.1
31     if (rfname == NULL)
32     fp = stdin;
33     else if ((fp = fopen(rfname, "r")) == NULL) {
34     perror(rfname);
35 greg 2.5 quit(1);
36 greg 2.1 }
37     while (fgetline(buf, sizeof(buf), fp) != NULL) {
38     for (cp = buf; *cp; cp++) {
39     switch (*cp) {
40     case '\\':
41     *cp++ = NOCHAR;
42     continue;
43     case '#':
44     *cp = '\0';
45     break;
46     default:
47     continue;
48     }
49     break;
50     }
51 greg 2.6 if (setvariable(buf, matchvar) < 0) {
52     fprintf(stderr, "%s: unknown variable: %s\n",
53     rfname, buf);
54     quit(1);
55     }
56 greg 2.1 }
57 greg 2.16 if (fp != stdin)
58     fclose(fp);
59 greg 2.1 }
60    
61    
62 greg 2.6 int
63 greg 2.15 setvariable( /* assign variable according to string */
64     char *ass,
65     VARIABLE *(*mv)(char*)
66     )
67 greg 2.1 {
68     char varname[32];
69     int n;
70 greg 2.15 char *cp;
71     VARIABLE *vp;
72     int i;
73 greg 2.1
74     while (isspace(*ass)) /* skip leading space */
75     ass++;
76     cp = varname; /* extract name */
77     while (cp < varname+sizeof(varname)-1
78     && *ass && !isspace(*ass) && *ass != '=')
79     *cp++ = *ass++;
80     *cp = '\0';
81     if (!varname[0])
82 greg 2.6 return(0); /* no variable name! */
83 greg 2.1 /* trim value */
84     while (isspace(*ass) || *ass == '=')
85     ass++;
86     for (n = strlen(ass); n > 0; n--)
87     if (!isspace(ass[n-1]))
88     break;
89 greg 2.6 if (!n)
90     return(0); /* no assignment */
91 greg 2.1 /* match variable from list */
92 greg 2.6 vp = (*mv)(varname);
93     if (vp == NULL)
94     return(-1);
95 greg 2.1 /* assign new value */
96 schorsch 2.13 if ( (i = vp->nass) ) {
97 greg 2.1 cp = vp->value;
98     while (i--)
99     while (*cp++)
100     ;
101     i = cp - vp->value;
102 greg 2.11 vp->value = (char *)realloc((void *)vp->value, i+n+1);
103 greg 2.1 } else
104 greg 2.9 vp->value = (char *)malloc(n+1);
105 greg 2.1 if (vp->value == NULL) {
106     perror(progname);
107 greg 2.5 quit(1);
108 greg 2.1 }
109     cp = vp->value+i; /* copy value, squeezing spaces */
110     *cp = *ass;
111     for (i = 1; i <= n; i++) {
112     if (ass[i] == NOCHAR)
113     continue;
114     if (isspace(*cp))
115     while (isspace(ass[i]))
116     i++;
117     *++cp = ass[i];
118     }
119     if (isspace(*cp)) /* remove trailing space */
120     *cp = '\0';
121 greg 2.6 return(++vp->nass);
122 greg 2.1 }
123    
124    
125     VARIABLE *
126 greg 2.15 matchvar( /* match a variable by its name */
127     char *nam
128     )
129 greg 2.1 {
130     int n = strlen(nam);
131 greg 2.15 int i;
132 greg 2.1
133     for (i = 0; i < NVARS; i++)
134     if (n >= vv[i].nick && !strncmp(nam, vv[i].name, n))
135     return(vv+i);
136     return(NULL);
137     }
138    
139    
140     char *
141 greg 2.15 nvalue( /* return nth variable value */
142     int vn,
143     int n
144     )
145 greg 2.1 {
146 greg 2.15 char *cp;
147 greg 2.1
148 schorsch 2.13 if ((vval(vn) == NULL) | (n < 0) | (n >= vdef(vn)))
149 greg 2.1 return(NULL);
150 greg 2.2 cp = vval(vn);
151 greg 2.1 while (n--)
152     while (*cp++)
153     ;
154     return(cp);
155     }
156    
157    
158 greg 2.9 void
159 greg 2.15 checkvalues(void) /* check assignments */
160 greg 2.1 {
161 greg 2.15 int i;
162 greg 2.1
163     for (i = 0; i < NVARS; i++)
164     if (vv[i].fixval != NULL)
165     (*vv[i].fixval)(vv+i);
166     }
167    
168    
169 greg 2.9 void
170 greg 2.15 onevalue( /* only one assignment for this variable */
171     VARIABLE *vp
172     )
173 greg 2.1 {
174     if (vp->nass < 2)
175     return;
176     if (!nowarn)
177     fprintf(stderr,
178     "%s: warning - multiple assignment of variable '%s'\n",
179     progname, vp->name);
180     do
181     vp->value += strlen(vp->value)+1;
182     while (--vp->nass > 1);
183     }
184    
185    
186 greg 2.9 void
187 greg 2.15 catvalues( /* concatenate variable values */
188     VARIABLE *vp
189     )
190 greg 2.1 {
191 greg 2.15 char *cp;
192 greg 2.1
193     if (vp->nass < 2)
194     return;
195     for (cp = vp->value; vp->nass > 1; vp->nass--) {
196     while (*cp)
197     cp++;
198     *cp++ = ' ';
199     }
200     }
201    
202    
203     int
204 greg 2.15 badmatch( /* case insensitive truncated comparison */
205     char *tv,
206     char *cv
207     )
208 greg 2.1 {
209     if (!*tv) return(1); /* null string cannot match */
210     do
211     if (UPPER(*tv) != *cv++)
212     return(1);
213     while (*++tv);
214     return(0); /* OK */
215     }
216    
217    
218 greg 2.9 void
219 greg 2.15 boolvalue( /* check boolean for legal values */
220     VARIABLE *vp
221     )
222 greg 2.1 {
223     if (!vp->nass) return;
224     onevalue(vp);
225     switch (UPPER(vp->value[0])) {
226     case 'T':
227     if (badmatch(vp->value, "TRUE")) break;
228     return;
229     case 'F':
230     if (badmatch(vp->value, "FALSE")) break;
231     return;
232     }
233     fprintf(stderr, "%s: illegal value for boolean variable '%s'\n",
234     progname, vp->name);
235 greg 2.5 quit(1);
236 greg 2.1 }
237    
238    
239 greg 2.9 void
240 greg 2.15 qualvalue( /* check qualitative var. for legal values */
241     VARIABLE *vp
242     )
243 greg 2.1 {
244     if (!vp->nass) return;
245     onevalue(vp);
246     switch (UPPER(vp->value[0])) {
247     case 'L':
248     if (badmatch(vp->value, "LOW")) break;
249     return;
250     case 'M':
251     if (badmatch(vp->value, "MEDIUM")) break;
252     return;
253     case 'H':
254     if (badmatch(vp->value, "HIGH")) break;
255     return;
256     }
257     fprintf(stderr, "%s: illegal value for qualitative variable '%s'\n",
258     progname, vp->name);
259 greg 2.5 quit(1);
260 greg 2.1 }
261    
262    
263 greg 2.9 void
264 greg 2.15 intvalue( /* check integer variable for legal values */
265     VARIABLE *vp
266     )
267 greg 2.1 {
268     if (!vp->nass) return;
269     onevalue(vp);
270     if (isint(vp->value)) return;
271     fprintf(stderr, "%s: illegal value for integer variable '%s'\n",
272     progname, vp->name);
273 greg 2.5 quit(1);
274 greg 2.1 }
275    
276    
277 greg 2.9 void
278 greg 2.15 fltvalue( /* check float variable for legal values */
279     VARIABLE *vp
280     )
281 greg 2.1 {
282     if (!vp->nass) return;
283     onevalue(vp);
284     if (isflt(vp->value)) return;
285     fprintf(stderr, "%s: illegal value for real variable '%s'\n",
286     progname, vp->name);
287 greg 2.5 quit(1);
288 greg 2.1 }
289    
290    
291 greg 2.9 void
292 greg 2.15 printvars( /* print variable values */
293     FILE *fp
294     )
295 greg 2.1 {
296     int i, j, k, clipline;
297 greg 2.15 char *cp;
298 greg 2.1
299     for (i = 0; i < NVARS; i++) /* print each variable */
300     for (j = 0; j < vdef(i); j++) { /* print each assignment */
301     fputs(vnam(i), fp);
302     fputs("= ", fp);
303 gwlarson 2.8 k = clipline = ( vv[i].fixval == catvalues ? 64 : 236 )
304 greg 2.1 - strlen(vnam(i)) ;
305 greg 2.2 cp = nvalue(i, j);
306 greg 2.1 while (*cp) {
307     putc(*cp++, fp);
308     if (--k <= 0) { /* line too long */
309     while (*cp && !isspace(*cp))
310 gwlarson 2.7 fputc(*cp++, fp); /* finish this word */
311 greg 2.1 if (*cp) { /* start new line */
312 gwlarson 2.7 if (vv[i].fixval == catvalues) {
313     fputc('\n', fp);
314     fputs(vnam(i), fp);
315     fputc('=', fp);
316     } else
317     fputs(" \\\n", fp);
318 greg 2.1 k = clipline;
319     }
320     }
321     }
322 gwlarson 2.7 fputc('\n', fp);
323 greg 2.1 }
324     fflush(fp);
325     }