stty: fix columns command. closes bug 791.
[oweals/busybox.git] / coreutils / wc.c
index 627267d4269d507d6835cd0b80e1f62b1b0f91fa..08f3c2dc4d9e1116231ba3559dd3f7efbe50c3b0 100644 (file)
 
 #include "libbb.h"
 
-#if ENABLE_LOCALE_SUPPORT
-#define isspace_given_isprint(c) isspace(c)
-#else
-#undef isspace
-#undef isprint
-#define isspace(c) ((((c) == ' ') || (((unsigned int)((c) - 9)) <= (13 - 9))))
-#define isprint(c) (((unsigned int)((c) - 0x20)) <= (0x7e - 0x20))
-#define isspace_given_isprint(c) ((c) == ' ')
+#if !ENABLE_LOCALE_SUPPORT
+# undef isprint
+# undef isspace
+# define isprint(c) ((unsigned)((c) - 0x20) <= (0x7e - 0x20))
+# define isspace(c) ((c) == ' ')
 #endif
 
 #if ENABLE_FEATURE_WC_LARGE
-#define COUNT_T unsigned long long
-#define COUNT_FMT "llu"
+# define COUNT_T unsigned long long
+# define COUNT_FMT "llu"
 #else
-#define COUNT_T unsigned
-#define COUNT_FMT "u"
+# define COUNT_T unsigned
+# define COUNT_FMT "u"
 #endif
 
 enum {
@@ -68,25 +65,20 @@ enum {
        WC_LENGTH       = 3
 };
 
-int wc_main(int argc, char **argv);
-int wc_main(int argc, char **argv)
+int wc_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+int wc_main(int argc UNUSED_PARAM, char **argv)
 {
-       FILE *fp;
-       const char *s, *arg;
-       const char *start_fmt = "%9"COUNT_FMT;
+       const char *arg;
+       const char *start_fmt = " %9"COUNT_FMT + 1;
        const char *fname_fmt = " %s\n";
        COUNT_T *pcounts;
        COUNT_T counts[4];
        COUNT_T totals[4];
-       unsigned linepos;
-       unsigned u;
-       int num_files = 0;
-       int c;
+       int num_files;
        smallint status = EXIT_SUCCESS;
-       smallint in_word;
        unsigned print_type;
 
-       print_type = getopt32(argc, argv, "lwcL");
+       print_type = getopt32(argv, "lwcL");
 
        if (print_type == 0) {
                print_type = (1 << WC_LINES) | (1 << WC_WORDS) | (1 << WC_CHARS);
@@ -104,7 +96,14 @@ int wc_main(int argc, char **argv)
 
        pcounts = counts;
 
+       num_files = 0;
        while ((arg = *argv++) != 0) {
+               FILE *fp;
+               const char *s;
+               unsigned u;
+               unsigned linepos;
+               smallint in_word;
+
                ++num_files;
                fp = fopen_or_warn_stdin(arg);
                if (!fp) {
@@ -117,17 +116,26 @@ int wc_main(int argc, char **argv)
                in_word = 0;
 
                do {
+                       int c;
                        /* Our -w doesn't match GNU wc exactly... oh well */
 
                        ++counts[WC_CHARS];
                        c = getc(fp);
-                       if (isprint(c)) {
+                       if (c == EOF) {
+                               if (ferror(fp)) {
+                                       bb_simple_perror_msg(arg);
+                                       status = EXIT_FAILURE;
+                               }
+                               --counts[WC_CHARS];
+                               goto DO_EOF;            /* Treat an EOF as '\r'. */
+                       }
+                       if (isprint_asciionly(c)) {
                                ++linepos;
-                               if (!isspace_given_isprint(c)) {
+                               if (!isspace(c)) {
                                        in_word = 1;
                                        continue;
                                }
-                       } else if (((unsigned int)(c - 9)) <= 4) {
+                       } else if ((unsigned)(c - 9) <= 4) {
                                /* \t  9
                                 * \n 10
                                 * \v 11
@@ -137,7 +145,7 @@ int wc_main(int argc, char **argv)
                                if (c == '\t') {
                                        linepos = (linepos | 7) + 1;
                                } else {                        /* '\n', '\r', '\f', or '\v' */
                              DO_EOF:
+ DO_EOF:
                                        if (linepos > counts[WC_LENGTH]) {
                                                counts[WC_LENGTH] = linepos;
                                        }
@@ -148,13 +156,6 @@ int wc_main(int argc, char **argv)
                                                linepos = 0;
                                        }
                                }
-                       } else if (c == EOF) {
-                               if (ferror(fp)) {
-                                       bb_perror_msg("%s", arg);
-                                       status = EXIT_FAILURE;
-                               }
-                               --counts[WC_CHARS];
-                               goto DO_EOF;            /* Treat an EOF as '\r'. */
                        } else {
                                continue;
                        }
@@ -173,7 +174,7 @@ int wc_main(int argc, char **argv)
 
                fclose_if_not_stdin(fp);
 
      OUTPUT:
+ OUTPUT:
                /* coreutils wc tries hard to print pretty columns
                 * (saves results for all files, find max col len etc...)
                 * we won't try that hard, it will bloat us too much */