use bb_xbind/bb_xlisten
[oweals/busybox.git] / coreutils / fold.c
index e45a75b33e183d0cceabc42d6d75c2d884c58c0c..833935af39533c32017ffcd7fa75b5bd3153b831 100644 (file)
@@ -18,7 +18,6 @@
 #include <unistd.h>
 #include "busybox.h"
 
-/* If nonzero, count bytes, not column positions. */
 static unsigned long flags;
 #define FLAG_COUNT_BYTES       1
 #define FLAG_BREAK_SPACES      2
@@ -45,39 +44,30 @@ static int adjust_column(int column, char c)
        return column;
 }
 
-extern int fold_main(int argc, char **argv)
+int fold_main(int argc, char **argv)
 {
        char *w_opt;
-
-       /* If nonzero, at least one of the files we read was standard input. */
-       int have_read_stdin = 0;
-
        int width = 80;
        int i;
        int errs = 0;
 
-       have_read_stdin = 0;
-
-       /* Turn any numeric options into -w options.  */
-       for (i = 1; i < argc; i++) {
-               char const *a = argv[i];
-
-               if (a[0] == '-') {
-                       if (a[1] == '-' && !a[2])
-                               break;
-                       if (isdigit(a[1])) {
-                               char *s = xmalloc(strlen(a) + 2);
+       if(!ENABLE_DEBUG_YANK_SUSv2) {
+               /* Turn any numeric options into -w options.  */
+               for (i = 1; i < argc; i++) {
+                       char const *a = argv[i];
 
-                               s[0] = '-';
-                               s[1] = 'w';
-                               strcpy(s + 2, a + 1);
-                               argv[i] = s;
+                       if (*a++ == '-') {
+                               if (*a == '-' && !a[1])
+                                       break;
+                               if (isdigit(*a)) {
+                                       argv[i] = bb_xasprintf("-w%s", a);
+                               }
                        }
                }
        }
 
        flags = bb_getopt_ulflags(argc, argv, "bsw:", &w_opt);
-       if (flags & 4)
+       if (flags & FLAG_WIDTH)
                width = bb_xgetlarg(w_opt, 10, 1, 10000);
 
        argv += optind;
@@ -87,83 +77,85 @@ extern int fold_main(int argc, char **argv)
 
        do {
                FILE *istream = bb_wfopen_input(*argv);
-               if (istream != NULL) {
-                       int c;
-                       int column = 0;         /* Screen column where next char will go. */
-                       int offset_out = 0;     /* Index in `line_out' for next char. */
-                       static char *line_out = NULL;
-                       static int allocated_out = 0;
-
-                       while ((c = getc(istream)) != EOF) {
-                               if (offset_out + 1 >= allocated_out) {
-                                       allocated_out += 1024;
-                                       line_out = xrealloc(line_out, allocated_out);
-                               }
+               int c;
+               int column = 0;         /* Screen column where next char will go. */
+               int offset_out = 0;     /* Index in `line_out' for next char. */
+               static char *line_out = NULL;
+               static int allocated_out = 0;
 
-                               if (c == '\n') {
-                                       line_out[offset_out++] = c;
-                                       fwrite(line_out, sizeof(char), (size_t) offset_out, stdout);
-                                       column = offset_out = 0;
-                                       continue;
-                               }
+               if (istream == NULL) {
+                       errs |= EXIT_FAILURE;
+                       continue;
+               }
+
+               while ((c = getc(istream)) != EOF) {
+                       if (offset_out + 1 >= allocated_out) {
+                               allocated_out += 1024;
+                               line_out = xrealloc(line_out, allocated_out);
+                       }
+
+                       if (c == '\n') {
+                               line_out[offset_out++] = c;
+                               fwrite(line_out, sizeof(char), (size_t) offset_out, stdout);
+                               column = offset_out = 0;
+                               continue;
+                       }
 
 rescan:
-                               column = adjust_column(column, c);
-
-                               if (column > width) {
-                                       /* This character would make the line too long.
-                                         Print the line plus a newline, and make this character
-                                          start the next line. */
-                                       if (flags & FLAG_BREAK_SPACES) {
-                                               /* Look for the last blank. */
-                                               int logical_end;
-
-                                               for (logical_end = offset_out - 1; logical_end >= 0; logical_end--) {
-                                                       if (isblank(line_out[logical_end])) {
-                                                               break;
-                                                       }
-                                               }
-                                               if (logical_end >= 0) {
-                                                       /* Found a blank.  Don't output the part after it. */
-                                                       logical_end++;
-                                                       fwrite(line_out, sizeof(char), (size_t) logical_end, stdout);
-                                                       putchar('\n');
-                                                       /* Move the remainder to the beginning of the next line.
-                                                          The areas being copied here might overlap. */
-                                                       memmove(line_out, line_out + logical_end, offset_out - logical_end);
-                                                       offset_out -= logical_end;
-                                                       for (column = i = 0; i < offset_out; i++) {
-                                                               column = adjust_column(column, line_out[i]);
-                                                       }
-                                                       goto rescan;
+                       column = adjust_column(column, c);
+
+                       if (column > width) {
+                               /* This character would make the line too long.
+                                  Print the line plus a newline, and make this character
+                                  start the next line. */
+                               if (flags & FLAG_BREAK_SPACES) {
+                                       /* Look for the last blank. */
+                                       int logical_end;
+
+                                       for (logical_end = offset_out - 1; logical_end >= 0; logical_end--) {
+                                               if (isblank(line_out[logical_end])) {
+                                                       break;
                                                }
-                                       } else {
-                                               if (offset_out == 0) {
-                                                       line_out[offset_out++] = c;
-                                                       continue;
+                                       }
+                                       if (logical_end >= 0) {
+                                               /* Found a blank.  Don't output the part after it. */
+                                               logical_end++;
+                                               fwrite(line_out, sizeof(char), (size_t) logical_end, stdout);
+                                               putchar('\n');
+                                               /* Move the remainder to the beginning of the next line.
+                                                  The areas being copied here might overlap. */
+                                               memmove(line_out, line_out + logical_end, offset_out - logical_end);
+                                               offset_out -= logical_end;
+                                               for (column = i = 0; i < offset_out; i++) {
+                                                       column = adjust_column(column, line_out[i]);
                                                }
+                                               goto rescan;
+                                       }
+                               } else {
+                                       if (offset_out == 0) {
+                                               line_out[offset_out++] = c;
+                                               continue;
                                        }
-                                       line_out[offset_out++] = '\n';
-                                       fwrite(line_out, sizeof(char), (size_t) offset_out, stdout);
-                                       column = offset_out = 0;
-                                       goto rescan;
                                }
-
-                               line_out[offset_out++] = c;
-                       }
-
-                       if (offset_out) {
+                               line_out[offset_out++] = '\n';
                                fwrite(line_out, sizeof(char), (size_t) offset_out, stdout);
+                               column = offset_out = 0;
+                               goto rescan;
                        }
 
-                       if (ferror(istream) || bb_fclose_nonstdin(istream)) {
-                               bb_perror_msg("%s", *argv);     /* Avoid multibyte problems. */
-                               errs |= EXIT_FAILURE;
-                       }
-               } else {
+                       line_out[offset_out++] = c;
+               }
+
+               if (offset_out) {
+                       fwrite(line_out, sizeof(char), (size_t) offset_out, stdout);
+               }
+
+               if (ferror(istream) || bb_fclose_nonstdin(istream)) {
+                       bb_perror_msg("%s", *argv);     /* Avoid multibyte problems. */
                        errs |= EXIT_FAILURE;
                }
        } while (*++argv);
 
        bb_fflush_stdout_and_exit(errs);
 }
+/* vi: set sw=4 ts=4: */