diff lib/exclude.c @ 4537:940fdf291f5b

Ignore trailing white space and empty lines in files containing patterns to exclude.
author Paul Eggert <eggert@cs.ucla.edu>
date Wed, 13 Aug 2003 23:15:00 +0000 (2003-08-13)
parents 766682dd672e
children e05e3087e98a
line wrap: on
line diff
--- 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 @@
 # 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 @@
 }
 
 /* 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),
@@ -257,8 +271,20 @@
   for (pattern = p = buf, lim = buf + buf_count;  p <= lim;  p++)
     if (p < lim ? *p == line_end : buf < p && p[-1])
       {
-	*p = '\0';
+	if (is_space (line_end))
+	  {
+	    char *pattern_end = p;
+	    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;
       }