|
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 - metrics - downloadIndex: T s
Length: 3244 (0xcac) Types: TextFile Names: »specol.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦this⟧ »EUUGD11/stat-5.3/eu/stat/src/specol.c«
/* Copyright 1986 Gary Perlman */ #include <stdio.h> #include <ctype.h> #define Status int #define SUCCESS 0 #define FAILURE 1 /*LINTLIBRARY*/ #ifndef lint static char sccsfid[] = "@(#) specol.c 5.1 (|stat) 8/11/86"; #endif #define RANGECHAR '-' /* ranges are of form M-N */ #define OUT_OF_RANGE (-1) #define TOO_MANY_COLUMNS (-3) #define TOO_MUCH_INFO (-4) #define ILLEGAL_RANGE (-5) char * specerr (value_returned) int value_returned; { switch (value_returned) { case OUT_OF_RANGE: return ("range value out of allowed range"); case TOO_MANY_COLUMNS: return ("range value exceeds maximum"); case TOO_MUCH_INFO: return ("extra information before range specification"); case ILLEGAL_RANGE: default: return ("illegal range specification"); } } /* specify columns of the form M-N optionally preceded by a letter-ended info string */ int specol (operand, request, info, nrequests, maxrequest, maxcols) char *operand; /* input string */ int *request; /* vector of requested columns */ char **info; /* info string for request[i] */ int nrequests; /* number of requests so far */ int maxrequest; /* max number of requests */ int maxcols; /* maximum number of columns to read in */ { int colno; char *range; /* a range request */ int first, last; /* extremes of ranges */ for (range = operand; *range && !isalpha (*range); range++) continue; if (isalpha (*range)) while (isalpha (*range)) range++; else /* no special info on this operand */ range = operand; if (getnums (range, &first, &last) == FAILURE) return (ILLEGAL_RANGE); if (first > maxcols || last > maxcols) return (TOO_MANY_COLUMNS); *range = '\0'; for (colno = first; first <= last ? colno <= last : colno >= last; colno += first <= last ? 1 : -1) { if (nrequests < 0) /* already some bad parsing */ return (nrequests); if (nrequests == maxrequest) return (maxrequest+1); if (colno <= 0) return (OUT_OF_RANGE); request[nrequests] = colno; if (info != NULL) info[nrequests] = operand; else if (*operand) /* illegal info string */ return (TOO_MUCH_INFO); nrequests++; } return (nrequests); } Status getnums (s, first, last) char *s; /* string of the form #[-#] */ int *first; /* stuff first column number in here */ int *last; /* stuff last column number in here */ { char *ptr; for (ptr = s; *ptr && *ptr != RANGECHAR; ptr++) continue; if (*ptr == RANGECHAR) /* range of columns */ { *ptr++ = '\0'; if (number (s) != 1) return (FAILURE); if (number (ptr) != 1) return (FAILURE); *first = atoi (s); *last = atoi (ptr); } else if (number (s) != 1) return (FAILURE); else *last = *first = atoi (s); if (*first < 1 || *last < 1) return (FAILURE); return (SUCCESS); } #ifdef SPECOL #define MAXCOL 100 main (argc, argv) char **argv; { int request[MAXCOL]; int nrequests = 0; char *info[MAXCOL]; int i; for (i = 1; i < argc; i++) { nrequests = specol (argv[i], request, info, nrequests, MAXCOL); printf ("%d requests\n", nrequests); } for (i = 0; i < nrequests; i++) { printf ("%4d %4d '%s'\n", i, request[i], info[i]); } } #endif SPECOL