ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/xform.c
Revision: 2.18
Committed: Fri Jun 4 15:51:04 1999 UTC (24 years, 11 months ago) by gwlarson
Content type: text/plain
Branch: MAIN
Changes since 2.17: +6 -3 lines
Log Message:
made it so -f option ignores completely empty lines and comments

File Contents

# Content
1 /* Copyright (c) 1996 Regents of the University of California */
2
3 #ifndef lint
4 static char SCCSid[] = "$SunId$ LBL";
5 #endif
6
7 /*
8 * xform.c - program to transform object files.
9 * Transformations must preserve aspect ratio.
10 *
11 * 10/19/85
12 * 11/6/86 Finally added error checking!
13 */
14
15 #include "standard.h"
16
17 #include "paths.h"
18
19 #include <ctype.h>
20
21 #include "object.h"
22
23 #include "otypes.h"
24
25 int xac; /* global xform argument count */
26 char **xav; /* global xform argument pointer */
27 int xfa; /* start of xf arguments */
28
29 XF tot; /* total transformation */
30 int reverse; /* boolean true if scene mirrored */
31
32 int invert = 0; /* boolean true to invert surfaces */
33
34 int expand = 1; /* boolean true to expand commands */
35
36 char *newmod = NULL; /* new modifier for surfaces */
37
38 char *idprefix = NULL; /* prefix for object identifiers */
39
40 #define ALIAS NUMOTYPE /* put alias at end of array */
41
42 #define NUMTYPES (NUMOTYPE+1) /* total number of object types */
43
44 FUN ofun[NUMTYPES] = INIT_OTYPE; /* default types and actions */
45
46 short tinvers[NUMOTYPE]; /* inverse types for surfaces */
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 */
55 FILE *mainfp = NULL; /* main file pointer */
56
57 #define progname (xav[0])
58
59
60 main(argc, argv) /* get transform options and transform file */
61 int argc;
62 char *argv[];
63 {
64 char *fname;
65 int a;
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
75 initotypes();
76
77 for (a = 1; a < argc; a++) {
78 if (argv[a][0] == '-')
79 switch (argv[a][1]) {
80 case 'm':
81 if (argv[a][2] || a+1 >= argc)
82 break;
83 newmod = argv[++a];
84 continue;
85 case 'n':
86 if (argv[a][2] || a+1 >= argc)
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;
98 expand = 1;
99 continue;
100 case 'I':
101 if (argv[a][2])
102 break;
103 invert = 1;
104 continue;
105 }
106 break;
107 }
108
109 xav = argv;
110 xfa = a;
111
112 a += xf(&tot, argc-a, argv+a);
113
114 if (reverse = tot.sca < 0.0)
115 tot.sca = -tot.sca;
116 if (invert)
117 reverse = !reverse;
118
119 if (a < argc && argv[a][0] == '-') {
120 fprintf(stderr, "%s: command line error at '%s'\n",
121 argv[0], argv[a]);
122 exit(1);
123 }
124
125 xac = a;
126 /* simple header */
127 putchar('#');
128 for (a = 0; a < xac; a++)
129 printf(" %s", xav[a]);
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
141 for (a = xac; a < argc; a++) {
142 openmain(argv[a]);
143 xform(mainfn, mainfp);
144 }
145
146 return(0);
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;
242 {
243 char *newav[256], **avp;
244 char newid[128], repts[32];
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++)
256 if (!strcmp(av[i-1], "-n")) {
257 oldid = av[i];
258 avp[i] = newid;
259 } else
260 avp[i] = av[i];
261 avp[ai] = "-i";
262 avp[ai+1] = repts;
263 avp[i] = NULL;
264 if (oldid == NULL) {
265 newav[0] = av[0];
266 newav[1] = "-n";
267 newav[2] = newid;
268 avp = newav;
269 ac += 2;
270 }
271 err = 0;
272 for (i = 0; i < n; i++) {
273 if (oldid == NULL)
274 sprintf(newid, "a%d", i);
275 else
276 sprintf(newid, "%s.%d", oldid, i);
277 sprintf(repts, "%d", i);
278 err |= main(ac, avp);
279 }
280 return(err);
281 }
282
283
284 xform(name, fin) /* transform stream by tot.xfm */
285 char *name;
286 register FILE *fin;
287 {
288 int nobjs = 0;
289 register int c;
290
291 while ((c = getc(fin)) != EOF) {
292 if (isspace(c)) /* blank */
293 continue;
294 if (c == '#') { /* comment */
295 putchar(c);
296 do {
297 if ((c = getc(fin)) == EOF)
298 return;
299 putchar(c);
300 } while (c != '\n');
301 } else if (c == '!') { /* command */
302 ungetc(c, fin);
303 xfcomm(name, fin);
304 nobjs++;
305 } else { /* object */
306 ungetc(c, fin);
307 xfobject(name, fin);
308 nobjs++;
309 }
310 }
311 if (nobjs == 0)
312 fprintf(stderr, "%s: (%s): warning - empty file\n",
313 progname, name);
314 }
315
316
317 xfcomm(fname, fin) /* transform a command */
318 char *fname;
319 FILE *fin;
320 {
321 extern FILE *popen();
322 extern char *fgetline();
323 FILE *pin;
324 char buf[512];
325 int i;
326
327 fgetline(buf, sizeof(buf), fin);
328 if (expand) {
329 if ((pin = popen(buf+1, "r")) == NULL) {
330 fprintf(stderr, "%s: (%s): cannot execute \"%s\"\n",
331 progname, fname, buf);
332 exit(1);
333 }
334 xform(buf, pin);
335 pclose(pin);
336 } else {
337 printf("\n%s", buf);
338 if (xac > 1) {
339 printf(" | %s", xav[0]);
340 for (i = 1; i < xac; i++)
341 printf(" %s", xav[i]);
342 }
343 putchar('\n');
344 }
345 }
346
347
348 xfobject(fname, fin) /* transform an object */
349 char *fname;
350 FILE *fin;
351 {
352 extern char *strcpy();
353 char typ[16], nam[MAXSTR];
354 int fn;
355 /* modifier and type */
356 strcpy(typ, "EOF");
357 fgetword(nam, sizeof(nam), fin);
358 fgetword(typ, sizeof(typ), fin);
359 if ((fn = otype(typ)) < 0) {
360 fprintf(stderr, "%s: (%s): unknown object type \"%s\"\n",
361 progname, fname, typ);
362 exit(1);
363 }
364 if (ismodifier(fn))
365 printf("\n%s %s ", nam, typ);
366 else
367 printf("\n%s %s ", newmod != NULL ? newmod : nam,
368 invert ? ofun[tinvers[fn]].funame : typ);
369 /* object name */
370 fgetword(nam, sizeof(nam), fin);
371 if (idprefix == NULL || ismodifier(fn))
372 printf("%s\n", nam);
373 else
374 printf("%s.%s\n", idprefix, nam);
375 /* transform arguments */
376 if ((*ofun[fn].funp)(fin) < 0) {
377 fprintf(stderr, "%s: (%s): bad %s \"%s\"\n",
378 progname, fname, ofun[fn].funame, nam);
379 exit(1);
380 }
381 }
382
383
384 o_default(fin) /* pass on arguments unchanged */
385 FILE *fin;
386 {
387 register int i;
388 FUNARGS fa;
389
390 if (readfargs(&fa, fin) != 1)
391 return(-1);
392 /* string arguments */
393 printf("%d", fa.nsargs);
394 for (i = 0; i < fa.nsargs; i++)
395 printf(" %s", fa.sarg[i]);
396 printf("\n");
397 #ifdef IARGS
398 /* integer arguments */
399 printf("%d", fa.niargs);
400 for (i = 0; i < fa.niargs; i++)
401 printf(" %d", fa.iarg[i]);
402 printf("\n");
403 #else
404 printf("0\n");
405 #endif
406 /* float arguments */
407 printf("%d", fa.nfargs);
408 for (i = 0; i < fa.nfargs; i++)
409 printf(" %18.12g", fa.farg[i]);
410 printf("\n");
411 freefargs(&fa);
412 return(0);
413 }
414
415
416 addxform(fin) /* add xf arguments to strings */
417 FILE *fin;
418 {
419 register int i;
420 int resetarr = 0;
421 FUNARGS fa;
422
423 if (readfargs(&fa, fin) != 1)
424 return(-1);
425 /* string arguments */
426 if (xac > xfa && strcmp(xav[xfa], "-i"))
427 resetarr = 2;
428 printf("%d", fa.nsargs + resetarr + xac-xfa);
429 for (i = 0; i < fa.nsargs; i++)
430 printf(" %s", fa.sarg[i]);
431 if (resetarr)
432 printf(" -i 1");
433 for (i = xfa; i < xac; i++) /* add xf arguments */
434 printf(" %s", xav[i]);
435 printf("\n");
436 #ifdef IARGS
437 /* integer arguments */
438 printf("%d", fa.niargs);
439 for (i = 0; i < fa.niargs; i++)
440 printf(" %d", fa.iarg[i]);
441 printf("\n");
442 #else
443 printf("0\n");
444 #endif
445 /* float arguments */
446 printf("%d", fa.nfargs);
447 for (i = 0; i < fa.nfargs; i++)
448 printf(" %18.12g", fa.farg[i]);
449 printf("\n");
450 freefargs(&fa);
451 return(0);
452 }
453
454
455 int
456 otype(ofname) /* get object function number from its name */
457 register char *ofname;
458 {
459 register int i;
460
461 for (i = 0; i < NUMTYPES; i++)
462 if (!strcmp(ofun[i].funame, ofname))
463 return(i);
464
465 return(-1); /* not found */
466 }
467
468
469 alias(fin) /* transfer alias */
470 FILE *fin;
471 {
472 char aliasnm[MAXSTR];
473
474 if (fgetword(aliasnm, MAXSTR, fin) == NULL)
475 return(-1);
476 printf("\t%s\n", aliasnm);
477 return(0);
478 }
479
480
481 m_glow(fin) /* transform arguments for proximity light */
482 FILE *fin;
483 {
484 FUNARGS fa;
485
486 if (readfargs(&fa, fin) != 1)
487 return(-1);
488 if (fa.nsargs != 0 || fa.nfargs != 4)
489 return(-1);
490 printf("0\n0\n4");
491 printf(" %18.12g %18.12g %18.12g",
492 fa.farg[0], fa.farg[1], fa.farg[2]);
493 printf(" %18.12g\n", fa.farg[3] * tot.sca);
494 freefargs(&fa);
495 return(0);
496 }
497
498
499 m_spot(fin) /* transform arguments for spotlight */
500 FILE *fin;
501 {
502 FVECT v;
503 FUNARGS fa;
504
505 if (readfargs(&fa, fin) != 1)
506 return(-1);
507 if (fa.nsargs != 0 || fa.nfargs != 7)
508 return(-1);
509 printf("0\n0\n7");
510 printf(" %18.12g %18.12g %18.12g %18.12g\n",
511 fa.farg[0], fa.farg[1], fa.farg[2], fa.farg[3]);
512 multv3(v, fa.farg+4, tot.xfm);
513 printf("\t%18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
514 freefargs(&fa);
515 return(0);
516 }
517
518
519 m_mist(fin) /* transform arguments for mist */
520 FILE *fin;
521 {
522 FUNARGS fa;
523 int i;
524
525 if (readfargs(&fa, fin) != 1)
526 return(-1);
527 if (fa.nfargs > 7)
528 return(-1);
529 printf("%d", fa.nsargs);
530 if (idprefix == NULL)
531 for (i = 0; i < fa.nsargs; i++)
532 printf(" %s", fa.sarg[i]);
533 else
534 for (i = 0; i < fa.nsargs; i++) {
535 char sname[256], *sp;
536 register char *cp1, *cp2 = sname;
537 /* add idprefix */
538 for (sp = fa.sarg[i]; *sp; sp = cp1) {
539 for (cp1 = idprefix; *cp1; )
540 *cp2++ = *cp1++;
541 *cp2++ = '.';
542 for (cp1 = sp; *cp1 &&
543 (*cp2++ = *cp1++) != '>'; )
544 ;
545 }
546 *cp2 = '\0';
547 printf(" %s", sname);
548 }
549 printf("\n0\n%d", fa.nfargs);
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 for (i = 3; i < fa.nfargs; i++)
554 printf(" %12.6g", fa.farg[i]);
555 printf("\n");
556 freefargs(&fa);
557 return(0);
558 }
559
560
561 m_dielectric(fin) /* transform arguments for dielectric */
562 FILE *fin;
563 {
564 FUNARGS fa;
565
566 if (readfargs(&fa, fin) != 1)
567 return(-1);
568 if (fa.nsargs != 0 || fa.nfargs != 5)
569 return(-1);
570 printf("0\n0\n5");
571 printf(" %12.6g %12.6g %12.6g",
572 pow(fa.farg[0], 1.0/tot.sca),
573 pow(fa.farg[1], 1.0/tot.sca),
574 pow(fa.farg[2], 1.0/tot.sca));
575 printf(" %12.6g %12.6g\n", fa.farg[3], fa.farg[4]);
576 freefargs(&fa);
577 return(0);
578 }
579
580
581 m_interface(fin) /* transform arguments for interface */
582 FILE *fin;
583 {
584 FUNARGS fa;
585
586 if (readfargs(&fa, fin) != 1)
587 return(-1);
588 if (fa.nsargs != 0 || fa.nfargs != 8)
589 return(-1);
590 printf("0\n0\n8\n");
591 printf("%12.6g %12.6g %12.6g",
592 pow(fa.farg[0], 1.0/tot.sca),
593 pow(fa.farg[1], 1.0/tot.sca),
594 pow(fa.farg[2], 1.0/tot.sca));
595 printf(" %12.6g\n", fa.farg[3]);
596 printf("%12.6g %12.6g %12.6g",
597 pow(fa.farg[4], 1.0/tot.sca),
598 pow(fa.farg[5], 1.0/tot.sca),
599 pow(fa.farg[6], 1.0/tot.sca));
600 printf(" %12.6g\n", fa.farg[7]);
601 freefargs(&fa);
602 return(0);
603 }
604
605
606 text(fin) /* transform text arguments */
607 FILE *fin;
608 {
609 int i;
610 FVECT v;
611 FUNARGS fa;
612
613 if (readfargs(&fa, fin) != 1)
614 return(-1);
615 if (fa.nfargs < 9)
616 return(-1);
617 /* string arguments */
618 printf("%d", fa.nsargs);
619 for (i = 0; i < fa.nsargs; i++)
620 printf(" %s", fa.sarg[i]);
621 printf("\n0\n%d\n", fa.nfargs);
622 /* anchor point */
623 multp3(v, fa.farg, tot.xfm);
624 printf(" %18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
625 /* right vector */
626 multv3(v, fa.farg+3, tot.xfm);
627 printf(" %18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
628 /* down vector */
629 multv3(v, fa.farg+6, tot.xfm);
630 printf(" %18.12g %18.12g %18.12g", v[0], v[1], v[2]);
631 /* remaining arguments */
632 for (i = 9; i < fa.nfargs; i++) {
633 if (i%3 == 0)
634 putchar('\n');
635 printf(" %18.12g", fa.farg[i]);
636 }
637 putchar('\n');
638 freefargs(&fa);
639 return(0);
640 }
641
642
643 o_source(fin) /* transform source arguments */
644 FILE *fin;
645 {
646 FVECT dv;
647 FUNARGS fa;
648
649 if (readfargs(&fa, fin) != 1)
650 return(-1);
651 if (fa.nsargs != 0 || fa.nfargs != 4)
652 return(-1);
653 /* transform direction vector */
654 multv3(dv, fa.farg, tot.xfm);
655 /* output */
656 printf("0\n0\n4");
657 printf(" %18.12g %18.12g %18.12g %18.12g\n",
658 dv[0], dv[1], dv[2], fa.farg[3]);
659 freefargs(&fa);
660 return(0);
661 }
662
663
664 o_sphere(fin) /* transform sphere arguments */
665 FILE *fin;
666 {
667 FVECT cent;
668 double rad;
669 FUNARGS fa;
670
671 if (readfargs(&fa, fin) != 1)
672 return(-1);
673 if (fa.nsargs != 0 || fa.nfargs != 4)
674 return(-1);
675
676 multp3(cent, fa.farg, tot.xfm); /* transform center */
677
678 rad = fa.farg[3] * tot.sca; /* scale radius */
679
680 printf("0\n0\n4");
681 printf(" %18.12g %18.12g %18.12g %18.12g\n",
682 cent[0], cent[1], cent[2], rad);
683 freefargs(&fa);
684 return(0);
685 }
686
687
688 o_face(fin) /* transform face arguments */
689 FILE *fin;
690 {
691 FVECT p;
692 register int i;
693 FUNARGS fa;
694
695 if (readfargs(&fa, fin) != 1)
696 return(-1);
697 if (fa.nsargs != 0 || fa.nfargs % 3)
698 return(-1);
699
700 printf("0\n0\n%d\n", fa.nfargs);
701
702 for (i = 0; i < fa.nfargs; i += 3) {
703 if (reverse)
704 multp3(p, fa.farg+(fa.nfargs-i-3), tot.xfm);
705 else
706 multp3(p, fa.farg+i, tot.xfm);
707 printf(" %18.12g %18.12g %18.12g\n", p[0], p[1], p[2]);
708 }
709 freefargs(&fa);
710 return(0);
711 }
712
713
714 o_cone(fin) /* transform cone and cup arguments */
715 FILE *fin;
716 {
717 FVECT p0, p1;
718 double r0, r1;
719 FUNARGS fa;
720
721 if (readfargs(&fa, fin) != 1)
722 return(-1);
723 if (fa.nsargs != 0 || fa.nfargs != 8)
724 return(-1);
725
726 printf("0\n0\n8\n");
727
728 multp3(p0, fa.farg, tot.xfm);
729 multp3(p1, fa.farg+3, tot.xfm);
730 r0 = fa.farg[6] * tot.sca;
731 r1 = fa.farg[7] * tot.sca;
732 printf(" %18.12g %18.12g %18.12g\n", p0[0], p0[1], p0[2]);
733 printf(" %18.12g %18.12g %18.12g\n", p1[0], p1[1], p1[2]);
734 printf(" %18.12g %18.12g\n", r0, r1);
735
736 freefargs(&fa);
737 return(0);
738 }
739
740
741 o_cylinder(fin) /* transform cylinder and tube arguments */
742 FILE *fin;
743 {
744 FVECT p0, p1;
745 double rad;
746 FUNARGS fa;
747
748 if (readfargs(&fa, fin) != 1)
749 return(-1);
750 if (fa.nsargs != 0 || fa.nfargs != 7)
751 return(-1);
752
753 printf("0\n0\n7\n");
754
755 multp3(p0, fa.farg, tot.xfm);
756 multp3(p1, fa.farg+3, tot.xfm);
757 rad = fa.farg[6] * tot.sca;
758 printf(" %18.12g %18.12g %18.12g\n", p0[0], p0[1], p0[2]);
759 printf(" %18.12g %18.12g %18.12g\n", p1[0], p1[1], p1[2]);
760 printf(" %18.12g\n", rad);
761 freefargs(&fa);
762 return(0);
763 }
764
765
766 o_ring(fin) /* transform ring arguments */
767 FILE *fin;
768 {
769 FVECT p0, pd;
770 double r0, r1;
771 FUNARGS fa;
772
773 if (readfargs(&fa, fin) != 1)
774 return(-1);
775 if (fa.nsargs != 0 || fa.nfargs != 8)
776 return(-1);
777
778 printf("0\n0\n8\n");
779
780 multp3(p0, fa.farg, tot.xfm);
781 multv3(pd, fa.farg+3, tot.xfm);
782 if (invert) {
783 pd[0] = -pd[0];
784 pd[1] = -pd[1];
785 pd[2] = -pd[2];
786 }
787 r0 = fa.farg[6] * tot.sca;
788 r1 = fa.farg[7] * tot.sca;
789 printf(" %18.12g %18.12g %18.12g\n", p0[0], p0[1], p0[2]);
790 printf(" %18.12g %18.12g %18.12g\n", pd[0], pd[1], pd[2]);
791 printf(" %18.12g %18.12g\n", r0, r1);
792 freefargs(&fa);
793 return(0);
794 }
795
796
797 initotypes() /* initialize ofun[] array */
798 {
799 register int i;
800
801 if (ofun[OBJ_SOURCE].funp == o_source)
802 return; /* done already */
803 /* alias is additional */
804 ofun[ALIAS].funame = ALIASID;
805 ofun[ALIAS].flags = 0;
806 /* functions get new transform */
807 for (i = 0; i < NUMTYPES; i++)
808 if (hasfunc(i))
809 ofun[i].funp = addxform;
810 /* special cases */
811 ofun[OBJ_SOURCE].funp = o_source;
812 ofun[OBJ_SPHERE].funp =
813 ofun[OBJ_BUBBLE].funp = o_sphere;
814 ofun[OBJ_FACE].funp = o_face;
815 ofun[OBJ_CONE].funp =
816 ofun[OBJ_CUP].funp = o_cone;
817 ofun[OBJ_CYLINDER].funp =
818 ofun[OBJ_TUBE].funp = o_cylinder;
819 ofun[OBJ_RING].funp = o_ring;
820 ofun[OBJ_INSTANCE].funp = addxform;
821 ofun[MAT_GLOW].funp = m_glow;
822 ofun[MAT_SPOT].funp = m_spot;
823 ofun[MAT_DIELECTRIC].funp = m_dielectric;
824 ofun[MAT_INTERFACE].funp = m_interface;
825 ofun[MAT_MIST].funp = m_mist;
826 ofun[PAT_CTEXT].funp =
827 ofun[PAT_BTEXT].funp =
828 ofun[MIX_TEXT].funp = text;
829 ofun[ALIAS].funp = alias;
830 /* surface inverses */
831 tinvers[OBJ_FACE] = OBJ_FACE;
832 tinvers[OBJ_SOURCE] = OBJ_SOURCE;
833 tinvers[OBJ_CONE] = OBJ_CUP;
834 tinvers[OBJ_CUP] = OBJ_CONE;
835 tinvers[OBJ_SPHERE] = OBJ_BUBBLE;
836 tinvers[OBJ_BUBBLE] = OBJ_SPHERE;
837 tinvers[OBJ_RING] = OBJ_RING;
838 tinvers[OBJ_CYLINDER] = OBJ_TUBE;
839 tinvers[OBJ_TUBE] = OBJ_CYLINDER;
840 tinvers[OBJ_INSTANCE] = OBJ_INSTANCE; /* oh, well */
841 }
842
843
844 #ifdef OLDXFORM
845 openmain(fname)
846 char *fname;
847 {
848 if (fname == NULL) {
849 strcpy(mainfn, "standard input");
850 mainfp = stdin;
851 return;
852 }
853 if (mainfp != NULL) {
854 if (!strcmp(fname, mainfn)) {
855 rewind(mainfp);
856 return;
857 }
858 fclose(mainfp);
859 }
860 if ((mainfp = fopen(fname, "r")) == NULL) {
861 fprintf(stderr, "%s: cannot open file \"%s\"\n",
862 progname, fname);
863 exit(1);
864 }
865 strcpy(mainfn, fname);
866 }
867 #else
868 openmain(fname) /* open fname for input, changing to its directory */
869 char *fname;
870 {
871 extern FILE *tmpfile();
872 extern char *getlibpath(), *getpath();
873 static char origdir[MAXPATH];
874 static char curfn[MAXPATH];
875 static int diffdir;
876 register char *fpath;
877
878 if (fname == NULL) { /* standard input */
879 if (mainfp == NULL) {
880 register int c;
881 strcpy(mainfn, "standard input");
882 if (nrept <= 1) {
883 mainfp = stdin;
884 return; /* just read once */
885 }
886 /* else copy */
887 if ((mainfp = tmpfile()) == NULL) {
888 fprintf(stderr,
889 "%s: cannot create temporary file\n",
890 progname);
891 exit(1);
892 }
893 while ((c = getc(stdin)) != EOF)
894 putc(c, mainfp);
895 fclose(stdin);
896 }
897 rewind(mainfp); /* rewind copy */
898 return;
899 }
900 if (mainfp == NULL) { /* first call, initialize */
901 getwd(origdir);
902 } else if (!strcmp(fname, curfn)) { /* just need to rewind? */
903 rewind(mainfp);
904 return;
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, 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 (fpath[0]) { /* change to new directory? */
935 if (chdir(fpath) < 0) {
936 fprintf(stderr,
937 "%s: cannot change directory to \"%s\"\n",
938 progname, fpath);
939 exit(1);
940 }
941 diffdir++;
942 }
943 /* get final path component */
944 for (fpath = fname+strlen(fname);
945 fpath > fname && !ISDIRSEP(fpath[-1]); fpath--)
946 ;
947 }
948 /* open the file */
949 if ((mainfp = fopen(fpath, "r")) == NULL) {
950 fprintf(stderr, "%s: cannot open file \"%s\"\n",
951 progname, mainfn);
952 exit(1);
953 }
954 }
955 #endif