diff options
Diffstat (limited to 'miscutils/strings.c')
-rw-r--r-- | miscutils/strings.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/miscutils/strings.c b/miscutils/strings.c new file mode 100644 index 0000000..3e02b53 --- /dev/null +++ b/miscutils/strings.c @@ -0,0 +1,84 @@ +/* vi: set sw=4 ts=4: */ +/* + * strings implementation for busybox + * + * Copyright Tito Ragusa <farmatito@tiscali.it> + * + * Licensed under the GPL v2 or later, see the file LICENSE in this tarball. + */ + +#include "libbb.h" + +#define WHOLE_FILE 1 +#define PRINT_NAME 2 +#define PRINT_OFFSET 4 +#define SIZE 8 + +int strings_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; +int strings_main(int argc UNUSED_PARAM, char **argv) +{ + int n, c, status = EXIT_SUCCESS; + unsigned opt; + unsigned count; + off_t offset; + FILE *file; + char *string; + const char *fmt = "%s: "; + const char *n_arg = "4"; + + opt = getopt32(argv, "afon:", &n_arg); + /* -a is our default behaviour */ + /*argc -= optind;*/ + argv += optind; + + n = xatou_range(n_arg, 1, INT_MAX); + string = xzalloc(n + 1); + n--; + + if (!*argv) { + fmt = "{%s}: "; + *--argv = (char *)bb_msg_standard_input; + } + + do { + file = fopen_or_warn_stdin(*argv); + if (!file) { + status = EXIT_FAILURE; + continue; + } + offset = 0; + count = 0; + do { + c = fgetc(file); + if (isprint(c) || c == '\t') { + if (count > n) { + bb_putchar(c); + } else { + string[count] = c; + if (count == n) { + if (opt & PRINT_NAME) { + printf(fmt, *argv); + } + if (opt & PRINT_OFFSET) { + printf("%7"OFF_FMT"o ", offset - n); + } + fputs(string, stdout); + } + count++; + } + } 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) + free(string); + + fflush_stdout_and_exit(status); +} |