diff options
author | Jim Meyering <jim@meyering.net> | 2003-08-18 09:44:49 +0000 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 2003-08-18 09:44:49 +0000 |
commit | b1b4af8047b2d6c2b2ea0d552969e25f872da675 (patch) | |
tree | ee8166cbc3f75e901def92c7c94473473d360165 /lib/exclude.c | |
parent | 84a9ab5a07427ab8322424cd0c401e847326e7e2 (diff) | |
download | coreutils-b1b4af8047b2d6c2b2ea0d552969e25f872da675.tar.xz |
Sync with gnulib.
Diffstat (limited to 'lib/exclude.c')
-rw-r--r-- | lib/exclude.c | 40 |
1 files changed, 35 insertions, 5 deletions
diff --git a/lib/exclude.c b/lib/exclude.c index 75042cbd8..7c038b23e 100644 --- a/lib/exclude.c +++ b/lib/exclude.c @@ -26,6 +26,7 @@ #include <stdbool.h> +#include <ctype.h> #include <errno.h> #ifndef errno extern int errno; @@ -58,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]; } @@ -208,8 +221,9 @@ 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) (struct exclude *, char const *, int), @@ -253,12 +267,28 @@ add_exclude_file (void (*add_func) (struct exclude *, char const *, int), 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; } |