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.16 by gwlarson, Thu Jun 3 14:15:01 1999 UTC vs.
Revision 2.21 by gwlarson, Fri Jun 4 17:06:31 1999 UTC

# Line 29 | Line 29 | int  xfa;                              /* start of xf arguments */
29   XF  tot;                                /* total transformation */
30   int  reverse;                           /* boolean true if scene mirrored */
31  
32 < int  invert = 0;                        /* boolean true to invert surfaces */
32 > int  invert;                            /* boolean true to invert surfaces */
33  
34 < int  expand = 1;                        /* boolean true to expand commands */
34 > int  expand;                            /* boolean true to expand commands */
35  
36 < char  *newmod = NULL;                   /* new modifier for surfaces */
36 > char  *newmod;                          /* new modifier for surfaces */
37  
38 < char  *idprefix = NULL;                 /* prefix for object identifiers */
38 > char  *idprefix;                        /* prefix for object identifiers */
39  
40   #define  ALIAS          NUMOTYPE        /* put alias at end of array */
41  
# Line 47 | Line 47 | short  tinvers[NUMOTYPE];              /* inverse types for surfac
47  
48   int  nrept = 1;                         /* number of array repetitions */
49  
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 */
# Line 59 | Line 61 | main(argc, argv)               /* get transform options and transfo
61   int  argc;
62   char  *argv[];
63   {
64 +        int  mal_prefix = 0;
65          char  *fname;
66          int  a;
67                                          /* check for argument list file */
# Line 70 | Line 73 | char  *argv[];
73                  if (!strcmp(argv[a], "-a"))
74                          return(doarray(argc, argv, a));
75  
76 <        initotypes();
76 >        initotypes();                   /* initialize */
77 >        invert = 0;
78 >        expand = 1;
79 >        newmod = NULL;
80 >        idprefix = NULL;
81  
82          for (a = 1; a < argc; a++) {
83                  if (argv[a][0] == '-')
84                          switch (argv[a][1]) {
85                          case 'm':
86 <                                if (argv[a][2] || a+1 >= argc)
86 >                                if (argv[a][2] | a+1 >= argc)
87                                          break;
88 <                                newmod = argv[++a];
88 >                                a++;
89 >                                if (newmod == NULL)
90 >                                        newmod = argv[a];
91                                  continue;
92                          case 'n':
93 <                                if (argv[a][2] || a+1 >= argc)
93 >                                if (argv[a][2] | a+1 >= argc)
94                                          break;
95 <                                idprefix = argv[++a];
95 >                                a++;
96 >                                if (idprefix == NULL)
97 >                                        idprefix = argv[a];
98 >                                else {
99 >                                        register char   *newp;
100 >                                        newp = (char *)malloc(strlen(idprefix)+
101 >                                                        strlen(argv[a])+2);
102 >                                        if (newp == NULL)
103 >                                                exit(2);
104 >                                        sprintf(newp, "%s.%s",
105 >                                                        idprefix, argv[a]);
106 >                                        if (mal_prefix++)
107 >                                                free((char *)idprefix);
108 >                                        idprefix = newp;
109 >                                }
110                                  continue;
111                          case 'c':
112                                  if (argv[a][2])
# Line 98 | Line 121 | char  *argv[];
121                          case 'I':
122                                  if (argv[a][2])
123                                          break;
124 <                                invert = 1;
124 >                                invert = !invert;
125                                  continue;
126                          }
127                  break;
# Line 128 | Line 151 | char  *argv[];
151          putchar('\n');
152                                          /* transform input */
153          if (xac == argc) {
154 +                if (stdinused) {
155 +                        fprintf(stderr, "%s: cannot use stdin more than once\n",
156 +                                        argv[0]);
157 +                        exit(1);
158 +                }
159                  openmain(NULL);
160                  xform(mainfn, mainfp);
161          } else
# Line 136 | Line 164 | char  *argv[];
164                          xform(mainfn, mainfp);
165                  }
166  
167 +        if (mal_prefix)
168 +                free((char *)idprefix);
169          return(0);
170   }
171  
# Line 145 | Line 175 | char  **av;
175   int  ac, fi;
176   {
177          char  *newav[256], **avp;
178 <        char  argbuf[2048];
178 >        char  argbuf[1024];
179          char  newid[128];
180          char  *oldid;
181          register char   *cp;
182          FILE    *argfp;
183          int  n, i, k, newac, err;
184          
185 <        if (fi >= ac-1 || av[fi+1][0] == '-') {
185 >        if (fi >= ac-1 || (av[fi+1][0] == '-' && av[fi+1][1] != '\0')) {
186                  fprintf(stderr, "%s: missing file for -f option\n", av[0]);
187                  exit(1);
188          }
189 <        if ((argfp = fopen(av[fi+1], "r")) == NULL) {
190 <                fprintf(stderr, "%s: cannot open argument file \"%s\"\n",
191 <                                av[0], av[fi+1]);
192 <                exit(1);
189 >        if (av[fi+1][0] == '-' && av[fi+1][1] == '\0') {
190 >                if (stdinused++) {
191 >                        fprintf(stderr, "%s: cannot use stdin more than once\n",
192 >                                        av[0]);
193 >                        exit(1);
194 >                }
195 >                argfp = stdin;
196 >                n = 100;                /* we just don't know! */
197 >        } else {
198 >                if ((argfp = fopen(av[fi+1], "r")) == NULL) {
199 >                        fprintf(stderr, "%s: cannot open argument file \"%s\"\n",
200 >                                        av[0], av[fi+1]);
201 >                        exit(1);
202 >                }
203 >                n = 0;                  /* count number of lines in file */
204 >                while (fgets(argbuf,sizeof(argbuf),argfp) != NULL)
205 >                        n += argbuf[0] != '\n' & argbuf[0] != '#';
206 >                if (!n) {
207 >                        fprintf(stderr, "%s: empty argument file \"%s\"\n",
208 >                                        av[0], av[fi+1]);
209 >                        exit(1);
210 >                }
211 >                nrept *= n;
212 >                rewind(argfp);
213          }
214 <        n = 0;                  /* count number of lines in file */
215 <        while (fgets(argbuf, sizeof(argbuf), argfp) != NULL)
216 <                n++;
217 <        if (!n) {
168 <                fprintf(stderr, "%s: empty argument file \"%s\"\n",
169 <                                av[0], av[fi+1]);
170 <                exit(1);
171 <        }
172 <        rewind(argfp);
173 <        nrept *= n;
174 <        err = 0;                        /* read each arg list and call main */
175 <        for (k = 0; k < n; k++) {
176 <                fgets(argbuf, sizeof(argbuf), argfp);
214 >        err = 0; k = 0;                 /* read each arg list and call main */
215 >        while (fgets(argbuf,sizeof(argbuf),argfp) != NULL) {
216 >                if (argbuf[0] == '\n' | argbuf[0] == '#')
217 >                        continue;
218                  avp = newav+2;
219                  avp[0] = av[0];
220                  for (i = 1; i < fi; i++)
221                          avp[i] = av[i];
222                  newac = i;
223 <                cp = argbuf;                    /* parse new words */
223 >                cp = argbuf;            /* parse new words */
224 >                if (*cp == '!') cp++;
225 >                if (!strncmp(cp, "xform ", 6)) cp += 6;
226                  for ( ; ; ) {
227                          while (isspace(*cp))    /* nullify spaces */
228                                  *cp++ = '\0';
# Line 211 | Line 254 | int  ac, fi;
254                  else
255                          sprintf(newid, "%s.%d", oldid, k);
256                  err |= main(newac, avp);
257 +                k++;
258          }
259          fclose(argfp);
260          return(err);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines