ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/loadvars.c
Revision: 2.15
Committed: Fri May 22 14:44:11 2015 UTC (8 years, 11 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R2, rad5R0, rad5R1
Changes since 2.14: +50 -37 lines
Log Message:
Added prototypes

File Contents

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