--- ray/src/util/rcollate.c 2014/05/30 00:00:54 2.9 +++ ray/src/util/rcollate.c 2014/05/30 18:10:20 2.12 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: rcollate.c,v 2.9 2014/05/30 00:00:54 greg Exp $"; +static const char RCSid[] = "$Id: rcollate.c,v 2.12 2014/05/30 18:10:20 greg Exp $"; #endif /* * Utility to re-order records in a binary or ASCII data file (matrix) @@ -276,7 +276,7 @@ int no_columns = 0; /* number of output columns */ int no_rows = 0; /* number of output rows */ /* check settings and assign defaults */ -static void +static int check_sizes() { if (fmtid == NULL) { @@ -288,9 +288,14 @@ check_sizes() comp_size = sizeof(double); else if (!strcmp(fmtid, "byte")) comp_size = 1; + else { + fprintf(stderr, "Unsupported format: %s\n", fmtid); + return(0); + } } if (n_comp <= 0) n_comp = 3; + return(1); } /* output transposed ASCII or binary data from memory */ @@ -367,10 +372,8 @@ do_resize(FILE *fp) int columns2go = no_columns; char word[256]; /* sanity checks */ - if (comp_size) { - fputs("Bad call to do_resize (binary input)\n", stderr); - return(0); - } + if (comp_size) + return(output_stream(fp)); /* binary data -- just copy */ if (no_columns <= 0) { fprintf(stderr, "Missing -oc specification\n"); return(0); @@ -471,7 +474,8 @@ headline(char *s, void *p) int main(int argc, char *argv[]) { - int do_header = 1; /* header i/o? */ + int i_header = 1; /* input header? */ + int o_header = 1; /* output header? */ int transpose = 0; /* transpose rows & cols? */ int i; @@ -493,8 +497,20 @@ main(int argc, char *argv[]) else goto userr; break; - case 'h': /* header on/off */ - do_header = !do_header; + case 'h': /* turn off header */ + switch (argv[i][2]) { + case 'i': + i_header = 0; + break; + case 'o': + o_header = 0; + break; + case '\0': + i_header = o_header = 0; + break; + default: + goto userr; + } break; case 't': /* transpose on/off */ transpose = !transpose; @@ -548,7 +564,7 @@ main(int argc, char *argv[]) SET_FILE_BINARY(stdout); } /* check for no-op */ - if (!transpose && (comp_size || + if (!transpose & (i_header == o_header) && (comp_size || (no_columns == ni_columns) & (no_rows == ni_rows))) { if (warnings) fprintf(stderr, "%s: no-op -- copying input verbatim\n", @@ -557,14 +573,18 @@ main(int argc, char *argv[]) return(1); return(0); } - if (do_header) { /* read/write header */ + if (i_header) { /* read header */ if (getheader(stdin, &headline, NULL) < 0) return(1); - check_sizes(); + if (!check_sizes()) + return(1); if (comp_size) { /* a little late... */ SET_FILE_BINARY(stdin); SET_FILE_BINARY(stdout); } + } else if (!check_sizes()) + return(1); + if (o_header) { /* write header */ printargs(argc, argv, stdout); if (transpose && (no_rows <= 0) & (no_columns <= 0)) { if (ni_rows > 0) no_columns = ni_rows; @@ -577,8 +597,7 @@ main(int argc, char *argv[]) printf("NCOMP=%d\n", n_comp); fputformat(fmtid, stdout); fputc('\n', stdout); /* finish new header */ - } else - check_sizes(); + } if (transpose) { /* transposing rows & columns? */ MEMLOAD myMem; /* need to load into memory */ if (i == argc-1) { @@ -600,7 +619,7 @@ main(int argc, char *argv[]) return(0); userr: fprintf(stderr, -"Usage: %s [-h][-w][-f[afdb][N]][-t][-ic in_col][-ir in_row][-oc out_col][-or out_row] [input.dat]\n", +"Usage: %s [-h[io]][-w][-f[afdb][N]][-t][-ic in_col][-ir in_row][-oc out_col][-or out_row] [input.dat]\n", argv[0]); return(1); }