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.12 by greg, Wed Jun 12 11:55:27 1996 UTC vs.
Revision 2.18 by gwlarson, Fri Jun 4 15:51:04 1999 UTC

# Line 31 | Line 31 | int  reverse;                          /* boolean true if scene mirrored */
31  
32   int  invert = 0;                        /* boolean true to invert surfaces */
33  
34 < int  expand = 0;                        /* boolean true to expand commands */
34 > int  expand = 1;                        /* boolean true to expand commands */
35  
36   char  *newmod = NULL;                   /* new modifier for surfaces */
37  
# 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 < char  *mainfn[MAXPATH];                 /* main file name */
52 > extern char  *malloc(), *fgets(), *fgetword();
53 >
54 > char  mainfn[MAXPATH];                  /* main file name */
55   FILE  *mainfp = NULL;                   /* main file pointer */
56  
57   #define  progname  (xav[0])
# 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 81 | Line 87 | char  *argv[];
87                                          break;
88                                  idprefix = argv[++a];
89                                  continue;
90 +                        case 'c':
91 +                                if (argv[a][2])
92 +                                        break;
93 +                                expand = 0;
94 +                                continue;
95                          case 'e':
96                                  if (argv[a][2])
97                                          break;
# Line 119 | 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 131 | 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 140 | 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 158 | Line 268 | int  ac, ai;
268                  avp = newav;
269                  ac += 2;
270          }
161        nrept *= n = atoi(av[ai+1]);
271          err = 0;
272          for (i = 0; i < n; i++) {
273                  if (oldid == NULL)
# Line 227 | Line 336 | FILE  *fin;
336          } else {
337                  printf("\n%s", buf);
338                  if (xac > 1) {
339 <                        printf(" | %s -e", xav[0]);
339 >                        printf(" | %s", xav[0]);
340                          for (i = 1; i < xac; i++)
341                                  printf(" %s", xav[i]);
342                  }
# Line 415 | Line 524 | FILE  *fin;
524  
525          if (readfargs(&fa, fin) != 1)
526                  return(-1);
527 <        if (fa.nfargs > 5)
527 >        if (fa.nfargs > 7)
528                  return(-1);
529          printf("%d", fa.nsargs);
530          if (idprefix == NULL)
# Line 441 | Line 550 | FILE  *fin;
550          if (fa.nfargs > 2)
551                  printf(" %12.6g %12.6g %12.6g", fa.farg[0]/tot.sca,
552                                  fa.farg[1]/tot.sca, fa.farg[2]/tot.sca);
553 <        if (fa.nfargs > 3)
554 <                printf(" %12.6g", fa.farg[3]);
446 <        if (fa.nfargs > 4)
447 <                printf(" %12.6g", fa.farg[4]);
553 >        for (i = 3; i < fa.nfargs; i++)
554 >                printf(" %12.6g", fa.farg[i]);
555          printf("\n");
556          freefargs(&fa);
557          return(0);
# Line 764 | Line 871 | char  *fname;
871          extern FILE  *tmpfile();
872          extern char  *getlibpath(), *getpath();
873          static char  origdir[MAXPATH];
874 <        static char  curdir[MAXPATH];
875 <        char  newdir[MAXPATH], *cp;
874 >        static char  curfn[MAXPATH];
875 >        static int  diffdir;
876 >        register char  *fpath;
877  
878          if (fname == NULL) {                    /* standard input */
879                  if (mainfp == NULL) {
# Line 789 | Line 897 | char  *fname;
897                  rewind(mainfp);                 /* rewind copy */
898                  return;
899          }
792                                                /* get full path */
793        if ((cp = getpath(fname, getlibpath(), R_OK)) == NULL) {
794                fprintf(stderr, "%s: cannot find file \"%s\"\n",
795                                progname, fname);
796                exit(1);
797        }
798        if (cp[0] == '.' && ISDIRSEP(cp[1]))    /* remove leading ./ */
799                cp += 2;
900          if (mainfp == NULL) {                   /* first call, initialize */
901                  getwd(origdir);
902 <                strcpy(curdir, origdir);
803 <        } else if (!strcmp(cp, mainfn)) {       /* just need to rewind? */
902 >        } else if (!strcmp(fname, curfn)) {     /* just need to rewind? */
903                  rewind(mainfp);
904                  return;
905 <        } else                                  /* else close old stream */
905 >        } else {                                /* else close old stream */
906                  fclose(mainfp);
907 +                if (diffdir) {
908 +                        chdir(origdir);
909 +                        diffdir = 0;
910 +                }
911 +        }
912 +        strcpy(curfn, fname);                   /* remember file name */
913 +                                                /* get full path */
914 +        if ((fpath = getpath(fname, getlibpath(), R_OK)) == NULL) {
915 +                fprintf(stderr, "%s: cannot find file \"%s\"\n",
916 +                                progname, fname);
917 +                exit(1);
918 +        }
919 +        if (fpath[0] == '.' && ISDIRSEP(fpath[1]))      /* remove leading ./ */
920 +                fpath += 2;
921                                                  /* record path name */
922 <        strcpy(mainfn, cp);
923 <        if (expand) {                           /* get directory component */
924 <                if (ISDIRSEP(cp[0]))
925 <                        strcpy(newdir, cp);
926 <                else
927 <                        sprintf(newdir, "%s%c%s", origdir, DIRSEP, cp);
928 <                for (cp = newdir+strlen(newdir); !ISDIRSEP(cp[-1]); cp--)
929 <                        ;
922 >        strcpy(mainfn, fpath);
923 >        if (expand) {                           /* change to local directory */
924 >                register char  *cp = fpath + strlen(fpath);     /* get dir. */
925 >                while (cp > fpath) {
926 >                        cp--;
927 >                        if (ISDIRSEP(*cp)) {
928 >                                if (cp == fpath)
929 >                                        cp++;   /* root special case */
930 >                                break;
931 >                        }
932 >                }
933                  *cp = '\0';
934 <                if (strcmp(newdir, curdir)) {   /* change to new directory? */
935 <                        if (chdir(newdir) < 0) {
934 >                if (fpath[0]) {                 /* change to new directory? */
935 >                        if (chdir(fpath) < 0) {
936                                  fprintf(stderr,
937                                  "%s: cannot change directory to \"%s\"\n",
938 <                                                progname, newdir);
938 >                                                progname, fpath);
939                                  exit(1);
940                          }
941 <                        strcpy(curdir, newdir);
941 >                        diffdir++;
942                  }
943                                                  /* get final path component */
944 <                for (cp = fname+strlen(fname);
945 <                                cp > fname && !ISDIRSEP(cp[-1]); cp--)
944 >                for (fpath = fname+strlen(fname);
945 >                                fpath > fname && !ISDIRSEP(fpath[-1]); fpath--)
946                          ;
947          }
948                                                  /* open the file */
949 <        if ((mainfp = fopen(cp, "r")) == NULL) {
949 >        if ((mainfp = fopen(fpath, "r")) == NULL) {
950                  fprintf(stderr, "%s: cannot open file \"%s\"\n",
951                                  progname, mainfn);
952                  exit(1);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines