blob: 50a29617845259b7b9e7523d3dbf9a1328f621f3 [file] [log] [blame]
Eric Andersencc8ed391999-10-05 16:24:54 +00001/*
Eric Andersen3e0fbae1999-10-19 06:02:44 +00002 * Mini grep implementation for busybox
Eric Andersencc8ed391999-10-05 16:24:54 +00003 *
Eric Andersenc4996011999-10-20 22:08:37 +00004 *
5 * Copyright (C) 1999 by Lineo, inc.
6 * Written by Erik Andersen <andersen@lineo.com>, <andersee@debian.org>
Eric Andersencc8ed391999-10-05 16:24:54 +00007 *
Eric Andersen3e0fbae1999-10-19 06:02:44 +00008 * 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 *
Eric Andersencc8ed391999-10-05 16:24:54 +000022 */
23
24#include "internal.h"
Eric Andersenaa0765e1999-10-22 04:30:20 +000025#include "regexp.h"
Eric Andersencc8ed391999-10-05 16:24:54 +000026#include <stdio.h>
27#include <dirent.h>
28#include <errno.h>
29#include <fcntl.h>
30#include <signal.h>
31#include <time.h>
32#include <ctype.h>
33
Eric Andersene77ae3a1999-10-19 20:03:34 +000034static const char grep_usage[] =
Eric Andersen3e0fbae1999-10-19 06:02:44 +000035"grep [-ihn]... PATTERN [FILE]...\n"
36"Search for PATTERN in each FILE or standard input.\n\n"
37"\t-h\tsuppress the prefixing filename on output\n"
38"\t-i\tignore case distinctions\n"
39"\t-n\tprint line number with output lines\n\n"
Eric Andersenaa0765e1999-10-22 04:30:20 +000040#if defined BB_REGEXP
41"This version of grep matches full regexps.\n";
42#else
Eric Andersen3e0fbae1999-10-19 06:02:44 +000043"This version of grep matches strings (not full regexps).\n";
Eric Andersenaa0765e1999-10-22 04:30:20 +000044#endif
Eric Andersencc8ed391999-10-05 16:24:54 +000045
Eric Andersenfbb39c81999-11-08 17:00:52 +000046int tellName=TRUE;
47int ignoreCase=FALSE;
48int tellLine=FALSE;
49
50static do_grep(char* needle, char* haystack )
51{
52 line = 0;
53
54 while (fgets (haystack, sizeof (haystack), fp)) {
55 line++;
56 cp = &haystack[strlen (haystack) - 1];
57
58 if (*cp != '\n')
59 fprintf (stderr, "%s: Line too long\n", name);
60
61 if (find_match(haystack, needle, ignoreCase) == TRUE) {
62 if (tellName==TRUE)
63 printf ("%s: ", name);
64
65 if (tellLine==TRUE)
66 printf ("%ld: ", line);
67
68 fputs (haystack, stdout);
69 }
70 }
71}
72
Eric Andersencc8ed391999-10-05 16:24:54 +000073
Eric Andersen596e5461999-10-07 08:30:23 +000074extern int grep_main (int argc, char **argv)
Eric Andersencc8ed391999-10-05 16:24:54 +000075{
Eric Andersen596e5461999-10-07 08:30:23 +000076 FILE *fp;
Eric Andersen6b6b3f61999-10-28 16:06:25 +000077 char *needle;
78 char *name;
79 char *cp;
Eric Andersen596e5461999-10-07 08:30:23 +000080 long line;
Eric Andersenaa0765e1999-10-22 04:30:20 +000081 char haystack[BUF_SIZE];
Eric Andersencc8ed391999-10-05 16:24:54 +000082
Eric Andersen596e5461999-10-07 08:30:23 +000083 ignoreCase = FALSE;
84 tellLine = FALSE;
Eric Andersencc8ed391999-10-05 16:24:54 +000085
Eric Andersen596e5461999-10-07 08:30:23 +000086 argc--;
87 argv++;
88 if (argc < 1) {
Eric Andersen3e0fbae1999-10-19 06:02:44 +000089 usage(grep_usage);
Eric Andersen596e5461999-10-07 08:30:23 +000090 }
91
92 if (**argv == '-') {
Eric Andersencc8ed391999-10-05 16:24:54 +000093 argc--;
Eric Andersen596e5461999-10-07 08:30:23 +000094 cp = *argv++;
95
96 while (*++cp)
97 switch (*cp) {
98 case 'i':
99 ignoreCase = TRUE;
100 break;
101
Eric Andersen3e0fbae1999-10-19 06:02:44 +0000102 case 'h':
103 tellName = FALSE;
104 break;
105
Eric Andersen596e5461999-10-07 08:30:23 +0000106 case 'n':
107 tellLine = TRUE;
108 break;
109
110 default:
Eric Andersen3e0fbae1999-10-19 06:02:44 +0000111 usage(grep_usage);
Eric Andersen596e5461999-10-07 08:30:23 +0000112 }
113 }
114
Eric Andersen3e0fbae1999-10-19 06:02:44 +0000115 needle = *argv++;
Eric Andersen596e5461999-10-07 08:30:23 +0000116 argc--;
117
Eric Andersenfbb39c81999-11-08 17:00:52 +0000118
Eric Andersen596e5461999-10-07 08:30:23 +0000119 while (argc-- > 0) {
Eric Andersenfbb39c81999-11-08 17:00:52 +0000120
121 if (argc==0) {
122 file = stdin;
123 }
124 else
125 file = fopen(*argv, "r");
126
127
Eric Andersen596e5461999-10-07 08:30:23 +0000128 name = *argv++;
129
130 fp = fopen (name, "r");
Eric Andersen596e5461999-10-07 08:30:23 +0000131 if (fp == NULL) {
132 perror (name);
Eric Andersen596e5461999-10-07 08:30:23 +0000133 continue;
Eric Andersencc8ed391999-10-05 16:24:54 +0000134 }
135
Eric Andersen596e5461999-10-07 08:30:23 +0000136 if (ferror (fp))
137 perror (name);
Eric Andersencc8ed391999-10-05 16:24:54 +0000138
Eric Andersen596e5461999-10-07 08:30:23 +0000139 fclose (fp);
140 }
Eric Andersen3e0fbae1999-10-19 06:02:44 +0000141 exit( TRUE);
Eric Andersencc8ed391999-10-05 16:24:54 +0000142}
143
144
Eric Andersencc8ed391999-10-05 16:24:54 +0000145/* END CODE */
Eric Andersen3cf52d11999-10-12 22:26:06 +0000146
147