aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandersen <andersen@69ca8d6d-28ef-0310-b511-8ec308f3f277>2003-01-13 23:19:31 +0000
committerandersen <andersen@69ca8d6d-28ef-0310-b511-8ec308f3f277>2003-01-13 23:19:31 +0000
commitf58dbe641d17a9a26baf5ebdcd7c7f77fe567bd1 (patch)
treec71c597efb86273b1f5e6ecb13beac51abbb3221
parentacfd861ee5a026d6350b3494813d4a3de63fb374 (diff)
downloadbusybox-w32-f58dbe641d17a9a26baf5ebdcd7c7f77fe567bd1.tar.gz
busybox-w32-f58dbe641d17a9a26baf5ebdcd7c7f77fe567bd1.tar.bz2
busybox-w32-f58dbe641d17a9a26baf5ebdcd7c7f77fe567bd1.zip
Patch from Tito to rework strings applet, and some testsuite
stuff to test it added by me. git-svn-id: svn://busybox.net/trunk/busybox@6324 69ca8d6d-28ef-0310-b511-8ec308f3f277
-rw-r--r--miscutils/strings.c133
-rw-r--r--testsuite/strings/strings-works-like-GNU8
2 files changed, 78 insertions, 63 deletions
diff --git a/miscutils/strings.c b/miscutils/strings.c
index 649485033..9d8012aa2 100644
--- a/miscutils/strings.c
+++ b/miscutils/strings.c
@@ -22,99 +22,106 @@
22 * Original copyright notice is retained at the end of this file. 22 * Original copyright notice is retained at the end of this file.
23 * 23 *
24 * Modified for BusyBox by Erik Andersen <andersee@debian.org> 24 * Modified for BusyBox by Erik Andersen <andersee@debian.org>
25 * Badly hacked by Tito Ragusa <farmatito@tiscali.it>
25 */ 26 */
26 27
27#include <stdio.h> 28#include <stdio.h>
28#include <stdlib.h> 29#include <stdlib.h>
29#include <string.h> 30#include <string.h>
30#include <getopt.h> 31#include <getopt.h>
31#include <unistd.h> 32#include <unistd.h>
32#include <ctype.h> 33#include <ctype.h>
33#include "busybox.h" 34#include "busybox.h"
34 35
35#define ISSTR(ch) (isprint(ch) || ch == '\t') 36#define ISSTR(ch) (isprint(ch) || ch == '\t')
36 37
37int strings_main(int argc, char **argv) 38int strings_main(int argc, char **argv)
38{ 39{
39 extern char *optarg; 40 extern char *optarg;
40 extern int optind; 41 extern int optind;
41 int ch, cnt; 42 int n=4, c, i, opt=0, a=0;
42 int exitcode; 43 long t, count;
43 int oflg, fflg; 44 FILE *file;
44 char *file; 45 char *string;
45 size_t foff, minlen; 46
46 unsigned char *bfr, *C; 47 while ((i = getopt(argc, argv, "an:of")) > 0)
47 int i; 48 switch(i)
48 49 {
49 exitcode = fflg = oflg = 0;
50 minlen = -1;
51 while ((ch = getopt(argc, argv, "an:of")) > 0)
52 switch(ch) {
53 case 'a': 50 case 'a':
54 break; 51 break;
55 case 'f': 52 case 'f':
56 fflg = 1; 53 opt++;
57 break; 54 break;
58 case 'n': 55 case 'n':
59 minlen = atoi(optarg); 56 n = atoi(optarg);
57 if(!(n/1))
58 show_usage();
60 break; 59 break;
61 case 'o': 60 case 'o':
62 oflg = 1; 61 opt++;
62 opt++;
63 break; 63 break;
64 default: 64 default:
65 show_usage(); 65 show_usage();
66 } 66 }
67
67 argc -= optind; 68 argc -= optind;
68 argv += optind; 69 argv += optind;
69 70
70 if (minlen == -1) 71 i=0;
71 minlen = 4;
72 72
73 bfr = xmalloc(minlen); 73 if(!argc )
74 bfr[minlen] = '\0'; 74 {
75 file = "stdin"; 75 file = stdin;
76 do { 76 goto pipe;
77 if (*argv) { 77 }
78 fprintf(stderr, "opening '%s'\n", *argv);
79 file = *argv++;
80 if (!freopen(file, "r", stdin)) {
81 perror_msg("%s", file);
82 exitcode = EXIT_FAILURE;
83 continue;
84 }
85 }
86 foff = 0;
87 78
88 for (cnt = 0; (ch = getchar()) != EOF;) { 79 for(a=0;a<argc;a++)
89 foff++; 80 {
90 if (ISSTR(ch)) { 81 file=xfopen(argv[a],"r");
91 if (!cnt) 82
92 C = bfr; 83 pipe:
93 *C++ = ch; 84
94 if (++cnt < minlen) 85 count=0;
95 continue; 86 string=xmalloc(n);
96 if (fflg) 87 string[n]='\0';
97 printf("%s:", file); 88 n--;
98 if (oflg) 89 while(1)
99 printf("%7lo %s", (long)(foff - minlen), (char *)bfr); 90 {
100 else 91 c=fgetc(file);
101 printf("%s", bfr); 92 if(ISSTR(c))
102 i=0; 93 {
103 while ((ch = getchar()) != EOF && ISSTR(ch)) 94 if(i==0)
95 t=count;
96 if(i<=n)
97 string[i]=c;
98 if(i==n)
104 { 99 {
105 putchar((char)ch); 100 if(opt == 1 || opt == 3 )
106 i++; 101 printf("%s: ",(!argv[a])?"{stdin}":argv[a]);
102 if(opt >= 2 )
103 printf("%7lo ",t);
104 printf("%s",string);
107 } 105 }
108 if(i>0) 106 if(i>n)
109 foff+=(i+1); 107 putchar(c);
110 else 108 i++;
111 foff++; 109 }
112 putchar('\n'); 110 else
111 {
112 if(i>n)
113 puts("");
114 i=0;
113 } 115 }
114 cnt = 0; 116 count++;
117 if(c==EOF)
118 break;
115 } 119 }
116 } while (*argv); 120 if(file!=stdin)
117 exit(exitcode); 121 fclose(file);
122 }
123 free(string);
124 exit(EXIT_SUCCESS);
118} 125}
119 126
120/* 127/*
@@ -130,7 +137,7 @@ int strings_main(int argc, char **argv)
130 * notice, this list of conditions and the following disclaimer in the 137 * notice, this list of conditions and the following disclaimer in the
131 * documentation and/or other materials provided with the distribution. 138 * documentation and/or other materials provided with the distribution.
132 * 139 *
133 * 3. <BSD Advertising Clause omitted per the July 22, 1999 licensing change 140 * 3. <BSD Advertising Clause omitted per the July 22, 1999 licensing change
134 * ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change> 141 * ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change>
135 * 142 *
136 * 4. Neither the name of the University nor the names of its contributors 143 * 4. Neither the name of the University nor the names of its contributors
diff --git a/testsuite/strings/strings-works-like-GNU b/testsuite/strings/strings-works-like-GNU
new file mode 100644
index 000000000..02e423134
--- /dev/null
+++ b/testsuite/strings/strings-works-like-GNU
@@ -0,0 +1,8 @@
1rm -f foo bar
2strings -af ../../busybox > foo
3busybox strings -af ../../busybox > bar
4test ! -f foo -a -f bar
5if [ $? = 0 ] ; then
6 diff -q foo bar
7fi;
8