From: Paul Eggert Date: Wed, 6 Sep 2017 04:14:51 +0000 (-0700) Subject: glob: Use enum for __glob_pattern_type result X-Git-Tag: v1.0~5957 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8ffefc19a6d30f3979a13fa9d37007aeaca40fdf;p=thirdparty%2Fgnulib.git glob: Use enum for __glob_pattern_type result From a patch proposed by Adhemerval Zanella in: https://sourceware.org/ml/libc-alpha/2017-09/msg00212.html * lib/glob_internal.h (GLOBPAT_NONE, GLOBPAT_SPECIAL) (GLOBPAT_BACKSLASH, GLOBPAT_BRACKET): New constants. * lib/glob_internal.h (__glob_pattern_type): * lib/glob.c (glob): * lib/glob_pattern_p.c (__glob_pattern_p): Use them. --- diff --git a/ChangeLog b/ChangeLog index 61e3e8cd11..448bad2c19 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,15 @@ 2017-09-05 Paul Eggert + glob: Use enum for __glob_pattern_type result + From a patch proposed by Adhemerval Zanella in: + https://sourceware.org/ml/libc-alpha/2017-09/msg00212.html + * lib/glob_internal.h (GLOBPAT_NONE, GLOBPAT_SPECIAL) + (GLOBPAT_BACKSLASH, GLOBPAT_BRACKET): New constants. + * lib/glob_internal.h (__glob_pattern_type): + * lib/glob.c (glob): + * lib/glob_pattern_p.c (__glob_pattern_p): + Use them. + glob: fix for use in glibc Problem reported by Adhemerval Zanella in: https://sourceware.org/ml/libc-alpha/2017-09/msg00213.html diff --git a/lib/glob.c b/lib/glob.c index ddab535767..4c6c31b819 100644 --- a/lib/glob.c +++ b/lib/glob.c @@ -903,7 +903,7 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int), [ which we handle the same, using fnmatch. Broken unterminated pattern bracket expressions ought to be rare enough that it is not worth special casing them, fnmatch will do the right thing. */ - if (meta & 5) + if (meta & (GLOBPAT_SPECIAL | GLOBPAT_BRACKET)) { /* The directory name contains metacharacters, so we have to glob for the directory, and then glob for @@ -1044,7 +1044,7 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int), size_t old_pathc = pglob->gl_pathc; int orig_flags = flags; - if (meta & 2) + if (meta & GLOBPAT_BACKSLASH) { char *p = strchr (dirname, '\\'), *q; /* We need to unescape the dirname string. It is certainly @@ -1242,14 +1242,14 @@ glob_in_dir (const char *pattern, const char *directory, int flags, / sizeof init_names->name[0]); meta = __glob_pattern_type (pattern, !(flags & GLOB_NOESCAPE)); - if (meta == 0 && (flags & (GLOB_NOCHECK|GLOB_NOMAGIC))) + if (meta == GLOBPAT_NONE && (flags & (GLOB_NOCHECK|GLOB_NOMAGIC))) { /* We need not do any tests. The PATTERN contains no meta characters and we must not return an error therefore the result will always contain exactly one name. */ flags |= GLOB_NOCHECK; } - else if (meta == 0) + else if (meta == GLOBPAT_NONE) { union { diff --git a/lib/glob_internal.h b/lib/glob_internal.h index 12c93660b7..d118b3533d 100644 --- a/lib/glob_internal.h +++ b/lib/glob_internal.h @@ -19,35 +19,43 @@ #ifndef GLOB_INTERNAL_H # define GLOB_INTERNAL_H +enum +{ + GLOBPAT_NONE = 0x0, + GLOBPAT_SPECIAL = 0x1, + GLOBPAT_BACKSLASH = 0x2, + GLOBPAT_BRACKET = 0x4 +}; + static inline int __glob_pattern_type (const char *pattern, int quote) { const char *p; - int ret = 0; + int ret = GLOBPAT_NONE; for (p = pattern; *p != '\0'; ++p) switch (*p) { case '?': case '*': - return 1; + return GLOBPAT_SPECIAL; case '\\': if (quote) { if (p[1] != '\0') ++p; - ret |= 2; + ret |= GLOBPAT_BACKSLASH; } break; case '[': - ret |= 4; + ret |= GLOBPAT_BRACKET; break; case ']': if (ret & 4) - return 1; + return GLOBPAT_SPECIAL; break; } diff --git a/lib/glob_pattern_p.c b/lib/glob_pattern_p.c index a17d337182..8489106e90 100644 --- a/lib/glob_pattern_p.c +++ b/lib/glob_pattern_p.c @@ -28,6 +28,6 @@ int __glob_pattern_p (const char *pattern, int quote) { - return __glob_pattern_type (pattern, quote) == 1; + return __glob_pattern_type (pattern, quote) == GLOBPAT_SPECIAL; } weak_alias (__glob_pattern_p, glob_pattern_p)