Fewer macros in common.h

In common.h, replace macros with constants or functions when that
is easy.  This makes code a bit more reliable (functions evaluate
their args exactly once) and easier to debug (many debugging
environments cannot access macros).
* src/common.h (CHKBLANKS): Remove.  All uses removed.
(NAME_FIELD_SIZE, PREFIX_FIELD_SIZE, UNAME_FIELD_SIZE)
(GNAME_FIELD_SIZE, TAREXIT_SUCCESS, TAREXIT_DIFFERS)
(TAREXIT_FAILURE, LG_8, LG_256, DEFAULT_CHECKPOINT)
(MAX_OLD_FILES, TF_READ, TF_WRITE, TF_DELETED, XFORM_REGFILE)
(XFORM_LINK, XFORM_SYMLINK, XFORM_ALL, WARN_ALONE_ZERO_BLOCK)
(WARN_BAD_DUMPDIR, WARN_CACHEDIR, WARN_CONTIGUOUS_CAST)
(WARN_FILE_CHANGED, WARN_FILE_IGNORED, WARN_FILE_REMOVED)
(WARN_FILE_SHRANK, WARN_FILE_UNCHANGED, WARN_FILENAME_WITH_NULS)
(WARN_IGNORE_ARCHIVE, WARN_IGNORE_NEWER, WARN_NEW_DIRECTORY)
(WARN_RENAME_DIRECTORY, WARN_SYMLINK_CAST, WARN_TIMESTAMP)
(WARN_UNKNOWN_CAST, WARN_UNKNOWN_KEYWORD, WARN_XDEV)
(WARN_DECOMPRESS_PROGRAM, WARN_EXISTING_FILE, WARN_XATTR_WRITE)
(WARN_RECORD_SIZE, WARN_FAILED_READ, WARN_MISSING_ZERO_BLOCKS)
(WARN_VERBOSE_WARNINGS, WARN_ALL, EXCL_DEFAULT, EXCL_RECURSIVE)
(EXCL_NON_RECURSIVE): Now enum constants rather than macros.
(time_option_initialized, isfound, wasfound, warning_enabled):
Now functions rather than macros TIME_OPTION_INITIALIZED, ISFOUND,
WASFOUND, WARNING_ENABLED.  All uses changed.
(OLDER_STAT_TIME, OLDER_TAR_STAT_TIME, EXTRACT_OVER_PIPE)
(TAR_ARGS_INITIALIZER): Remove.  All uses replaced with their
definiens or equivalent.
This commit is contained in:
Paul Eggert
2024-08-19 09:12:52 -07:00
parent 005e345c04
commit 4323e98683
10 changed files with 127 additions and 111 deletions

View File

