]> Dogcows Code - chaz/tar/blobdiff - src/names.c
Rewrite update algorithm.
[chaz/tar] / src / names.c
index eaa94d284aa7257c08970ff877155b1e3542e9aa..0e50aa401b3ca31ccd33199fb5c064d1f6b6405e 100644 (file)
@@ -205,7 +205,7 @@ free_name (struct name *p)
 /* 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
@@ -418,14 +418,14 @@ name_gather (void)
          buffer->next = 0;
          buffer->found_count = 0;
          buffer->matching_flags = matching_flags;
-         buffer->dir_contents = NULL;
+         buffer->directory = NULL;
          buffer->parent = NULL;
+         buffer->cmdline = true;
          
-         namelist = buffer;
-         nametail = &namelist->next;
+         namelist = nametail = buffer;
        }
       else if (change_dir)
-       addname (0, change_dir, NULL);
+       addname (0, change_dir, false, NULL);
     }
   else
     {
@@ -439,11 +439,11 @@ name_gather (void)
            change_dir = chdir_arg (xstrdup (ep->v.name));
 
          if (ep)
-           addname (ep->v.name, change_dir, NULL);
+           addname (ep->v.name, change_dir, true, NULL);
          else
            {
              if (change_dir != change_dir0)
-               addname (0, change_dir, NULL);
+               addname (NULL, change_dir, false, NULL);
              break;
            }
        }
@@ -452,20 +452,24 @@ name_gather (void)
 
 /*  Add a name to the namelist.  */
 struct name *
-addname (char const *string, int change_dir, struct name *parent)
+addname (char const *string, int change_dir, bool cmdline, struct name *parent)
 {
   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->change_dir = change_dir;
-  name->dir_contents = NULL;
+  name->directory = NULL;
   name->parent = parent;
-  
-  *nametail = name;
-  nametail = &name->next;
+  name->cmdline = cmdline;
+
+  if (nametail)
+    nametail->next = name;
+  else
+    namelist = name;
+  nametail = name;
   return name;
 }
 
@@ -499,7 +503,7 @@ remname (struct name *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
@@ -519,8 +523,8 @@ name_match (const char *file_name)
       if (cursor->name[0] == 0)
        {
          chdir_do (cursor->change_dir);
-         namelist = 0;
-         nametail = &namelist;
+         namelist = NULL;
+         nametail = NULL;
          return true;
        }
 
@@ -533,8 +537,8 @@ name_match (const char *file_name)
          if (starting_file_option)
            {
              free (namelist);
-             namelist = 0;
-             nametail = &namelist;
+             namelist = NULL;
+             nametail = NULL;
            }
          chdir_do (cursor->change_dir);
 
@@ -587,18 +591,12 @@ all_names_found (struct tar_stat_info *p)
   return true;
 }
 
-static inline int
-is_pattern (const char *string)
-{
-  return strchr (string, '*') || strchr (string, '[') || strchr (string, '?');
-}
-
 static void
 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,
@@ -631,8 +629,8 @@ names_notfound (void)
       }
 
   /* Don't bother freeing the name list; we're about to exit.  */
