- replace variables by defines to save space - rename string denoting stdin from "-" to "(standard input)" to match GNU grep.
This commit was genuinely broken at the time (not related to our build system): scripts/config/mkconfigs.c (2005-08-01 - 2006-10-05 arasi) uretilen bbconfigopts.h icine .config satirlarini kacissiz, ham newline'larla gömüyordu - gecerli C degildi, busybox'un kendi bb_mkdep araci bile parse edemiyordu (7d219aab7 ile duzeltildi, mkconfigs shell scripte cevrildi)
No binary (build failed)
—
(log yok)
| @@ -1,24 +1,15 @@ | |
| + | /* vi: set sw=4 ts=4: */ |
| /* | |
| * Mini grep implementation for busybox using libc regex. | |
| * | |
| * Copyright (C) 1999,2000,2001 by Lineo, inc. and Mark Whitley | |
| * Copyright (C) 1999,2000,2001 by Mark Whitley <[email protected]> | |
| * | |
| - | * 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 |
| - | * |
| + | * Licensed under the GPL v2, see the file LICENSE in this tarball. |
| */ | |
| + | /* BB_AUDIT SUSv3 defects - unsupported option -x. */ |
| + | /* BB_AUDIT GNU defects - always acts as -a. */ |
| + | /* http://www.opengroup.org/onlinepubs/007904975/utilities/grep.html */ |
| /* | |
| * Apr 2004 by Vladimir Oleynik <[email protected]> - | |
| * correction "-e pattern1 -e pattern2" logic and more optimizations. | |
| @@ -34,30 +25,31 @@ | |
| /* options */ | |
| + | static unsigned long opt; |
| #define GREP_OPTS "lnqvscFiHhe:f:L" | |
| #define GREP_OPT_l (1<<0) | |
| - | static char print_files_with_matches; |
| + | #define PRINT_FILES_WITH_MATCHES (opt & GREP_OPT_l) |
| #define GREP_OPT_n (1<<1) | |
| - | static char print_line_num; |
| + | #define PRINT_LINE_NUM (opt & GREP_OPT_n) |
| #define GREP_OPT_q (1<<2) | |
| - | static char be_quiet; |
| + | #define BE_QUIET (opt & GREP_OPT_q) |
| #define GREP_OPT_v (1<<3) | |
| typedef char invert_search_t; | |
| static invert_search_t invert_search; | |
| #define GREP_OPT_s (1<<4) | |
| - | static char suppress_err_msgs; |
| + | #define SUPPRESS_ERR_MSGS (opt & GREP_OPT_s) |
| #define GREP_OPT_c (1<<5) | |
| - | static char print_match_counts; |
| + | #define PRINT_MATCH_COUNTS (opt & GREP_OPT_c) |
| #define GREP_OPT_F (1<<6) | |
| - | static char fgrep_flag; |
| + | #define FGREP_FLAG (opt & GREP_OPT_F) |
| #define GREP_OPT_i (1<<7) | |
| #define GREP_OPT_H (1<<8) | |
| #define GREP_OPT_h (1<<9) | |
| #define GREP_OPT_e (1<<10) | |
| #define GREP_OPT_f (1<<11) | |
| #define GREP_OPT_L (1<<12) | |
| - | static char print_files_without_matches; |
| - | #ifdef CONFIG_FEATURE_GREP_CONTEXT |
| + | #define PRINT_FILES_WITHOUT_MATCHES ((opt & GREP_OPT_L) != 0) |
| + | #if ENABLE_FEATURE_GREP_CONTEXT |
| #define GREP_OPT_CONTEXT "A:B:C" | |
| #define GREP_OPT_A (1<<13) | |
| #define GREP_OPT_B (1<<14) | |
| @@ -65,9 +57,12 @@ static char print_files_without_matches; | |
| #define GREP_OPT_E (1<<16) | |
| #else | |
| #define GREP_OPT_CONTEXT "" | |
| + | #define GREP_OPT_A (0) |
| + | #define GREP_OPT_B (0) |
| + | #define GREP_OPT_C (0) |
| #define GREP_OPT_E (1<<13) | |
| #endif | |
| - | #ifdef CONFIG_FEATURE_GREP_EGREP_ALIAS |
| + | #if ENABLE_FEATURE_GREP_EGREP_ALIAS |
| # define OPT_EGREP "E" | |
| #else | |
| # define OPT_EGREP "" | |
| @@ -76,12 +71,12 @@ static char print_files_without_matches; | |
| static int reflags; | |
| static int print_filename; | |
| - | #ifdef CONFIG_FEATURE_GREP_CONTEXT |
| + | #if ENABLE_FEATURE_GREP_CONTEXT |
| static int lines_before; | |
| static int lines_after; | |
| static char **before_buf; | |
| static int last_line_printed; | |
| - | #endif /* CONFIG_FEATURE_GREP_CONTEXT */ |
| + | #endif /* ENABLE_FEATURE_GREP_CONTEXT */ |
| /* globals used internally */ | |
| static llist_t *pattern_head; /* growable list of patterns to match */ | |
| @@ -90,7 +85,7 @@ static char *cur_file; /* the current file we are reading */ | |
| static void print_line(const char *line, int linenum, char decoration) | |
| { | |
| - | #ifdef CONFIG_FEATURE_GREP_CONTEXT |
| + | #if ENABLE_FEATURE_GREP_CONTEXT |
| /* possibly print the little '--' separator */ | |
| if ((lines_before || lines_after) && last_line_printed && | |
| last_line_printed < linenum - 1) { | |
| @@ -100,7 +95,7 @@ static void print_line(const char *line, int linenum, char decoration) | |
| #endif | |
| if (print_filename > 0) | |
| printf("%s%c", cur_file, decoration); | |
| - | if (print_line_num) |
| + | if (PRINT_LINE_NUM) |
| printf("%i%c", linenum, decoration); | |
| puts(line); | |
| } | |
| @@ -112,11 +107,11 @@ static int grep_file(FILE *file) | |
| invert_search_t ret; | |
| int linenum = 0; | |
| int nmatches = 0; | |
| - | #ifdef CONFIG_FEATURE_GREP_CONTEXT |
| + | #if ENABLE_FEATURE_GREP_CONTEXT |
| int print_n_lines_after = 0; | |
| int curpos = 0; /* track where we are in the circular 'before' buffer */ | |
| int idx = 0; /* used for iteration through the circular buffer */ | |
| - | #endif /* CONFIG_FEATURE_GREP_CONTEXT */ |
| + | #endif /* ENABLE_FEATURE_GREP_CONTEXT */ |
| while ((line = bb_get_chomped_line_from_file(file)) != NULL) { | |
| llist_t *pattern_ptr = pattern_head; | |
| @@ -124,7 +119,7 @@ static int grep_file(FILE *file) | |
| linenum++; | |
| ret = 0; | |
| while (pattern_ptr) { | |
| - | if (fgrep_flag) { |
| + | if (FGREP_FLAG) { |
| ret = strstr(line, pattern_ptr->data) != NULL; | |
| } else { | |
| /* | |
| @@ -143,23 +138,23 @@ static int grep_file(FILE *file) | |
| if ((ret ^ invert_search)) { | |
| - | if (print_files_with_matches || be_quiet) |
| + | if (PRINT_FILES_WITH_MATCHES || BE_QUIET) |
| free(line); | |
| /* if we found a match but were told to be quiet, stop here */ | |
| - | if (be_quiet || print_files_without_matches) |
| + | if (BE_QUIET || PRINT_FILES_WITHOUT_MATCHES) |
| return -1; | |
| /* keep track of matches */ | |
| nmatches++; | |
| /* if we're just printing filenames, we stop after the first match */ | |
| - | if (print_files_with_matches) |
| + | if (PRINT_FILES_WITH_MATCHES) |
| break; | |
| /* print the matched line */ | |
| - | if (print_match_counts == 0) { |
| - | #ifdef CONFIG_FEATURE_GREP_CONTEXT |
| + | if (PRINT_MATCH_COUNTS == 0) { |
| + | #if ENABLE_FEATURE_GREP_CONTEXT |
| int prevpos = (curpos == 0) ? lines_before - 1 : curpos - 1; | |
| /* if we were told to print 'before' lines and there is at least | |
| @@ -188,11 +183,11 @@ static int grep_file(FILE *file) | |
| /* make a note that we need to print 'after' lines */ | |
| print_n_lines_after = lines_after; | |
| - | #endif /* CONFIG_FEATURE_GREP_CONTEXT */ |
| + | #endif |
| print_line(line, linenum, ':'); | |
| } | |
| } | |
| - | #ifdef CONFIG_FEATURE_GREP_CONTEXT |
| + | #if ENABLE_FEATURE_GREP_CONTEXT |
| else { /* no match */ | |
| /* Add the line to the circular 'before' buffer */ | |
| if(lines_before) { | |
| @@ -207,7 +202,7 @@ static int grep_file(FILE *file) | |
| print_line(line, linenum, '-'); | |
| print_n_lines_after--; | |
| } | |
| - | #endif /* CONFIG_FEATURE_GREP_CONTEXT */ |
| + | #endif /* ENABLE_FEATURE_GREP_CONTEXT */ |
| free(line); | |
| } | |
| @@ -216,19 +211,19 @@ static int grep_file(FILE *file) | |
| * matches, just filenames and possibly match counts */ | |
| /* grep -c: print [filename:]count, even if count is zero */ | |
| - | if (print_match_counts) { |
| + | if (PRINT_MATCH_COUNTS) { |
| if (print_filename > 0) | |
| printf("%s:", cur_file); | |
| printf("%d\n", nmatches); | |
| } | |
| /* grep -l: print just the filename, but only if we grepped the line in the file */ | |
| - | if (print_files_with_matches && nmatches > 0) { |
| + | if (PRINT_FILES_WITH_MATCHES && nmatches > 0) { |
| puts(cur_file); | |
| } | |
| /* grep -L: print just the filename, but only if we didn't grep the line in the file */ | |
| - | if (print_files_without_matches && nmatches == 0) { |
| + | if (PRINT_FILES_WITHOUT_MATCHES && nmatches == 0) { |
| puts(cur_file); | |
| } | |
| @@ -258,12 +253,11 @@ extern int grep_main(int argc, char **argv) | |
| { | |
| FILE *file; | |
| int matched; | |
| - | unsigned long opt; |
| llist_t *fopt = NULL; | |
| int error_open_count = 0; | |
| /* do normal option parsing */ | |
| - | #ifdef CONFIG_FEATURE_GREP_CONTEXT |
| + | #if ENABLE_FEATURE_GREP_CONTEXT |
| { | |
| char *junk; | |
| char *slines_after; | |
| @@ -287,14 +281,14 @@ extern int grep_main(int argc, char **argv) | |
| } | |
| if(opt & GREP_OPT_A) { | |
| lines_after = strtoul(slines_after, &junk, 10); | |
| - | if(*junk != '\0') |
| - | bb_error_msg_and_die("invalid context length argument"); |
| + | if(*junk != '\0') |
| + | bb_error_msg_and_die("invalid context length argument"); |
| } | |
| if(opt & GREP_OPT_B) { | |
| lines_before = strtoul(slines_before, &junk, 10); | |
| - | if(*junk != '\0') |
| - | bb_error_msg_and_die("invalid context length argument"); |
| - | } |
| + | if(*junk != '\0') |
| + | bb_error_msg_and_die("invalid context length argument"); |
| + | } |
| /* sanity checks after parse may be invalid numbers ;-) */ | |
| if ((opt & (GREP_OPT_c|GREP_OPT_q|GREP_OPT_l|GREP_OPT_L))) { | |
| opt &= ~GREP_OPT_n; | |
| @@ -308,16 +302,9 @@ extern int grep_main(int argc, char **argv) | |
| bb_opt_complementally = "H-h:e*:f*:c-n:q-n:l-n"; | |
| opt = bb_getopt_ulflags(argc, argv, GREP_OPTS OPT_EGREP, | |
| &pattern_head, &fopt); | |
| - | |
| #endif | |
| - | print_files_with_matches = opt & GREP_OPT_l; |
| - | print_files_without_matches = (opt & GREP_OPT_L) != 0; |
| - | print_line_num = opt & GREP_OPT_n; |
| - | be_quiet = opt & GREP_OPT_q; |
| invert_search = (opt & GREP_OPT_v) != 0; /* 0 | 1 */ | |
| - | suppress_err_msgs = opt & GREP_OPT_s; |
| - | print_match_counts = opt & GREP_OPT_c; |
| - | fgrep_flag = opt & GREP_OPT_F; |
| + | |
| if(opt & GREP_OPT_H) | |
| print_filename++; | |
| if(opt & GREP_OPT_h) | |
| @@ -325,16 +312,13 @@ extern int grep_main(int argc, char **argv) | |
| if(opt & GREP_OPT_f) | |
| load_regexes_from_file(fopt); | |
| - | #ifdef CONFIG_FEATURE_GREP_FGREP_ALIAS |
| - | if(bb_applet_name[0] == 'f') |
| - | fgrep_flag = 1; |
| - | #endif |
| + | if(ENABLE_FEATURE_GREP_FGREP_ALIAS && bb_applet_name[0] == 'f') |
| + | opt |= GREP_OPT_F; |
| - | #ifdef CONFIG_FEATURE_GREP_EGREP_ALIAS |
| - | if(bb_applet_name[0] == 'e' || (opt & GREP_OPT_E)) |
| + | if(ENABLE_FEATURE_GREP_EGREP_ALIAS && |
| + | (bb_applet_name[0] == 'e' || (opt & GREP_OPT_E))) |
| reflags = REG_EXTENDED | REG_NOSUB; | |
| else | |
| - | #endif |
| reflags = REG_NOSUB; | |
| if(opt & GREP_OPT_i) | |
| @@ -368,15 +352,15 @@ extern int grep_main(int argc, char **argv) | |
| while (argc--) { | |
| cur_file = *argv++; | |
| if(!cur_file || (*cur_file == '-' && !cur_file[1])) { | |
| - | cur_file = "-"; |
| + | cur_file = "(standard input)"; |
| file = stdin; | |
| } else { | |
| file = fopen(cur_file, "r"); | |
| } | |
| - | if (file == NULL) { |
| - | if (!suppress_err_msgs) |
| - | bb_perror_msg("%s", cur_file); |
| - | error_open_count++; |
| + | if (file == NULL) { |
| + | if (!SUPPRESS_ERR_MSGS) |
| + | bb_perror_msg("%s", cur_file); |
| + | error_open_count++; |
| } else { | |
| matched += grep_file(file); | |
| if(matched < 0) { | |
| @@ -388,17 +372,19 @@ extern int grep_main(int argc, char **argv) | |
| } | |
| } | |
| - | #ifdef CONFIG_FEATURE_CLEAN_UP |
| /* destroy all the elments in the pattern list */ | |
| + | if (ENABLE_FEATURE_CLEAN_UP) |
| while (pattern_head) { | |
| llist_t *pattern_head_ptr = pattern_head; | |
| pattern_head = pattern_head->link; | |
| free(pattern_head_ptr); | |
| } | |
| - | #endif |
| - | if(be_quiet && matched) |
| + | /* 0 = success, 1 = failed, 2 = error */ |
| + | /* If the -q option is specified, the exit status shall be zero |
| + | * if an input line is selected, even if an error was detected. */ |
| + | if(BE_QUIET && matched) |
| return 0; | |
| if(error_open_count) | |
| return 2; | |