X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fexclude.c;h=7c038b23e4075727991ba4b08dac913959a8466a;hb=c04bc106f2977f098ccc8a29da37af55c2d098ad;hp=9337e74a9060f73142e8e3b8497740ff9651cdad;hpb=ae37c409a5d07f70eae16dab08c67348cc9efaf8;p=gnulib.git diff --git a/lib/exclude.c b/lib/exclude.c index 9337e74a9..7c038b23e 100644 --- a/lib/exclude.c +++ b/lib/exclude.c @@ -1,6 +1,6 @@ /* exclude.c -- exclude file names - Copyright (C) 1992, 1993, 1994, 1997, 1999, 2000, 2001, 2002 Free + 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 @@ -24,20 +24,15 @@ # include #endif -#if HAVE_STDBOOL_H -# include -#else -typedef enum {false = 0, true = 1} bool; -#endif +#include +#include #include #ifndef errno extern int errno; #endif +#include #include -#if HAVE_SYS_TYPES_H -# include -#endif #if HAVE_STDLIB_H # include #endif @@ -64,6 +59,18 @@ extern int errno; # define SIZE_MAX ((size_t) -1) #endif +#if STDC_HEADERS || (! defined isascii && ! HAVE_ISASCII) +# define IN_CTYPE_DOMAIN(c) true +#else +# define IN_CTYPE_DOMAIN(c) isascii (c) +#endif + +static inline bool +is_space (unsigned char c) +{ + return IN_CTYPE_DOMAIN (c) && isspace (c); +} + /* Verify a requirement at compile-time (unlike assert, which is runtime). */ #define verify(name, assertion) struct name { char a[(assertion) ? 1 : -1]; } @@ -104,11 +111,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; } @@ -173,7 +179,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); @@ -206,8 +212,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++]; @@ -216,12 +221,12 @@ add_exclude (struct exclude *ex, char const *pattern, int options) } /* Use ADD_FUNC to append to EX the patterns in FILENAME, each with - OPTIONS. LINE_END terminates each pattern in the file. Return -1 - on failure, 0 on success. */ + OPTIONS. LINE_END terminates each pattern in the file. If + LINE_END is a space character, ignore trailing spaces and empty + lines in FILE. Return -1 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) { @@ -262,12 +267,28 @@ add_exclude_file (void (*add_func) PARAMS ((struct exclude *, e = errno; buf = xrealloc (buf, buf_count + 1); + buf[buf_count] = line_end; + lim = buf + buf_count + ! (buf_count == 0 || buf[buf_count - 1] == line_end); + pattern = buf; - for (pattern = p = buf, lim = buf + buf_count; p <= lim; p++) - if (p < lim ? *p == line_end : buf < p && p[-1]) + for (p = buf; p < lim; p++) + if (*p == line_end) { - *p = '\0'; + char *pattern_end = p; + + if (is_space (line_end)) + { + for (; ; pattern_end--) + if (pattern_end == pattern) + goto next_pattern; + else if (! is_space (pattern_end[-1])) + break; + } + + *pattern_end = '\0'; (*add_func) (ex, pattern, options); + + next_pattern: pattern = p + 1; }