Mercurial > hg > octave-kai > gnulib-hg
annotate lib/exclude.c @ 6259:96c32553b4c6
Use a consistent style for including <config.h>.
* __fpending.c, acl.c, argmatch.c,
argp-help.c, argp-parse.c,
argp-pvh.c, backupfile.c, basename.c, c-stack.c,
calloc.c, check-version.c, cloexec.c, closeout.c, copy-file.c,
creat-safer.c, cycle-check.c, dirfd.c, dirname.c, dup-safer.c,
dup2.c, euidaccess.c, exclude.c, exitfail.c, fatal-signal.c,
fd-safer.c, file-type.c, fileblocks.c, filemode.c,
filenamecat.c, findprog.c, fnmatch.c, fopen-safer.c, free.c,
fsusage.c, ftruncate.c, full-write.c, fwriteerror.c,
getaddrinfo.c, getcwd.c, getdelim.c, getline.c, getlogin_r.c,
getndelim2.c, getnline.c, getopt1.c, getpass.c, group-member.c,
hard-locale.c, hash-pjw.c, hash.c, human.c, idcache.c,
inet_ntop.c, isdir.c, long-options.c, malloc.c, memcasecmp.c,
memcmp.c, memcoll.c, memcpy.c, memmove.c, mkdir-p.c,
modechange.c, mountlist.c, open-safer.c, physmem.c,
pipe-safer.c, pipe.c, poll.c, posixver.c, progname.c,
progreloc.c, putenv.c, quote.c, quotearg.c, readline.c,
readlink.c, realloc.c, regex.c, rename.c, rmdir.c, rpmatch.c,
safe-read.c, same.c, save-cwd.c, savedir.c, sig2str.c,
strcspn.c, strerror.c, stripslash.c, strncasecmp.c, strndup.c,
strnlen.c, strnlen1.c, strsep.c, strstr.c, strtod.c,
strtoimax.c, strtol.c, strverscmp.c, tempname.c, time_r.c,
userspec.c, utimecmp.c, version-etc-fsf.c,
version-etc.c, wait-process.c, xalloc-die.c, xgetcwd.c,
xmalloc.c, xmemcoll.c, xnanosleep.c, xreadlink.c, xsetenv.c,
xstrndup.c, xstrtoimax.c, xstrtol.c, xstrtoumax.c, yesno.c:
Standardize inclusion of config.h.
* __fpending.h, dirfd.h, getdate.h, human.h,
inttostr.h: Removed inclusion of config.h from header files.
* inttostr.c: Adjusted in-tree users.
* timespec.h: Remove superfluous warning to include config.h.
* atexit.c, chdir-long.c chown.c, fchown-stub.c, getgroups.c,
gettimeofday.c, lchown.c, lstat.c, mkdir.c, mkstemp.c,
nanosleep.c, openat.c, raise.c, readtokens0.c, readutmp.c,
unlinkdir.c: Guard inclusion of config.h with HAVE_CONFIG_H.
author | Paul Eggert <eggert@cs.ucla.edu> |
---|---|
date | Mon, 19 Sep 2005 17:28:14 +0000 (2005-09-19) |
parents | c47674a83a78 |
children | fd0ccce602e4 |
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, |
5907 | 4 2004, 2005 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" |
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
38 #include "xalloc.h" |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
39 |
5318
7c24a825b51d
Remove dependencies on unlocked-io.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5159
diff
changeset
|
40 #if USE_UNLOCKED_IO |
7c24a825b51d
Remove dependencies on unlocked-io.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5159
diff
changeset
|
41 # include "unlocked-io.h" |
7c24a825b51d
Remove dependencies on unlocked-io.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5159
diff
changeset
|
42 #endif |
7c24a825b51d
Remove dependencies on unlocked-io.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5159
diff
changeset
|
43 |
4537
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
44 #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
|
45 # define IN_CTYPE_DOMAIN(c) true |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
46 #else |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
47 # 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
|
48 #endif |
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 static inline bool |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
51 is_space (unsigned char c) |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
52 { |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
53 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
|
54 } |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
55 |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
56 /* 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
|
57 #define verify(name, assertion) struct name { char a[(assertion) ? 1 : -1]; } |
1171 | 58 |
4077
62c996889465
(FNM_CASEFOLD, FNM_LEADING_DIR): Define to 0 if not
Paul Eggert <eggert@cs.ucla.edu>
parents:
3618
diff
changeset
|
59 /* 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
|
60 #ifndef FNM_CASEFOLD |
62c996889465
(FNM_CASEFOLD, FNM_LEADING_DIR): Define to 0 if not
Paul Eggert <eggert@cs.ucla.edu>
parents:
3618
diff
changeset
|
61 # 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
|
62 #endif |
62c996889465
(FNM_CASEFOLD, FNM_LEADING_DIR): Define to 0 if not
Paul Eggert <eggert@cs.ucla.edu>
parents:
3618
diff
changeset
|
63 #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
|
64 # 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
|
65 #endif |
62c996889465
(FNM_CASEFOLD, FNM_LEADING_DIR): Define to 0 if not
Paul Eggert <eggert@cs.ucla.edu>
parents:
3618
diff
changeset
|
66 |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
67 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
|
68 (((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
|
69 & (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
|
70 | FNM_CASEFOLD)) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
71 == 0)); |
1171 | 72 |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
73 /* 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
|
74 ORed with EXCLUDE_* options. */ |
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 struct patopts |
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 char const *pattern; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
79 int options; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
80 }; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
81 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
82 /* An exclude list, of pattern-options pairs. */ |
1171 | 83 |
84 struct exclude | |
85 { | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
86 struct patopts *exclude; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
87 size_t exclude_alloc; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
88 size_t exclude_count; |
1171 | 89 }; |
90 | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
91 /* 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
|
92 |
1171 | 93 struct exclude * |
94 new_exclude (void) | |
95 { | |
4820
559c5f9c9e45
Modify exclude.c to use new xalloc primitives, for simplicity.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4790
diff
changeset
|
96 return xzalloc (sizeof *new_exclude ()); |
1171 | 97 } |
98 | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
99 /* Free the storage associated with an exclude list. */ |
1171 | 100 |
101 void | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
102 free_exclude (struct exclude *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 free (ex->exclude); |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
105 free (ex); |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
106 } |
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 /* 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
|
109 (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
|
110 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
111 static int |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
112 fnmatch_no_wildcards (char const *pattern, char const *f, int options) |
1171 | 113 { |
3459
616b1a72ff28
(fnmatch_no_wildcards): Fix confusion between
Jim Meyering <jim@meyering.net>
parents:
3436
diff
changeset
|
114 if (! (options & FNM_LEADING_DIR)) |
616b1a72ff28
(fnmatch_no_wildcards): Fix confusion between
Jim Meyering <jim@meyering.net>
parents:
3436
diff
changeset
|
115 return ((options & FNM_CASEFOLD) |
3436
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
116 ? strcasecmp (pattern, f) |
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
117 : strcmp (pattern, f)); |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
118 else |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
119 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
120 size_t patlen = strlen (pattern); |
3459
616b1a72ff28
(fnmatch_no_wildcards): Fix confusion between
Jim Meyering <jim@meyering.net>
parents:
3436
diff
changeset
|
121 int r = ((options & FNM_CASEFOLD) |
3436
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
122 ? strncasecmp (pattern, f, patlen) |
da0f25c86213
Use `""', not `<>' to #include non-system header files.
Jim Meyering <jim@meyering.net>
parents:
3398
diff
changeset
|
123 : strncmp (pattern, f, patlen)); |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
124 if (! r) |
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 r = f[patlen]; |
3459
616b1a72ff28
(fnmatch_no_wildcards): Fix confusion between
Jim Meyering <jim@meyering.net>
parents:
3436
diff
changeset
|
127 if (r == '/') |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
128 r = 0; |
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 r; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
131 } |
1171 | 132 } |
133 | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
134 /* Return true if EX excludes 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 bool |
5907 | 137 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
|
138 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
139 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
|
140 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
141 /* 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
|
142 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
|
143 return false; |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
144 else |
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 struct patopts const *exclude = ex->exclude; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
147 size_t i; |
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 /* 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
|
150 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
|
151 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
152 /* 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
|
153 excluded to included or vice versa. */ |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
154 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
|
155 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
156 char const *pattern = exclude[i].pattern; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
157 int options = exclude[i].options; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
158 if (excluded == !! (options & EXCLUDE_INCLUDE)) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
159 { |
4292 | 160 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
|
161 (options & EXCLUDE_WILDCARDS |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
162 ? fnmatch |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
163 : fnmatch_no_wildcards); |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
164 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
|
165 char const *p; |
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 if (! (options & EXCLUDE_ANCHORED)) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
168 for (p = f; *p && ! matched; p++) |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
169 if (*p == '/' && p[1] != '/') |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
170 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
|
171 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
172 excluded ^= matched; |
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 } |
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 return excluded; |
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 } |
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 /* 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
|
181 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
182 void |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
183 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
|
184 { |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
185 struct patopts *patopts; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
186 |
4820
559c5f9c9e45
Modify exclude.c to use new xalloc primitives, for simplicity.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4790
diff
changeset
|
187 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
|
188 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
|
189 sizeof *ex->exclude); |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
190 |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
191 patopts = &ex->exclude[ex->exclude_count++]; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
192 patopts->pattern = pattern; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
193 patopts->options = options; |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
194 } |
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
195 |
5907 | 196 /* 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
|
197 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
|
198 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
|
199 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
|
200 |
1171 | 201 int |
4292 | 202 add_exclude_file (void (*add_func) (struct exclude *, char const *, int), |
5907 | 203 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
|
204 char line_end) |
1171 | 205 { |
5907 | 206 bool use_stdin = file_name[0] == '-' && !file_name[1]; |
1171 | 207 FILE *in; |
4820
559c5f9c9e45
Modify exclude.c to use new xalloc primitives, for simplicity.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4790
diff
changeset
|
208 char *buf = NULL; |
1171 | 209 char *p; |
210 char const *pattern; | |
211 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
|
212 size_t buf_alloc = 0; |
1171 | 213 size_t buf_count = 0; |
214 int c; | |
215 int e = 0; | |
216 | |
217 if (use_stdin) | |
218 in = stdin; | |
5907 | 219 else if (! (in = fopen (file_name, "r"))) |
1171 | 220 return -1; |
221 | |
222 while ((c = getc (in)) != EOF) | |
223 { | |
4820
559c5f9c9e45
Modify exclude.c to use new xalloc primitives, for simplicity.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4790
diff
changeset
|
224 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
|
225 buf = x2realloc (buf, &buf_alloc); |
1171 | 226 buf[buf_count++] = c; |
227 } | |
228 | |
229 if (ferror (in)) | |
230 e = errno; | |
231 | |
232 if (!use_stdin && fclose (in) != 0) | |
233 e = errno; | |
234 | |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
235 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
|
236 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
|
237 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
|
238 pattern = buf; |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
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 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
|
241 if (*p == line_end) |
1171 | 242 { |
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
|
243 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
|
244 |
4537
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
245 if (is_space (line_end)) |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
246 { |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
247 for (; ; pattern_end--) |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
248 if (pattern_end == pattern) |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
249 goto next_pattern; |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
250 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
|
251 break; |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
252 } |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
253 |
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
|
254 *pattern_end = '\0'; |
3398
1beac6d79e51
Merge 'exclude' changes from tar 1.13.22.
Jim Meyering <jim@meyering.net>
parents:
2108
diff
changeset
|
255 (*add_func) (ex, pattern, options); |
4537
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
256 |
940fdf291f5b
Ignore trailing white space and empty lines
Paul Eggert <eggert@cs.ucla.edu>
parents:
4350
diff
changeset
|
257 next_pattern: |
1171 | 258 pattern = p + 1; |
259 } | |
260 | |
261 errno = e; | |
262 return e ? -1 : 0; | |
263 } |