|
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 p ┃
Length: 5376 (0x1500) Types: TextFile Names: »perm.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─ ⟦this⟧ »EUUGD11/stat-5.3/eu/stat/src/perm.c«
/* Copyright 1981 Gary Perlman */ #include "stat.h" PGM(perm,Permute Line Order,5.5,6/12/86) #define MAXCHARS BUFSIZ /* maximum number of chars in lines */ unsigned Maxlines = 1000; int Seed; /* random seed that might be set on command line */ Boole Alphasort; /* sort lines alphabetically */ Boole Intsort; /* sort lines as integers */ Boole Expsort; /* sort lines as real numbers */ Boole Numsort; /* sort as xxx.yyy numbers */ Boole Sort; /* true if any sorting is to be done */ Boole Reverse; /* multiplying factor to reverse the order of any sort */ Boole Caseignore; /* ignore case when making alpha comparisons */ Boole InfoVersion; /* print version information */ Boole InfoLimits; /* print program limits */ Boole InfoOptions; /* print usage information */ \f #define sortwith(x) qsort ((char *) lptr, nlines, sizeof (*lptr), x) #define compare(name,fun,arg1,arg2) \ int name (sp1, sp2) char **sp1, **sp2; { return (fun (*arg1, *arg2)); } compare (alcmp, strcmp, sp1, sp2) compare (ralcmp, strcmp, sp2, sp1) compare (cialcmp, cistrcmp, sp1, sp2) /* case insensitive alpha compare */ compare (ciralcmp, cistrcmp, sp2, sp1) /* case insensitive reverse alpha */ compare (ncmp, numcmp, sp1, sp2) compare (rncmp, numcmp, sp2, sp1) #define diffint(a,b) (atoi(a) - atoi(b)) compare (intcmp, diffint, sp1, sp2) compare (rintcmp, diffint, sp2, sp1) #define diffloat(a,b) ((atof (a) - atof (b)) < 0 ? -1 : 1) compare (fltcmp, diffloat, sp1, sp2) compare (rfltcmp, diffloat, sp2, sp1) main (argc, argv) char **argv; { char **lptr; int nlines; int lineno; #ifdef NEVER int fltcmp (), alcmp (), intcmp (); int rfltcmp (), ralcmp (), rintcmp (); #endif ARGV0; initial (argc, argv); checkstdin (); nlines = readlines (&lptr, Maxlines, stdin); if (nlines == 0) exit (0); if (nlines > Maxlines) ERRMANY (lines, Maxlines) if (nlines < 0) ERRSPACE (lines) if (Sort) { if (Alphasort) { if (Caseignore) if (Reverse) sortwith (ciralcmp); else sortwith (cialcmp); else if (Reverse) sortwith (ralcmp); else sortwith (alcmp); } else if (Intsort) if (Reverse) sortwith (rintcmp); else sortwith (intcmp); else if (Numsort) if (Reverse) sortwith (rncmp); else sortwith (ncmp); else if (Expsort) if (Reverse) sortwith (rfltcmp); else sortwith (fltcmp); } else strpermut (lptr, nlines); for (lineno = 0; lineno < nlines; lineno++) puts (lptr[lineno]); exit (0); } \f /*FUNCTION initial: returns local version of optind, index to first operand */ int initial (argc, argv) char **argv; { extern char *optarg; /* option value accessed through this by getopt */ extern int optind; /* will be index to first operand */ int opterr = 0; /* count of number of errors */ int flag; /* option flag characters read in here */ while ((flag = getopt (argc, argv, "aceil:nrs:LOV")) != EOF) switch (flag) { default: opterr++; break; /* put option cases here */ case 'O': InfoOptions = TRUE; break; case 'V': InfoVersion = TRUE; break; case 'L': InfoLimits = TRUE; break; case 'c': Caseignore = TRUE; /* FALLTHROUGH */ case 'a': Alphasort = TRUE; Numsort = Intsort = Expsort = FALSE; break; case 'e': Expsort = TRUE; Numsort = Alphasort = Intsort = FALSE; break; case 'i': Intsort = TRUE; Numsort = Alphasort = Expsort = FALSE; break; case 'l': if (setint (Argv0, 'l', optarg, &Maxlines, 1, MAXINT)) opterr++; break; case 'n': Numsort = TRUE; Intsort = Alphasort = Expsort = FALSE; break; case 'r': Reverse = TRUE; break; case 's': if (setint (argv[0], flag, optarg, &Seed, 1, MAXINT)) opterr++; break; } if (opterr) /* print usage message and bail out */ USAGE ([-a | -c | -e | -i | -n] [-r] [-l lines] [-s seed]) Sort = Alphasort || Intsort || Numsort || Expsort; if (Reverse && !Sort) WARNING (reversal option has no effect without sorting option) if (Sort && Seed != 0) WARNING (setting random seed has no effect when sorting) usinfo (); ERROPT (optind) return (optind); } \f strpermut (array, size) char *array[]; { int i, irand; char *temp; extern double Maxrand; int randval; initrand (Seed); for (i = 0; i < size; i++) { while ((randval = rand ()) < 0); irand = (int) (randval / Maxrand * (size-i)) + i; temp = array[i]; array[i] = array[irand]; array[irand] = temp; } } \f usinfo () { if (InfoVersion) pver (Version); if (InfoLimits) { plim (Argv0); const (MAXCHARS, "maximum number of characters in lines"); const (Maxlines, "maximum number of input lines"); } if (InfoOptions) { ppgm (Argv0, Purpose); lopt ('a', "order lines alphabetically", Alphasort); lopt ('c', "case insensitive alphabetic ordering", Caseignore); lopt ('e', "order lines as xxx.yyyEzzz numbers", Expsort); lopt ('i', "order lines as integers", Intsort); iopt ('l', "lines", "maximum number of input lines", Maxlines); lopt ('n', "order lines as xxx.yyy numbers", Numsort); lopt ('r', "reverse sorting order of lines", Reverse); iopt ('s', "seed", "integer random number generator seed", Seed); } if (InfoVersion || InfoLimits || InfoOptions) exit (0); }