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.16 by gwlarson, Thu Jun 3 14:15:01 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 > extern char  *malloc(), *fgets(), *fgetword();
51  
52 < char  *mainfn[MAXPATH];                 /* main file name */
52 > char  mainfn[MAXPATH];                  /* main file name */
53   FILE  *mainfp = NULL;                   /* main file pointer */
54  
55   #define  progname  (xav[0])
# Line 61 | Line 61 | char  *argv[];
61   {
62          char  *fname;
63          int  a;
64 <                                        /* check for array */
64 >                                        /* check for argument list file */
65          for (a = 1; a < argc; a++)
66 +                if (!strcmp(argv[a], "-f"))
67 +                        return(doargf(argc, argv, a));
68 +                                        /* check for regular array */
69 +        for (a = 1; a < argc; a++)
70                  if (!strcmp(argv[a], "-a"))
71                          return(doarray(argc, argv, a));
72  
# Line 81 | Line 85 | char  *argv[];
85                                          break;
86                                  idprefix = argv[++a];
87                                  continue;
88 +                        case 'c':
89 +                                if (argv[a][2])
90 +                                        break;
91 +                                expand = 0;
92 +                                continue;
93                          case 'e':
94                                  if (argv[a][2])
95                                          break;
# Line 131 | Line 140 | char  *argv[];
140   }
141  
142  
143 + doargf(ac, av, fi)                      /* take argument list from file */
144 + char  **av;
145 + int  ac, fi;
146 + {
147 +        char  *newav[256], **avp;
148 +        char  argbuf[2048];
149 +        char  newid[128];
150 +        char  *oldid;
151 +        register char   *cp;
152 +        FILE    *argfp;
153 +        int  n, i, k, newac, err;
154 +        
155 +        if (fi >= ac-1 || av[fi+1][0] == '-') {
156 +                fprintf(stderr, "%s: missing file for -f option\n", av[0]);
157 +                exit(1);
158 +        }
159 +        if ((argfp = fopen(av[fi+1], "r")) == NULL) {
160 +                fprintf(stderr, "%s: cannot open argument file \"%s\"\n",
161 +                                av[0], av[fi+1]);
162 +                exit(1);
163 +        }
164 +        n = 0;                  /* count number of lines in file */
165 +        while (fgets(argbuf, sizeof(argbuf), argfp) != NULL)
166 +                n++;
167 +        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);
177 +                avp = newav+2;
178 +                avp[0] = av[0];
179 +                for (i = 1; i < fi; i++)
180 +                        avp[i] = av[i];
181 +                newac = i;
182 +                cp = argbuf;                    /* parse new words */
183 +                for ( ; ; ) {
184 +                        while (isspace(*cp))    /* nullify spaces */
185 +                                *cp++ = '\0';
186 +                        if (!*cp)               /* all done? */
187 +                                break;
188 +                        avp[newac++] = cp;      /* add argument to list */
189 +                        while (*++cp && !isspace(*cp))
190 +                                ;
191 +                }
192 +                for (i = fi+2; i < ac; i++)
193 +                        avp[newac++] = av[i];
194 +                avp[newac] = NULL;
195 +                oldid = NULL;
196 +                for (i = 2; i < newac; i++)
197 +                        if (!strcmp(avp[i-1], "-n")) {
198 +                                oldid = avp[i];
199 +                                avp[i] = newid;
200 +                                break;
201 +                        }
202 +                if (oldid == NULL) {
203 +                        newav[0] = av[0];
204 +                        newav[1] = "-n";
205 +                        newav[2] = newid;
206 +                        avp = newav;
207 +                        newac += 2;
208 +                }
209 +                if (oldid == NULL)
210 +                        sprintf(newid, "i%d", k);
211 +                else
212 +                        sprintf(newid, "%s.%d", oldid, k);
213 +                err |= main(newac, avp);
214 +        }
215 +        fclose(argfp);
216 +        return(err);
217 + }
218 +
219 +
220   doarray(ac, av, ai)                     /* make array */
221   char  **av;
222   int  ac, ai;
# Line 140 | Line 226 | int  ac, ai;
226          char  *oldid = NULL;
227          int  n, i, err;
228          
229 +        if (ai >= ac-1 || (n = atoi(av[ai+1])) <= 0) {
230 +                fprintf(stderr, "%s: missing count for -a option\n", av[0]);
231 +                exit(1);
232 +        }
233 +        nrept *= n;
234          avp = newav+2;
235          avp[0] = av[0];
236          for (i = 1; i < ac; i++)
# Line 158 | Line 249 | int  ac, ai;
249                  avp = newav;
250                  ac += 2;
251          }
161        nrept *= n = atoi(av[ai+1]);
252          err = 0;
253          for (i = 0; i < n; i++) {
254                  if (oldid == NULL)
# Line 227 | Line 317 | FILE  *fin;
317          } else {
318                  printf("\n%s", buf);
319                  if (xac > 1) {
320 <                        printf(" | %s -e", xav[0]);
320 >                        printf(" | %s", xav[0]);
321                          for (i = 1; i < xac; i++)
322                                  printf(" %s", xav[i]);
323                  }
# Line 415 | Line 505 | FILE  *fin;
505  
506          if (readfargs(&fa, fin) != 1)
507                  return(-1);
508 <        if (fa.nfargs > 5)
508 >        if (fa.nfargs > 7)
509                  return(-1);
510          printf("%d", fa.nsargs);
511          if (idprefix == NULL)
# Line 441 | Line 531 | FILE  *fin;
531          if (fa.nfargs > 2)
532                  printf(" %12.6g %12.6g %12.6g", fa.farg[0]/tot.sca,
533                                  fa.farg[1]/tot.sca, fa.farg[2]/tot.sca);
534 <        if (fa.nfargs > 3)
535 <                printf(" %12.6g", fa.farg[3]);
446 <        if (fa.nfargs > 4)
447 <                printf(" %12.6g", fa.farg[4]);
534 >        for (i = 3; i < fa.nfargs; i++)
535 >                printf(" %12.6g", fa.farg[i]);
536          printf("\n");
537          freefargs(&fa);
538          return(0);
# Line 764 | Line 852 | char  *fname;
852          extern FILE  *tmpfile();
853          extern char  *getlibpath(), *getpath();
854          static char  origdir[MAXPATH];
855 <        static char  curdir[MAXPATH];
856 <        char  newdir[MAXPATH], *cp;
855 >        static char  curfn[MAXPATH];
856 >        static int  diffdir;
857 >        register char  *fpath;
858  
859          if (fname == NULL) {                    /* standard input */
860                  if (mainfp == NULL) {
# Line 789 | Line 878 | char  *fname;
878                  rewind(mainfp);                 /* rewind copy */
879                  return;
880          }
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;
881          if (mainfp == NULL) {                   /* first call, initialize */
882                  getwd(origdir);
883 <                strcpy(curdir, origdir);
803 <        } else if (!strcmp(cp, mainfn)) {       /* just need to rewind? */
883 >        } else if (!strcmp(fname, curfn)) {     /* just need to rewind? */
884                  rewind(mainfp);
885                  return;
886 <        } else                                  /* else close old stream */
886 >        } else {                                /* else close old stream */
887                  fclose(mainfp);
888 +                if (diffdir) {
889 +                        chdir(origdir);
890 +                        diffdir = 0;
891 +                }
892 +        }
893 +        strcpy(curfn, fname);                   /* remember file name */
894 +                                                /* get full path */
895 +        if ((fpath = getpath(fname, getlibpath(), R_OK)) == NULL) {
896 +                fprintf(stderr, "%s: cannot find file \"%s\"\n",
897 +                                progname, fname);
898 +                exit(1);
899 +        }
900 +        if (fpath[0] == '.' && ISDIRSEP(fpath[1]))      /* remove leading ./ */
901 +                fpath += 2;
902                                                  /* record path name */
903 <        strcpy(mainfn, cp);
904 <        if (expand) {                           /* get directory component */
905 <                if (ISDIRSEP(cp[0]))
906 <                        strcpy(newdir, cp);
907 <                else
908 <                        sprintf(newdir, "%s%c%s", origdir, DIRSEP, cp);
909 <                for (cp = newdir+strlen(newdir); !ISDIRSEP(cp[-1]); cp--)
910 <                        ;
903 >        strcpy(mainfn, fpath);
904 >        if (expand) {                           /* change to local directory */
905 >                register char  *cp = fpath + strlen(fpath);     /* get dir. */
906 >                while (cp > fpath) {
907 >                        cp--;
908 >                        if (ISDIRSEP(*cp)) {
909 >                                if (cp == fpath)
910 >                                        cp++;   /* root special case */
911 >                                break;
912 >                        }
913 >                }
914                  *cp = '\0';
915 <                if (strcmp(newdir, curdir)) {   /* change to new directory? */
916 <                        if (chdir(newdir) < 0) {
915 >                if (fpath[0]) {                 /* change to new directory? */
916 >                        if (chdir(fpath) < 0) {
917                                  fprintf(stderr,
918                                  "%s: cannot change directory to \"%s\"\n",
919 <                                                progname, newdir);
919 >                                                progname, fpath);
920                                  exit(1);
921                          }
922 <                        strcpy(curdir, newdir);
922 >                        diffdir++;
923                  }
924                                                  /* get final path component */
925 <                for (cp = fname+strlen(fname);
926 <                                cp > fname && !ISDIRSEP(cp[-1]); cp--)
925 >                for (fpath = fname+strlen(fname);
926 >                                fpath > fname && !ISDIRSEP(fpath[-1]); fpath--)
927                          ;
928          }
929                                                  /* open the file */
930 <        if ((mainfp = fopen(cp, "r")) == NULL) {
930 >        if ((mainfp = fopen(fpath, "r")) == NULL) {
931                  fprintf(stderr, "%s: cannot open file \"%s\"\n",
932                                  progname, mainfn);
933                  exit(1);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines