|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ T c ┃
Length: 6904 (0x1af8) Types: TextFile Names: »colex.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─ ⟦this⟧ »EUUGD11/stat-5.3/eu/stat/src/colex.c«
/* Copyright 1984 Gary Perlman */ /* colex extracts columns from its input and prints them there are options to specify the printing format of columns which are specified in a form convenient for users: i integer (d) n numerical (f) a alphabetic (s) e exponential (g) these are converted to the printf format strings in parens. */ /* $link: linkml colex parselin+checkio+number+getopt+specol */ #include "stat.h" PGM (colex,Column Extraction/Formatting,5.2,8/11/86) #define MAXCOLS 100 #define MAXCHARS BUFSIZ /* maximum number of chars in lines */ char *NAstring = "NA"; Boole Forcefill = FALSE; /* empty fields are filled with NA */ Boole Quotestrings = FALSE; /* strings are quoted */ Boole Ignore = FALSE; /* missing strings are ignored */ Boole Dotab = TRUE; /* put tab after every column */ Boole Debug = FALSE; /* print debugging information */ Boole Validate = FALSE; /* validate data type in columns */ Boole InfoVersion; /* print version information */ Boole InfoLimits; /* print program limits */ Boole InfoOptions; /* print usage information */ int Lineno = 0; /* input line number */ char *Format[MAXCOLS]; /* printf formats for columns */ char *Dformat = "a"; /* default output format */ int Request[MAXCOLS]; /* requested columns */ int Nrequest = 0; /* number of requested columns */ char Type[MAXCOLS]; /* data types = a e i n */ #define T_ALPHA 'a' #define T_INTEGER 'i' #define T_NUMBER 'n' #define T_EXPONENT 'e' #define F_ALPHA 's' #define F_INTEGER 'd' #define F_NUMBER 'f' #define F_EXPONENT 'g' #define NTYPES 4 \f main (argc, argv) char **argv; { char line[MAXCHARS]; char *input[MAXCOLS]; int ncols; int reqno; /* request number */ int optind; /* local optind returned by initial() */ char *cs; /* current column specification */ optind = initial (argc, argv); while (optind < argc) { cs = argv[optind++]; Nrequest = specol (cs, Request, Format, Nrequest, MAXCOLS, MAXCOLS); if (Nrequest > MAXCOLS) ERRMANY (column Requests, MAXCOLS) if (Nrequest < 0) ERRMSG0 (illegal column specification) } if (Nrequest == 0) ERRMSG0 (No column numbers were supplied) settypes (); checkstdin (); while (gets (line)) { Lineno++; ncols = parselin (line, input, MAXCOLS); if (ncols > MAXCOLS) ERRMANY (columns in input line, MAXCOLS) for (reqno = 0; reqno < Nrequest; reqno++) prcol (ncols, input, Request[reqno], reqno); putchar ('\n'); } exit (0); } \f /*FUNCTION initial: returns local optind */ int initial (argc, argv) int argc; char **argv; { extern int optind; extern char *optarg; Boole errflg = 0; int c; ARGV0; while ((c = getopt (argc, argv, "qiftvF:DLOV")) != EOF) switch (c) { default: errflg = TRUE; break; case 'i': Ignore = TRUE; break; case 'f': Forcefill = TRUE; break; case 'q': Quotestrings = TRUE; break; case 't': Dotab = FALSE; break; case 'v': Validate = TRUE; break; case 'F': Dformat = optarg; break; case 'D': Debug = TRUE; break; case 'O': InfoOptions = TRUE; break; case 'V': InfoVersion = TRUE; break; case 'L': InfoLimits = TRUE; break; } if (errflg) USAGE ([-fiqt] [-F format] column-numbers) usinfo (); return (optind); } \f /* must be passed the column request number to have format information */ prcol (ncols, array, colno, reqno) int ncols; /* number of columns read in input array */ char **array; /* data input array */ int colno; /* requested column number == Request[reqno] */ int reqno; /* request number */ { if (colno > ncols) /* missing column */ { if (Forcefill) printstring (NAstring, T_ALPHA, "s"); else if (Ignore) { if (Quotestrings) printstring ("", T_ALPHA, "s"); /* else do nothing */ } else ERRMSG2 (missing column %d in short input line %d, colno, Lineno) } else printstring (array[colno-1], Type[reqno], Format[reqno]); } printstring (string, type, fmt) char *string; int type; char *fmt; { char qchar = '"'; double dtmp, atof (); int itmp, atoi (); char printbuf[128]; switch (type) { case T_ALPHA: if (Quotestrings) { if (index (string, qchar)) qchar = '\''; putchar (qchar); } sprintf (printbuf, "%c%s", '%', fmt); printf (printbuf, string); if (Quotestrings) putchar (qchar); break; case T_INTEGER: if (Validate && number (string) != 1) fprintf (stderr, "%s: %s on line %d is not an integer\n", Argv0, string, Lineno); itmp = atoi (string); sprintf (printbuf, "%c%s", '%', fmt); printf (printbuf, itmp); break; case T_NUMBER: case T_EXPONENT: if (Validate && !number (string)) fprintf (stderr, "%s: %s on line %d is not a number\n", Argv0, string, Lineno); dtmp = atof (string); sprintf (printbuf, "%c%s", '%', fmt); printf (printbuf, dtmp); break; } if (Dotab) putchar ('\t'); } \f /*FUNCTION settypes: set up (user supplied) type and format information */ Status settypes () { int colno; char *ptr; for (colno = 0; colno < Nrequest; colno++) { if (*Format[colno] == '\0') Format[colno] = Dformat; for (ptr = Format[colno]; *ptr && !isalpha (*ptr); ptr++) continue; switch (*ptr) { default: ERRMSG1 (unknown data type specification: %s, Format[colno]) /*NOTREACHED*/ break; case T_ALPHA: case F_ALPHA: Type[colno] = T_ALPHA; *ptr++ = F_ALPHA; *ptr = '\0'; break; case T_INTEGER: case F_INTEGER: Type[colno] = T_INTEGER; *ptr++ = F_INTEGER; *ptr = '\0'; break; case T_NUMBER: case F_NUMBER: Type[colno] = T_NUMBER; *ptr++ = F_NUMBER; *ptr = '\0'; break; case T_EXPONENT: case F_EXPONENT: Type[colno] = T_EXPONENT; *ptr++ = F_EXPONENT; *ptr = '\0'; break; } if (Format[colno][0] == '%') Format[colno]++; if (Debug) fprintf (stderr, "%3d %3d %c %s\n", colno+1, Request[colno], Type[colno], Format[colno]); } return (SUCCESS); } \f usinfo () { if (InfoVersion) pver (Version); if (InfoLimits) { plim (Argv0); const (MAXCOLS, "maximum number of columns"); const (MAXCHARS, "maximum number of characters in lines"); } if (InfoOptions) { ppgm (Argv0, Purpose); lopt ('f', "force-fill columns with NA", Forcefill); sopt ('F', "format", "default column output format (aine)", Dformat); lopt ('i', "ignore missing columns", Ignore); lopt ('q', "quote output columns", Quotestrings); lopt ('t', "place tab after every column", Dotab); lopt ('v', "validate data types in columns", Validate); oper ("columns", "columns to extract", ""); } if (InfoVersion || InfoLimits || InfoOptions) exit (0); }