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