uniq: add ascii implementation of -f and -s flags

This commit is contained in:
Tai Chi Minh Ralph Eastwood 2015-02-11 06:02:54 +00:00 committed by sin
parent 28e26bc688
commit bc2310376f
1 changed files with 32 additions and 3 deletions

35
uniq.c
View File

@ -3,6 +3,7 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <ctype.h>
#include "text.h"
#include "util.h"
@ -14,8 +15,11 @@ static void uniqfinish(void);
static const char *countfmt = "";
static int dflag = 0;
static int uflag = 0;
static int fskip = 0;
static int sskip = 0;
static char *prevline = NULL;
static char *prevoffset = NULL;
static long prevlinecount = 0;
static void
@ -41,6 +45,12 @@ main(int argc, char *argv[])
case 'u':
uflag = 1;
break;
case 'f':
fskip = estrtonum(EARGF(usage()), 0, INT_MAX);
break;
case 's':
sskip = estrtonum(EARGF(usage()), 0, INT_MAX);
break;
default:
usage();
} ARGEND;
@ -59,12 +69,29 @@ main(int argc, char *argv[])
return 0;
}
static char *
uniqskip(char *l)
{
char *lo = l;
int f = fskip, s = sskip;
for (; f; --f) {
while (isblank(*lo))
lo++;
while (*lo && !isblank(*lo))
lo++;
}
for (; s && *lo && *lo != '\n'; --s, ++lo);
return lo;
}
static void
uniqline(char *l)
{
char *loffset = l ? uniqskip(l) : l;
int linesequel = (!l || !prevline)
? l == prevline
: !strcmp(l, prevline);
: !strcmp(loffset, prevoffset);
if (linesequel) {
++prevlinecount;
@ -78,11 +105,13 @@ uniqline(char *l)
fputs(prevline, stdout);
}
free(prevline);
prevline = NULL;
prevline = prevoffset = NULL;
}
if (l)
if (l) {
prevline = estrdup(l);
prevoffset = prevline + (loffset - l);
}
prevlinecount = 1;
}