-  namelist = 0;
-  nametail = &namelist;
+  namelist = NULL;
+  nametail = NULL;
 
   if (same_order_option)
     {
@@ -767,12 +765,11 @@ compare_names (struct name const *n1, struct name const *n2)
 static void
 add_hierarchy_to_namelist (struct name *name, dev_t device, bool cmdline)
 {
-  char *file_name = name->name;
-  const char *buffer = scan_directory (file_name, device, cmdline);
+  const char *buffer;
   
-  if (! buffer)
-    name->dir_contents = "\0\0\0\0";
-  else
+  name_fill_directory (name, device, cmdline);
+  buffer = directory_contents (name->directory);
+  if (buffer)
     {
       struct name *child_head = NULL, *child_tail = NULL;
       size_t name_length = name->length;
@@ -785,8 +782,7 @@ add_hierarchy_to_namelist (struct name *name, dev_t device, bool cmdline)
       size_t string_length;
       int change_dir = name->change_dir;
 
-      name->dir_contents = buffer;
-      strcpy (namebuf, file_name);
+      strcpy (namebuf, name->name);
       if (! ISSLASH (namebuf[name_length - 1]))
        {
          namebuf[name_length++] = '/';
@@ -813,7 +809,7 @@ add_hierarchy_to_namelist (struct name *name, dev_t device, bool cmdline)
                  namebuf = xrealloc (namebuf, allocated_length + 1);
                }
              strcpy (namebuf + name_length, string + 1);
-             np = addname (namebuf, change_dir, name);
+             np = addname (namebuf, change_dir, false, name);
              if (!child_head)
                child_head = np;
              else
@@ -866,8 +862,9 @@ rebase_child_list (struct name *child, struct name *parent)
       child->name = newp;
       child->length = size;
 
-      rebase_directory (child->name, old_prefix_len, child->parent->name,
-                       new_prefix);
+      rebase_directory (child->directory,
+                       child->parent->name, old_prefix_len, 
+                       new_prefix, new_prefix_len);
     }
 }
 
@@ -887,7 +884,7 @@ collect_and_sort_names (void)
   name_gather ();
 
   if (!namelist)
-    addname (".", 0, NULL);
+    addname (".", 0, false, NULL);
 
   if (listed_incremental_option)
     {
@@ -908,14 +905,14 @@ collect_and_sort_names (void)
                        _("Only one -C option is allowed with "
                          "--listed-incremental")));
        }
-      chdir_do (namelist->change_dir);
+
       read_directory_file ();
     }
   
-  for (name = namelist; name; name = next_name)
+  num_names = 0;
+  for (name = namelist; name; name = name->next, num_names++)
     {
-      next_name = name->next;
-      if (name->found_count || name->dir_contents)
+      if (name->found_count || name->directory)
        continue;
       if (name->matching_flags & EXCLUDE_WILDCARDS)
        /* NOTE: EXCLUDE_ANCHORED is not relevant here */
@@ -934,15 +931,10 @@ collect_and_sort_names (void)
       if (S_ISDIR (statbuf.st_mode))
        {
          name->found_count++;
-         if (name->found_count == 1)
-           add_hierarchy_to_namelist (name, statbuf.st_dev, true);
+         add_hierarchy_to_namelist (name, statbuf.st_dev, true);
        }
     }
 
-  num_names = 0;
-  for (name = namelist; name; name = name->next)
-    num_names++;
-
   namelist = merge_sort (namelist, num_names, compare_names);
 
   num_names = 0;
@@ -980,11 +972,12 @@ collect_and_sort_names (void)
            }
        }
       name->found_count = 0;
-      hash_insert (nametab, name);
+      if (!hash_insert (nametab, name))
+       xalloc_die ();
       prev_name = name;
       num_names++;
     }
-  nametail = &prev_name;
+  nametail = prev_name;
   hash_free (nametab);
 
   namelist = merge_sort (namelist, num_names, compare_names_found);
@@ -994,7 +987,7 @@ collect_and_sort_names (void)
       for (name = namelist; name && name->name[0] == 0; name++)
        ;
       if (name)
-       name->dir_contents = append_incremental_renames (name->dir_contents);
+       append_incremental_renames (name->directory);
     }
 }
 
@@ -1035,8 +1028,8 @@ name_scan (const char *file_name)
    find and return all the non-found names in the namelist.  */
 struct name *gnu_list_name;
 
-char *
-name_from_list (void)
+struct name const *
+name_from_list ()
 {
   if (!gnu_list_name)
     gnu_list_name = namelist;
@@ -1047,9 +1040,9 @@ name_from_list (void)
     {
       gnu_list_name->found_count++;
       chdir_do (gnu_list_name->change_dir);
-      return gnu_list_name->name;
+      return gnu_list_name;
     }
-  return 0;
+  return NULL;
 }
 
 void
@@ -1083,24 +1076,6 @@ excluded_name (char const *name)
 {
   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;
 
This page took 0.03497 seconds and 4 git commands to generate.