Added regexp support, fixed Changelog.
[platform/upstream/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
47 extern int grep_main (int argc, char **argv)
48 {
49     FILE *fp;
50     const char *needle;
51     const char *name;
52     const char *cp;
53     int tellName=TRUE;
54     int ignoreCase=FALSE;
55     int tellLine=FALSE;
56     long line;
57     char haystack[BUF_SIZE];
58
59     ignoreCase = FALSE;
60     tellLine = FALSE;
61
62     argc--;
63     argv++;
64     if (argc < 1) {
65         usage(grep_usage);
66     }
67
68     if (**argv == '-') {
69         argc--;
70         cp = *argv++;
71
72         while (*++cp)
73             switch (*cp) {
74             case 'i':
75                 ignoreCase = TRUE;
76                 break;
77
78             case 'h':
79                 tellName = FALSE;
80                 break;
81
82             case 'n':
83                 tellLine = TRUE;
84                 break;
85
86             default:
87                 usage(grep_usage);
88             }
89     }
90
91     needle = *argv++;
92     argc--;
93
94     while (argc-- > 0) {
95         name = *argv++;
96
97         fp = fopen (name, "r");
98         if (fp == NULL) {
99             perror (name);
100             continue;
101         }
102
103         line = 0;
104
105         while (fgets (haystack, sizeof (haystack), fp)) {
106             line++;
107             cp = &haystack[strlen (haystack) - 1];
108
109             if (*cp != '\n')
110                 fprintf (stderr, "%s: Line too long\n", name);
111
112             if (find_match(haystack, needle, ignoreCase) == TRUE) {
113                 if (tellName==TRUE)
114                     printf ("%s: ", name);
115
116                 if (tellLine==TRUE)
117                     printf ("%ld: ", line);
118
119                 fputs (haystack, stdout);
120             }
121         }
122
123         if (ferror (fp))
124             perror (name);
125
126         fclose (fp);
127     }
128     exit( TRUE);
129 }
130
131
132 /* END CODE */
133
134