X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=miscutils%2Fstrings.c;h=4d9bfe6901cd96f15db6daacd37b36ea10cb37b7;hb=9c7ee1439aded3f72fb314b516c0eb488076c179;hp=9a76c85346eb1550de242a0e0a16ee8a11546799;hpb=c052576821e75dff7424144c1cc0646ed68bd1c9;p=oweals%2Fbusybox.git diff --git a/miscutils/strings.c b/miscutils/strings.c index 9a76c8534..4d9bfe690 100644 --- a/miscutils/strings.c +++ b/miscutils/strings.c @@ -2,86 +2,115 @@ /* * strings implementation for busybox * - * Copyright Tito Ragusa - * - * Licensed under the GPL v2 or later, see the file LICENSE in this tarball. + * Copyright 2003 Tito Ragusa + * + * Licensed under GPLv2 or later, see file LICENSE in this source tree. */ +//config:config STRINGS +//config: bool "strings" +//config: default y +//config: help +//config: strings prints the printable character sequences for each file +//config: specified. + +//applet:IF_STRINGS(APPLET(strings, BB_DIR_USR_BIN, BB_SUID_DROP)) + +//kbuild:lib-$(CONFIG_STRINGS) += strings.o -#include "busybox.h" -#include -#include -#include -#include +//usage:#define strings_trivial_usage +//usage: "[-fo] [-t o/d/x] [-n LEN] [FILE]..." +//usage:#define strings_full_usage "\n\n" +//usage: "Display printable strings in a binary file\n" +//We usually don't bother user with "nop" options. They work, but are not shown: +////usage: "\n -a Scan whole file (default)" +//unimplemented alternative is -d: Only strings from initialized, loaded data sections +//usage: "\n -f Precede strings with filenames" +//usage: "\n -o Precede strings with octal offsets" +//usage: "\n -t o/d/x Precede strings with offsets in base 8/10/16" +//usage: "\n -n LEN At least LEN characters form a string (default 4)" -#define WHOLE_FILE 1 -#define PRINT_NAME 2 -#define PRINT_OFFSET 4 -#define SIZE 8 +#include "libbb.h" -int strings_main(int argc, char **argv) +#define WHOLE_FILE 1 +#define PRINT_NAME 2 +#define PRINT_OFFSET 4 +#define SIZE 8 +#define PRINT_RADIX 16 + +int strings_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; +int strings_main(int argc UNUSED_PARAM, char **argv) { - int n, c, i = 0, status = EXIT_SUCCESS; - unsigned long opt; - unsigned long count; - FILE *file = stdin; + int n, c, status = EXIT_SUCCESS; + unsigned count; + off_t offset; + FILE *file; char *string; const char *fmt = "%s: "; - char *n_arg = "4"; + const char *n_arg = "4"; + /* default for -o */ + const char *radix = "o"; + char *radix_fmt; - opt = bb_getopt_ulflags(argc, argv, "afon:", &n_arg); + getopt32(argv, "afon:t:", &n_arg, &radix); /* -a is our default behaviour */ - - argc -= optind; + /*argc -= optind;*/ argv += optind; - n = bb_xgetlarg(n_arg, 10, 1, INT_MAX); + n = xatou_range(n_arg, 1, INT_MAX); string = xzalloc(n + 1); n--; - if (argc == 0) { + if ((radix[0] != 'd' && radix[0] != 'o' && radix[0] != 'x') || radix[1] != 0) + bb_show_usage(); + + radix_fmt = xasprintf("%%7"OFF_FMT"%s ", radix); + + if (!*argv) { fmt = "{%s}: "; - *argv = (char *)bb_msg_standard_input; - goto PIPE; + *--argv = (char *)bb_msg_standard_input; } do { - if ((file = bb_wfopen(*argv, "r"))) { -PIPE: - count = 0; - do { - c = fgetc(file); - if (isprint(c) || c == '\t') { - if (i <= n) { - string[i] = c; - } else { - putchar(c); - } - if (i == n) { - if (opt & PRINT_NAME) { + file = fopen_or_warn_stdin(*argv); + if (!file) { + status = EXIT_FAILURE; + continue; + } + offset = 0; + count = 0; + do { + c = fgetc(file); + if (isprint_asciionly(c) || c == '\t') { + if (count > n) { + bb_putchar(c); + } else { + string[count] = c; + if (count == n) { + if (option_mask32 & PRINT_NAME) { printf(fmt, *argv); } - if (opt & PRINT_OFFSET) { - printf("%7lo ", count - n); + if (option_mask32 & (PRINT_OFFSET | PRINT_RADIX)) { + printf(radix_fmt, offset - n); } - printf("%s", string); - } - i++; - } else { - if (i > n) { - putchar('\n'); + fputs(string, stdout); } - i = 0; + count++; } - count++; - } while (c != EOF); - bb_fclose_nonstdin(file); - } else { - status = EXIT_FAILURE; - } - } while (--argc > 0); + } else { + if (count > n) { + bb_putchar('\n'); + } + count = 0; + } + offset++; + } while (c != EOF); + fclose_if_not_stdin(file); + } while (*++argv); - if (ENABLE_FEATURE_CLEAN_UP) + if (ENABLE_FEATURE_CLEAN_UP) { free(string); + free(radix_fmt); + } - bb_fflush_stdout_and_exit(status); + fflush_stdout_and_exit(status); }