Mercurial > hg > octave-kai > gnulib-hg
annotate lib/exclude.c @ 4538:e05e3087e98a
Fix typo in previous change; it mishandled the case when line_end was
neither a space nor NUL.
author | Paul Eggert <eggert@cs.ucla.edu> |
---|---|
date | Wed, 13 Aug 2003 23:44:25 +0000 (2003-08-13) |
parents | 940fdf291f5b |
children | 652159397a1d |
rev | line source |
---|---|
1171 | 1 /* exclude.c -- exclude file names |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
2 |
4292 | 3 Copyright (C) 1992, 1993, 1994, 1997, 1999, 2000, 2001, 2002, 2003 Free |
4077
62c996889465
(FNM_CASEFOLD, FNM_LEADING_DIR): Define to 0 if not
Paul Eggert <eggert@cs.ucla.edu>
parents:
3618
diff
changeset
|
4 Software Foundation, Inc. |
1171 | 5 |
6 This program is free software; you can redistribute it and/or modify | |
7 it under the terms of the GNU General Public License as published by | |
8 the Free Software Foundation; either version 2, or (at your option) | |
9 any later version. | |
10 | |
11 This program is distributed in the hope that it will be useful, | |
12 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 GNU General Public License for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
17 along with this program; see the file COPYING. | |
18 If not, write to the Free Software Foundation, | |
19 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |
20 | |
21 /* Written by Paul Eggert <eggert@twinsun.com> */ | |
22 | |
23 #if HAVE_CONFIG_H | |
24 # include <config.h> | |
25 #endif | |
26 | |
4333 | 27 #include <stdbool.h> |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
28 |
4537
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
29 #include <ctype.h> |
1171 | 30 #include <errno.h> |
31 #ifndef errno | |
32 extern int errno; | |
33 #endif | |
4347
df44e79ce676
.h files should stand alone, but we shouldn't include <sys/types.h>
Paul Eggert <eggert@cs.ucla.edu>
parents:
4333
diff
changeset
|
34 #include <stddef.h> |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
35 #include <stdio.h> |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
36 #if HAVE_STDLIB_H |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
37 # include <stdlib.h> |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
38 #endif |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
39 #if HAVE_STRING_H |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
40 # include <string.h> |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
41 #endif |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
42 #if HAVE_STRINGS_H |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
43 # include <strings.h> |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
44 #endif |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
45 #if HAVE_INTTYPES_H |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
46 # include <inttypes.h> |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
47 #else |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
48 # if HAVE_STDINT_H |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
49 # include <stdint.h> |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
50 # endif |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
51 #endif |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
52 |
3436
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
53 #include "exclude.h" |
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
54 #include "fnmatch.h" |
3618 | 55 #include "unlocked-io.h" |
3436
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
56 #include "xalloc.h" |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
57 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
58 #ifndef SIZE_MAX |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
59 # define SIZE_MAX ((size_t) -1) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
60 #endif |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
61 |
4537
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
62 #if STDC_HEADERS || (! defined isascii && ! HAVE_ISASCII) |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
63 # define IN_CTYPE_DOMAIN(c) true |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
64 #else |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
65 # define IN_CTYPE_DOMAIN(c) isascii (c) |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
66 #endif |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
67 |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
68 static inline bool |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
69 is_space (unsigned char c) |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
70 { |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
71 return IN_CTYPE_DOMAIN (c) && isspace (c); |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
72 } |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
73 |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
74 /* Verify a requirement at compile-time (unlike assert, which is runtime). */ |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
75 #define verify(name, assertion) struct name { char a[(assertion) ? 1 : -1]; } |
1171 | 76 |
4077
62c996889465
(FNM_CASEFOLD, FNM_LEADING_DIR): Define to 0 if not
Paul Eggert <eggert@cs.ucla.edu>
parents:
3618
diff
changeset
|
77 /* Non-GNU systems lack these options, so we don't need to check them. */ |
62c996889465
(FNM_CASEFOLD, FNM_LEADING_DIR): Define to 0 if not
Paul Eggert <eggert@cs.ucla.edu>
parents:
3618
diff
changeset
|
78 #ifndef FNM_CASEFOLD |
62c996889465
(FNM_CASEFOLD, FNM_LEADING_DIR): Define to 0 if not
Paul Eggert <eggert@cs.ucla.edu>
parents:
3618
diff
changeset
|
79 # define FNM_CASEFOLD 0 |
62c996889465
(FNM_CASEFOLD, FNM_LEADING_DIR): Define to 0 if not
Paul Eggert <eggert@cs.ucla.edu>
parents:
3618
diff
changeset
|
80 #endif |
62c996889465
(FNM_CASEFOLD, FNM_LEADING_DIR): Define to 0 if not
Paul Eggert <eggert@cs.ucla.edu>
parents:
3618
diff
changeset
|
81 #ifndef FNM_LEADING_DIR |
62c996889465
(FNM_CASEFOLD, FNM_LEADING_DIR): Define to 0 if not
Paul Eggert <eggert@cs.ucla.edu>
parents:
3618
diff
changeset
|
82 # define FNM_LEADING_DIR 0 |
62c996889465
(FNM_CASEFOLD, FNM_LEADING_DIR): Define to 0 if not
Paul Eggert <eggert@cs.ucla.edu>
parents:
3618
diff
changeset
|
83 #endif |
62c996889465
(FNM_CASEFOLD, FNM_LEADING_DIR): Define to 0 if not
Paul Eggert <eggert@cs.ucla.edu>
parents:
3618
diff
changeset
|
84 |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
85 verify (EXCLUDE_macros_do_not_collide_with_FNM_macros, |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
86 (((EXCLUDE_ANCHORED | EXCLUDE_INCLUDE | EXCLUDE_WILDCARDS) |
4077
62c996889465
(FNM_CASEFOLD, FNM_LEADING_DIR): Define to 0 if not
Paul Eggert <eggert@cs.ucla.edu>
parents:
3618
diff
changeset
|
87 & (FNM_PATHNAME | FNM_NOESCAPE | FNM_PERIOD | FNM_LEADING_DIR |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
88 | FNM_CASEFOLD)) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
89 == 0)); |
1171 | 90 |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
91 /* An exclude pattern-options pair. The options are fnmatch options |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
92 ORed with EXCLUDE_* options. */ |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
93 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
94 struct patopts |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
95 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
96 char const *pattern; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
97 int options; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
98 }; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
99 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
100 /* An exclude list, of pattern-options pairs. */ |
1171 | 101 |
102 struct exclude | |
103 { | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
104 struct patopts *exclude; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
105 size_t exclude_alloc; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
106 size_t exclude_count; |
1171 | 107 }; |
108 | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
109 /* Return a newly allocated and empty exclude list. */ |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
110 |
1171 | 111 struct exclude * |
112 new_exclude (void) | |
113 { | |
4350
766682dd672e
(new_exclude, add_exclude): Remove casts that are
Paul Eggert <eggert@cs.ucla.edu>
parents:
4347
diff
changeset
|
114 struct exclude *ex = xmalloc (sizeof *ex); |
1171 | 115 ex->exclude_count = 0; |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
116 ex->exclude_alloc = (1 << 6); /* This must be a power of 2. */ |
4350
766682dd672e
(new_exclude, add_exclude): Remove casts that are
Paul Eggert <eggert@cs.ucla.edu>
parents:
4347
diff
changeset
|
117 ex->exclude = xmalloc (ex->exclude_alloc * sizeof ex->exclude[0]); |
1171 | 118 return ex; |
119 } | |
120 | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
121 /* Free the storage associated with an exclude list. */ |
1171 | 122 |
123 void | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
124 free_exclude (struct exclude *ex) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
125 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
126 free (ex->exclude); |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
127 free (ex); |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
128 } |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
129 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
130 /* Return zero if PATTERN matches F, obeying OPTIONS, except that |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
131 (unlike fnmatch) wildcards are disabled in PATTERN. */ |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
132 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
133 static int |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
134 fnmatch_no_wildcards (char const *pattern, char const *f, int options) |
1171 | 135 { |
3459
616b1a72ff28
(fnmatch_no_wildcards): Fix confusion between
Jim Meyering <jim@meyering.net>
parents:
3436
diff
changeset
|
136 if (! (options & FNM_LEADING_DIR)) |
616b1a72ff28
(fnmatch_no_wildcards): Fix confusion between
Jim Meyering <jim@meyering.net>
parents:
3436
diff
changeset
|
137 return ((options & FNM_CASEFOLD) |
3436
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
138 ? strcasecmp (pattern, f) |
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
139 : strcmp (pattern, f)); |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
140 else |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
141 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
142 size_t patlen = strlen (pattern); |
3459
616b1a72ff28
(fnmatch_no_wildcards): Fix confusion between
Jim Meyering <jim@meyering.net>
parents:
3436
diff
changeset
|
143 int r = ((options & FNM_CASEFOLD) |
3436
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
144 ? strncasecmp (pattern, f, patlen) |
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
145 : strncmp (pattern, f, patlen)); |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
146 if (! r) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
147 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
148 r = f[patlen]; |
3459
616b1a72ff28
(fnmatch_no_wildcards): Fix confusion between
Jim Meyering <jim@meyering.net>
parents:
3436
diff
changeset
|
149 if (r == '/') |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
150 r = 0; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
151 } |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
152 return r; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
153 } |
1171 | 154 } |
155 | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
156 /* Return true if EX excludes F. */ |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
157 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
158 bool |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
159 excluded_filename (struct exclude const *ex, char const *f) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
160 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
161 size_t exclude_count = ex->exclude_count; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
162 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
163 /* If no options are given, the default is to include. */ |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
164 if (exclude_count == 0) |
3535
c08cb8ae6c9c
(excluded_filename): 0 -> false, since it's a boolean context.
Jim Meyering <jim@meyering.net>
parents:
3459
diff
changeset
|
165 return false; |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
166 else |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
167 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
168 struct patopts const *exclude = ex->exclude; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
169 size_t i; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
170 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
171 /* Otherwise, the default is the opposite of the first option. */ |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
172 bool excluded = !! (exclude[0].options & EXCLUDE_INCLUDE); |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
173 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
174 /* Scan through the options, seeing whether they change F from |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
175 excluded to included or vice versa. */ |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
176 for (i = 0; i < exclude_count; i++) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
177 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
178 char const *pattern = exclude[i].pattern; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
179 int options = exclude[i].options; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
180 if (excluded == !! (options & EXCLUDE_INCLUDE)) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
181 { |
4292 | 182 int (*matcher) (char const *, char const *, int) = |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
183 (options & EXCLUDE_WILDCARDS |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
184 ? fnmatch |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
185 : fnmatch_no_wildcards); |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
186 bool matched = ((*matcher) (pattern, f, options) == 0); |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
187 char const *p; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
188 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
189 if (! (options & EXCLUDE_ANCHORED)) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
190 for (p = f; *p && ! matched; p++) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
191 if (*p == '/' && p[1] != '/') |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
192 matched = ((*matcher) (pattern, p + 1, options) == 0); |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
193 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
194 excluded ^= matched; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
195 } |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
196 } |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
197 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
198 return excluded; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
199 } |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
200 } |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
201 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
202 /* Append to EX the exclusion PATTERN with OPTIONS. */ |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
203 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
204 void |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
205 add_exclude (struct exclude *ex, char const *pattern, int options) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
206 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
207 struct patopts *patopts; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
208 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
209 if (ex->exclude_alloc <= ex->exclude_count) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
210 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
211 size_t s = 2 * ex->exclude_alloc; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
212 if (! (0 < s && s <= SIZE_MAX / sizeof ex->exclude[0])) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
213 xalloc_die (); |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
214 ex->exclude_alloc = s; |
4350
766682dd672e
(new_exclude, add_exclude): Remove casts that are
Paul Eggert <eggert@cs.ucla.edu>
parents:
4347
diff
changeset
|
215 ex->exclude = xrealloc (ex->exclude, s * sizeof ex->exclude[0]); |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
216 } |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
217 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
218 patopts = &ex->exclude[ex->exclude_count++]; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
219 patopts->pattern = pattern; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
220 patopts->options = options; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
221 } |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
222 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
223 /* Use ADD_FUNC to append to EX the patterns in FILENAME, each with |
4537
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
224 OPTIONS. LINE_END terminates each pattern in the file. If |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
225 LINE_END is a space character, ignore trailing spaces and empty |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
226 lines in FILE. Return -1 on failure, 0 on success. */ |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
227 |
1171 | 228 int |
4292 | 229 add_exclude_file (void (*add_func) (struct exclude *, char const *, int), |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
230 struct exclude *ex, char const *filename, int options, |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
231 char line_end) |
1171 | 232 { |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
233 bool use_stdin = filename[0] == '-' && !filename[1]; |
1171 | 234 FILE *in; |
235 char *buf; | |
236 char *p; | |
237 char const *pattern; | |
238 char const *lim; | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
239 size_t buf_alloc = (1 << 10); /* This must be a power of two. */ |
1171 | 240 size_t buf_count = 0; |
241 int c; | |
242 int e = 0; | |
243 | |
244 if (use_stdin) | |
245 in = stdin; | |
246 else if (! (in = fopen (filename, "r"))) | |
247 return -1; | |
248 | |
249 buf = xmalloc (buf_alloc); | |
250 | |
251 while ((c = getc (in)) != EOF) | |
252 { | |
253 buf[buf_count++] = c; | |
254 if (buf_count == buf_alloc) | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
255 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
256 buf_alloc *= 2; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
257 if (! buf_alloc) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
258 xalloc_die (); |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
259 buf = xrealloc (buf, buf_alloc); |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
260 } |
1171 | 261 } |
262 | |
263 if (ferror (in)) | |
264 e = errno; | |
265 | |
266 if (!use_stdin && fclose (in) != 0) | |
267 e = errno; | |
268 | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
269 buf = xrealloc (buf, buf_count + 1); |
4538
e05e3087e98a
Fix typo in previous change; it mishandled the case when line_end was
Paul Eggert <eggert@cs.ucla.edu>
parents:
4537
diff
changeset
|
270 buf[buf_count] = line_end; |
e05e3087e98a
Fix typo in previous change; it mishandled the case when line_end was
Paul Eggert <eggert@cs.ucla.edu>
parents:
4537
diff
changeset
|
271 lim = buf + buf_count + ! (buf_count == 0 || buf[buf_count - 1] == line_end); |
e05e3087e98a
Fix typo in previous change; it mishandled the case when line_end was
Paul Eggert <eggert@cs.ucla.edu>
parents:
4537
diff
changeset
|
272 pattern = buf; |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
273 |
4538
e05e3087e98a
Fix typo in previous change; it mishandled the case when line_end was
Paul Eggert <eggert@cs.ucla.edu>
parents:
4537
diff
changeset
|
274 for (p = buf; p < lim; p++) |
e05e3087e98a
Fix typo in previous change; it mishandled the case when line_end was
Paul Eggert <eggert@cs.ucla.edu>
parents:
4537
diff
changeset
|
275 if (*p == line_end) |
1171 | 276 { |
4538
e05e3087e98a
Fix typo in previous change; it mishandled the case when line_end was
Paul Eggert <eggert@cs.ucla.edu>
parents:
4537
diff
changeset
|
277 char *pattern_end = p; |
e05e3087e98a
Fix typo in previous change; it mishandled the case when line_end was
Paul Eggert <eggert@cs.ucla.edu>
parents:
4537
diff
changeset
|
278 |
4537
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
279 if (is_space (line_end)) |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
280 { |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
281 for (; ; pattern_end--) |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
282 if (pattern_end == pattern) |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
283 goto next_pattern; |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
284 else if (! is_space (pattern_end[-1])) |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
285 break; |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
286 } |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
287 |
4538
e05e3087e98a
Fix typo in previous change; it mishandled the case when line_end was
Paul Eggert <eggert@cs.ucla.edu>
parents:
4537
diff
changeset
|
288 *pattern_end = '\0'; |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
289 (*add_func) (ex, pattern, options); |
4537
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
290 |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
291 next_pattern: |
1171 | 292 pattern = p + 1; |
293 } | |
294 | |
295 errno = e; | |
296 return e ? -1 : 0; | |
297 } |