X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Ftar;a=blobdiff_plain;f=src%2Fnames.c;h=60a5f700c3acaa3412e14b4da7cf6c3b900c96a7;hp=0eff2b4bf1c675259236562cd3d61354609933d9;hb=45ccda119355a1087450039a250359c1d0de0d08;hpb=bff9c3637d9e3c010be697a81d93e934c919d83c diff --git a/src/names.c b/src/names.c index 0eff2b4..60a5f70 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-2014 + 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" @@ -225,7 +226,7 @@ struct name_elt /* A name_array element. */ int matching_flags;/* fnmatch options if type == NELT_FMASK */ struct /* File, if type == NELT_FILE */ { - const char *name;/* File name */ + const char *name;/* File name */ int term; /* File name terminator in the list */ FILE *fp; } file; @@ -349,7 +350,7 @@ static struct file_id_list *file_id_list; are being read. */ static const char * -file_list_name () +file_list_name (void) { struct name_elt *elt; @@ -407,7 +408,7 @@ read_name_from_file (struct name_elt *ent) size_t counter = 0; FILE *fp = ent->v.file.fp; int term = ent->v.file.term; - + for (c = getc (fp); c != EOF && c != term; c = getc (fp)) { if (counter == name_buffer_length) @@ -436,7 +437,7 @@ handle_option (const char *str) { struct wordsplit ws; int i; - + while (*str && isspace (*str)) ; if (*str != '-') @@ -450,7 +451,7 @@ handle_option (const char *str) more_options (ws.ws_wordc+ws.ws_offs, ws.ws_wordv); for (i = 0; i < ws.ws_wordc+ws.ws_offs; i++) ws.ws_wordv[i] = NULL; - + wordsplit_free (&ws); return 0; } @@ -476,14 +477,14 @@ read_next_name (struct name_elt *ent, struct name_elt *ret) open_fatal (ent->v.file.name); } } - + while (1) { switch (read_name_from_file (ent)) { case file_list_skip: continue; - + case file_list_zero: WARNOPT (WARN_FILENAME_WITH_NULS, (0, 0, N_("%s: file name read contains nul character"), @@ -491,6 +492,8 @@ read_next_name (struct name_elt *ent, struct name_elt *ret) ent->v.file.term = 0; /* fall through */ case file_list_success: + if (unquote_option) + unquote_string (name_buffer); if (handle_option (name_buffer) == 0) { name_list_adjust (); @@ -499,7 +502,7 @@ read_next_name (struct name_elt *ent, struct name_elt *ret) ret->type = NELT_NAME; ret->v.name = name_buffer; return 0; - + case file_list_end: if (strcmp (ent->v.file.name, "-")) fclose (ent->v.file.fp); @@ -508,7 +511,7 @@ read_next_name (struct name_elt *ent, struct name_elt *ret) return 1; } } -} +} static void copy_name (struct name_elt *ep) @@ -564,27 +567,26 @@ name_next_elt (int change_dirs) case NELT_NOOP: name_list_advance (); break; - + case NELT_FMASK: matching_flags = ep->v.matching_flags; + recursion_option = matching_flags & FNM_LEADING_DIR; name_list_advance (); continue; - + case NELT_FILE: if (read_next_name (ep, &entry) == 0) return &entry; continue; - + 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 +1242,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);