|
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 r
Length: 3078 (0xc06) Types: TextFile Names: »reverse.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦this⟧ »EUUGD11/stat-5.3/eu/stat/src/reverse.c«
/* Copyright 1982 Gary Perlman */ #include "stat.h" PGM(reverse,Reverse Lines/Fields/Characters,5.1,10/13/86) #define MAXFIELDS 100 #define MAXCHARS BUFSIZ char **Lines; int Maxlines = 1000; Boole Rlines, Rchars, Rfields; Boole InfoVersion; /* print version information */ Boole InfoLimits; /* print program limits */ Boole InfoOptions; /* print usage information */ \f /*FUNCTION revchar: reverse characters in a string */ char * revchar (s) register char *s; { static char buf[MAXCHARS]; register char *ptr; register char *sptr; ptr = buf; sptr = s; while (*sptr) sptr++; while (sptr > s) *ptr++ = *--sptr; *ptr = '\0'; return (buf); } \f /*FUNCTION revfield: reverse fields in a string */ char * revfield (line) char *line; { char *array[MAXFIELDS]; char buf[MAXCHARS]; int ncols, i; char *ptr = line; strcpy (buf, line); if ((ncols = parselin (buf, array, MAXFIELDS)) > MAXFIELDS) ERRMANY (fields, MAXFIELDS) for (i = ncols-1; i >= 0; i--) { strcpy (ptr, array[i]); while (*ptr) ptr++; if (i != 0) *ptr++ = '\t'; } *ptr = '\0'; return (line); } \f /*FUNCTION initial: set program options */ initial (argc, argv) char **argv; { int errcnt = 0; extern int optind; int C; while ((C = getopt (argc, argv, "cflLOV")) != EOF) switch (C) { case 'O': InfoOptions = TRUE; break; case 'V': InfoVersion = TRUE; break; case 'L': InfoLimits = TRUE; break; case 'f': Rfields = 1; break; case 'l': Rlines = 1; break; case 'c': Rchars = 1; break; default: errcnt++; } if (errcnt) USAGE ([-cfl]) /* always exits */ if (!Rchars && !Rfields) Rlines = TRUE; usinfo (); ERROPT (optind) /* may exit */ checkstdin (); } \f /*FUNCTION main: reverse */ main (argc, argv) char **argv; { char line[MAXCHARS]; int nlines = 0; ARGV0; initial (argc, argv); if (Rlines) { nlines = readlines (&Lines, Maxlines, stdin); if (nlines == 0) /* nothing to reverse, so we are done */ exit (SUCCESS); if (nlines > Maxlines) ERRMANY (input lines, Maxlines) /* always exits */ if (nlines < 0) ERRSPACE (input lines for reversal) /* always exits */ while (nlines > 0) println (Lines[--nlines]); } else /* no line reversal */ while (gets (line)) println (line); exit (SUCCESS); } println (line) char *line; { if (Rchars) line = revchar (line); if (Rfields) line = revfield (line); puts (line); } \f /*FUNCTION usinfo: print information about options, limits, version */ usinfo () { if (InfoVersion) pver (Version); if (InfoLimits) { plim (Argv0); const (Maxlines, "maximum number of lines to reverse"); const (MAXFIELDS, "maximum number of fields to reverse"); const (MAXCHARS, "maximum length of input lines"); } if (InfoOptions) { ppgm (Argv0, Purpose); lopt ('c', "reverse characters", Rchars); lopt ('f', "reverse fields", Rfields); lopt ('l', "reverse lines", Rlines); } if (InfoVersion || InfoLimits || InfoOptions) exit (SUCCESS); }