diff options
Diffstat (limited to 'toys')
-rw-r--r-- | toys/uniq.c | 63 |
1 files changed, 20 insertions, 43 deletions
diff --git a/toys/uniq.c b/toys/uniq.c index 03913e71..c16c08f1 100644 --- a/toys/uniq.c +++ b/toys/uniq.c @@ -45,61 +45,38 @@ DEFINE_GLOBALS( static char *skip(char *str) { - int field = 0; - long nchars = TT.nchars; - long nfields = TT.nfields; + long nchars = TT.nchars, nfields; + // Skip fields first - while (nfields && *str) { - if (isspace((unsigned char)*str)) { - if (field) { - field = 0; - nfields--; - } - } else if (!field) { - field = 1; - } - str++; + for (nfields = TT.nfields; nfields; str++) { + while (*str && isspace(*str)) str++; + while (*str && !isspace(*str)) str++; + nfields--; } // Skip chars - while (nchars-- && *str) - str++; + while (*str && nchars--) str++; + return str; } static void print_line(FILE *f, char *line) { - if (TT.repeats == 0 && (toys.optflags & FLAG_d)) - return; - if (TT.repeats > 0 && (toys.optflags & FLAG_u)) - return; - if ((toys.optflags & FLAG_c)) { - fprintf(f, "%7lu %s", TT.repeats + 1, line); - } else { - fprintf(f, "%s", line); - } - if (toys.optflags & FLAG_z) - fprintf(f, "%c", '\0'); + if (toys.optflags & (TT.repeats ? FLAG_u : FLAG_d)) return; + if (toys.optflags & FLAG_c) fprintf(f, "%7lu ", TT.repeats + 1); + fputs(line, f); + if (toys.optflags & FLAG_z) fputc(0, f); } void uniq_main(void) { - FILE *infile = stdin; - FILE *outfile = stdout; - char *thisline = NULL; - char *prevline = NULL; - size_t thissize, prevsize = 0; - char *tmpline; - char eol = '\n'; - size_t tmpsize; - - if (toys.optc >= 1) - infile = xfopen(toys.optargs[0], "r"); - - if (toys.optc >= 2) - outfile = xfopen(toys.optargs[1], "w"); - - if (toys.optflags & FLAG_z) - eol = '\0'; + FILE *infile = stdin, *outfile = stdout; + char *thisline = NULL, *prevline = NULL, *tmpline, eol = '\n'; + size_t thissize, prevsize = 0, tmpsize; + + if (toys.optc >= 1) infile = xfopen(toys.optargs[0], "r"); + if (toys.optc >= 2) outfile = xfopen(toys.optargs[1], "w"); + + if (toys.optflags & FLAG_z) eol = 0; // If first line can't be read if (getdelim(&prevline, &prevsize, eol, infile) < 0) |