/* Names from the command call. */
static struct name *namelist; /* first name in list, if any */
-static struct name **nametail = &namelist; /* end of name list */
+static struct name *nametail; /* end of name list */
/* File name arguments are processed in two stages: first a
name_array (see below) is filled, then the names from it
buffer->parent = NULL;
buffer->cmdline = true;
- namelist = buffer;
- nametail = &namelist->next;
+ namelist = nametail = buffer;
}
else if (change_dir)
addname (0, change_dir, false, NULL);
{
struct name *name = make_name (string);
- name->prev = *nametail;
+ name->prev = nametail;
name->next = NULL;
name->found_count = 0;
name->matching_flags = matching_flags;
name->directory = NULL;
name->parent = parent;
name->cmdline = cmdline;
-
- *nametail = name;
- nametail = &name->next;
+
+ if (nametail)
+ nametail->next = name;
+ else
+ namelist = name;
+ nametail = name;
return name;
}
if ((p = name->next) != NULL)
p->prev = name->prev;
else
- nametail = &name->prev;
+ nametail = name->prev;
}
/* Return true if and only if name FILE_NAME (from an archive) matches any
if (cursor->name[0] == 0)
{
chdir_do (cursor->change_dir);
- namelist = 0;
- nametail = &namelist;
+ namelist = NULL;
+ nametail = NULL;
return true;
}
if (starting_file_option)
{
free (namelist);
- namelist = 0;
- nametail = &namelist;
+ namelist = NULL;
+ nametail = NULL;
}
chdir_do (cursor->change_dir);
struct name const *cursor;
size_t len;
- if (test_label_option)
- return true;
if (!p->file_name || occurrence_option == 0 || p->had_trailing_slash)
return false;
len = strlen (p->file_name);
return true;
}
-static inline int
-is_pattern (const char *string)
-{
- return strchr (string, '*') || strchr (string, '[') || strchr (string, '?');
-}
-
-static void
+static int
regex_usage_warning (const char *name)
{
static int warned_once = 0;
- if (warn_regex_usage && is_pattern (name))
+ if (warn_regex_usage && fnmatch_pattern_has_wildcards (name, 0))
{
warned_once = 1;
WARN ((0, 0,
- /* TRANSLATORS: The following three msgids form a single sentence.
- */
- _("Pattern matching characters used in file names. Please,")));
- WARN ((0, 0,
- _("use --wildcards to enable pattern matching, or --no-wildcards to")));
+ _("Pattern matching characters used in file names")));
WARN ((0, 0,
- _("suppress this warning.")));
+ _("Use --wildcards to enable pattern matching,"
+ " or --no-wildcards to suppress this warning")));
}
+ return warned_once;
}
/* Print the names of things in the namelist that were not matched. */
if (!WASFOUND (cursor) && cursor->name[0])
{
regex_usage_warning (cursor->name);
- if (cursor->found_count == 0)
- ERROR ((0, 0, _("%s: Not found in archive"),
- quotearg_colon (cursor->name)));
- else
- ERROR ((0, 0, _("%s: Required occurrence not found in archive"),
- quotearg_colon (cursor->name)));
+ ERROR ((0, 0,
+ (cursor->found_count == 0) ?
+ _("%s: Not found in archive") :
+ _("%s: Required occurrence not found in archive"),
+ quotearg_colon (cursor->name)));
}
/* Don't bother freeing the name list; we're about to exit. */
- namelist = 0;
- nametail = &namelist;
+ namelist = NULL;
+ nametail = NULL;
if (same_order_option)
{
}
}
}
+
+void
+label_notfound (void)
+{
+ struct name const *cursor;
+
+ if (!namelist)
+ return;
+
+ for (cursor = namelist; cursor; cursor = cursor->next)
+ if (WASFOUND (cursor))
+ return;
+
+ if (verbose_option)
+ error (0, 0, _("Archive label mismatch"));
+ set_exit_status (TAREXIT_DIFFERS);
+
+ for (cursor = namelist; cursor; cursor = cursor->next)
+ {
+ if (regex_usage_warning (cursor->name))
+ break;
+ }
+
+ /* Don't bother freeing the name list; we're about to exit. */
+ namelist = NULL;
+ nametail = NULL;
+
+ if (same_order_option)
+ {
+ const char *name;
+
+ while ((name = name_next (1)) != NULL
+ && regex_usage_warning (name) == 0)
+ ;
+ }
+}
\f
/* Sorting name lists. */
collect_and_sort_names (void)
{
struct name *name;
- struct name *next_name, *prev_name;
+ struct name *next_name, *prev_name = NULL;
int num_names;
struct stat statbuf;
Hash_table *nametab;
_("Only one -C option is allowed with "
"--listed-incremental")));
}
- chdir_do (namelist->change_dir);
+
read_directory_file ();
}
prev_name = name;
num_names++;
}
- nametail = &prev_name;
+ nametail = prev_name;
hash_free (nametab);
namelist = merge_sort (namelist, num_names, compare_names_found);
{
return excluded_file_name (excluded, name + FILE_SYSTEM_PREFIX_LEN (name));
}
-\f
-/* Names to avoid dumping. */
-static Hash_table *avoided_name_table;
-
-/* Remember to not archive NAME. */
-void
-add_avoided_name (char const *name)
-{
- hash_string_insert (&avoided_name_table, name);
-}
-
-/* Should NAME be avoided when archiving? */
-bool
-is_avoided_name (char const *name)
-{
- return hash_string_lookup (avoided_name_table, name);
-}
-
\f
static Hash_table *individual_file_table;