version 1.30, 2021/12/24 17:59:28 |
version 1.31, 2022/01/01 02:20:38 |
|
|
int cflag, dflag, iflag, uflag; |
int cflag, dflag, iflag, uflag; |
int numchars, numfields, repeats; |
int numchars, numfields, repeats; |
|
|
FILE *file(char *, char *); |
void show(const char *); |
void show(FILE *, char *); |
|
char *skip(char *); |
char *skip(char *); |
void obsolete(char *[]); |
void obsolete(char *[]); |
__dead void usage(void); |
__dead void usage(void); |
|
|
main(int argc, char *argv[]) |
main(int argc, char *argv[]) |
{ |
{ |
char *p, *prevline, *t, *thisline, *tmp; |
char *p, *prevline, *t, *thisline, *tmp; |
FILE *ifp = NULL, *ofp = NULL; |
|
size_t prevsize, thissize, tmpsize; |
size_t prevsize, thissize, tmpsize; |
ssize_t len; |
ssize_t len; |
int ch; |
int ch; |
|
|
if (!dflag && !uflag) |
if (!dflag && !uflag) |
dflag = uflag = 1; |
dflag = uflag = 1; |
|
|
switch (argc) { |
if (argc > 2) |
case 0: |
|
ifp = stdin; |
|
ofp = stdout; |
|
break; |
|
case 1: |
|
ifp = file(argv[0], "r"); |
|
ofp = stdout; |
|
break; |
|
case 2: |
|
ifp = file(argv[0], "r"); |
|
ofp = file(argv[1], "w"); |
|
break; |
|
default: |
|
usage(); |
usage(); |
|
if (argc >= 1 && strcmp(argv[0], "-") != 0) { |
|
if (freopen(argv[0], "r", stdin) == NULL) |
|
err(1, "%s", argv[0]); |
} |
} |
|
if (argc == 2 && strcmp(argv[1], "-") != 0) { |
|
if (freopen(argv[1], "w", stdout) == NULL) |
|
err(1, "%s", argv[1]); |
|
} |
|
|
if (pledge("stdio", NULL) == -1) |
if (pledge("stdio", NULL) == -1) |
err(1, "pledge"); |
err(1, "pledge"); |
|
|
prevsize = 0; |
prevsize = 0; |
prevline = NULL; |
prevline = NULL; |
if ((len = getline(&prevline, &prevsize, ifp)) == -1) { |
if ((len = getline(&prevline, &prevsize, stdin)) == -1) { |
free(prevline); |
free(prevline); |
if (ferror(ifp)) |
if (ferror(stdin)) |
err(1, "getline"); |
err(1, "getline"); |
exit(0); |
exit(0); |
} |
} |
|
|
|
|
thissize = 0; |
thissize = 0; |
thisline = NULL; |
thisline = NULL; |
while ((len = getline(&thisline, &thissize, ifp)) != -1) { |
while ((len = getline(&thisline, &thissize, stdin)) != -1) { |
if (thisline[len - 1] == '\n') |
if (thisline[len - 1] == '\n') |
thisline[len - 1] = '\0'; |
thisline[len - 1] = '\0'; |
|
|
|
|
|
|
/* If different, print; set previous to new value. */ |
/* If different, print; set previous to new value. */ |
if ((iflag ? strcasecmp : strcmp)(p, t)) { |
if ((iflag ? strcasecmp : strcmp)(p, t)) { |
show(ofp, prevline); |
show(prevline); |
tmp = prevline; |
tmp = prevline; |
prevline = thisline; |
prevline = thisline; |
thisline = tmp; |
thisline = tmp; |
|
|
++repeats; |
++repeats; |
} |
} |
free(thisline); |
free(thisline); |
if (ferror(ifp)) |
if (ferror(stdin)) |
err(1, "getline"); |
err(1, "getline"); |
|
|
show(ofp, prevline); |
show(prevline); |
free(prevline); |
free(prevline); |
|
|
exit(0); |
exit(0); |
|
|
* of the line. |
* of the line. |
*/ |
*/ |
void |
void |
show(FILE *ofp, char *str) |
show(const char *str) |
{ |
{ |
if ((dflag && repeats) || (uflag && !repeats)) { |
if ((dflag && repeats) || (uflag && !repeats)) { |
if (cflag) |
if (cflag) |
fprintf(ofp, "%4d %s\n", repeats + 1, str); |
printf("%4d %s\n", repeats + 1, str); |
else |
else |
fprintf(ofp, "%s\n", str); |
printf("%s\n", str); |
} |
} |
} |
} |
|
|
|
|
len = 1; |
len = 1; |
|
|
return (str); |
return (str); |
} |
|
|
|
FILE * |
|
file(char *name, char *mode) |
|
{ |
|
FILE *fp; |
|
|
|
if (strcmp(name, "-") == 0) |
|
return(*mode == 'r' ? stdin : stdout); |
|
if ((fp = fopen(name, mode)) == NULL) |
|
err(1, "%s", name); |
|
return (fp); |
|
} |
} |
|
|
void |
void |