X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fexclude.c;h=9337e74a9060f73142e8e3b8497740ff9651cdad;hb=69a9b8f8d7acc8677b5657adb83a8ba448737e0c;hp=5a1e1ee6f5c4dfb116286acdbadabfa383217675;hpb=42a7a591a61dec356ce453f6c2e483c4a56fc9f4;p=gnulib.git diff --git a/lib/exclude.c b/lib/exclude.c index 5a1e1ee6f..9337e74a9 100644 --- a/lib/exclude.c +++ b/lib/exclude.c @@ -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 -#include -#include +#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;