Mercurial > hg > octave-kai > gnulib-hg
annotate lib/exclude.c @ 5159:a535859efd14
Merge from coreutils.
author | Paul Eggert <eggert@cs.ucla.edu> |
---|---|
date | Sat, 07 Aug 2004 00:09:38 +0000 |
parents | 559c5f9c9e45 |
children | 7c24a825b51d |
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, |
4 2004 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, | |
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> |
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" |
3618 | 38 #include "unlocked-io.h" |
3436
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
39 #include "xalloc.h" |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
40 |
4537
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
41 #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
|
42 # define IN_CTYPE_DOMAIN(c) true |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
43 #else |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
44 # 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
|
45 #endif |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
46 |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
47 static inline bool |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
48 is_space (unsigned char c) |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
49 { |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
50 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
|
51 } |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
52 |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
53 /* 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
|
54 #define verify(name, assertion) struct name { char a[(assertion) ? 1 : -1]; } |
1171 | 55 |
4077
62c996889465
(FNM_CASEFOLD, FNM_LEADING_DIR): Define to 0 if not
Paul Eggert <eggert@cs.ucla.edu>
parents:
3618
diff
changeset
|
56 /* 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
|
57 #ifndef FNM_CASEFOLD |
62c996889465
(FNM_CASEFOLD, FNM_LEADING_DIR): Define to 0 if not
Paul Eggert <eggert@cs.ucla.edu>
parents:
3618
diff
changeset
|
58 # 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
|
59 #endif |
62c996889465
(FNM_CASEFOLD, FNM_LEADING_DIR): Define to 0 if not
Paul Eggert <eggert@cs.ucla.edu>
parents:
3618
diff
changeset
|
60 #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
|
61 # 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
|
62 #endif |
62c996889465
(FNM_CASEFOLD, FNM_LEADING_DIR): Define to 0 if not
Paul Eggert <eggert@cs.ucla.edu>
parents:
3618
diff
changeset
|
63 |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
64 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
|
65 (((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
|
66 & (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
|
67 | FNM_CASEFOLD)) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
68 == 0)); |
1171 | 69 |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
70 /* 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
|
71 ORed with EXCLUDE_* options. */ |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
72 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
73 struct patopts |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
74 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
75 char const *pattern; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
76 int 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 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
79 /* An exclude list, of pattern-options pairs. */ |
1171 | 80 |
81 struct exclude | |
82 { | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
83 struct patopts *exclude; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
84 size_t exclude_alloc; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
85 size_t exclude_count; |
1171 | 86 }; |
87 | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
88 /* 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
|
89 |
1171 | 90 struct exclude * |
91 new_exclude (void) | |
92 { | |
4820
559c5f9c9e45
Modify exclude.c to use new xalloc primitives, for simplicity.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4790
diff
changeset
|
93 return xzalloc (sizeof *new_exclude ()); |
1171 | 94 } |
95 | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
96 /* Free the storage associated with an exclude list. */ |
1171 | 97 |
98 void | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
99 free_exclude (struct exclude *ex) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
100 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
101 free (ex->exclude); |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
102 free (ex); |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
103 } |
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 /* 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
|
106 (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
|
107 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
108 static int |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
109 fnmatch_no_wildcards (char const *pattern, char const *f, int options) |
1171 | 110 { |
3459
616b1a72ff28
(fnmatch_no_wildcards): Fix confusion between
Jim Meyering <jim@meyering.net>
parents:
3436
diff
changeset
|
111 if (! (options & FNM_LEADING_DIR)) |
616b1a72ff28
(fnmatch_no_wildcards): Fix confusion between
Jim Meyering <jim@meyering.net>
parents:
3436
diff
changeset
|
112 return ((options & FNM_CASEFOLD) |
3436
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
113 ? strcasecmp (pattern, f) |
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
114 : strcmp (pattern, f)); |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
115 else |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
116 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
117 size_t patlen = strlen (pattern); |
3459
616b1a72ff28
(fnmatch_no_wildcards): Fix confusion between
Jim Meyering <jim@meyering.net>
parents:
3436
diff
changeset
|
118 int r = ((options & FNM_CASEFOLD) |
3436
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
119 ? strncasecmp (pattern, f, patlen) |
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
120 : strncmp (pattern, f, patlen)); |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
121 if (! r) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
122 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
123 r = f[patlen]; |
3459
616b1a72ff28
(fnmatch_no_wildcards): Fix confusion between
Jim Meyering <jim@meyering.net>
parents:
3436
diff
changeset
|
124 if (r == '/') |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
125 r = 0; |
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 return r; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
128 } |
1171 | 129 } |
130 | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
131 /* Return true if EX excludes F. */ |
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 bool |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
134 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
|
135 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
136 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
|
137 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
138 /* 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
|
139 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
|
140 return false; |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
141 else |
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 struct patopts const *exclude = ex->exclude; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
144 size_t i; |
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 /* 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
|
147 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
|
148 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
149 /* 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
|
150 excluded to included or vice versa. */ |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
151 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
|
152 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
153 char const *pattern = exclude[i].pattern; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
154 int options = exclude[i].options; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
155 if (excluded == !! (options & EXCLUDE_INCLUDE)) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
156 { |
4292 | 157 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
|
158 (options & EXCLUDE_WILDCARDS |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
159 ? fnmatch |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
160 : fnmatch_no_wildcards); |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
161 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
|
162 char const *p; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
163 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
164 if (! (options & EXCLUDE_ANCHORED)) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
165 for (p = f; *p && ! matched; p++) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
166 if (*p == '/' && p[1] != '/') |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
167 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
|
168 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
169 excluded ^= matched; |
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 } |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
172 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
173 return excluded; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
174 } |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
175 } |
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 /* 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
|
178 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
179 void |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
180 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
|
181 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
182 struct patopts *patopts; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
183 |
4820
559c5f9c9e45
Modify exclude.c to use new xalloc primitives, for simplicity.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4790
diff
changeset
|
184 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
|
185 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
|
186 sizeof *ex->exclude); |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
187 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
188 patopts = &ex->exclude[ex->exclude_count++]; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
189 patopts->pattern = pattern; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
190 patopts->options = 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 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
193 /* 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
|
194 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
|
195 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
|
196 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
|
197 |
1171 | 198 int |
4292 | 199 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
|
200 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
|
201 char line_end) |
1171 | 202 { |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
203 bool use_stdin = filename[0] == '-' && !filename[1]; |
1171 | 204 FILE *in; |
4820
559c5f9c9e45
Modify exclude.c to use new xalloc primitives, for simplicity.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4790
diff
changeset
|
205 char *buf = NULL; |
1171 | 206 char *p; |
207 char const *pattern; | |
208 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
|
209 size_t buf_alloc = 0; |
1171 | 210 size_t buf_count = 0; |
211 int c; | |
212 int e = 0; | |
213 | |
214 if (use_stdin) | |
215 in = stdin; | |
216 else if (! (in = fopen (filename, "r"))) | |
217 return -1; | |
218 | |
219 while ((c = getc (in)) != EOF) | |
220 { | |
4820
559c5f9c9e45
Modify exclude.c to use new xalloc primitives, for simplicity.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4790
diff
changeset
|
221 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
|
222 buf = x2realloc (buf, &buf_alloc); |
1171 | 223 buf[buf_count++] = c; |
224 } | |
225 | |
226 if (ferror (in)) | |
227 e = errno; | |
228 | |
229 if (!use_stdin && fclose (in) != 0) | |
230 e = errno; | |
231 | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
232 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
|
233 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
|
234 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
|
235 pattern = buf; |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
236 |
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
|
237 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
|
238 if (*p == line_end) |
1171 | 239 { |
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
|
240 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
|
241 |
4537
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
242 if (is_space (line_end)) |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
243 { |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
244 for (; ; pattern_end--) |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
245 if (pattern_end == pattern) |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
246 goto next_pattern; |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
247 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
|
248 break; |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
249 } |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
250 |
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
|
251 *pattern_end = '\0'; |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
252 (*add_func) (ex, pattern, options); |
4537
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
253 |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
254 next_pattern: |
1171 | 255 pattern = p + 1; |
256 } | |
257 | |
258 errno = e; | |
259 return e ? -1 : 0; | |
260 } |