X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=grep.c;h=84bb99667373720d1fcbb0108a89988d691e2ca7;hb=b99df0fd65abe3245fa2d04115326100847f865e;hp=3779e5510a9eda7ea7ae988f140bfc40b003e63c;hpb=cc8ed39b240180b58810784f844e253263594ac3;p=oweals%2Fbusybox.git diff --git a/grep.c b/grep.c index 3779e5510..84bb99667 100644 --- a/grep.c +++ b/grep.c @@ -1,18 +1,28 @@ /* - * Copyright (c) 1999 by David I. Bell - * Permission is granted to use, distribute, or modify this source, - * provided that this copyright notice remains intact. + * Mini grep implementation for busybox * - * The "grep" command, taken from sash. - * This provides basic file searching. * - * Permission to distribute this code under the GPL has been granted. - * Modified for busybox by Erik Andersen + * Copyright (C) 1999 by Lineo, inc. + * Written by Erik Andersen , + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * */ #include "internal.h" -#ifdef BB_GREP - +#include "regexp.h" #include #include #include @@ -21,190 +31,115 @@ #include #include - -const char grep_usage[] = -"Search the input file(s) for lines matching the given pattern.\n" -"\tI search stdin if no files are given.\n" -"\tI can't grok full regular expressions.\n" -"usage: grep [in] PATTERN [FILES]...\n" -"\ti=ignore case, n=list line numbers\n"; - - - -static BOOL search - (const char * string, const char * word, BOOL ignoreCase); +static const char grep_usage[] = +"grep [OPTIONS]... PATTERN [FILE]...\n\n" +"Search for PATTERN in each FILE or standard input.\n\n" +"OPTIONS:\n" +"\t-h\tsuppress the prefixing filename on output\n" +"\t-i\tignore case distinctions\n" +"\t-n\tprint line number with output lines\n\n" +#if defined BB_REGEXP +"This version of grep matches full regular expresions.\n"; +#else +"This version of grep matches strings (not regular expresions).\n"; +#endif -extern int -grep_main(struct FileInfo * unused, int argc, char ** argv) +static void do_grep(FILE *fp, char* needle, char *fileName, int tellName, int ignoreCase, int tellLine) { - FILE * fp; - const char * word; - const char * name; - const char * cp; - BOOL tellName; - BOOL ignoreCase; - BOOL tellLine; - long line; - char buf[BUF_SIZE]; - - ignoreCase = FALSE; - tellLine = FALSE; - - argc--; - argv++; - if (argc < 1) - { - fprintf(stderr, "%s", grep_usage); - return 1; - } - - if (**argv == '-') - { - argc--; - cp = *argv++; - - while (*++cp) switch (*cp) - { - case 'i': - ignoreCase = TRUE; - break; - - case 'n': - tellLine = TRUE; - break; - - default: - fprintf(stderr, "Unknown option\n"); - return 1; - } - } - - word = *argv++; - argc--; - - tellName = (argc > 1); - - while (argc-- > 0) - { - name = *argv++; - - fp = fopen(name, "r"); - - if (fp == NULL) - { - perror(name); - - continue; - } - - line = 0; + char *cp; + long line = 0; + char haystack[BUF_SIZE]; - while (fgets(buf, sizeof(buf), fp)) - { - line++; + while (fgets (haystack, sizeof (haystack), fp)) { + line++; + cp = &haystack[strlen (haystack) - 1]; - cp = &buf[strlen(buf) - 1]; + if (*cp != '\n') + fprintf (stderr, "%s: Line too long\n", fileName); - if (*cp != '\n') - fprintf(stderr, "%s: Line too long\n", name); + if (find_match(haystack, needle, ignoreCase) == TRUE) { + if (tellName==TRUE) + printf ("%s:", fileName); - if (search(buf, word, ignoreCase)) - { - if (tellName) - printf("%s: ", name); + if (tellLine==TRUE) + printf ("%ld:", line); - if (tellLine) - printf("%ld: ", line); - - fputs(buf, stdout); - } - } - - if (ferror(fp)) - perror(name); - - fclose(fp); + fputs (haystack, stdout); } - return 0; + } } -/* - * See if the specified word is found in the specified string. - */ -static BOOL -search(const char * string, const char * word, BOOL ignoreCase) +extern int grep_main (int argc, char **argv) { - const char * cp1; - const char * cp2; - int len; - int lowFirst; - int ch1; - int ch2; - - len = strlen(word); + FILE *fp; + char *cp; + char *needle; + char *fileName; + int tellName=FALSE; + int ignoreCase=FALSE; + int tellLine=FALSE; - if (!ignoreCase) - { - while (TRUE) - { - string = strchr(string, word[0]); - if (string == NULL) - return FALSE; + ignoreCase = FALSE; + tellLine = FALSE; - if (memcmp(string, word, len) == 0) - return TRUE; + argc--; + argv++; + if (argc < 1) { + usage(grep_usage); + } - string++; - } + if (**argv == '-') { + argc--; + cp = *argv++; + + while (*++cp) + switch (*cp) { + case 'i': + ignoreCase = TRUE; + break; + + case 'h': + tellName = TRUE; + break; + + case 'n': + tellLine = TRUE; + break; + + default: + usage(grep_usage); + } + } + + needle = *argv++; + argc--; + + if (argc==0) { + do_grep( stdin, needle, "stdin", FALSE, ignoreCase, tellLine); + } else { + while (argc-- > 0) { + fileName = *argv++; + + fp = fopen (fileName, "r"); + if (fp == NULL) { + perror (fileName); + continue; + } + + do_grep( fp, needle, fileName, tellName, ignoreCase, tellLine); + + if (ferror (fp)) + perror (fileName); + fclose (fp); } + } + exit( TRUE); +} - /* - * Here if we need to check case independence. - * Do the search by lower casing both strings. - */ - lowFirst = *word; - - if (isupper(lowFirst)) - lowFirst = tolower(lowFirst); - - while (TRUE) - { - while (*string && (*string != lowFirst) && - (!isupper(*string) || (tolower(*string) != lowFirst))) - { - string++; - } - - if (*string == '\0') - return FALSE; - - cp1 = string; - cp2 = word; - - do - { - if (*cp2 == '\0') - return TRUE; - - ch1 = *cp1++; - - if (isupper(ch1)) - ch1 = tolower(ch1); - - ch2 = *cp2++; - - if (isupper(ch2)) - ch2 = tolower(ch2); - } - while (ch1 == ch2); +/* END CODE */ - string++; - } -} -#endif -/* END CODE */