ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/loadvars.c
Revision: 2.1
Committed: Tue Dec 12 14:00:48 1995 UTC (28 years, 4 months ago) by greg
Content type: text/plain
Branch: MAIN
Log Message:
Initial revision

File Contents

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