Mercurial > hg > octave-jordi > gnulib-hg
annotate lib/exclude.c @ 3436:da0f25c86213
Use `""', not `<>' to #include non-system header files.
(fnmatch_no_wildcards): Rewrite not to use function names, strcasecmp
and strncasecmp as r-values. Unixware didn't have declarations.
author | Jim Meyering <jim@meyering.net> |
---|---|
date | Sat, 01 Sep 2001 07:28:51 +0000 |
parents | 1beac6d79e51 |
children | 616b1a72ff28 |
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 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
3 Copyright 1992, 1993, 1994, 1997, 1999, 2000, 2001 Free Software |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
4 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 | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
27 #if HAVE_STDBOOL_H |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
28 # include <stdbool.h> |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
29 #else |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
30 typedef enum {false = 0, true = 1} bool; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
31 #endif |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
32 |
1171 | 33 #include <errno.h> |
34 #ifndef errno | |
35 extern int errno; | |
36 #endif | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
37 #include <stdio.h> |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
38 #if HAVE_SYS_TYPES_H |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
39 # include <sys/types.h> |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
40 #endif |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
41 #if HAVE_STDLIB_H |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
42 # include <stdlib.h> |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
43 #endif |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
44 #if HAVE_STRING_H |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
45 # include <string.h> |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
46 #endif |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
47 #if HAVE_STRINGS_H |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
48 # include <strings.h> |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
49 #endif |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
50 #if HAVE_INTTYPES_H |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
51 # include <inttypes.h> |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
52 #else |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
53 # if HAVE_STDINT_H |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
54 # include <stdint.h> |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
55 # endif |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
56 #endif |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
57 |
3436
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
58 #include "exclude.h" |
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
59 #include "fnmatch.h" |
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
60 #include "xalloc.h" |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
61 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
62 #ifndef SIZE_MAX |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
63 # define SIZE_MAX ((size_t) -1) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
64 #endif |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
65 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
66 /* 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
|
67 #define verify(name, assertion) struct name { char a[(assertion) ? 1 : -1]; } |
1171 | 68 |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
69 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
|
70 (((EXCLUDE_ANCHORED | EXCLUDE_INCLUDE | EXCLUDE_WILDCARDS) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
71 & (FNM_FILE_NAME | FNM_NOESCAPE | FNM_PERIOD | FNM_LEADING_DIR |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
72 | FNM_CASEFOLD)) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
73 == 0)); |
1171 | 74 |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
75 /* 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
|
76 ORed with EXCLUDE_* options. */ |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
77 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
78 struct patopts |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
79 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
80 char const *pattern; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
81 int options; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
82 }; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
83 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
84 /* An exclude list, of pattern-options pairs. */ |
1171 | 85 |
86 struct exclude | |
87 { | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
88 struct patopts *exclude; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
89 size_t exclude_alloc; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
90 size_t exclude_count; |
1171 | 91 }; |
92 | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
93 /* 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
|
94 |
1171 | 95 struct exclude * |
96 new_exclude (void) | |
97 { | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
98 struct exclude *ex = (struct exclude *) xmalloc (sizeof *ex); |
1171 | 99 ex->exclude_count = 0; |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
100 ex->exclude_alloc = (1 << 6); /* This must be a power of 2. */ |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
101 ex->exclude = (struct patopts *) xmalloc (ex->exclude_alloc |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
102 * sizeof ex->exclude[0]); |
1171 | 103 return ex; |
104 } | |
105 | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
106 /* Free the storage associated with an exclude list. */ |
1171 | 107 |
108 void | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
109 free_exclude (struct exclude *ex) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
110 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
111 free (ex->exclude); |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
112 free (ex); |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
113 } |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
114 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
115 /* 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
|
116 (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
|
117 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
118 static int |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
119 fnmatch_no_wildcards (char const *pattern, char const *f, int options) |
1171 | 120 { |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
121 if (! (options & FNM_CASEFOLD)) |
3436
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
122 return ((options & FNM_LEADING_DIR) |
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
123 ? strcasecmp (pattern, f) |
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
124 : strcmp (pattern, f)); |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
125 else |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
126 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
127 size_t patlen = strlen (pattern); |
3436
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
128 int r = ((options & FNM_LEADING_DIR) |
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
129 ? strncasecmp (pattern, f, patlen) |
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
130 : strncmp (pattern, f, patlen)); |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
131 if (! r) |
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 r = f[patlen]; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
134 if (r == '/' && (options & FNM_LEADING_DIR)) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
135 r = 0; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
136 } |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
137 return r; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
138 } |
1171 | 139 } |
140 | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
141 /* Return true if EX excludes F. */ |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
142 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
143 bool |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
144 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
|
145 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
146 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
|
147 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
148 /* 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
|
149 if (exclude_count == 0) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
150 return 0; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
151 else |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
152 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
153 struct patopts const *exclude = ex->exclude; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
154 size_t i; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
155 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
156 /* 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
|
157 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
|
158 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
159 /* 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
|
160 excluded to included or vice versa. */ |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
161 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
|
162 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
163 char const *pattern = exclude[i].pattern; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
164 int options = exclude[i].options; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
165 if (excluded == !! (options & EXCLUDE_INCLUDE)) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
166 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
167 int (*matcher) PARAMS ((char const *, char const *, int)) = |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
168 (options & EXCLUDE_WILDCARDS |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
169 ? fnmatch |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
170 : fnmatch_no_wildcards); |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
171 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
|
172 char const *p; |
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 if (! (options & EXCLUDE_ANCHORED)) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
175 for (p = f; *p && ! matched; p++) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
176 if (*p == '/' && p[1] != '/') |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
177 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
|
178 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
179 excluded ^= matched; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
180 } |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
181 } |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
182 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
183 return excluded; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
184 } |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
185 } |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
186 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
187 /* 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
|
188 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
189 void |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
190 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
|
191 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
192 struct patopts *patopts; |
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 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
|
195 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
196 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
|
197 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
|
198 xalloc_die (); |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
199 ex->exclude_alloc = s; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
200 ex->exclude = (struct patopts *) xrealloc (ex->exclude, |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
201 s * sizeof ex->exclude[0]); |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
202 } |
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 patopts = &ex->exclude[ex->exclude_count++]; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
205 patopts->pattern = pattern; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
206 patopts->options = options; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
207 } |
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 /* Use ADD_FUNC to append to EX the patterns in FILENAME, each with |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
210 OPTIONS. LINE_END terminates each pattern in the file. Return -1 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
211 on failure, 0 on success. */ |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
212 |
1171 | 213 int |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
214 add_exclude_file (void (*add_func) PARAMS ((struct exclude *, |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
215 char const *, int)), |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
216 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
|
217 char line_end) |
1171 | 218 { |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
219 bool use_stdin = filename[0] == '-' && !filename[1]; |
1171 | 220 FILE *in; |
221 char *buf; | |
222 char *p; | |
223 char const *pattern; | |
224 char const *lim; | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
225 size_t buf_alloc = (1 << 10); /* This must be a power of two. */ |
1171 | 226 size_t buf_count = 0; |
227 int c; | |
228 int e = 0; | |
229 | |
230 if (use_stdin) | |
231 in = stdin; | |
232 else if (! (in = fopen (filename, "r"))) | |
233 return -1; | |
234 | |
235 buf = xmalloc (buf_alloc); | |
236 | |
237 while ((c = getc (in)) != EOF) | |
238 { | |
239 buf[buf_count++] = c; | |
240 if (buf_count == buf_alloc) | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
241 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
242 buf_alloc *= 2; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
243 if (! buf_alloc) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
244 xalloc_die (); |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
245 buf = xrealloc (buf, buf_alloc); |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
246 } |
1171 | 247 } |
248 | |
249 if (ferror (in)) | |
250 e = errno; | |
251 | |
252 if (!use_stdin && fclose (in) != 0) | |
253 e = errno; | |
254 | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
255 buf = xrealloc (buf, buf_count + 1); |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
256 |
1171 | 257 for (pattern = p = buf, lim = buf + buf_count; p <= lim; p++) |
258 if (p < lim ? *p == line_end : buf < p && p[-1]) | |
259 { | |
260 *p = '\0'; | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
261 (*add_func) (ex, pattern, options); |
1171 | 262 pattern = p + 1; |
263 } | |
264 | |
265 errno = e; | |
266 return e ? -1 : 0; | |
267 } |