50a29617845259b7b9e7523d3dbf9a1328f621f3
[oweals/busybox.git] / grep.c
1 /*
2  * Mini grep implementation for busybox
3  *
4  *
5  * Copyright (C) 1999 by Lineo, inc.
6  * Written by Erik Andersen <andersen@lineo.com>, <andersee@debian.org>
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  */
23
24 #include "internal.h"
25 #include "regexp.h"
26 #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
34 static const char grep_usage[] =
35 "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"
40 #if defined BB_REGEXP
41 "This version of grep matches full regexps.\n";
42 #else
43 "This version of grep matches strings (not full regexps).\n";
44 #endif
45
46 int tellName=TRUE;
47 int ignoreCase=FALSE;
48 int tellLine=FALSE;
49
50 static 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
73
74 extern int grep_main (int argc, char **argv)
75 {
76     FILE *fp;
77     char *needle;
78     char *name;
79     char *cp;
80     long line;
81     char haystack[BUF_SIZE];
82
83     ignoreCase = FALSE;
84     tellLine = FALSE;
85
86     argc--;
87     argv++;
88     if (argc < 1) {
89         usage(grep_usage);
90     }
91
92     if (**argv == '-') {
93         argc--;
94         cp = *argv++;
95
96         while (*++cp)
97             switch (*cp) {
98             case 'i':
99                 ignoreCase = TRUE;
100                 break;
101
102             case 'h':
103                 tellName = FALSE;
104                 break;
105
106             case 'n':
107                 tellLine = TRUE;
108                 break;
109
110             default:
111                 usage(grep_usage);
112             }
113     }
114
115     needle = *argv++;
116     argc--;
117
118
119     while (argc-- > 0) {
120
121         if (argc==0) {
122             file = stdin;
123         }
124         else
125             file = fopen(*argv, "r");
126
127
128         name = *argv++;
129
130         fp = fopen (name, "r");
131         if (fp == NULL) {
132             perror (name);
133             continue;
134         }
135
136         if (ferror (fp))
137             perror (name);
138
139         fclose (fp);
140     }
141     exit( TRUE);
142 }
143
144
145 /* END CODE */
146
147