--- ray/src/util/rtcontrib.c 2005/06/09 17:27:28 1.14 +++ ray/src/util/rtcontrib.c 2005/06/14 02:50:23 1.22 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: rtcontrib.c,v 1.14 2005/06/09 17:27:28 greg Exp $"; +static const char RCSid[] = "$Id: rtcontrib.c,v 1.22 2005/06/14 02:50:23 greg Exp $"; #endif /* * Gather rtrace output to compute contributions from particular sources @@ -16,7 +16,9 @@ static const char RCSid[] = "$Id: rtcontrib.c,v 1.14 2 #include "lookup.h" #include "calcomp.h" +#ifndef MAXMODLIST #define MAXMODLIST 1024 /* maximum modifiers we'll track */ +#endif int treebufsiz = BUFSIZ; /* current tree buffer size */ @@ -72,7 +74,8 @@ struct rtproc { }; /* rtrace process buffer */ /* rtrace command and defaults */ -char *rtargv[256] = { "rtrace", "-dj", ".5", "-dr", "3", +char *rtargv[256+2*MAXMODLIST] = { "rtrace", + "-dj", ".5", "-dr", "3", "-ab", "1", "-ad", "128", }; int rtargc = 9; /* overriding rtrace options */ @@ -110,6 +113,7 @@ const char *modname[MAXMODLIST]; /* ordered modifier n int nmods = 0; /* number of modifiers */ MODCONT *addmodifier(char *modn, char *outf, char *binv); +void addmodfile(char *fname, char *outf, char *binv); void init(int np); int done_rprocs(struct rtproc *rtp); @@ -192,7 +196,7 @@ main(int argc, char *argv[]) recover++; continue; case 'n': /* number of processes */ - if (argv[i][2] || i >= argc-1) break; + if (argv[i][2] || i >= argc-2) break; nprocs = atoi(argv[++i]); if (nprocs <= 0) error(USER, "illegal number of processes"); @@ -217,7 +221,7 @@ main(int argc, char *argv[]) case 'f': /* file or i/o format */ if (!argv[i][2]) { char *fpath; - if (i >= argc-1) break; + if (i >= argc-2) break; fpath = getpath(argv[++i], getrlibpath(), R_OK); if (fpath == NULL) { @@ -232,31 +236,37 @@ main(int argc, char *argv[]) setformat(argv[i]+2); continue; case 'e': /* expression */ - if (argv[i][2] || i >= argc-1) break; + if (argv[i][2] || i >= argc-2) break; scompile(argv[++i], NULL, 0); continue; case 'o': /* output file spec. */ - if (argv[i][2] || i >= argc-1) break; + if (argv[i][2] || i >= argc-2) break; curout = argv[++i]; continue; case 'x': /* horiz. output resolution */ - if (argv[i][2] || i >= argc-1) break; + if (argv[i][2] || i >= argc-2) break; xres = atoi(argv[++i]); continue; case 'y': /* vert. output resolution */ - if (argv[i][2] || i >= argc-1) break; + if (argv[i][2] || i >= argc-2) break; yres = atoi(argv[++i]); continue; case 'b': /* bin expression */ - if (argv[i][2] || i >= argc-1) break; + if (argv[i][2] || i >= argc-2) break; binval = argv[++i]; continue; case 'm': /* modifier name */ - if (argv[i][2] || i >= argc-1) break; + if (argv[i][2] || i >= argc-2) break; rtargv[rtargc++] = "-ti"; rtargv[rtargc++] = argv[++i]; addmodifier(argv[i], curout, binval); continue; + case 'M': /* modifier file */ + if (argv[i][2] || i >= argc-2) break; + rtargv[rtargc++] = "-tI"; + rtargv[rtargc++] = argv[++i]; + addmodfile(argv[i], curout, binval); + continue; } rtargv[rtargc++] = argv[i]; /* assume rtrace option */ } @@ -452,6 +462,21 @@ addmodifier(char *modn, char *outf, char *binv) return mp; } +/* add modifiers from a file list */ +void +addmodfile(char *fname, char *outf, char *binv) +{ + char *mname[MAXMODLIST]; + int i; + /* find the file & store strings */ + if (wordfile(mname, getpath(fname, getrlibpath(), R_OK)) < 0) { + sprintf(errmsg, "cannot find modifier file '%s'", fname); + error(SYSTEM, errmsg); + } + for (i = 0; mname[i]; i++) /* add each one */ + addmodifier(mname[i], outf, binv); +} + /* put string to stderr */ void eputs(char *s) @@ -598,10 +623,8 @@ getofile(const char *ospec, const char *mname, int bn) if (header) { char info[512]; char *cp = info; - if (ofl & OF_MODIFIER) { - sprintf(cp, "MODIFIER=%s\n", mname); - while (*cp) ++cp; - } + sprintf(cp, "MODIFIER=%s\n", mname); + while (*cp) ++cp; if (ofl & OF_BIN) { sprintf(cp, "BIN=%d\n", bn); while (*cp) ++cp; @@ -1045,7 +1068,7 @@ recover_output(FILE *fin) break; /* no bin separation */ } if (!lastout) { /* empty output */ - error(WARNING, "no data to recover"); + error(WARNING, "no previous data to recover"); lu_done(&ofiletab); /* reclose all outputs */ return; } @@ -1058,6 +1081,10 @@ recover_output(FILE *fin) mp->nbins = j; ment->data = (char *)mp; } + } + if (lastout < 0) { + error(WARNING, "no output files to recover"); + return; } /* seek on all files */ nvals = lastout * outvsiz;