@@ -20,22 +20,24 @@
/* Declare the GNU tar archive format. */
#include "tar.h"
/* The checksum field is filled with this while the checksum is computed. */
#define CHKBLANKS " " /* 8 blanks, no null */
/* Some constants from POSIX are given names. */
#define NAME_FIELD_SIZE 100
#define PREFIX_FIELD_SIZE 155
#define UNAME_FIELD_SIZE 32
#define GNAME_FIELD_SIZE 32
enum
{
NAME_FIELD_SIZE = 100,
PREFIX_FIELD_SIZE = 155,
UNAME_FIELD_SIZE = 32,
GNAME_FIELD_SIZE = 32
};
/* Some various global definitions. */
#define TAREXIT_SUCCESS PAXEXIT_SUCCESS
#define TAREXIT_DIFFERS PAXEXIT_DIFFERS
#define TAREXIT_FAILURE PAXEXIT_FAILURE
enum
{
TAREXIT_SUCCESS = PAXEXIT_SUCCESS,
TAREXIT_DIFFERS = PAXEXIT_DIFFERS,
TAREXIT_FAILURE = PAXEXIT_FAILURE
};
#include "arith.h"
@@ -63,8 +65,7 @@
#include <xvasprintf.h>
/* Log base 2 of common values. */
#define LG_8 3
#define LG_256 8
enum { LG_8 = 3, LG_256 = 8 };
_GL_INLINE_HEADER_BEGIN
#ifndef COMMON_INLINE
@@ -130,7 +131,7 @@ extern enum backup_type backup_type;
extern bool block_number_option;
extern intmax_t checkpoint_option;
#define DEFAULT_CHECKPOINT 10
enum { DEFAULT_CHECKPOINT = 10 };
/* Specified name of compression program, or "gzip" as implied by -z. */
extern const char *use_compress_program_option;
@@ -183,7 +184,7 @@ enum old_files
SKIP_OLD_FILES, /* --skip-old-files */
KEEP_NEWER_FILES /* --keep-newer-files */
};
#define MAX_OLD_FILES (KEEP_NEWER_FILES+1)
enum { MAX_OLD_FILES = KEEP_NEWER_FILES + 1 };
extern enum old_files old_files_option;
extern bool keep_directory_symlink_option;
@@ -228,16 +229,11 @@ extern char *set_mtime_command;
extern char *set_mtime_format;
/* Return true if mtime_option or newer_mtime_option is initialized. */
#define TIME_OPTION_INITIALIZED(opt) (0 <= (opt).tv_nsec)
/* Return true if the struct stat ST's M time is less than
newer_mtime_option. */
#define OLDER_STAT_TIME(st, m) \
(timespec_cmp (get_stat_##m##time (&(st)), newer_mtime_option) < 0)
/* Likewise, for struct tar_stat_info ST. */
#define OLDER_TAR_STAT_TIME(st, m) \
(timespec_cmp ((st).m##time, newer_mtime_option) < 0)
COMMON_INLINE bool
time_option_initialized (struct timespec opt)
{
return 0 <= opt.tv_nsec;
}
/* Zero if there is no recursion, otherwise FNM_LEADING_DIR. */
extern int recursion_option;
@@ -320,9 +316,6 @@ extern bool ignore_command_error_option;
/* Restrict some potentially harmful tar options */
extern bool restrict_option;
/* Return true if the extracted files are not being written to disk */
#define EXTRACT_OVER_PIPE (to_stdout_option || to_command_option)
/* Count how many times the option has been set, multiple setting yields
more verbose behavior. Value 0 means no verbosity, 1 means file name
only, 2 means file name and all attributes. More than 2 is just like 2. */
@@ -473,9 +466,7 @@ void archive_read_error (void);
off_t seek_archive (off_t size);
void set_start_time (void);
#define TF_READ 0
#define TF_WRITE 1
#define TF_DELETED 2
enum { TF_READ, TF_WRITE, TF_DELETED };
int format_total_stats (FILE *fp, char const *const *formats, int eor, int eol);
void print_total_stats (void);
@@ -813,12 +804,21 @@ bool is_avoided_name (char const *name);
bool contains_dot_dot (char const *name);
#define ISFOUND(c) (occurrence_option == 0 \
? (c)->found_count != 0 \
: (c)->found_count == occurrence_option)
#define WASFOUND(c) (occurrence_option == 0 \
? (c)->found_count != 0 \
: (c)->found_count >= occurrence_option)
COMMON_INLINE bool
isfound (struct name const *c)
{
return (occurrence_option == 0
? (c)->found_count != 0
: (c)->found_count == occurrence_option);
}
COMMON_INLINE bool
wasfound (struct name const *c)
{
return (occurrence_option == 0
? (c)->found_count != 0
: occurrence_option <= (c)->found_count);
}
/* Module tar.c. */
@@ -872,9 +872,6 @@ struct tar_args /* Variables used during option parsing */
char const *version_control_string; /* --backup option argument */
};
#define TAR_ARGS_INITIALIZER(loc) \
{ loc, NULL, false, false, false, NULL, NULL }
void more_options (int argc, char **argv, struct option_locus *loc);
/* Module update.c. */
@@ -965,10 +962,13 @@ bool string_ascii_p (const char *str);
bool utf8_convert (bool to_utf, char const *input, char **output);
/* Module transform.c */
#define XFORM_REGFILE 0x01
#define XFORM_LINK 0x02
#define XFORM_SYMLINK 0x04
#define XFORM_ALL (XFORM_REGFILE|XFORM_LINK|XFORM_SYMLINK)
enum
{
XFORM_REGFILE = 1 << 0,
XFORM_LINK = 1 << 1,
XFORM_SYMLINK = 1 << 2,
XFORM_ALL = XFORM_REGFILE | XFORM_LINK | XFORM_SYMLINK
};
void set_transform_expr (const char *expr);
bool transform_name (char **pinput, int type);
@@ -989,43 +989,52 @@ void checkpoint_finish (void);
void checkpoint_flush_actions (void);
/* Module warning.c */
#define WARN_ALONE_ZERO_BLOCK 0x00000001
#define WARN_BAD_DUMPDIR 0x00000002
#define WARN_CACHEDIR 0x00000004
#define WARN_CONTIGUOUS_CAST 0x00000008
#define WARN_FILE_CHANGED 0x00000010
#define WARN_FILE_IGNORED 0x00000020
#define WARN_FILE_REMOVED 0x00000040
#define WARN_FILE_SHRANK 0x00000080
#define WARN_FILE_UNCHANGED 0x00000100
#define WARN_FILENAME_WITH_NULS 0x00000200
#define WARN_IGNORE_ARCHIVE 0x00000400
#define WARN_IGNORE_NEWER 0x00000800
#define WARN_NEW_DIRECTORY 0x00001000
#define WARN_RENAME_DIRECTORY 0x00002000
#define WARN_SYMLINK_CAST 0x00004000
#define WARN_TIMESTAMP 0x00008000
#define WARN_UNKNOWN_CAST 0x00010000
#define WARN_UNKNOWN_KEYWORD 0x00020000
#define WARN_XDEV 0x00040000
#define WARN_DECOMPRESS_PROGRAM 0x00080000
#define WARN_EXISTING_FILE 0x00100000
#define WARN_XATTR_WRITE 0x00200000
#define WARN_RECORD_SIZE 0x00400000
#define WARN_FAILED_READ 0x00800000
#define WARN_MISSING_ZERO_BLOCKS 0x01000000
enum
{
WARN_ALONE_ZERO_BLOCK = 1 << 0,
WARN_BAD_DUMPDIR = 1 << 1,
WARN_CACHEDIR = 1 << 2,
WARN_CONTIGUOUS_CAST = 1 << 3,
WARN_FILE_CHANGED = 1 << 4,
WARN_FILE_IGNORED = 1 << 5,
WARN_FILE_REMOVED = 1 << 6,
WARN_FILE_SHRANK = 1 << 7,
WARN_FILE_UNCHANGED = 1 << 8,
WARN_FILENAME_WITH_NULS = 1 << 9,
WARN_IGNORE_ARCHIVE = 1 << 10,
WARN_IGNORE_NEWER = 1 << 11,
WARN_NEW_DIRECTORY = 1 << 12,
WARN_RENAME_DIRECTORY = 1 << 13,
WARN_SYMLINK_CAST = 1 << 14,
WARN_TIMESTAMP = 1 << 15,
WARN_UNKNOWN_CAST = 1 << 16,
WARN_UNKNOWN_KEYWORD = 1 << 17,
WARN_XDEV = 1 << 18,
WARN_DECOMPRESS_PROGRAM = 1 << 19,
WARN_EXISTING_FILE = 1 << 20,
WARN_XATTR_WRITE = 1 << 21,
WARN_RECORD_SIZE = 1 << 22,
WARN_FAILED_READ = 1 << 23,
WARN_MISSING_ZERO_BLOCKS = 1 << 24
};
/* These warnings are enabled by default in verbose mode: */
#define WARN_VERBOSE_WARNINGS (WARN_RENAME_DIRECTORY|WARN_NEW_DIRECTORY|\
WARN_DECOMPRESS_PROGRAM|WARN_EXISTING_FILE|\
WARN_RECORD_SIZE)
#define WARN_ALL 0xffffffff
enum
{
WARN_VERBOSE_WARNINGS = (WARN_RENAME_DIRECTORY | WARN_NEW_DIRECTORY
| WARN_DECOMPRESS_PROGRAM | WARN_EXISTING_FILE
| WARN_RECORD_SIZE),
WARN_ALL = ~0
};
void set_warning_option (const char *arg);
extern int warning_option;
#define WARNING_ENABLED(opt) (warning_option & (opt))
COMMON_INLINE bool
warning_enabled (int opt)
{
return warning_option & opt;
}
extern void warnopt (int, int, char const *, ...)
ATTRIBUTE_COLD ATTRIBUTE_FORMAT ((printf, 3, 4));
@@ -1039,9 +1048,7 @@ void finish_deferred_unlinks (void);
extern void (*fatal_exit_hook) (void);
/* Module exclist.c */
#define EXCL_DEFAULT 0x00
#define EXCL_RECURSIVE 0x01
#define EXCL_NON_RECURSIVE 0x02
enum { EXCL_DEFAULT, EXCL_RECURSIVE, EXCL_NON_RECURSIVE };
void excfile_add (const char *name, int flags);
void info_attach_exclist (struct tar_stat_info *dir);

View File

@@ -960,7 +960,8 @@ simple_finish_header (union block *header)
int sum;
char *p;
memcpy (header->header.chksum, CHKBLANKS, sizeof header->header.chksum);
/* Fill checksum field with spaces while the checksum is computed. */
memset (header->header.chksum, ' ', sizeof header->header.chksum);
sum = 0;
p = header->buffer;
@@ -1687,8 +1688,9 @@ dump_file0 (struct tar_stat_info *st, char const *name, char const *p)
if (! (incremental_option && ! top_level)
&& !S_ISDIR (st->stat.st_mode)
&& OLDER_TAR_STAT_TIME (*st, m)
&& (!after_date_option || OLDER_TAR_STAT_TIME (*st, c)))
&& timespec_cmp (st->mtime, newer_mtime_option) < 0
&& (!after_date_option
|| timespec_cmp (st->ctime, newer_mtime_option) < 0))
{
if (!incremental_option && verbose_option)
warnopt (WARN_FILE_UNCHANGED, 0, _("%s: file is unchanged; not dumped"),

View File

@@ -179,7 +179,7 @@ delete_archive_members (void)
break;
}
name->found_count++;
if (!ISFOUND (name))
if (!isfound (name))
{
skim_member (acting_as_filter);
break;
@@ -271,7 +271,7 @@ delete_archive_members (void)
if ((name = name_scan (current_stat_info.file_name, false)) != NULL)
{
name->found_count++;
if (ISFOUND (name))
if (isfound (name))
{
flush_file ();
break;

View File

@@ -1768,7 +1768,7 @@ prepare_to_extract (char const *file_name, int typeflag, tar_extractor_t *fun)
extractor = extract_file;
}
if (EXTRACT_OVER_PIPE)
if (to_stdout_option || to_command_option)
{
if (extractor != extract_file)
return false;

View File

@@ -553,9 +553,12 @@ procdir (const char *name_buffer, struct tar_stat_info *st,
quotearg_colon (name_buffer));
directory->children =
(listed_incremental_option
|| (OLDER_STAT_TIME (*stat_data, m)
|| (after_date_option
&& OLDER_STAT_TIME (*stat_data, c))))
|| (timespec_cmp (get_stat_mtime (stat_data), newer_mtime_option)
< 0)
|| (after_date_option
&& (timespec_cmp (get_stat_ctime (stat_data),
newer_mtime_option)
< 0)))
? ALL_CHILDREN
: CHANGED_CHILDREN;
}
@@ -820,9 +823,13 @@ scan_directory (struct tar_stat_info *st)
else if (*entry == 'Y')
/* New entry, skip further checks */;
/* FIXME: if (S_ISHIDDEN (stat_data.st_mode))?? */
else if (OLDER_STAT_TIME (stsub.stat, m)
else if ((timespec_cmp (get_stat_mtime (&stsub.stat),
newer_mtime_option)
< 0)
&& (!after_date_option
|| OLDER_STAT_TIME (stsub.stat, c)))
|| (timespec_cmp (get_stat_ctime (&stsub.stat),
newer_mtime_option)
< 0)))
*entry = 'N';
else
*entry = 'Y';

View File

@@ -195,7 +195,7 @@ read_and (void (*do_something) (void))
decode_header (current_header, &current_stat_info,
&current_format, 1);
if (! name_match (current_stat_info.file_name)
|| (TIME_OPTION_INITIALIZED (newer_mtime_option)
|| (time_option_initialized (newer_mtime_option)
/* FIXME: We get mtime now, and again later; this causes
duplicate diagnostics if header.mtime is bogus. */
&& ((mtime.tv_sec
@@ -204,7 +204,7 @@ read_and (void (*do_something) (void))
extended header. */
mtime.tv_nsec = 0,
current_stat_info.mtime = mtime,
OLDER_TAR_STAT_TIME (current_stat_info, m)))
timespec_cmp (mtime, newer_mtime_option) < 0))
|| excluded_name (current_stat_info.file_name,
current_stat_info.parent))
{

View File

@@ -1116,7 +1116,7 @@ close_diag (char const *name)
{
if (ignore_failed_read_option)
{
if (WARNING_ENABLED (WARN_FAILED_READ))
if (warning_enabled (WARN_FAILED_READ))
close_warn (name);
}
else
@@ -1128,7 +1128,7 @@ open_diag (char const *name)
{
if (ignore_failed_read_option)
{
if (WARNING_ENABLED (WARN_FAILED_READ))
if (warning_enabled (WARN_FAILED_READ))
open_warn (name);
}
else
@@ -1140,7 +1140,7 @@ read_diag_details (char const *name, off_t offset, size_t size)
{
if (ignore_failed_read_option)
{
if (WARNING_ENABLED (WARN_FAILED_READ))
if (warning_enabled (WARN_FAILED_READ))
read_warn_details (name, offset, size);
}
else
@@ -1152,7 +1152,7 @@ readlink_diag (char const *name)
{
if (ignore_failed_read_option)
{
if (WARNING_ENABLED (WARN_FAILED_READ))
if (warning_enabled (WARN_FAILED_READ))
readlink_warn (name);
}
else
@@ -1164,7 +1164,7 @@ savedir_diag (char const *name)
{
if (ignore_failed_read_option)
{
if (WARNING_ENABLED (WARN_FAILED_READ))
if (warning_enabled (WARN_FAILED_READ))
savedir_warn (name);
}
else
@@ -1176,7 +1176,7 @@ seek_diag_details (char const *name, off_t offset)
{
if (ignore_failed_read_option)
{
if (WARNING_ENABLED (WARN_FAILED_READ))
if (warning_enabled (WARN_FAILED_READ))
seek_warn_details (name, offset);
}
else
@@ -1188,7 +1188,7 @@ stat_diag (char const *name)
{
if (ignore_failed_read_option)
{
if (WARNING_ENABLED (WARN_FAILED_READ))
if (warning_enabled (WARN_FAILED_READ))
stat_warn (name);
}
else

View File

@@ -1352,7 +1352,7 @@ name_match (const char *file_name)
cursor->found_count++; /* remember it matched */
chdir_do (cursor->change_dir);
/* We got a match. */
return ISFOUND (cursor);
return isfound (cursor);
}
/* Filename from archive not found in namelist. If we have the whole
@@ -1391,7 +1391,7 @@ all_names_found (struct tar_stat_info *p)
len = strlen (p->file_name);
for (cursor = namelist; cursor; cursor = cursor->next)
{
if ((cursor->name[0] && !WASFOUND (cursor))
if ((cursor->name[0] && !wasfound (cursor))
|| (len >= cursor->length && ISSLASH (p->file_name[cursor->length])))
return false;
}
@@ -1423,7 +1423,7 @@ names_notfound (void)
struct name const *cursor;
for (cursor = namelist; cursor; cursor = cursor->next)
if (!WASFOUND (cursor) && cursor->name[0])
if (!wasfound (cursor) && cursor->name[0])
{
regex_usage_warning (cursor->name);
paxerror (0,
@@ -1458,7 +1458,7 @@ label_notfound (void)
return;
for (cursor = namelist; cursor; cursor = cursor->next)
if (WASFOUND (cursor))
if (wasfound (cursor))
return;
if (verbose_option)
@@ -1585,7 +1585,7 @@ merge_sort (struct name *list, int length,
static int
compare_names_found (struct name const *n1, struct name const *n2)
{
int found_diff = WASFOUND (n2) - WASFOUND (n1);
int found_diff = wasfound (n2) - wasfound (n1);
return found_diff ? found_diff : strcmp (n1->name, n2->name);
}

View File

@@ -1722,7 +1722,7 @@ parse_opt (int key, char *arg, struct argp_state *state)
after_date_option = true;
FALLTHROUGH;
case NEWER_MTIME_OPTION:
if (TIME_OPTION_INITIALIZED (newer_mtime_option))
if (time_option_initialized (newer_mtime_option))
paxusage (_("More than one threshold date"));
get_date_or_file (args,
key == NEWER_MTIME_OPTION ? "--newer-mtime"
@@ -2309,7 +2309,7 @@ static int subcommand_class[] = {
void
more_options (int argc, char **argv, struct option_locus *loc)
{
struct tar_args args = TAR_ARGS_INITIALIZER (loc);
struct tar_args args = { .loc = loc };
argp_parse (&names_argp, argc, argv, ARGP_IN_ORDER|ARGP_NO_EXIT|ARGP_NO_ERRS,
NULL, &args);
}
@@ -2360,8 +2360,8 @@ static void
decode_options (int argc, char **argv)
{
int idx;
struct option_locus loc = { OPTS_COMMAND_LINE, 0, 0, 0 };
struct tar_args args = TAR_ARGS_INITIALIZER (&loc);
struct option_locus loc = { .source = OPTS_COMMAND_LINE };
struct tar_args args = { .loc = &loc };
argp_version_setup ("tar", tar_authors);
@@ -2534,7 +2534,7 @@ decode_options (int argc, char **argv)
paxusage (_("Multiple archive files require '-M' option"));
if (listed_incremental_option
&& TIME_OPTION_INITIALIZED (newer_mtime_option))
&& time_option_initialized (newer_mtime_option))
{
struct option_locus *listed_loc = optloc_lookup (OC_LISTED_INCREMENTAL);
struct option_locus *newer_loc = optloc_lookup (OC_NEWER);
@@ -2605,7 +2605,7 @@ decode_options (int argc, char **argv)
}
else if (set_mtime_option == CLAMP_MTIME)
{
if (!TIME_OPTION_INITIALIZED (mtime_option))
if (!time_option_initialized (mtime_option))
paxusage (_("--clamp-mtime needs a date specified using --mtime"));
}
@@ -2791,7 +2791,7 @@ decode_options (int argc, char **argv)
backup_type = xget_version ("--backup", args.version_control_string);
/* No backup is needed either if explicitly disabled or if
the extracted files are not being written to disk. */
if (backup_type == no_backups || EXTRACT_OVER_PIPE)
if (backup_type == no_backups || to_stdout_option || to_command_option)
backup_option = false;
}

View File

@@ -115,7 +115,7 @@ set_warning_option (const char *arg)
void
warnopt (int opt, int errnum, char const *format, ...)
{
if (WARNING_ENABLED (opt))
if (warning_enabled (opt))
{
if (error_hook)
error_hook ();