jejones@ea.UUCP (11/22/84)
The following is a (simple to do, but worth doing) subset of the Unix
uniq [sic] filter. It's not in shar format, because there's just one
file. The contents of <bool.h> should be easy to reverse engineer...
James Jones
------------------------------TARE HEAR------------------------------
/*
* Unique -- a subset of the Unix "uniq" [sic] command
*
* usage: Unique [-udc] [input]
*
* semantics: examine the input (use the input pathname if it is
* specified, else standard input) for identical adjacent lines.
* Print some such lines, depending on the choice of flags:
*
* -u print "unique" lines (i.e. ones that don't appear next
* to copies of themselves)
* -d print non-"unique" lines
* -c prefix lines printed with a count of the number of
* (adjacent) occurrences of the line
*
* defaults: -ud if no flags are specified; standard input if no
* input pathname is specified.
*
* Note that "unique" lines are really unique only if the file is
* sorted.
*/
#include <stdio.h>
#include <bool.h>
#define MAXLINE 256
char Buffer[2][MAXLINE];
int Count;
bool Unique,
Repeated,
LineSpec,
PrintCount;
main(argc, argv)
int argc;
char *argv[];
{
int i;
char *ArgScan, *Master, *Slave, *Temp;
FILE *Input;
bool Done;
LineSpec = FALSE;
Unique = FALSE;
Repeated = FALSE;
PrintCount = FALSE;
for (i = 1; i < argc; i++) {
if (*argv[i] != '-')
break;
for (ArgScan = argv[i] + 1; *ArgScan; ArgScan++) {
switch (*ArgScan) {
case 'u':
Unique = TRUE;
LineSpec = TRUE;
break;
case 'd':
Repeated = TRUE;
LineSpec = TRUE;
break;
case 'c':
PrintCount = TRUE;
break;
default:
fprintf(stderr, "Unique: unknown option %c\n",
*ArgScan);
exit(1);
}
}
}
if (!LineSpec)
Unique = Repeated = TRUE;
if (i < argc - 1) {
fputs("usage: Unique [-udc] [input]\n", stderr);
exit(1);
} else if (i == argc - 1) {
if ((Input = fopen(argv[i], "r")) == NULL) {
fprintf(stderr, "Unique: can't open input file\n",
argv[i]);
exit(1);
}
} else
Input = stdin;
Master = Buffer[0];
Slave = Buffer[1];
Done = fgets(Master, MAXLINE, Input) == NULL;
while (!Done) {
Count = 1;
for (;;) {
if (Done = fgets(Slave, MAXLINE, Input) == NULL)
break;
if (strcmp(Master, Slave) != 0)
break;
Count++;
}
if ((Count == 1) ? Unique : Repeated) {
if (PrintCount)
printf("%4d ", Count);
fputs(Master, stdout);
}
Temp = Master;
Master = Slave;
Slave = Temp;
}
fclose(Input);
}