GLOBAL bool interactive_option;
+/* If nonzero, extract only Nth occurrence of each named file */
+GLOBAL uintmax_t occurrence_option;
+
enum old_files
{
DEFAULT_OLD_FILES, /* default */
{
struct name *next;
size_t length; /* cached strlen(name) */
- char found; /* a matching file has been found */
+ uintmax_t found_count; /* number of times a matching file has
+ been found */
+ int isdir;
char firstch; /* first char is literally matched */
char regexp; /* this name is a regexp, not literal */
int change_dir; /* set with the -C option */
void name_gather (void);
struct name *addname (char const *, int);
int name_match (const char *);
-bool names_done (void);
void names_notfound (void);
void collect_and_sort_names (void);
struct name *name_scan (const char *);
char *new_name (const char *, const char *);
char *safer_name_suffix (char const *, bool);
size_t stripped_path_len (char const *file_name, size_t num);
+bool all_names_found (struct tar_stat_info *);
bool excluded_name (char const *);
bool contains_dot_dot (char const *);
+#define ISFOUND(c) ((occurrence_option == 0) ? (c)->found_count : \
+ (c)->found_count == occurrence_option)
+#define WASFOUND(c) ((occurrence_option == 0) ? (c)->found_count : \
+ (c)->found_count >= occurrence_option)
+
/* Module tar.c. */
int confirm (const char *, const char *);
void request_stdin (const char *);
void destroy_stat (struct tar_stat_info *);
-bool all_names_found (void);
/* Module update.c. */