[8/9] posix: Use enum for __glob_pattern_type result

Message ID 1504643122-14874-9-git-send-email-adhemerval.zanella@linaro.org
State New
Headers show
Series
  • posix: glob fixes and refactor
Related show

Commit Message

Adhemerval Zanella Sept. 5, 2017, 8:25 p.m.
This patch replaces the internal integer constant from
__glob_pattern_type return with a proper enum.

Checked on x86_64-linux-gnu and on a build using build-many-glibcs.py
for all major architectures.

	* posix/glob_internal.h (glob_pattern_type_t): New enumeration.
	(__glob_pattern_type): Use __glob_pat_types.
	* posix/glob_pattern_p.c (__glob_pattern_p): Likewise.
	* posix/glob.c (glob): Likewise.
	(glob_in_dir): Likewise.
---
 ChangeLog              |  6 ++++++
 posix/glob.c           |  8 ++++----
 posix/glob_internal.h  | 18 +++++++++++++-----
 posix/glob_pattern_p.c |  2 +-
 4 files changed, 24 insertions(+), 10 deletions(-)

Comments

Paul Eggert Sept. 6, 2017, 1:30 a.m. | #1
'git am' complained about this patch:

.git/rebase-apply/patch:60: trailing whitespace.
   __GLOB_BRACKET   = 0x4
warning: 1 line adds whitespace errors.
Paul Eggert Sept. 6, 2017, 4:18 a.m. | #2
Adhemerval Zanella wrote:
> +enum glob_pattern_type_t
> +{
> +  __GLOB_NONE      = 0x0,
> +  __GLOB_SPECIAL   = 0x1,
> +  __GLOB_BACKSLASH = 0x2,
> +  __GLOB_BRACKET   = 0x4
> +};

The identifier glob_pattern_type_t is not used elsewhere, so let's omit it. This 
makes it clearer that we're merely defining handy names for int constants, as 
opposed to defining a new type.

Also, names like __GLOB_NONE could cause problems when Gnulib is used on non-GNU 
platforms, which might use those names for other purposes. As glob_internal.h is 
not user-visible, let's use ordinary names. I suggest GLOBPAT_NONE, 
GLOBPAT_SPECIAL, etc., as done in the attached patch, which I installed into Gnulib.
From 36102f8d365655b5d9693ccff0349acc73c60433 Mon Sep 17 00:00:00 2001
From: Paul Eggert <eggert@cs.ucla.edu>
Date: Tue, 5 Sep 2017 21:14:51 -0700
Subject: [PATCH] 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.
---
 ChangeLog            | 10 ++++++++++
 lib/glob.c           |  8 ++++----
 lib/glob_internal.h  | 18 +++++++++++++-----
 lib/glob_pattern_p.c |  2 +-
 4 files changed, 28 insertions(+), 10 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 61e3e8c..448bad2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
 2017-09-05  Paul Eggert  <eggert@cs.ucla.edu>
 
+	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 ddab535..4c6c31b 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 12c93660..d118b35 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 a17d337..8489106 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)
Adhemerval Zanella Sept. 6, 2017, 1:03 p.m. | #3
On 06/09/2017 01:18, Paul Eggert wrote:
> Adhemerval Zanella wrote:
>> +enum glob_pattern_type_t
>> +{
>> +  __GLOB_NONE      = 0x0,
>> +  __GLOB_SPECIAL   = 0x1,
>> +  __GLOB_BACKSLASH = 0x2,
>> +  __GLOB_BRACKET   = 0x4
>> +};
> 
> The identifier glob_pattern_type_t is not used elsewhere, so let's omit it. This makes it clearer that we're merely defining handy names for int constants, as opposed to defining a new type.

Ack.

> 
> Also, names like __GLOB_NONE could cause problems when Gnulib is used on non-GNU platforms, which might use those names for other purposes. As glob_internal.h is not user-visible, let's use ordinary names. I suggest GLOBPAT_NONE, GLOBPAT_SPECIAL, etc., as done in the attached patch, which I installed into Gnulib.

My understanding was double underscore identifiers are reserved for implementation
(C99 7.1.3 Reserved identifiers).  But I do not have a strong opinion here, I am 
ok with your approach.
Paul Eggert Sept. 6, 2017, 4:18 p.m. | #4
Adhemerval Zanella wrote:
> My understanding was double underscore identifiers are reserved for implementation
> (C99 7.1.3 Reserved identifiers).

Yes, and that's the point. When this code is used as part of Gnulib, it is used 
within an application, so any identifiers it uses that start with __ might 
collide with the implementation, which means it's safer to avoid them when it's 
easy, as is the case here.
Adhemerval Zanella Sept. 6, 2017, 4:54 p.m. | #5
On 06/09/2017 13:18, Paul Eggert wrote:
> Adhemerval Zanella wrote:
>> My understanding was double underscore identifiers are reserved for implementation
>> (C99 7.1.3 Reserved identifiers).
> 
> Yes, and that's the point. When this code is used as part of Gnulib, it is used within an application, so any identifiers it uses that start with __ might collide with the implementation, which means it's safer to avoid them when it's easy, as is the case here.

Right, I got your point.

Patch

diff --git a/posix/glob.c b/posix/glob.c
index 2c8a3dc..30a4143 100644
--- a/posix/glob.c
+++ b/posix/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 & (__GLOB_SPECIAL | __GLOB_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 & __GLOB_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 == __GLOB_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 == __GLOB_NONE)
     {
       union
       {
diff --git a/posix/glob_internal.h b/posix/glob_internal.h
index 12c9366..2e09132 100644
--- a/posix/glob_internal.h
+++ b/posix/glob_internal.h
@@ -19,35 +19,43 @@ 
 #ifndef GLOB_INTERNAL_H
 # define GLOB_INTERNAL_H
 
+enum glob_pattern_type_t
+{
+  __GLOB_NONE      = 0x0,
+  __GLOB_SPECIAL   = 0x1,
+  __GLOB_BACKSLASH = 0x2,
+  __GLOB_BRACKET   = 0x4 
+};
+
 static inline int
 __glob_pattern_type (const char *pattern, int quote)
 {
   const char *p;
-  int ret = 0;
+  int ret = __GLOB_NONE;
 
   for (p = pattern; *p != '\0'; ++p)
     switch (*p)
       {
       case '?':
       case '*':
-        return 1;
+        return __GLOB_SPECIAL;
 
       case '\\':
         if (quote)
           {
             if (p[1] != '\0')
               ++p;
-            ret |= 2;
+            ret |= __GLOB_BACKSLASH;
           }
         break;
 
       case '[':
-        ret |= 4;
+        ret |= __GLOB_BRACKET;
         break;
 
       case ']':
         if (ret & 4)
-          return 1;
+          return __GLOB_SPECIAL;
         break;
       }
 
diff --git a/posix/glob_pattern_p.c b/posix/glob_pattern_p.c
index a17d337..2502772 100644
--- a/posix/glob_pattern_p.c
+++ b/posix/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) == __GLOB_SPECIAL;
 }
 weak_alias (__glob_pattern_p, glob_pattern_p)