X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=miscutils%2Fstrings.c;h=111aa94ba0f0bc4675d4bea162edf0fead205bba;hb=843c5ef0f95e0a6f61f4e27d0355aca5e09ee6b1;hp=3d3aaf589072c484e3f40595120bc945e0c3911a;hpb=dd3461af2f227efae7a69a67e5b8dc1f665b57b9;p=oweals%2Fbusybox.git diff --git a/miscutils/strings.c b/miscutils/strings.c index 3d3aaf589..111aa94ba 100644 --- a/miscutils/strings.c +++ b/miscutils/strings.c @@ -21,92 +21,88 @@ * * Original copyright notice is retained at the end of this file. * - * Modified for BusyBox by Erik Andersen + * Modified for BusyBox by Erik Andersen + * Badly hacked by Tito Ragusa */ -#include -#include -#include -#include -#include +#include +#include +#include #include #include "busybox.h" #define ISSTR(ch) (isprint(ch) || ch == '\t') -int strings_main(int argc, char **argv) -{ - extern char *optarg; - extern int optind; - int ch, cnt; - int exitcode; - int oflg, fflg; - char *file; - size_t foff, minlen; - unsigned char *bfr, *C; - +#define WHOLE_FILE 1 +#define PRINT_NAME 2 +#define PRINT_OFFSET 4 +#define SIZE 8 - exitcode = fflg = oflg = 0; - minlen = -1; - while ((ch = getopt(argc, argv, "an:of")) > 0) - switch(ch) { - case 'a': - break; - case 'f': - fflg = 1; - break; - case 'n': - minlen = atoi(optarg); - break; - case 'o': - oflg = 1; - break; - default: - show_usage(); - } +int strings_main(int argc, char **argv) +{ + int n, c, i = 0, status = EXIT_SUCCESS; + unsigned long opt; + unsigned long count; + FILE *file = stdin; + char *string; + const char *fmt = "%s: "; + char *n_arg = "4"; + + opt = bb_getopt_ulflags (argc, argv, "afon:", &n_arg); + /* -a is our default behaviour */ + argc -= optind; argv += optind; - if (minlen == -1) - minlen = 4; - - bfr = xmalloc(minlen); - bfr[minlen] = '\0'; - file = "stdin"; + n = bb_xgetlarg(n_arg, 10, 1, INT_MAX); + string = xcalloc(n + 1, 1); + n--; + + if ( argc == 0) { + fmt = "{%s}: "; + *argv = (char *)bb_msg_standard_input; + goto PIPE; + } + do { - if (*argv) { - fprintf(stderr, "opening '%s'\n", *argv); - file = *argv++; - if (!freopen(file, "r", stdin)) { - perror_msg("%s", file); - exitcode = EXIT_FAILURE; - continue; - } + if ((file = bb_wfopen(*argv, "r"))) { +PIPE: + count = 0; + do { + c = fgetc(file); + if (ISSTR(c)) { + if (i <= n) { + string[i]=c; + } else { + putchar(c); + } + if (i == n) { + if (opt & PRINT_NAME) { + printf(fmt, *argv); + } + if (opt & PRINT_OFFSET) { + printf("%7lo ", count - n ); + } + printf("%s", string); + } + i++; + } else { + if (i > n) { + putchar('\n'); + } + i = 0; + } + count++; + } while (c != EOF); + bb_fclose_nonstdin(file); + } else { + status=EXIT_FAILURE; } - foff = 0; + } while ( --argc > 0 ); - for (cnt = 0; (ch = getchar()) != EOF;) { - foff++; - if (ISSTR(ch)) { - if (!cnt) - C = bfr; - *C++ = ch; - if (++cnt < minlen) - continue; - if (fflg) - printf("%s:", file); - if (oflg) - printf("%7ld %s", (long)(foff - minlen), (char *)bfr); - else - printf("%s", bfr); - while ((ch = getchar()) != EOF && ISSTR(ch)) - putchar((char)ch); - putchar('\n'); - } - cnt = 0; - } - } while (*argv); - exit(exitcode); + if (ENABLE_FEATURE_CLEAN_UP) free(string); + + bb_fflush_stdout_and_exit(status); } /* @@ -122,8 +118,8 @@ int strings_main(int argc, char **argv) * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - * 3. + * 3. * * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software