Mercurial > hg > octave-kai > gnulib-hg
annotate lib/exclude.c @ 6803:ef94ee751cba
(exclude_fnmatch): New function.
(excluded_file_name): Call exclude_fnmatch.
author | Sergey Poznyakoff <gray@gnu.org.ua> |
---|---|
date | Thu, 25 May 2006 07:02:07 +0000 |
parents | af09cfa36fd5 |
children | fa896bb33133 |
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 |
5159 | 3 Copyright (C) 1992, 1993, 1994, 1997, 1999, 2000, 2001, 2002, 2003, |
6803
ef94ee751cba
(exclude_fnmatch): New function.
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
6323
diff
changeset
|
4 2004, 2005, 2006 Free 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, | |
5848
a48fb0e98c8c
*** empty log message ***
Paul Eggert <eggert@cs.ucla.edu>
parents:
5318
diff
changeset
|
19 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ |
1171 | 20 |
21 /* Written by Paul Eggert <eggert@twinsun.com> */ | |
22 | |
6259
96c32553b4c6
Use a consistent style for including <config.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5907
diff
changeset
|
23 #ifdef HAVE_CONFIG_H |
1171 | 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> |
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
|
31 #include <stddef.h> |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
32 #include <stdio.h> |
4638 | 33 #include <stdlib.h> |
34 #include <string.h> | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
35 |
3436
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
36 #include "exclude.h" |
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
37 #include "fnmatch.h" |
6275 | 38 #include "strcase.h" |
3436
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
39 #include "xalloc.h" |
6323
af09cfa36fd5
* modules/exclude (Depends-on): Depend on verify.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6275
diff
changeset
|
40 #include "verify.h" |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
41 |
5318
7c24a825b51d
Remove dependencies on unlocked-io.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5159
diff
changeset
|
42 #if USE_UNLOCKED_IO |
7c24a825b51d
Remove dependencies on unlocked-io.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5159
diff
changeset
|
43 # include "unlocked-io.h" |
7c24a825b51d
Remove dependencies on unlocked-io.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5159
diff
changeset
|
44 #endif |
7c24a825b51d
Remove dependencies on unlocked-io.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5159
diff
changeset
|
45 |
4537
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
46 #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
|
47 # define IN_CTYPE_DOMAIN(c) true |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
48 #else |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
49 # 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
|
50 #endif |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
51 |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
52 static inline bool |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
53 is_space (unsigned char c) |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
54 { |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
55 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
|
56 } |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
57 |
4077
62c996889465
(FNM_CASEFOLD, FNM_LEADING_DIR): Define to 0 if not
Paul Eggert <eggert@cs.ucla.edu>
parents:
3618
diff
changeset
|
58 /* 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
|
59 #ifndef FNM_CASEFOLD |
62c996889465
(FNM_CASEFOLD, FNM_LEADING_DIR): Define to 0 if not
Paul Eggert <eggert@cs.ucla.edu>
parents:
3618
diff
changeset
|
60 # 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
|
61 #endif |
62c996889465
(FNM_CASEFOLD, FNM_LEADING_DIR): Define to 0 if not
Paul Eggert <eggert@cs.ucla.edu>
parents:
3618
diff
changeset
|
62 #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
|
63 # 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
|
64 #endif |
62c996889465
(FNM_CASEFOLD, FNM_LEADING_DIR): Define to 0 if not
Paul Eggert <eggert@cs.ucla.edu>
parents:
3618
diff
changeset
|
65 |
6323
af09cfa36fd5
* modules/exclude (Depends-on): Depend on verify.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6275
diff
changeset
|
66 verify (((EXCLUDE_ANCHORED | EXCLUDE_INCLUDE | EXCLUDE_WILDCARDS) |
af09cfa36fd5
* modules/exclude (Depends-on): Depend on verify.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6275
diff
changeset
|
67 & (FNM_PATHNAME | FNM_NOESCAPE | FNM_PERIOD | FNM_LEADING_DIR |
af09cfa36fd5
* modules/exclude (Depends-on): Depend on verify.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6275
diff
changeset
|
68 | FNM_CASEFOLD)) |
af09cfa36fd5
* modules/exclude (Depends-on): Depend on verify.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6275
diff
changeset
|
69 == 0); |
1171 | 70 |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
71 /* 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
|
72 ORed with EXCLUDE_* options. */ |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
73 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
74 struct patopts |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
75 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
76 char const *pattern; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
77 int options; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
78 }; |
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 /* An exclude list, of pattern-options pairs. */ |
1171 | 81 |
82 struct exclude | |
83 { | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
84 struct patopts *exclude; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
85 size_t exclude_alloc; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
86 size_t exclude_count; |
1171 | 87 }; |
88 | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
89 /* 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
|
90 |
1171 | 91 struct exclude * |
92 new_exclude (void) | |
93 { | |
4820
559c5f9c9e45
Modify exclude.c to use new xalloc primitives, for simplicity.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4790
diff
changeset
|
94 return xzalloc (sizeof *new_exclude ()); |
1171 | 95 } |
96 | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
97 /* Free the storage associated with an exclude list. */ |
1171 | 98 |
99 void | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
100 free_exclude (struct exclude *ex) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
101 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
102 free (ex->exclude); |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
103 free (ex); |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
104 } |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
105 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
106 /* 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
|
107 (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
|
108 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
109 static int |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
110 fnmatch_no_wildcards (char const *pattern, char const *f, int options) |
1171 | 111 { |
3459
616b1a72ff28
(fnmatch_no_wildcards): Fix confusion between
Jim Meyering <jim@meyering.net>
parents:
3436
diff
changeset
|
112 if (! (options & FNM_LEADING_DIR)) |
616b1a72ff28
(fnmatch_no_wildcards): Fix confusion between
Jim Meyering <jim@meyering.net>
parents:
3436
diff
changeset
|
113 return ((options & FNM_CASEFOLD) |
3436
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
114 ? strcasecmp (pattern, f) |
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
115 : strcmp (pattern, f)); |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
116 else |
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 size_t patlen = strlen (pattern); |
3459
616b1a72ff28
(fnmatch_no_wildcards): Fix confusion between
Jim Meyering <jim@meyering.net>
parents:
3436
diff
changeset
|
119 int r = ((options & FNM_CASEFOLD) |
3436
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
120 ? strncasecmp (pattern, f, patlen) |
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
121 : strncmp (pattern, f, patlen)); |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
122 if (! r) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
123 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
124 r = f[patlen]; |
3459
616b1a72ff28
(fnmatch_no_wildcards): Fix confusion between
Jim Meyering <jim@meyering.net>
parents:
3436
diff
changeset
|
125 if (r == '/') |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
126 r = 0; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
127 } |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
128 return r; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
129 } |
1171 | 130 } |
131 | |
6803
ef94ee751cba
(exclude_fnmatch): New function.
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
6323
diff
changeset
|
132 bool |
ef94ee751cba
(exclude_fnmatch): New function.
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
6323
diff
changeset
|
133 exclude_fnmatch (char const *pattern, char const *f, int options) |
ef94ee751cba
(exclude_fnmatch): New function.
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
6323
diff
changeset
|
134 { |
ef94ee751cba
(exclude_fnmatch): New function.
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
6323
diff
changeset
|
135 int (*matcher) (char const *, char const *, int) = |
ef94ee751cba
(exclude_fnmatch): New function.
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
6323
diff
changeset
|
136 (options & EXCLUDE_WILDCARDS |
ef94ee751cba
(exclude_fnmatch): New function.
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
6323
diff
changeset
|
137 ? fnmatch |
ef94ee751cba
(exclude_fnmatch): New function.
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
6323
diff
changeset
|
138 : fnmatch_no_wildcards); |
ef94ee751cba
(exclude_fnmatch): New function.
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
6323
diff
changeset
|
139 bool matched = ((*matcher) (pattern, f, options) == 0); |
ef94ee751cba
(exclude_fnmatch): New function.
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
6323
diff
changeset
|
140 char const *p; |
ef94ee751cba
(exclude_fnmatch): New function.
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
6323
diff
changeset
|
141 |
ef94ee751cba
(exclude_fnmatch): New function.
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
6323
diff
changeset
|
142 if (! (options & EXCLUDE_ANCHORED)) |
ef94ee751cba
(exclude_fnmatch): New function.
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
6323
diff
changeset
|
143 for (p = f; *p && ! matched; p++) |
ef94ee751cba
(exclude_fnmatch): New function.
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
6323
diff
changeset
|
144 if (*p == '/' && p[1] != '/') |
ef94ee751cba
(exclude_fnmatch): New function.
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
6323
diff
changeset
|
145 matched = ((*matcher) (pattern, p + 1, options) == 0); |
ef94ee751cba
(exclude_fnmatch): New function.
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
6323
diff
changeset
|
146 |
ef94ee751cba
(exclude_fnmatch): New function.
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
6323
diff
changeset
|
147 return matched; |
ef94ee751cba
(exclude_fnmatch): New function.
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
6323
diff
changeset
|
148 } |
ef94ee751cba
(exclude_fnmatch): New function.
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
6323
diff
changeset
|
149 |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
150 /* Return true if EX excludes F. */ |
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 bool |
5907 | 153 excluded_file_name (struct exclude const *ex, char const *f) |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
154 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
155 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
|
156 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
157 /* 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
|
158 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
|
159 return false; |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
160 else |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
161 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
162 struct patopts const *exclude = ex->exclude; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
163 size_t i; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
164 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
165 /* 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
|
166 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
|
167 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
168 /* 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
|
169 excluded to included or vice versa. */ |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
170 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
|
171 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
172 char const *pattern = exclude[i].pattern; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
173 int options = exclude[i].options; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
174 if (excluded == !! (options & EXCLUDE_INCLUDE)) |
6803
ef94ee751cba
(exclude_fnmatch): New function.
Sergey Poznyakoff <gray@gnu.org.ua>
parents:
6323
diff
changeset
|
175 excluded ^= exclude_fnmatch (pattern, f, options); |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
176 } |
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 return excluded; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
179 } |
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 /* 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
|
183 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
184 void |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
185 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
|
186 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
187 struct patopts *patopts; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
188 |
4820
559c5f9c9e45
Modify exclude.c to use new xalloc primitives, for simplicity.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4790
diff
changeset
|
189 if (ex->exclude_count == ex->exclude_alloc) |
559c5f9c9e45
Modify exclude.c to use new xalloc primitives, for simplicity.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4790
diff
changeset
|
190 ex->exclude = x2nrealloc (ex->exclude, &ex->exclude_alloc, |
559c5f9c9e45
Modify exclude.c to use new xalloc primitives, for simplicity.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4790
diff
changeset
|
191 sizeof *ex->exclude); |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
192 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
193 patopts = &ex->exclude[ex->exclude_count++]; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
194 patopts->pattern = pattern; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
195 patopts->options = options; |
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 |
5907 | 198 /* Use ADD_FUNC to append to EX the patterns in FILE_NAME, each with |
4537
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
199 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
|
200 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
|
201 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
|
202 |
1171 | 203 int |
4292 | 204 add_exclude_file (void (*add_func) (struct exclude *, char const *, int), |
5907 | 205 struct exclude *ex, char const *file_name, int options, |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
206 char line_end) |
1171 | 207 { |
5907 | 208 bool use_stdin = file_name[0] == '-' && !file_name[1]; |
1171 | 209 FILE *in; |
4820
559c5f9c9e45
Modify exclude.c to use new xalloc primitives, for simplicity.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4790
diff
changeset
|
210 char *buf = NULL; |
1171 | 211 char *p; |
212 char const *pattern; | |
213 char const *lim; | |
4820
559c5f9c9e45
Modify exclude.c to use new xalloc primitives, for simplicity.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4790
diff
changeset
|
214 size_t buf_alloc = 0; |
1171 | 215 size_t buf_count = 0; |
216 int c; | |
217 int e = 0; | |
218 | |
219 if (use_stdin) | |
220 in = stdin; | |
5907 | 221 else if (! (in = fopen (file_name, "r"))) |
1171 | 222 return -1; |
223 | |
224 while ((c = getc (in)) != EOF) | |
225 { | |
4820
559c5f9c9e45
Modify exclude.c to use new xalloc primitives, for simplicity.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4790
diff
changeset
|
226 if (buf_count == buf_alloc) |
559c5f9c9e45
Modify exclude.c to use new xalloc primitives, for simplicity.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4790
diff
changeset
|
227 buf = x2realloc (buf, &buf_alloc); |
1171 | 228 buf[buf_count++] = c; |
229 } | |
230 | |
231 if (ferror (in)) | |
232 e = errno; | |
233 | |
234 if (!use_stdin && fclose (in) != 0) | |
235 e = errno; | |
236 | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
237 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
|
238 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
|
239 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
|
240 pattern = buf; |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
241 |
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
|
242 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
|
243 if (*p == line_end) |
1171 | 244 { |
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
|
245 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
|
246 |
4537
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
247 if (is_space (line_end)) |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
248 { |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
249 for (; ; pattern_end--) |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
250 if (pattern_end == pattern) |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
251 goto next_pattern; |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
252 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
|
253 break; |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
254 } |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
255 |
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
|
256 *pattern_end = '\0'; |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
257 (*add_func) (ex, pattern, options); |
4537
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
258 |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
259 next_pattern: |
1171 | 260 pattern = p + 1; |
261 } | |
262 | |
263 errno = e; | |
264 return e ? -1 : 0; | |
265 } |