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.17 by gwlarson, Fri Jun 4 09:26: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++;
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;                        /* read each arg list and call main */
192 +        for (k = 0; fgets(argbuf,sizeof(argbuf),argfp) != NULL; k++) {
193 +                avp = newav+2;
194 +                avp[0] = av[0];
195 +                for (i = 1; i < fi; i++)
196 +                        avp[i] = av[i];
197 +                newac = i;
198 +                cp = argbuf;                    /* parse new words */
199 +                for ( ; ; ) {
200 +                        while (isspace(*cp))    /* nullify spaces */
201 +                                *cp++ = '\0';
202 +                        if (!*cp)               /* all done? */
203 +                                break;
204 +                        avp[newac++] = cp;      /* add argument to list */
205 +                        while (*++cp && !isspace(*cp))
206 +                                ;
207 +                }
208 +                for (i = fi+2; i < ac; i++)
209 +                        avp[newac++] = av[i];
210 +                avp[newac] = NULL;
211 +                oldid = NULL;
212 +                for (i = 2; i < newac; i++)
213 +                        if (!strcmp(avp[i-1], "-n")) {
214 +                                oldid = avp[i];
215 +                                avp[i] = newid;
216 +                                break;
217 +                        }
218 +                if (oldid == NULL) {
219 +                        newav[0] = av[0];
220 +                        newav[1] = "-n";
221 +                        newav[2] = newid;
222 +                        avp = newav;
223 +                        newac += 2;
224 +                }
225 +                if (oldid == NULL)
226 +                        sprintf(newid, "i%d", k);
227 +                else
228 +                        sprintf(newid, "%s.%d", oldid, k);
229 +                err |= main(newac, avp);
230 +        }
231 +        fclose(argfp);
232 +        return(err);
233 + }
234 +
235 +
236   doarray(ac, av, ai)                     /* make array */
237   char  **av;
238   int  ac, ai;
# Line 140 | Line 242 | int  ac, ai;
242          char  *oldid = NULL;
243          int  n, i, err;
244          
245 +        if (ai >= ac-1 || (n = atoi(av[ai+1])) <= 0) {
246 +                fprintf(stderr, "%s: missing count for -a option\n", av[0]);
247 +                exit(1);
248 +        }
249 +        nrept *= n;
250          avp = newav+2;
251          avp[0] = av[0];
252          for (i = 1; i < ac; i++)
# Line 158 | Line 265 | int  ac, ai;
265                  avp = newav;
266                  ac += 2;
267          }
161        nrept *= n = atoi(av[ai+1]);
268          err = 0;
269          for (i = 0; i < n; i++) {
270                  if (oldid == NULL)
# Line 227 | Line 333 | FILE  *fin;
333          } else {
334                  printf("\n%s", buf);
335                  if (xac > 1) {
336 <                        printf(" | %s -e", xav[0]);
336 >                        printf(" | %s", xav[0]);
337                          for (i = 1; i < xac; i++)
338                                  printf(" %s", xav[i]);
339                  }
# Line 415 | Line 521 | FILE  *fin;
521  
522          if (readfargs(&fa, fin) != 1)
523                  return(-1);
524 <        if (fa.nfargs > 5)
524 >        if (fa.nfargs > 7)
525                  return(-1);
526          printf("%d", fa.nsargs);
527          if (idprefix == NULL)
# Line 441 | Line 547 | FILE  *fin;
547          if (fa.nfargs > 2)
548                  printf(" %12.6g %12.6g %12.6g", fa.farg[0]/tot.sca,
549                                  fa.farg[1]/tot.sca, fa.farg[2]/tot.sca);
550 <        if (fa.nfargs > 3)
551 <                printf(" %12.6g", fa.farg[3]);
446 <        if (fa.nfargs > 4)
447 <                printf(" %12.6g", fa.farg[4]);
550 >        for (i = 3; i < fa.nfargs; i++)
551 >                printf(" %12.6g", fa.farg[i]);
552          printf("\n");
553          freefargs(&fa);
554          return(0);
# Line 764 | Line 868 | char  *fname;
868          extern FILE  *tmpfile();
869          extern char  *getlibpath(), *getpath();
870          static char  origdir[MAXPATH];
871 <        static char  curdir[MAXPATH];
872 <        char  newdir[MAXPATH], *cp;
871 >        static char  curfn[MAXPATH];
872 >        static int  diffdir;
873 >        register char  *fpath;
874  
875          if (fname == NULL) {                    /* standard input */
876                  if (mainfp == NULL) {
# Line 789 | Line 894 | char  *fname;
894                  rewind(mainfp);                 /* rewind copy */
895                  return;
896          }
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;
897          if (mainfp == NULL) {                   /* first call, initialize */
898                  getwd(origdir);
899 <                strcpy(curdir, origdir);
803 <        } else if (!strcmp(cp, mainfn)) {       /* just need to rewind? */
899 >        } else if (!strcmp(fname, curfn)) {     /* just need to rewind? */
900                  rewind(mainfp);
901                  return;
902 <        } else                                  /* else close old stream */
902 >        } else {                                /* else close old stream */
903                  fclose(mainfp);
904 +                if (diffdir) {
905 +                        chdir(origdir);
906 +                        diffdir = 0;
907 +                }
908 +        }
909 +        strcpy(curfn, fname);                   /* remember file name */
910 +                                                /* get full path */
911 +        if ((fpath = getpath(fname, getlibpath(), R_OK)) == NULL) {
912 +                fprintf(stderr, "%s: cannot find file \"%s\"\n",
913 +                                progname, fname);
914 +                exit(1);
915 +        }
916 +        if (fpath[0] == '.' && ISDIRSEP(fpath[1]))      /* remove leading ./ */
917 +                fpath += 2;
918                                                  /* record path name */
919 <        strcpy(mainfn, cp);
920 <        if (expand) {                           /* get directory component */
921 <                if (ISDIRSEP(cp[0]))
922 <                        strcpy(newdir, cp);
923 <                else
924 <                        sprintf(newdir, "%s%c%s", origdir, DIRSEP, cp);
925 <                for (cp = newdir+strlen(newdir); !ISDIRSEP(cp[-1]); cp--)
926 <                        ;
919 >        strcpy(mainfn, fpath);
920 >        if (expand) {                           /* change to local directory */
921 >                register char  *cp = fpath + strlen(fpath);     /* get dir. */
922 >                while (cp > fpath) {
923 >                        cp--;
924 >                        if (ISDIRSEP(*cp)) {
925 >                                if (cp == fpath)
926 >                                        cp++;   /* root special case */
927 >                                break;
928 >                        }
929 >                }
930                  *cp = '\0';
931 <                if (strcmp(newdir, curdir)) {   /* change to new directory? */
932 <                        if (chdir(newdir) < 0) {
931 >                if (fpath[0]) {                 /* change to new directory? */
932 >                        if (chdir(fpath) < 0) {
933                                  fprintf(stderr,
934                                  "%s: cannot change directory to \"%s\"\n",
935 <                                                progname, newdir);
935 >                                                progname, fpath);
936                                  exit(1);
937                          }
938 <                        strcpy(curdir, newdir);
938 >                        diffdir++;
939                  }
940                                                  /* get final path component */
941 <                for (cp = fname+strlen(fname);
942 <                                cp > fname && !ISDIRSEP(cp[-1]); cp--)
941 >                for (fpath = fname+strlen(fname);
942 >                                fpath > fname && !ISDIRSEP(fpath[-1]); fpath--)
943                          ;
944          }
945                                                  /* open the file */
946 <        if ((mainfp = fopen(cp, "r")) == NULL) {
946 >        if ((mainfp = fopen(fpath, "r")) == NULL) {
947                  fprintf(stderr, "%s: cannot open file \"%s\"\n",
948                                  progname, mainfn);
949                  exit(1);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines