From 1647d032a7bfcba36d3dabe627b858b372210d05 Mon Sep 17 00:00:00 2001 From: Sami Kerola Date: Mon, 23 May 2011 22:42:15 +0200 Subject: colrm: gotos, long options and argument checking Unnecessary goto jumps where replaced by a simple function, and two loops. Long options support help and version, and the two arguments this command has are now validated with strtoul_or_err. Signed-off-by: Sami Kerola --- text-utils/colrm.c | 145 ++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 99 insertions(+), 46 deletions(-) (limited to 'text-utils/colrm.c') diff --git a/text-utils/colrm.c b/text-utils/colrm.c index e8b1ea4a4..d454643a0 100644 --- a/text-utils/colrm.c +++ b/text-utils/colrm.c @@ -40,67 +40,80 @@ #include #include +#include #include "nls.h" #include "widechar.h" +#include "strutils.h" +#include "c.h" /* COLRM removes unwanted columns from a file Jeff Schriebman UC Berkeley 11-74 */ -int -main(int argc, char **argv) +static void __attribute__ ((__noreturn__)) usage(FILE * out) { - register int ct, first, last; - register wint_t c; - int i, w; + fprintf(out, _("\nUsage:\n" + " %s [startcol [endcol]]\n"), + program_invocation_short_name); + + fprintf(out, _("\nOptions:\n" + " -V, --version output version information and exit\n" + " -h, --help display this help and exit\n\n")); + + fprintf(out, _("%s reads from standard input and writes to standard output\n\n"), + program_invocation_short_name); + + exit(out == stderr ? EXIT_FAILURE : EXIT_SUCCESS); +} + +int process_input(unsigned long first, unsigned long last) +{ + unsigned long ct = 0; + wint_t c; + unsigned long i; + int w; int padding; - setlocale(LC_ALL, ""); + for (;;) { + c = getwc(stdin); + if (c == WEOF) + return 0; + if (c == '\t') + w = ((ct + 8) & ~7) - ct; + else if (c == '\b') + w = (ct ? ct - 1 : 0) - ct; + else { + w = wcwidth(c); + if (w < 0) + w = 0; + } + ct += w; + if (c == '\n') { + putwc(c, stdout); + ct = 0; + continue; - first = 0; - last = 0; - if (argc > 1) - first = atoi(*++argv); - if (argc > 2) - last = atoi(*++argv); - -start: - ct = 0; -loop1: - c = getwc(stdin); - if (c == WEOF) - goto fin; - if (c == '\t') - w = ((ct + 8) & ~7) - ct; - else if (c == '\b') - w = (ct ? ct - 1 : 0) - ct; - else { - w = wcwidth(c); - if (w < 0) - w = 0; - } - ct += w; - if (c == '\n') { - putwc(c, stdout); - goto start; - } - if (!first || ct < first) { - putwc(c, stdout); - goto loop1; + } + if (!first || ct < first) { + putwc(c, stdout); + continue; + } + break; } - for (i = ct-w+1; i < first; i++) + + for (i = ct - w + 1; i < first; i++) putwc(' ', stdout); -/* Loop getting rid of characters */ + /* Loop getting rid of characters */ while (!last || ct < last) { c = getwc(stdin); if (c == WEOF) - goto fin; + return 0; if (c == '\n') { putwc(c, stdout); - goto start; + return 1; } if (c == '\t') ct = (ct + 8) & ~7; @@ -116,25 +129,65 @@ loop1: padding = 0; -/* Output last of the line */ + /* Output last of the line */ for (;;) { c = getwc(stdin); if (c == WEOF) break; if (c == '\n') { putwc(c, stdout); - goto start; + return 1; } if (padding == 0 && last < ct) { - for (i = last; i 1) + first = strtoul_or_err(*++argv, _("first argument")); + if (argc > 2) + last = strtoul_or_err(*++argv, _("second argument")); + + while (process_input(first, last)) + ; + fflush(stdout); if (ferror(stdout) || fclose(stdout)) - return 1; - return 0; + return EXIT_FAILURE; + return EXIT_SUCCESS; } -- cgit v1.2.3-55-g7522