blob: 1231a93bd05f8999fb25560fae17e7bc1d272a4f [file] [log] [blame]
Eric Andersenef5e8f82002-11-07 02:09:37 +00001/* 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 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 *
22 * Original copyright notice is retained at the end of this file.
23 *
Eric Andersencb81e642003-07-14 21:21:08 +000024 * Modified for BusyBox by Erik Andersen <andersen@codepoet.org>
Eric Andersen65ddf772003-01-13 23:19:31 +000025 * Badly hacked by Tito Ragusa <farmatito@tiscali.it>
Eric Andersenef5e8f82002-11-07 02:09:37 +000026 */
27
Eric Andersen65ddf772003-01-13 23:19:31 +000028#include <stdio.h>
29#include <stdlib.h>
30#include <string.h>
31#include <getopt.h>
Eric Andersenef5e8f82002-11-07 02:09:37 +000032#include <unistd.h>
33#include <ctype.h>
34#include "busybox.h"
35
36#define ISSTR(ch) (isprint(ch) || ch == '\t')
37
Eric Andersen65ddf772003-01-13 23:19:31 +000038int strings_main(int argc, char **argv)
Eric Andersenef5e8f82002-11-07 02:09:37 +000039{
Eric Andersen92b7e7b2003-03-13 18:49:45 +000040 int n=4, c, i, opt=0, a=0, status=EXIT_SUCCESS;
41 long t=0, count;
Eric Andersen65ddf772003-01-13 23:19:31 +000042 FILE *file;
Eric Andersen92b7e7b2003-03-13 18:49:45 +000043 char *string=NULL;
44
45 while ((i = getopt(argc, argv, "afon:")) > 0)
Eric Andersen65ddf772003-01-13 23:19:31 +000046 switch(i)
47 {
Glenn L McGrathdd3461a2003-01-09 10:00:49 +000048 case 'a':
Eric Andersenef5e8f82002-11-07 02:09:37 +000049 break;
50 case 'f':
Eric Andersen92b7e7b2003-03-13 18:49:45 +000051 opt+=1;
Eric Andersenef5e8f82002-11-07 02:09:37 +000052 break;
53 case 'o':
Eric Andersen92b7e7b2003-03-13 18:49:45 +000054 opt+=2;
55 break;
56 case 'n':
Eric Andersena860bec2003-04-27 10:42:31 +000057 n = bb_xgetlarg(optarg, 10, 1, INT_MAX);
Eric Andersenef5e8f82002-11-07 02:09:37 +000058 break;
59 default:
Manuel Novoa III cad53642003-03-19 09:13:01 +000060 bb_show_usage();
Eric Andersenef5e8f82002-11-07 02:09:37 +000061 }
Eric Andersen65ddf772003-01-13 23:19:31 +000062
Eric Andersenef5e8f82002-11-07 02:09:37 +000063 argc -= optind;
64 argv += optind;
65
Eric Andersen65ddf772003-01-13 23:19:31 +000066 i=0;
Eric Andersenef5e8f82002-11-07 02:09:37 +000067
Eric Andersen92b7e7b2003-03-13 18:49:45 +000068 string=xmalloc(n+1);
69 string[n]='\0';
70 n-=1;
71
Eric Andersen65ddf772003-01-13 23:19:31 +000072 if(!argc )
73 {
74 file = stdin;
75 goto pipe;
76 }
Eric Andersenef5e8f82002-11-07 02:09:37 +000077
Eric Andersen65ddf772003-01-13 23:19:31 +000078 for(a=0;a<argc;a++)
79 {
Eric Andersen92b7e7b2003-03-13 18:49:45 +000080 if((file=fopen(argv[a],"r")))
Eric Andersen65ddf772003-01-13 23:19:31 +000081 {
Eric Andersen92b7e7b2003-03-13 18:49:45 +000082pipe:
83
84 count=0;
Glenn L McGrathe01c5502003-08-29 15:48:37 +000085 do{
Eric Andersen92b7e7b2003-03-13 18:49:45 +000086 c=fgetc(file);
87 if(ISSTR(c))
Eric Andersene9319092003-01-09 14:36:26 +000088 {
Eric Andersen92b7e7b2003-03-13 18:49:45 +000089 if(i==0)
90 t=count;
91 if(i<=n)
92 string[i]=c;
93 if(i==n)
94 {
95 if(opt == 1 || opt == 3 )
96 printf("%s: ", (!argv[a])? "{stdin}" : argv[a]);
97 if(opt >= 2 )
98 printf("%7lo ", t);
99 printf("%s", string);
100 }
101 if(i>n)
102 putchar(c);
103 i++;
Eric Andersene9319092003-01-09 14:36:26 +0000104 }
Eric Andersen92b7e7b2003-03-13 18:49:45 +0000105 else
106 {
107 if(i>n)
Glenn L McGrathbb136242003-08-30 12:38:13 +0000108 putchar('\n');
Eric Andersen92b7e7b2003-03-13 18:49:45 +0000109 i=0;
110 }
111 count++;
Glenn L McGrathe01c5502003-08-29 15:48:37 +0000112 }while(c!=EOF);
Eric Andersen92b7e7b2003-03-13 18:49:45 +0000113
Glenn L McGrathe01c5502003-08-29 15:48:37 +0000114 bb_fclose_nonstdin(file);
Eric Andersenef5e8f82002-11-07 02:09:37 +0000115 }
Eric Andersen92b7e7b2003-03-13 18:49:45 +0000116 else
117 {
Manuel Novoa III cad53642003-03-19 09:13:01 +0000118 bb_perror_msg("%s",argv[a]);
Eric Andersen92b7e7b2003-03-13 18:49:45 +0000119 status=EXIT_FAILURE;
120 }
Eric Andersen65ddf772003-01-13 23:19:31 +0000121 }
122 free(string);
Eric Andersen92b7e7b2003-03-13 18:49:45 +0000123 exit(status);
Eric Andersenef5e8f82002-11-07 02:09:37 +0000124}
125
126/*
127 * Copyright (c) 1980, 1987
128 * The Regents of the University of California. All rights reserved.
129 *
130 * Redistribution and use in source and binary forms, with or without
131 * modification, are permitted provided that the following conditions
132 * are met:
133 * 1. Redistributions of source code must retain the above copyright
134 * notice, this list of conditions and the following disclaimer.
135 * 2. Redistributions in binary form must reproduce the above copyright
136 * notice, this list of conditions and the following disclaimer in the
137 * documentation and/or other materials provided with the distribution.
138 *
Eric Andersen65ddf772003-01-13 23:19:31 +0000139 * 3. <BSD Advertising Clause omitted per the July 22, 1999 licensing change
Eric Andersenef5e8f82002-11-07 02:09:37 +0000140 * ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change>
141 *
142 * 4. Neither the name of the University nor the names of its contributors
143 * may be used to endorse or promote products derived from this software
144 * without specific prior written permission.
145 *
146 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
147 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
148 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
149 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
150 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
151 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
152 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
153 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
154 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
155 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
156 * SUCH DAMAGE.
157 */