/* Sc parse routine * * usage psc options * options: * -L Left justify strings. Default is right justify. * -r Assemble data into rows first, not columns. * -R n Increment by n between rows * -C n Increment by n between columns * -n n Length of the row (column) should be n. * -s v Top left location in the spreadsheet should be v; eg, k5 * -d c Use c as the delimiter between the fields. * -k Keep all delimiters - Default is strip multiple delimiters to 1. * -f suppress 'format' lines in output * * Author: Robert Bond * $Revision: 6.8 $ */ #include #include #include "sc.h" #define END 0 #define NUM 1 #define ALPHA 2 #define SPACE 3 #define EOL 4 extern char *optarg; extern int optind; char *coltoa(); char *progname; #ifdef SYSV3 extern void exit(); #else extern int exit(); #endif int colfirst = 0; int r0 = 0; int c0 = 0; int rinc = 1; int cinc = 1; int leftadj = 0; int len = 20000; char delim1 = ' '; char delim2 = '\t'; int strip_delim = 1; int drop_format = 0; int *fwidth; int *precision; int maxcols; char token[1000]; main(argc, argv) int argc; char **argv; { int curlen; int curcol, coff; int currow, roff; int first; int c; register effr, effc; int i,j; register char *p; progname = argv[0]; while ((c = getopt(argc, argv, "rfLks:R:C:n:d:")) != EOF) { switch(c) { case 'r': colfirst = 1; break; case 'L': leftadj = 1; break; case 's': c0 = getcol(optarg); r0 = getrow(optarg); break; case 'R': rinc = atoi(optarg); break; case 'C': cinc = atoi(optarg); break; case 'n': len = atoi(optarg); break; case 'd': delim1 = optarg[0]; delim2 = 0; break; case 'k': strip_delim = 0; break; case 'f': drop_format = 1; break; default: (void) fprintf(stderr,"Usage: %s [-rkfL] [-s v] [-R i] [-C i] [-n i] [-d c]\n", progname); exit(1); } } if (optind < argc) { (void) fprintf(stderr,"Usage: %s [-rL] [-s v] [-R i] [-C i] [-n i] [-d c]\n", progname); exit(1); } /* setup the spreadsheet arrays */ if (!growtbl(GROWNEW, 0, 0)) exit(1); curlen = 0; curcol = c0; coff = 0; currow = r0; roff = 0; first = 1; while(1) { effr = currow+roff; effc = curcol+coff; switch(scan()) { case END: if(drop_format) exit(0); for (i = 0; i= maxcols - 1) { if (!growtbl(GROWCOL, 0, 0)) { (void) fprintf(stderr, "Invalid column used: %s\n", coltoa(effc)); continue; } } i = 0; j = 0; p = token; while (*p && *p != '.') { p++; i++; } if (*p) { p++; i++; } while (*p) { p++; i++; j++; } if (precision[effc] < j) precision[effc] = j; if (fwidth[effc] < i) fwidth[effc] = i; break; case ALPHA: first = 0; if (leftadj) (void) printf("leftstring %s%d = \"%s\"\n", coltoa(effc),effr,token); else (void) printf("rightstring %s%d = \"%s\"\n",coltoa(effc),effr,token); if (effc >= maxcols - 1) { if (!growtbl(GROWCOL, 0, 0)) { (void) fprintf(stderr, "Invalid column used: %s\n", coltoa(effc)); continue; } } i = strlen(token); if (i > precision[effc]) precision[effc] = i; break; case SPACE: if (first && strip_delim) break; if (colfirst) roff++; else coff++; break; case EOL: curlen++; roff = 0; coff = 0; first = 1; if (colfirst) { if (curlen >= len) { curcol = c0; currow += rinc; curlen = 0; } else { curcol += cinc; } } else { if (curlen >= len) { currow = r0; curcol += cinc; curlen = 0; } else { currow += rinc; } } break; } } } scan() { register int c; register char *p; p = token; c = getchar(); if (c == EOF) return(END); if (c == '\n') return(EOL); if (c == delim1 || c == delim2) { if (strip_delim) { while ((c = getchar()) && (c == delim1 || c == delim2)) ; (void)ungetc(c, stdin); } return(SPACE); } if (c == '\"') { while ((c = getchar()) && c != '\"' && c != '\n' && c != EOF) *p++ = c; if (c != '\"') (void)ungetc(c, stdin); *p = 0; return(ALPHA); } while (c != delim1 && c != delim2 && c!= '\n' && c != EOF) { *p++ = c; c = getchar(); } *p = 0; (void)ungetc(c, stdin); p = token; c = *p; if (isdigit(c) || c == '.' || c == '-' || c == '+') { while(isdigit(c) || c == '.' || c == '-' || c == '+' || c == 'e' || c == 'E') { c = *p++; } if (c == 0) return(NUM); else return(ALPHA); } return(ALPHA); } getcol(p) char *p; { register col; if (!p) return(0); while(*p && !isalpha(*p)) p++; if (!*p) return(0); col = ((*p & 0137) - 'A'); if (isalpha(*++p)) col = (col + 1)*26 + ((*p & 0137) - 'A'); return(col); } getrow(p) char *p; { int row; if (!p) return(0); while(*p && !isdigit(*p)) p++; if (!*p) return(0); if (sscanf(p, "%d", &row) != 1) return(0); return(row); } char * coltoa(col) int col; { static char rname[3]; register char *p = rname; if (col < 0 || col > 25*26) (void) fprintf(stderr,"coltoa: invalid col: %d", col); if (col > 25) { *p++ = col/26 + 'A' - 1; col %= 26; } *p++ = col+'A'; *p = 0; return(rname); }