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

Comparing ray/src/gen/xform.c (file contents):
Revision 2.15 by gregl, Fri May 30 18:24:32 1997 UTC vs.
Revision 2.18 by gwlarson, Fri Jun 4 15:51:04 1999 UTC

# Line 47 | Line 47 | short  tinvers[NUMOTYPE];              /* inverse types for surfac
47  
48   int  nrept = 1;                         /* number of array repetitions */
49  
50 < extern char  *malloc(), *fgetword();
50 > int stdinused = 0;                      /* stdin has been used by -f option? */
51  
52 + extern char  *malloc(), *fgets(), *fgetword();
53 +
54   char  mainfn[MAXPATH];                  /* main file name */
55   FILE  *mainfp = NULL;                   /* main file pointer */
56  
# Line 61 | Line 63 | char  *argv[];
63   {
64          char  *fname;
65          int  a;
66 <                                        /* check for array */
66 >                                        /* check for argument list file */
67          for (a = 1; a < argc; a++)
68 +                if (!strcmp(argv[a], "-f"))
69 +                        return(doargf(argc, argv, a));
70 +                                        /* check for regular array */
71 +        for (a = 1; a < argc; a++)
72                  if (!strcmp(argv[a], "-a"))
73                          return(doarray(argc, argv, a));
74  
# Line 124 | Line 130 | char  *argv[];
130          putchar('\n');
131                                          /* transform input */
132          if (xac == argc) {
133 +                if (stdinused) {
134 +                        fprintf(stderr, "%s: cannot use stdin more than once\n",
135 +                                        argv[0]);
136 +                        exit(1);
137 +                }
138                  openmain(NULL);
139                  xform(mainfn, mainfp);
140          } else
# Line 136 | Line 147 | char  *argv[];
147   }
148  
149  
150 + doargf(ac, av, fi)                      /* take argument list from file */
151 + char  **av;
152 + int  ac, fi;
153 + {
154 +        char  *newav[256], **avp;
155 +        char  argbuf[2048];
156 +        char  newid[128];
157 +        char  *oldid;
158 +        register char   *cp;
159 +        FILE    *argfp;
160 +        int  n, i, k, newac, err;
161 +        
162 +        if (fi >= ac-1 || (av[fi+1][0] == '-' && av[fi+1][1] != '\0')) {
163 +                fprintf(stderr, "%s: missing file for -f option\n", av[0]);
164 +                exit(1);
165 +        }
166 +        if (av[fi+1][0] == '-' && av[fi+1][1] == '\0') {
167 +                if (stdinused++) {
168 +                        fprintf(stderr, "%s: cannot use stdin more than once\n",
169 +                                        av[0]);
170 +                        exit(1);
171 +                }
172 +                argfp = stdin;
173 +                n = 100;                /* we just don't know! */
174 +        } else {
175 +                if ((argfp = fopen(av[fi+1], "r")) == NULL) {
176 +                        fprintf(stderr, "%s: cannot open argument file \"%s\"\n",
177 +                                        av[0], av[fi+1]);
178 +                        exit(1);
179 +                }
180 +                n = 0;                  /* count number of lines in file */
181 +                while (fgets(argbuf,sizeof(argbuf),argfp) != NULL)
182 +                        n += argbuf[0] != '\n' & argbuf[0] != '#';
183 +                if (!n) {
184 +                        fprintf(stderr, "%s: empty argument file \"%s\"\n",
185 +                                        av[0], av[fi+1]);
186 +                        exit(1);
187 +                }
188 +                nrept *= n;
189 +                rewind(argfp);
190 +        }
191 +        err = 0; k = 0;                 /* read each arg list and call main */
192 +        while (fgets(argbuf,sizeof(argbuf),argfp) != NULL) {
193 +                if (argbuf[0] == '\n' | argbuf[0] == '#')
194 +                        continue;
195 +                avp = newav+2;
196 +                avp[0] = av[0];
197 +                for (i = 1; i < fi; i++)
198 +                        avp[i] = av[i];
199 +                newac = i;
200 +                cp = argbuf;                    /* parse new words */
201 +                for ( ; ; ) {
202 +                        while (isspace(*cp))    /* nullify spaces */
203 +                                *cp++ = '\0';
204 +                        if (!*cp)               /* all done? */
205 +                                break;
206 +                        avp[newac++] = cp;      /* add argument to list */
207 +                        while (*++cp && !isspace(*cp))
208 +                                ;
209 +                }
210 +                for (i = fi+2; i < ac; i++)
211 +                        avp[newac++] = av[i];
212 +                avp[newac] = NULL;
213 +                oldid = NULL;
214 +                for (i = 2; i < newac; i++)
215 +                        if (!strcmp(avp[i-1], "-n")) {
216 +                                oldid = avp[i];
217 +                                avp[i] = newid;
218 +                                break;
219 +                        }
220 +                if (oldid == NULL) {
221 +                        newav[0] = av[0];
222 +                        newav[1] = "-n";
223 +                        newav[2] = newid;
224 +                        avp = newav;
225 +                        newac += 2;
226 +                }
227 +                if (oldid == NULL)
228 +                        sprintf(newid, "i%d", k);
229 +                else
230 +                        sprintf(newid, "%s.%d", oldid, k);
231 +                err |= main(newac, avp);
232 +                k++;
233 +        }
234 +        fclose(argfp);
235 +        return(err);
236 + }
237 +
238 +
239   doarray(ac, av, ai)                     /* make array */
240   char  **av;
241   int  ac, ai;
# Line 145 | Line 245 | int  ac, ai;
245          char  *oldid = NULL;
246          int  n, i, err;
247          
248 +        if (ai >= ac-1 || (n = atoi(av[ai+1])) <= 0) {
249 +                fprintf(stderr, "%s: missing count for -a option\n", av[0]);
250 +                exit(1);
251 +        }
252 +        nrept *= n;
253          avp = newav+2;
254          avp[0] = av[0];
255          for (i = 1; i < ac; i++)
# Line 163 | Line 268 | int  ac, ai;
268                  avp = newav;
269                  ac += 2;
270          }
166        nrept *= n = atoi(av[ai+1]);
271          err = 0;
272          for (i = 0; i < n; i++) {
273                  if (oldid == NULL)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines