X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fnames.c;h=22118b7665c9e8445f4a623a3a6145c65b812316;hb=HEAD;hp=85049b12efb0c552d5f2d1d511d65202ac7ec531;hpb=dd549cc257c7ec9e0780f649ac8ae384a84baba0;p=chaz%2Ftar diff --git a/src/names.c b/src/names.c index 85049b1..22118b7 100644 --- a/src/names.c +++ b/src/names.c @@ -1,7 +1,7 @@ /* Various processing of names. - Copyright 1988, 1992, 1994, 1996-2001, 2003-2007, 2009, 2013 Free - Software Foundation, Inc. + Copyright 1988, 1992, 1994, 1996-2001, 2003-2007, 2009, 2013-2015 + Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the @@ -22,6 +22,7 @@ #include #include #include +#include #include "common.h" @@ -227,6 +228,8 @@ struct name_elt /* A name_array element. */ { const char *name;/* File name */ int term; /* File name terminator in the list */ + bool verbatim; /* Verbatim handling of file names: no white-space + trimming, no option processing */ FILE *fp; } file; } v; @@ -257,6 +260,21 @@ name_elt_alloc (void) return elt; } +static struct name_elt * +name_elt_alloc_matflags (int matflags) +{ + static int prev_flags = 0; /* FIXME: Or EXCLUDE_ANCHORED? */ + struct name_elt *ep = name_elt_alloc (); + if (prev_flags != matflags) + { + ep->type = NELT_FMASK; + ep->v.matching_flags = matflags; + prev_flags = matflags; + ep = name_elt_alloc (); + } + return ep; +} + static void name_list_adjust (void) { @@ -275,20 +293,13 @@ name_list_advance (void) free (elt); } -/* Add to name_array the file NAME with fnmatch options MATCHING_FLAGS */ + +/* Add to name_array the file NAME with fnmatch options MATFLAGS */ void -name_add_name (const char *name, int matching_flags) +name_add_name (const char *name, int matflags) { - static int prev_flags = 0; /* FIXME: Or EXCLUDE_ANCHORED? */ - struct name_elt *ep = name_elt_alloc (); + struct name_elt *ep = name_elt_alloc_matflags (matflags); - if (prev_flags != matching_flags) - { - ep->type = NELT_FMASK; - ep->v.matching_flags = matching_flags; - prev_flags = matching_flags; - ep = name_elt_alloc (); - } ep->type = NELT_NAME; ep->v.name = name; name_count++; @@ -304,12 +315,14 @@ name_add_dir (const char *name) } void -name_add_file (const char *name, int term) +name_add_file (const char *name, int term, bool verbatim, int matflags) { - struct name_elt *ep = name_elt_alloc (); + struct name_elt *ep = name_elt_alloc_matflags (matflags); + ep->type = NELT_FILE; ep->v.file.name = name; ep->v.file.term = term; + ep->v.file.verbatim = verbatim; ep->v.file.fp = NULL; } @@ -388,6 +401,15 @@ add_file_id (const char *filename) file_id_list = p; return 0; } + +/* Chop trailing slashes. */ +static void +chopslash (char *str) +{ + char *p = str + strlen (str) - 1; + while (p > str && ISSLASH (*p)) + *p-- = '\0'; +} enum read_file_list_state /* Result of reading file name from the list file */ { @@ -427,7 +449,7 @@ read_name_from_file (struct name_elt *ent) if (counter == name_buffer_length) name_buffer = x2realloc (name_buffer, &name_buffer_length); name_buffer[counter] = 0; - + chopslash (name_buffer); return (counter == 0 && c == EOF) ? file_list_end : file_list_success; } @@ -438,7 +460,7 @@ handle_option (const char *str) int i; while (*str && isspace (*str)) - ; + ++str; if (*str != '-') return 1; @@ -491,7 +513,9 @@ read_next_name (struct name_elt *ent, struct name_elt *ret) ent->v.file.term = 0; /* fall through */ case file_list_success: - if (handle_option (name_buffer) == 0) + if (unquote_option) + unquote_string (name_buffer); + if (!ent->v.file.verbatim && handle_option (name_buffer) == 0) { name_list_adjust (); return 1; @@ -515,7 +539,6 @@ copy_name (struct name_elt *ep) { const char *source; size_t source_len; - char *cursor; source = ep->v.name; source_len = strlen (source); @@ -533,11 +556,7 @@ copy_name (struct name_elt *ep) name_buffer = xmalloc(name_buffer_length + 2); } strcpy (name_buffer, source); - - /* Zap trailing slashes. */ - cursor = name_buffer + strlen (name_buffer) - 1; - while (cursor > name_buffer && ISSLASH (*cursor)) - *cursor-- = '\0'; + chopslash (name_buffer); } @@ -550,7 +569,8 @@ static int matching_flags; /* exclude_fnmatch options */ the request to change to the given directory. Entries of type NELT_FMASK cause updates of the matching_flags - value. */ + value. +*/ static struct name_elt * name_next_elt (int change_dirs) { @@ -567,6 +587,7 @@ name_next_elt (int change_dirs) case NELT_FMASK: matching_flags = ep->v.matching_flags; + recursion_option = matching_flags & FNM_LEADING_DIR; name_list_advance (); continue; @@ -578,13 +599,11 @@ name_next_elt (int change_dirs) case NELT_CHDIR: if (change_dirs) { - copy_name (ep); - if (chdir (name_buffer) < 0) - chdir_fatal (name_buffer); + chdir_do (chdir_arg (xstrdup (ep->v.name))); name_list_advance (); break; } - /* fall trhough */ + /* fall through */ case NELT_NAME: copy_name (ep); if (unquote_option) @@ -1240,13 +1259,11 @@ collect_and_sort_names (void) namelist = merge_sort (namelist, num_names, compare_names); num_names = 0; - nametab = hash_initialize (0, 0, - name_hash, - name_compare, NULL); + nametab = hash_initialize (0, 0, name_hash, name_compare, NULL); for (name = namelist; name; name = next_name) { next_name = name->next; - name->caname = normalize_filename (name->name); + name->caname = normalize_filename (name->change_dir, name->name); if (prev_name) { struct name *p = hash_lookup (nametab, name); @@ -1373,12 +1390,6 @@ new_name (const char *file_name, const char *name) return buffer; } -/* Return nonzero if file NAME is excluded. */ -bool -excluded_name (char const *name) -{ - return excluded_file_name (excluded, name + FILE_SYSTEM_PREFIX_LEN (name)); -} /* Return the size of the prefix of FILE_NAME that is removed after