📄 psc.c
字号:
/* 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 <ctype.h>#include <stdio.h>#include "sc.h"#define END 0#define NUM 1#define ALPHA 2#define SPACE 3#define EOL 4extern char *optarg;extern int optind;char *coltoa();char *progname;#ifdef SYSV3extern void exit();#elseextern int exit();#endifint 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; i++) { if (precision[i]) (void) printf("format %s %d %d\n", coltoa(i), fwidth[i], precision[i]+1); } exit(0); case NUM: first = 0; (void) printf("let %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 = 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);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -