[PATCH] expand: Always compile test fnmatch and glob

Herbert Xu <[email protected]>
Newsgroups org.kernel.vger.dash
Message-ID <[email protected]>
Always compile test code paths with and without fnmatch and glob by
avoiding the use of ifdefs.

Signed-off-by: Herbert Xu <[email protected]>
---
 src/expand.c   | 28 +++++++-----------------
 src/mystring.h |  6 ++++++
 src/system.h   | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 72 insertions(+), 20 deletions(-)

diff --git a/src/expand.c b/src/expand.c
index 0db2b29..399a9e6 100644
--- a/src/expand.c
+++ b/src/expand.c
@@ -119,20 +119,13 @@ static size_t strtodest(const char *p, int flags);
 static size_t memtodest(const char *p, size_t len, int flags);
 STATIC ssize_t varvalue(char *, int, int, int);
 STATIC void expandmeta(struct strlist *);
-#ifdef HAVE_GLOB
 static void addglob(const glob64_t *);
-#else
 STATIC void expmeta(char *, unsigned, unsigned);
 STATIC struct strlist *expsort(struct strlist *);
 STATIC struct strlist *msort(struct strlist *, int);
-#endif
 STATIC void addfname(char *);
 STATIC int patmatch(char *, const char *);
-#ifndef HAVE_FNMATCH
 STATIC int pmatch(const char *, const char *);
-#else
-#define pmatch(a, b) !fnmatch((a), (b), 0)
-#endif
 static size_t cvtnum(intmax_t num, int flags);
 STATIC size_t esclen(const char *, const char *);
 STATIC void varunset(const char *, const char *, const char *, int)
@@ -1156,9 +1149,8 @@ out:
  * should be escapes.  The results are stored in the list exparg.
  */
 
-#ifdef HAVE_GLOB
 #ifdef __GLIBC__
-void *opendir_interruptible(const char *pathname)
+static void *opendir_interruptible(const char *pathname)
 {
 	if (int_pending()) {
 		suppressint = 0;
@@ -1171,11 +1163,8 @@ void *opendir_interruptible(const char *pathname)
 #define GLOB_ALTDIRFUNC 0
 #endif
 
-STATIC void
-expandmeta(struct strlist *str)
+static void expandmeta_glob(struct strlist *str)
 {
-	/* TODO - EXP_REDIR */
-
 	while (str) {
 		const char *p;
 		glob64_t pglob;
@@ -1236,8 +1225,6 @@ static void addglob(const glob64_t *pglob)
 	} while (*++p);
 }
 
-
-#else	/* HAVE_GLOB */
 STATIC char *expdir;
 STATIC unsigned expdir_max;
 
@@ -1250,6 +1237,9 @@ expandmeta(struct strlist *str)
 	};
 	/* TODO - EXP_REDIR */
 
+	if (GLOB_IS_ENABLED)
+		return expandmeta_glob(str);
+
 	while (str) {
 		struct strlist **savelastp;
 		struct strlist *sp;
@@ -1416,7 +1406,6 @@ expmeta(char *name, unsigned name_len, unsigned expdir_len)
 	if (! atend)
 		endname[-esc - 1] = esc ? '\\' : '/';
 }
-#endif	/* HAVE_GLOB */
 
 
 /*
@@ -1435,7 +1424,6 @@ addfname(char *name)
 }
 
 
-#ifndef HAVE_GLOB
 /*
  * Sort the results of file name expansion.  It calculates the number of
  * strings to sort and then calls msort (short for merge sort) to do the
@@ -1494,7 +1482,6 @@ msort(struct strlist *list, int len)
 	}
 	return list;
 }
-#endif
 
 
 /*
@@ -1510,7 +1497,6 @@ patmatch(char *pattern, const char *string)
 }
 
 
-#ifndef HAVE_FNMATCH
 STATIC int ccmatch(const char *p, int chr, const char **r)
 {
 	static const struct class {
@@ -1553,6 +1539,9 @@ pmatch(const char *pattern, const char *string)
 	const char *p, *q;
 	char c;
 
+	if (FNMATCH_IS_ENABLED)
+		return !fnmatch(pattern, string, 0);
+
 	p = pattern;
 	q = string;
 	for (;;) {
@@ -1644,7 +1633,6 @@ breakloop:
 		return 0;
 	return 1;
 }
-#endif
 
 
 
diff --git a/src/mystring.h b/src/mystring.h
index d0ec9dd..07d0c73 100644
--- a/src/mystring.h
+++ b/src/mystring.h
@@ -39,8 +39,14 @@
 
 #ifdef HAVE_FNMATCH
 #define FNMATCH_IS_ENABLED 1
+#ifdef HAVE_GLOB
+#define GLOB_IS_ENABLED 1
+#else
+#define GLOB_IS_ENABLED 0
+#endif
 #else
 #define FNMATCH_IS_ENABLED 0
+#define GLOB_IS_ENABLED 0
 #endif
 
 extern const char snlfmt[];
diff --git a/src/system.h b/src/system.h
index 371c64b..6b31d52 100644
--- a/src/system.h
+++ b/src/system.h
@@ -118,6 +118,64 @@ long sysconf(int) __attribute__((__noreturn__));
 int isblank(int c);
 #endif
 
+#ifndef HAVE_FNMATCH
+static inline int fnmatch(const char *pattern, const char *string, int flags)
+{
+	return -1;
+}
+#endif
+
+#ifndef HAVE_GLOB
+#define GLOB_ERR	(1 << 0)/* Return on read errors.  */
+#define GLOB_MARK	(1 << 1)/* Append a slash to each name.  */
+#define GLOB_NOSORT	(1 << 2)/* Don't sort the names.  */
+#define GLOB_DOOFFS	(1 << 3)/* Insert PGLOB->gl_offs NULLs.  */
+#define GLOB_NOCHECK	(1 << 4)/* If nothing matches, return the pattern.  */
+#define GLOB_APPEND	(1 << 5)/* Append to results of a previous call.  */
+#define GLOB_NOESCAPE	(1 << 6)/* Backslashes don't quote metacharacters.  */
+#define GLOB_PERIOD	(1 << 7)/* Leading `.' can be matched by metachars.  */
+#define GLOB_MAGCHAR	(1 << 8)/* Set in gl_flags if any metachars seen.  */
+#define GLOB_ALTDIRFUNC (1 << 9)/* Use gl_opendir et al functions.  */
+#define GLOB_BRACE	(1 << 10)/* Expand "{a,b}" to "a" "b".  */
+#define GLOB_NOMAGIC	(1 << 11)/* If no magic chars, return the pattern.  */
+#define GLOB_TILDE	(1 << 12)/* Expand ~user and ~ to home directories. */
+#define GLOB_ONLYDIR	(1 << 13)/* Match only directories.  */
+#define GLOB_TILDE_CHECK (1 << 14)/* Like GLOB_TILDE but return an error
+				     if the user name is not available.  */
+
+#define GLOB_NOSPACE	1	/* Ran out of memory.  */
+#define GLOB_ABORTED	2	/* Read error.  */
+#define GLOB_NOMATCH	3	/* No matches found.  */
+#define GLOB_NOSYS	4	/* Not implemented.  */
+
+struct dirent64;
+struct stat64;
+
+typedef struct {
+	size_t gl_pathc;
+	char **gl_pathv;
+	size_t gl_offs;
+	int gl_flags;
+
+	void (*gl_closedir)(void *);
+	struct dirent64 *(*gl_readdir)(void *);
+	void *(*gl_opendir)(const char *);
+	int (*gl_lstat)(const char *, struct stat64 *);
+	int (*gl_stat)(const char *, struct stat64 *);
+} glob64_t;
+
+static inline int glob64(const char *pattern, int flags,
+			 int (*errfunc)(const char *epath, int eerrno),
+			 glob64_t *restrict pglob)
+{
+	return -1;
+}
+
+static inline void globfree64(glob64_t *pglob)
+{
+}
+#endif
+
 /*
  * A trick to suppress uninitialized variable warning without generating any
  * code
-- 
2.39.2

-- 
Email: Herbert Xu <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.