--- ray/src/gen/xform.c 2003/06/30 14:59:11 2.28 +++ ray/src/gen/xform.c 2011/06/22 17:05:00 2.45 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: xform.c,v 2.28 2003/06/30 14:59:11 schorsch Exp $"; +static const char RCSid[] = "$Id: xform.c,v 2.45 2011/06/22 17:05:00 greg Exp $"; #endif /* * xform.c - program to transform object files. @@ -10,11 +10,12 @@ static const char RCSid[] = "$Id: xform.c,v 2.28 2003/ */ #include -#include -#include "standard.h" #include "platform.h" #include "paths.h" +#include "rtprocess.h" /* win_popen() */ +#include "rtio.h" +#include "rtmath.h" #include "object.h" #include "otypes.h" @@ -46,13 +47,24 @@ FILE *mainfp = NULL; /* main file pointer */ #define progname (xav[0]) +static int doargf(int ac, char **av, int fi); +static int doarray(int ac, char **av, int ai); +static void xform(char *name, FILE *fin); +static void xfcomm(char *fname, FILE *fin); +static void xfobject(char *fname, FILE *fin); +static int addxform(FILE *fin); +static int alias(FILE *fin); +void initotypes(void); /* XXX conflict with otypes.h */ +static void openmain(char *iname); -main(argc, argv) /* get transform options and transform file */ -int argc; -char *argv[]; + +int +main( /* get transform options and transform file */ + int argc, + char *argv[] +) { int mal_prefix = 0; - char *fname; int a; /* check for argument list file */ for (a = 1; a < argc; a++) @@ -73,14 +85,14 @@ char *argv[]; if (argv[a][0] == '-') switch (argv[a][1]) { case 'm': - if (argv[a][2] | a+1 >= argc) + if (argv[a][2] | (a+1 >= argc)) break; a++; if (newmod == NULL) newmod = argv[a]; continue; case 'n': - if (argv[a][2] | a+1 >= argc) + if (argv[a][2] | (a+1 >= argc)) break; a++; if (idprefix == NULL) @@ -122,7 +134,7 @@ char *argv[]; a += xf(&tot, argc-a, argv+a); - if (reverse = tot.sca < 0.0) + if ( (reverse = tot.sca < 0.0) ) tot.sca = -tot.sca; if (invert) reverse = !reverse; @@ -160,14 +172,17 @@ char *argv[]; } -doargf(ac, av, fi) /* take argument list from file */ -char **av; -int ac, fi; +int +doargf( /* take argument list from file */ + int ac, + char **av, + int fi +) { int inquote; char *newav[256], **avp; - char argbuf[1024]; - char newid[128]; + char argbuf[2048]; + char *newid, newidbuf[128]; char *oldid; register char *cp; FILE *argfp; @@ -221,7 +236,7 @@ int ac, fi; skipspaces: while (isspace(*cp)) /* nullify spaces */ *cp++ = '\0'; - if ((*cp == '"' | *cp == '\'')) + if ((*cp == '"') | (*cp == '\'')) inquote = *cp++; if (!*cp) /* all done? */ break; @@ -243,10 +258,16 @@ int ac, fi; for (i = fi+2; i < ac; i++) avp[newac++] = av[i]; avp[newac] = NULL; + newid = newidbuf; oldid = NULL; for (i = 2; i < newac; i++) if (!strcmp(avp[i-1], "-n")) { oldid = avp[i]; + if (strlen(oldid)+32 > sizeof(newidbuf)) { + newid = (char *)malloc(strlen(oldid)+32); + if (newid == NULL) + exit(2); + } avp[i] = newid; break; } @@ -262,6 +283,8 @@ int ac, fi; else sprintf(newid, "%s.%d", oldid, k); err |= main(newac, avp); + if (newid != newidbuf) + free((void *)newid); k++; } fclose(argfp); @@ -269,9 +292,12 @@ int ac, fi; } -doarray(ac, av, ai) /* make array */ -char **av; -int ac, ai; +int +doarray( /* make array */ + int ac, + char **av, + int ai +) { char *newav[256], **avp; char newid[128], repts[32]; @@ -314,9 +340,11 @@ int ac, ai; } -xform(name, fin) /* transform stream by tot.xfm */ -char *name; -register FILE *fin; +void +xform( /* transform stream by tot.xfm */ + char *name, + register FILE *fin +) { int nobjs = 0; register int c; @@ -347,12 +375,14 @@ register FILE *fin; } -xfcomm(fname, fin) /* transform a command */ -char *fname; -FILE *fin; +void +xfcomm( /* transform a command */ + char *fname, + FILE *fin +) { FILE *pin; - char buf[512]; + char buf[2048]; int i; fgetline(buf, sizeof(buf), fin); @@ -377,9 +407,11 @@ FILE *fin; } -xfobject(fname, fin) /* transform an object */ -char *fname; -FILE *fin; +void +xfobject( /* transform an object */ + char *fname, + FILE *fin +) { char typ[16], nam[MAXSTR]; int fn; @@ -392,17 +424,24 @@ FILE *fin; progname, fname, typ); exit(1); } - if (ismodifier(fn)) - printf("\n%s %s ", nam, typ); - else - printf("\n%s %s ", newmod != NULL ? newmod : nam, - invert ? ofun[tinvers[fn]].funame : typ); + putchar('\n'); + if (ismodifier(fn)) { + fputword(nam, stdout); + printf(" %s ", typ); + } else { + fputword(newmod != NULL ? newmod : nam, stdout); + printf(" %s ", invert ? ofun[tinvers[fn]].funame : typ); + } /* object name */ fgetword(nam, sizeof(nam), fin); if (idprefix == NULL || ismodifier(fn)) - printf("%s\n", nam); - else - printf("%s.%s\n", idprefix, nam); + fputword(nam, stdout); + else { + char nnam[MAXSTR]; + sprintf(nnam, "%s.%s", idprefix, nam); + fputword(nnam, stdout); + } + putchar('\n'); /* transform arguments */ if ((*ofun[fn].funp)(fin) < 0) { fprintf(stderr, "%s: (%s): bad %s \"%s\"\n", @@ -412,8 +451,10 @@ FILE *fin; } -o_default(fin) /* pass on arguments unchanged */ -FILE *fin; +int +o_default( /* pass on arguments unchanged */ + FILE *fin +) { register int i; FUNARGS fa; @@ -446,8 +487,10 @@ FILE *fin; } -addxform(fin) /* add xf arguments to strings */ -FILE *fin; +int +addxform( /* add xf arguments to strings */ + FILE *fin +) { register int i; int resetarr = 0; @@ -487,8 +530,10 @@ FILE *fin; } -alias(fin) /* transfer alias */ -FILE *fin; +int +alias( /* transfer alias */ + FILE *fin +) { char aliasnm[MAXSTR]; @@ -499,8 +544,10 @@ FILE *fin; } -m_glow(fin) /* transform arguments for proximity light */ -FILE *fin; +int +m_glow( /* transform arguments for proximity light */ + FILE *fin +) { FUNARGS fa; @@ -517,8 +564,10 @@ FILE *fin; } -m_spot(fin) /* transform arguments for spotlight */ -FILE *fin; +int +m_spot( /* transform arguments for spotlight */ + FILE *fin +) { FVECT v; FUNARGS fa; @@ -537,8 +586,10 @@ FILE *fin; } -m_mist(fin) /* transform arguments for mist */ -FILE *fin; +int +m_mist( /* transform arguments for mist */ + FILE *fin +) { FUNARGS fa; int i; @@ -579,8 +630,10 @@ FILE *fin; } -m_dielectric(fin) /* transform arguments for dielectric */ -FILE *fin; +int +m_dielectric( /* transform arguments for dielectric */ + FILE *fin +) { FUNARGS fa; @@ -599,8 +652,10 @@ FILE *fin; } -m_interface(fin) /* transform arguments for interface */ -FILE *fin; +int +m_interface( /* transform arguments for interface */ + FILE *fin +) { FUNARGS fa; @@ -624,8 +679,10 @@ FILE *fin; } -text(fin) /* transform text arguments */ -FILE *fin; +int +text( /* transform text arguments */ + FILE *fin +) { int i; FVECT v; @@ -663,8 +720,10 @@ FILE *fin; } -o_source(fin) /* transform source arguments */ -FILE *fin; +int +o_source( /* transform source arguments */ + FILE *fin +) { FVECT dv; FUNARGS fa; @@ -684,8 +743,10 @@ FILE *fin; } -o_sphere(fin) /* transform sphere arguments */ -FILE *fin; +int +o_sphere( /* transform sphere arguments */ + FILE *fin +) { FVECT cent; double rad; @@ -708,8 +769,10 @@ FILE *fin; } -o_face(fin) /* transform face arguments */ -FILE *fin; +int +o_face( /* transform face arguments */ + FILE *fin +) { FVECT p; register int i; @@ -734,8 +797,10 @@ FILE *fin; } -o_cone(fin) /* transform cone and cup arguments */ -FILE *fin; +int +o_cone( /* transform cone and cup arguments */ + FILE *fin +) { FVECT p0, p1; double r0, r1; @@ -761,8 +826,10 @@ FILE *fin; } -o_cylinder(fin) /* transform cylinder and tube arguments */ -FILE *fin; +int +o_cylinder( /* transform cylinder and tube arguments */ + FILE *fin +) { FVECT p0, p1; double rad; @@ -786,8 +853,10 @@ FILE *fin; } -o_ring(fin) /* transform ring arguments */ -FILE *fin; +int +o_ring( /* transform ring arguments */ + FILE *fin +) { FVECT p0, pd; double r0, r1; @@ -817,7 +886,8 @@ FILE *fin; } -initotypes() /* initialize ofun[] array */ +void +initotypes(void) /* initialize ofun[] array */ { register int i; @@ -837,7 +907,8 @@ initotypes() /* initialize ofun[] array */ ofun[OBJ_CYLINDER].funp = ofun[OBJ_TUBE].funp = o_cylinder; ofun[OBJ_RING].funp = o_ring; - ofun[OBJ_INSTANCE].funp = addxform; + ofun[OBJ_INSTANCE].funp = + ofun[OBJ_MESH].funp = addxform; ofun[MAT_GLOW].funp = m_glow; ofun[MAT_SPOT].funp = m_spot; ofun[MAT_DIELECTRIC].funp = m_dielectric; @@ -858,12 +929,15 @@ initotypes() /* initialize ofun[] array */ tinvers[OBJ_CYLINDER] = OBJ_TUBE; tinvers[OBJ_TUBE] = OBJ_CYLINDER; tinvers[OBJ_INSTANCE] = OBJ_INSTANCE; /* oh, well */ + tinvers[OBJ_MESH] = OBJ_MESH; /* ditto */ } #ifdef OLDXFORM -openmain(fname) -char *fname; +void +openmain( + char *fname +) { if (fname == NULL) { strcpy(mainfn, "standard input"); @@ -885,8 +959,10 @@ char *fname; strcpy(mainfn, fname); } #else -openmain(iname) /* open input, changing directory for file */ -char *iname; +void +openmain( /* open input, changing directory for file */ + char *iname +) { static char origdir[PATH_MAX]; static char curfn[PATH_MAX];