summaryrefslogtreecommitdiffstats
path: root/text-utils/colrm.c
diff options
context:
space:
mode:
authorSami Kerola2011-05-23 22:42:15 +0200
committerKarel Zak2011-06-08 11:13:12 +0200
commit1647d032a7bfcba36d3dabe627b858b372210d05 (patch)
treee2b60b61f47c809e46687a3f8202a60aecb16217 /text-utils/colrm.c
parentcol: check with strtol_or_err option argument (diff)
downloadkernel-qcow2-util-linux-1647d032a7bfcba36d3dabe627b858b372210d05.tar.gz
kernel-qcow2-util-linux-1647d032a7bfcba36d3dabe627b858b372210d05.tar.xz
kernel-qcow2-util-linux-1647d032a7bfcba36d3dabe627b858b372210d05.zip
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 <kerolasa@iki.fi>
Diffstat (limited to 'text-utils/colrm.c')
-rw-r--r--text-utils/colrm.c145
1 files changed, 99 insertions, 46 deletions
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 <stdio.h>
#include <stdlib.h>
+#include <getopt.h>
#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 <ct; i++)
+ for (i = last; i < ct; i++)
putwc(' ', stdout);
padding = 1;
}
putwc(c, stdout);
}
-fin:
+ return 0;
+}
+
+int main(int argc, char **argv)
+{
+ unsigned long first = 0, last = 0;
+ int opt;
+
+ static const struct option longopts[] = {
+ {"version", no_argument, 0, 'V'},
+ {"help", no_argument, 0, 'h'},
+ {NULL, 0, 0, 0}
+ };
+
+ setlocale(LC_ALL, "");
+ bindtextdomain(PACKAGE, LOCALEDIR);
+ textdomain(PACKAGE);
+
+ while ((opt =
+ getopt_long(argc, argv, "bfhl:pxVH", longopts,
+ NULL)) != -1)
+ switch (opt) {
+ case 'V':
+ printf(_("%s from %s\n"),
+ program_invocation_short_name,
+ PACKAGE_STRING);
+ return EXIT_SUCCESS;
+ case 'h':
+ usage(stdout);
+ default:
+ usage(stderr);
+ }
+
+ if (argc > 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;
}