source: branches/3.2/mindi-busybox/miscutils/strings.c @ 3232

Last change on this file since 3232 was 3232, checked in by Bruno Cornec, 7 years ago
  • Update mindi-busybox to 1.21.1
File size: 2.0 KB
Line 
1/* vi: set sw=4 ts=4: */
2/*
3 * strings implementation for busybox
4 *
5 * Copyright 2003 Tito Ragusa <farmatito@tiscali.it>
6 *
7 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
8 */
9
10//usage:#define strings_trivial_usage
11//usage:       "[-afo] [-n LEN] [FILE]..."
12//usage:#define strings_full_usage "\n\n"
13//usage:       "Display printable strings in a binary file\n"
14//usage:     "\n    -a  Scan whole file (default)"
15//usage:     "\n    -f  Precede strings with filenames"
16//usage:     "\n    -n LEN  At least LEN characters form a string (default 4)"
17//usage:     "\n    -o  Precede strings with decimal offsets"
18
19#include "libbb.h"
20
21#define WHOLE_FILE    1
22#define PRINT_NAME    2
23#define PRINT_OFFSET  4
24#define SIZE          8
25
26int strings_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
27int strings_main(int argc UNUSED_PARAM, char **argv)
28{
29    int n, c, status = EXIT_SUCCESS;
30    unsigned count;
31    off_t offset;
32    FILE *file;
33    char *string;
34    const char *fmt = "%s: ";
35    const char *n_arg = "4";
36
37    getopt32(argv, "afon:", &n_arg);
38    /* -a is our default behaviour */
39    /*argc -= optind;*/
40    argv += optind;
41
42    n = xatou_range(n_arg, 1, INT_MAX);
43    string = xzalloc(n + 1);
44    n--;
45
46    if (!*argv) {
47        fmt = "{%s}: ";
48        *--argv = (char *)bb_msg_standard_input;
49    }
50
51    do {
52        file = fopen_or_warn_stdin(*argv);
53        if (!file) {
54            status = EXIT_FAILURE;
55            continue;
56        }
57        offset = 0;
58        count = 0;
59        do {
60            c = fgetc(file);
61            if (isprint_asciionly(c) || c == '\t') {
62                if (count > n) {
63                    bb_putchar(c);
64                } else {
65                    string[count] = c;
66                    if (count == n) {
67                        if (option_mask32 & PRINT_NAME) {
68                            printf(fmt, *argv);
69                        }
70                        if (option_mask32 & PRINT_OFFSET) {
71                            printf("%7"OFF_FMT"o ", offset - n);
72                        }
73                        fputs(string, stdout);
74                    }
75                    count++;
76                }
77            } else {
78                if (count > n) {
79                    bb_putchar('\n');
80                }
81                count = 0;
82            }
83            offset++;
84        } while (c != EOF);
85        fclose_if_not_stdin(file);
86    } while (*++argv);
87
88    if (ENABLE_FEATURE_CLEAN_UP)
89        free(string);
90
91    fflush_stdout_and_exit(status);
92}
Note: See TracBrowser for help on using the repository browser.