- move #include busybox.h to the very top so we pull in the config
[platform/upstream/busybox.git] / miscutils / strings.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * strings implementation for busybox
4  *
5  * Copyright (c) 1980, 1987
6  *      The Regents of the University of California.  All rights reserved.
7  *
8  * Licensed under the GPL v2 or later, see the file LICENSE in this tarball.
9  *
10  * Original copyright notice is retained at the end of this file.
11  *
12  * Modified for BusyBox by Erik Andersen <andersen@codepoet.org>
13  * Badly hacked by Tito Ragusa <farmatito@tiscali.it>
14  */
15
16 #include "busybox.h"
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include <getopt.h>
20 #include <ctype.h>
21
22 #define WHOLE_FILE              1
23 #define PRINT_NAME              2
24 #define PRINT_OFFSET    4
25 #define SIZE                    8
26
27 int strings_main(int argc, char **argv)
28 {
29         int n, c, i = 0, status = EXIT_SUCCESS;
30         unsigned long opt;
31         unsigned long count;
32         FILE *file = stdin;
33         char *string;
34         const char *fmt = "%s: ";
35         char *n_arg = "4";
36
37         opt = bb_getopt_ulflags(argc, argv, "afon:", &n_arg);
38         /* -a is our default behaviour */
39
40         argc -= optind;
41         argv += optind;
42
43         n = bb_xgetlarg(n_arg, 10, 1, INT_MAX);
44         string = xzalloc(n + 1);
45         n--;
46
47         if (argc == 0) {
48                 fmt = "{%s}: ";
49                 *argv = (char *)bb_msg_standard_input;
50                 goto PIPE;
51         }
52
53         do {
54                 if ((file = bb_wfopen(*argv, "r"))) {
55 PIPE:
56                         count = 0;
57                         do {
58                                 c = fgetc(file);
59                                 if (isprint(c) || c == '\t') {
60                                         if (i <= n) {
61                                                 string[i] = c;
62                                         } else {
63                                                 putchar(c);
64                                         }
65                                         if (i == n) {
66                                                 if (opt & PRINT_NAME) {
67                                                         printf(fmt, *argv);
68                                                 }
69                                                 if (opt & PRINT_OFFSET) {
70                                                         printf("%7lo ", count - n);
71                                                 }
72                                                 printf("%s", string);
73                                         }
74                                         i++;
75                                 } else {
76                                         if (i > n) {
77                                                 putchar('\n');
78                                         }
79                                         i = 0;
80                                 }
81                                 count++;
82                         } while (c != EOF);
83                         bb_fclose_nonstdin(file);
84                 } else {
85                         status = EXIT_FAILURE;
86                 }
87         } while (--argc > 0);
88
89         if (ENABLE_FEATURE_CLEAN_UP)
90                 free(string);
91
92         bb_fflush_stdout_and_exit(status);
93 }
94
95 /*
96  * Copyright (c) 1980, 1987
97  *      The Regents of the University of California.  All rights reserved.
98  *
99  * Redistribution and use in source and binary forms, with or without
100  * modification, are permitted provided that the following conditions
101  * are met:
102  * 1. Redistributions of source code must retain the above copyright
103  *    notice, this list of conditions and the following disclaimer.
104  * 2. Redistributions in binary form must reproduce the above copyright
105  *    notice, this list of conditions and the following disclaimer in the
106  *    documentation and/or other materials provided with the distribution.
107  *
108  * 3. <BSD Advertising Clause omitted per the July 22, 1999 licensing change
109  *              ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change>
110  *
111  * 4. Neither the name of the University nor the names of its contributors
112  *    may be used to endorse or promote products derived from this software
113  *    without specific prior written permission.
114  *
115  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
116  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
117  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
118  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
119  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
120  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
121  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
122  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
123  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
124  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
125  * SUCH DAMAGE.
126  */