X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fexclude.c;h=75042cbd85358fd6d5212178f981bc30887035e4;hb=fc66900ee825390c11719d7d3e6816c6fa94ef45;hp=7df879dd17dfaa3f605a0b2249b09ce8dc0ab520;hpb=02e3bf2a532498c860f248a9bd81869dbf514404;p=gnulib.git diff --git a/lib/exclude.c b/lib/exclude.c index 7df879dd1..75042cbd8 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, 2003 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 @@ -24,20 +24,14 @@ # include #endif -#if HAVE_STDBOOL_H -# include -#else -typedef enum {false = 0, true = 1} bool; -#endif +#include #include #ifndef errno extern int errno; #endif +#include #include -#if HAVE_SYS_TYPES_H -# include -#endif #if HAVE_STDLIB_H # include #endif @@ -57,6 +51,7 @@ extern int errno; #include "exclude.h" #include "fnmatch.h" +#include "unlocked-io.h" #include "xalloc.h" #ifndef SIZE_MAX @@ -66,9 +61,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)); @@ -95,11 +98,10 @@ struct exclude struct exclude * new_exclude (void) { - struct exclude *ex = (struct exclude *) xmalloc (sizeof *ex); + struct exclude *ex = xmalloc (sizeof *ex); ex->exclude_count = 0; ex->exclude_alloc = (1 << 6); /* This must be a power of 2. */ - ex->exclude = (struct patopts *) xmalloc (ex->exclude_alloc - * sizeof ex->exclude[0]); + ex->exclude = xmalloc (ex->exclude_alloc * sizeof ex->exclude[0]); return ex; } @@ -118,20 +120,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) + 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) + 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; @@ -147,7 +149,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; @@ -164,7 +166,7 @@ excluded_filename (struct exclude const *ex, char const *f) int options = exclude[i].options; if (excluded == !! (options & EXCLUDE_INCLUDE)) { - int (*matcher) PARAMS ((char const *, char const *, int)) = + int (*matcher) (char const *, char const *, int) = (options & EXCLUDE_WILDCARDS ? fnmatch : fnmatch_no_wildcards); @@ -197,8 +199,7 @@ add_exclude (struct exclude *ex, char const *pattern, int options) if (! (0 < s && s <= SIZE_MAX / sizeof ex->exclude[0])) xalloc_die (); ex->exclude_alloc = s; - ex->exclude = (struct patopts *) xrealloc (ex->exclude, - s * sizeof ex->exclude[0]); + ex->exclude = xrealloc (ex->exclude, s * sizeof ex->exclude[0]); } patopts = &ex->exclude[ex->exclude_count++]; @@ -211,8 +212,7 @@ add_exclude (struct exclude *ex, char const *pattern, int options) on failure, 0 on success. */ int -add_exclude_file (void (*add_func) PARAMS ((struct exclude *, - char const *, int)), +add_exclude_file (void (*add_func) (struct exclude *, char const *, int), struct exclude *ex, char const *filename, int options, char line_end) {