grep: fix EXTRA_COMPAT grep to honor -E and -i
This commit is contained in:
parent
72fa70af4c
commit
c110b7d61f
@ -87,7 +87,11 @@ enum {
|
|||||||
|
|
||||||
struct globals {
|
struct globals {
|
||||||
int max_matches;
|
int max_matches;
|
||||||
|
#if !ENABLE_EXTRA_COMPAT
|
||||||
int reflags;
|
int reflags;
|
||||||
|
#else
|
||||||
|
RE_TRANSLATE_TYPE case_fold; /* RE_TRANSLATE_TYPE is [[un]signed] char* */
|
||||||
|
#endif
|
||||||
smalluint invert_search;
|
smalluint invert_search;
|
||||||
smalluint print_filename;
|
smalluint print_filename;
|
||||||
smalluint open_errors;
|
smalluint open_errors;
|
||||||
@ -110,7 +114,19 @@ struct globals {
|
|||||||
}; \
|
}; \
|
||||||
} while (0)
|
} while (0)
|
||||||
#define max_matches (G.max_matches )
|
#define max_matches (G.max_matches )
|
||||||
|
#if !ENABLE_EXTRA_COMPAT
|
||||||
#define reflags (G.reflags )
|
#define reflags (G.reflags )
|
||||||
|
#else
|
||||||
|
#define case_fold (G.case_fold )
|
||||||
|
/* http://www.delorie.com/gnu/docs/regex/regex_46.html */
|
||||||
|
#define reflags re_syntax_options
|
||||||
|
#undef REG_NOSUB
|
||||||
|
#undef REG_EXTENDED
|
||||||
|
#undef REG_ICASE
|
||||||
|
#define REG_NOSUB bug:is:here /* should not be used */
|
||||||
|
#define REG_EXTENDED RE_SYNTAX_EGREP
|
||||||
|
#define REG_ICASE bug:is:here /* should not be used */
|
||||||
|
#endif
|
||||||
#define invert_search (G.invert_search )
|
#define invert_search (G.invert_search )
|
||||||
#define print_filename (G.print_filename )
|
#define print_filename (G.print_filename )
|
||||||
#define open_errors (G.open_errors )
|
#define open_errors (G.open_errors )
|
||||||
@ -240,6 +256,7 @@ static int grep_file(FILE *file)
|
|||||||
xregcomp(&gl->compiled_regex, gl->pattern, reflags);
|
xregcomp(&gl->compiled_regex, gl->pattern, reflags);
|
||||||
#else
|
#else
|
||||||
memset(&gl->compiled_regex, 0, sizeof(gl->compiled_regex));
|
memset(&gl->compiled_regex, 0, sizeof(gl->compiled_regex));
|
||||||
|
gl->compiled_regex.translate = case_fold; /* for -i */
|
||||||
if (re_compile_pattern(gl->pattern, strlen(gl->pattern), &gl->compiled_regex))
|
if (re_compile_pattern(gl->pattern, strlen(gl->pattern), &gl->compiled_regex))
|
||||||
bb_error_msg_and_die("bad regex '%s'", gl->pattern);
|
bb_error_msg_and_die("bad regex '%s'", gl->pattern);
|
||||||
#endif
|
#endif
|
||||||
@ -532,8 +549,10 @@ int grep_main(int argc, char **argv)
|
|||||||
if (ENABLE_FEATURE_GREP_FGREP_ALIAS && applet_name[0] == 'f')
|
if (ENABLE_FEATURE_GREP_FGREP_ALIAS && applet_name[0] == 'f')
|
||||||
option_mask32 |= OPT_F;
|
option_mask32 |= OPT_F;
|
||||||
|
|
||||||
|
#if !ENABLE_EXTRA_COMPAT
|
||||||
if (!(option_mask32 & (OPT_o | OPT_w)))
|
if (!(option_mask32 & (OPT_o | OPT_w)))
|
||||||
reflags = REG_NOSUB;
|
reflags = REG_NOSUB;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (ENABLE_FEATURE_GREP_EGREP_ALIAS
|
if (ENABLE_FEATURE_GREP_EGREP_ALIAS
|
||||||
&& (applet_name[0] == 'e' || (option_mask32 & OPT_E))
|
&& (applet_name[0] == 'e' || (option_mask32 & OPT_E))
|
||||||
@ -541,8 +560,18 @@ int grep_main(int argc, char **argv)
|
|||||||
reflags |= REG_EXTENDED;
|
reflags |= REG_EXTENDED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (option_mask32 & OPT_i)
|
if (option_mask32 & OPT_i) {
|
||||||
|
#if !ENABLE_EXTRA_COMPAT
|
||||||
reflags |= REG_ICASE;
|
reflags |= REG_ICASE;
|
||||||
|
#else
|
||||||
|
int i;
|
||||||
|
case_fold = xmalloc(256);
|
||||||
|
for (i = 0; i < 256; i++)
|
||||||
|
case_fold[i] = (unsigned char)i;
|
||||||
|
for (i = 'a'; i <= 'z'; i++)
|
||||||
|
case_fold[i] = (unsigned char)(i - ('a' - 'A'));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
argv += optind;
|
argv += optind;
|
||||||
argc -= optind;
|
argc -= optind;
|
||||||
|
Loading…
Reference in New Issue
Block a user