ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/loadvars.c
Revision: 2.14
Committed: Wed Jul 30 10:11:06 2003 UTC (20 years, 8 months ago) by schorsch
Content type: text/plain
Branch: MAIN
CVS Tags: rad4R2P2, rad3R7P2, rad3R7P1, rad4R2, rad4R1, rad4R0, rad3R6, rad3R6P1, rad3R8, rad3R9, rad4R2P1
Changes since 2.13: +2 -2 lines
Log Message:
Added prototypes submitted by Randolph Fritz.

File Contents

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