Add module mathl.
[gnulib.git] / lib / exclude.c
index 5a1e1ee..9337e74 100644 (file)
@@ -1,7 +1,7 @@
 /* exclude.c -- exclude file names
 
-   Copyright 1992, 1993, 1994, 1997, 1999, 2000, 2001 Free Software
-   Foundation, Inc.
+   Copyright (C) 1992, 1993, 1994, 1997, 1999, 2000, 2001, 2002 Free
+   Software Foundation, Inc.
 
    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
@@ -55,9 +55,10 @@ extern int errno;
 # endif
 #endif
 
-#include <exclude.h>
-#include <fnmatch.h>
-#include <xalloc.h>
+#include "exclude.h"
+#include "fnmatch.h"
+#include "unlocked-io.h"
+#include "xalloc.h"
 
 #ifndef SIZE_MAX
 # define SIZE_MAX ((size_t) -1)
@@ -66,9 +67,17 @@ extern int errno;
 /* Verify a requirement at compile-time (unlike assert, which is runtime).  */
 #define verify(name, assertion) struct name { char a[(assertion) ? 1 : -1]; }
 
+/* Non-GNU systems lack these options, so we don't need to check them.  */
+#ifndef FNM_CASEFOLD
+# define FNM_CASEFOLD 0
+#endif
+#ifndef FNM_LEADING_DIR
+# define FNM_LEADING_DIR 0
+#endif
+
 verify (EXCLUDE_macros_do_not_collide_with_FNM_macros,
        (((EXCLUDE_ANCHORED | EXCLUDE_INCLUDE | EXCLUDE_WILDCARDS)
-         & (FNM_FILE_NAME | FNM_NOESCAPE | FNM_PERIOD | FNM_LEADING_DIR
+         & (FNM_PATHNAME | FNM_NOESCAPE | FNM_PERIOD | FNM_LEADING_DIR
             | FNM_CASEFOLD))
         == 0));
 
@@ -118,17 +127,20 @@ free_exclude (struct exclude *ex)
 static int
 fnmatch_no_wildcards (char const *pattern, char const *f, int options)
 {
-  if (! (options & FNM_CASEFOLD))
-    return (options & FNM_LEADING_DIR ? strcasecmp : strcmp) (pattern, f);
+  if (! (options & FNM_LEADING_DIR))
+    return ((options & FNM_CASEFOLD)
+           ? strcasecmp (pattern, f)
+           : strcmp (pattern, f));
   else
     {
       size_t patlen = strlen (pattern);
-      int r = ((options & FNM_LEADING_DIR ? strncasecmp : strncmp)
-              (pattern, f, patlen));
+      int r = ((options & FNM_CASEFOLD)
+               ? strncasecmp (pattern, f, patlen)
+               : strncmp (pattern, f, patlen));
       if (! r)
        {
          r = f[patlen];
-         if (r == '/' && (options & FNM_LEADING_DIR))
+         if (r == '/')
            r = 0;
        }
       return r;
@@ -144,7 +156,7 @@ excluded_filename (struct exclude const *ex, char const *f)
 
   /* If no options are given, the default is to include.  */
   if (exclude_count == 0)
-    return 0;
+    return false;
   else
     {
       struct patopts const *exclude = ex->exclude;