blob: 84bb99667373720d1fcbb0108a89988d691e2ca7 [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 Andersend73dc5b1999-11-10 23:13:02 +000035"grep [OPTIONS]... PATTERN [FILE]...\n\n"
Eric Andersen3e0fbae1999-10-19 06:02:44 +000036"Search for PATTERN in each FILE or standard input.\n\n"
Eric Andersend73dc5b1999-11-10 23:13:02 +000037"OPTIONS:\n"
Eric Andersen3e0fbae1999-10-19 06:02:44 +000038"\t-h\tsuppress the prefixing filename on output\n"
39"\t-i\tignore case distinctions\n"
40"\t-n\tprint line number with output lines\n\n"
Eric Andersenaa0765e1999-10-22 04:30:20 +000041#if defined BB_REGEXP
Eric Andersend73dc5b1999-11-10 23:13:02 +000042"This version of grep matches full regular expresions.\n";
Eric Andersenaa0765e1999-10-22 04:30:20 +000043#else
Eric Andersend73dc5b1999-11-10 23:13:02 +000044"This version of grep matches strings (not regular expresions).\n";
Eric Andersenaa0765e1999-10-22 04:30:20 +000045#endif
Eric Andersencc8ed391999-10-05 16:24:54 +000046
Eric Andersenfbb39c81999-11-08 17:00:52 +000047
Eric Andersen50d63601999-11-09 01:47:36 +000048static void do_grep(FILE *fp, char* needle, char *fileName, int tellName, int ignoreCase, int tellLine)
Eric Andersenfbb39c81999-11-08 17:00:52 +000049{
Eric Andersen50d63601999-11-09 01:47:36 +000050 char *cp;
51 long line = 0;
52 char haystack[BUF_SIZE];
Eric Andersenfbb39c81999-11-08 17:00:52 +000053
Eric Andersen50d63601999-11-09 01:47:36 +000054 while (fgets (haystack, sizeof (haystack), fp)) {
55 line++;
56 cp = &haystack[strlen (haystack) - 1];
Eric Andersenfbb39c81999-11-08 17:00:52 +000057
Eric Andersen50d63601999-11-09 01:47:36 +000058 if (*cp != '\n')
59 fprintf (stderr, "%s: Line too long\n", fileName);
Eric Andersenfbb39c81999-11-08 17:00:52 +000060
Eric Andersen50d63601999-11-09 01:47:36 +000061 if (find_match(haystack, needle, ignoreCase) == TRUE) {
62 if (tellName==TRUE)
63 printf ("%s:", fileName);
Eric Andersenfbb39c81999-11-08 17:00:52 +000064
Eric Andersen50d63601999-11-09 01:47:36 +000065 if (tellLine==TRUE)
66 printf ("%ld:", line);
Eric Andersenfbb39c81999-11-08 17:00:52 +000067
Eric Andersen50d63601999-11-09 01:47:36 +000068 fputs (haystack, stdout);
Eric Andersenfbb39c81999-11-08 17:00:52 +000069 }
Eric Andersen50d63601999-11-09 01:47:36 +000070 }
Eric Andersenfbb39c81999-11-08 17:00:52 +000071}
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 *cp;
Eric Andersen50d63601999-11-09 01:47:36 +000078 char *needle;
79 char *fileName;
80 int tellName=FALSE;
81 int ignoreCase=FALSE;
82 int tellLine=FALSE;
83
Eric Andersencc8ed391999-10-05 16:24:54 +000084
Eric Andersen596e5461999-10-07 08:30:23 +000085 ignoreCase = FALSE;
86 tellLine = FALSE;
Eric Andersencc8ed391999-10-05 16:24:54 +000087
Eric Andersen596e5461999-10-07 08:30:23 +000088 argc--;
89 argv++;
90 if (argc < 1) {
Eric Andersen3e0fbae1999-10-19 06:02:44 +000091 usage(grep_usage);
Eric Andersen596e5461999-10-07 08:30:23 +000092 }
93
94 if (**argv == '-') {
Eric Andersencc8ed391999-10-05 16:24:54 +000095 argc--;
Eric Andersen596e5461999-10-07 08:30:23 +000096 cp = *argv++;
97
98 while (*++cp)
99 switch (*cp) {
100 case 'i':
101 ignoreCase = TRUE;
102 break;
103
Eric Andersen3e0fbae1999-10-19 06:02:44 +0000104 case 'h':
Eric Andersen50d63601999-11-09 01:47:36 +0000105 tellName = TRUE;
Eric Andersen3e0fbae1999-10-19 06:02:44 +0000106 break;
107
Eric Andersen596e5461999-10-07 08:30:23 +0000108 case 'n':
109 tellLine = TRUE;
110 break;
111
112 default:
Eric Andersen3e0fbae1999-10-19 06:02:44 +0000113 usage(grep_usage);
Eric Andersen596e5461999-10-07 08:30:23 +0000114 }
115 }
116
Eric Andersen3e0fbae1999-10-19 06:02:44 +0000117 needle = *argv++;
Eric Andersen596e5461999-10-07 08:30:23 +0000118 argc--;
119
Eric Andersen50d63601999-11-09 01:47:36 +0000120 if (argc==0) {
121 do_grep( stdin, needle, "stdin", FALSE, ignoreCase, tellLine);
122 } else {
123 while (argc-- > 0) {
124 fileName = *argv++;
Eric Andersenfbb39c81999-11-08 17:00:52 +0000125
Eric Andersen50d63601999-11-09 01:47:36 +0000126 fp = fopen (fileName, "r");
127 if (fp == NULL) {
128 perror (fileName);
129 continue;
130 }
Eric Andersenfbb39c81999-11-08 17:00:52 +0000131
Eric Andersen50d63601999-11-09 01:47:36 +0000132 do_grep( fp, needle, fileName, tellName, ignoreCase, tellLine);
133
134 if (ferror (fp))
135 perror (fileName);
136 fclose (fp);
Eric Andersenfbb39c81999-11-08 17:00:52 +0000137 }
Eric Andersen596e5461999-10-07 08:30:23 +0000138 }
Eric Andersen3e0fbae1999-10-19 06:02:44 +0000139 exit( TRUE);
Eric Andersencc8ed391999-10-05 16:24:54 +0000140}
141
142
Eric Andersencc8ed391999-10-05 16:24:54 +0000143/* END CODE */
Eric Andersen3cf52d11999-10-12 22:26:06 +0000144
145