static void recommend_man_page(int cmd, FILE *fp);
static const tchar *get_cmd_string(int cmd, bool only_short_form);
-static bool imagex_be_quiet = false;
static FILE *imagex_info_file;
-#define imagex_printf(format, ...) \
+#define imagex_printf(format, ...) \
+ if (imagex_info_file) \
tfprintf(imagex_info_file, format, ##__VA_ARGS__)
+static void imagex_suppress_output(void)
+{
+ imagex_info_file = NULL;
+}
+
+static void imagex_output_to_stderr(void)
+{
+ if (imagex_info_file)
+ imagex_info_file = stderr;
+}
+
+static void imagex_flush_output(void)
+{
+ if (imagex_info_file)
+ fflush(imagex_info_file);
+}
+
enum {
IMAGEX_ALLOW_OTHER_OPTION,
IMAGEX_BLOBS_OPTION,
unsigned unit_shift;
const tchar *unit_name;
- if (imagex_be_quiet)
- return WIMLIB_PROGRESS_STATUS_CONTINUE;
switch (msg) {
case WIMLIB_PROGRESS_MSG_WRITE_STREAMS:
{
default:
break;
}
- fflush(imagex_info_file);
+ imagex_flush_output();
return WIMLIB_PROGRESS_STATUS_CONTINUE;
}
}
wim_fd = STDOUT_FILENO;
wimfile = NULL;
- imagex_info_file = stderr;
+ imagex_output_to_stderr();
set_fd_to_binary_mode(wim_fd);
}
#endif
dest_wimfile = NULL;
dest_wim_fd = STDOUT_FILENO;
- imagex_info_file = stderr;
+ imagex_output_to_stderr();
set_fd_to_binary_mode(dest_wim_fd);
}
errno = ENOENT;
break;
case IMAGEX_TO_STDOUT_OPTION:
extract_flags |= WIMLIB_EXTRACT_FLAG_TO_STDOUT;
- imagex_info_file = stderr;
- imagex_be_quiet = true;
+ imagex_suppress_output();
set_fd_to_binary_mode(STDOUT_FILENO);
break;
case IMAGEX_INCLUDE_INVALID_NAMES_OPTION:
}
if (ret == 0) {
- if (!imagex_be_quiet)
- imagex_printf(T("Done extracting files.\n"));
+ imagex_printf(T("Done extracting files.\n"));
} else if (ret == WIMLIB_ERR_PATH_DOES_NOT_EXIST) {
if ((extract_flags & (WIMLIB_EXTRACT_FLAG_STRICT_GLOB |
WIMLIB_EXTRACT_FLAG_GLOB_PATHS))
static void
version(void)
{
- static const tchar * const s =
+ uint32_t vers = wimlib_get_version();
+
+ static const tchar * const fmt =
T(
-"wimlib-imagex (distributed with " PACKAGE " " PACKAGE_VERSION ")\n"
+"wimlib-imagex " PACKAGE_VERSION " (using wimlib %u.%u.%u)\n"
"Copyright (C) 2012-2017 Eric Biggers\n"
"License GPLv3+; GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.\n"
"This is free software: you are free to change and redistribute it.\n"
"\n"
"Report bugs to "PACKAGE_BUGREPORT".\n"
);
- tfputs(s, stdout);
+ tfprintf(stdout, fmt,
+ vers >> 20, (vers >> 10) & 0x3ff, vers & 0x3ff);
}
static void
-help_or_version(int argc, tchar **argv, int cmd)
+do_common_options(int *argc_p, tchar **argv, int cmd)
{
+ int argc = *argc_p;
int i;
const tchar *p;
} else if (!tstrcmp(p, T("version"))) {
version();
exit(0);
- }
+ } else if (!tstrcmp(p, T("quiet"))) {
+ imagex_suppress_output();
+ memmove(&argv[i], &argv[i + 1],
+ (argc - i) * sizeof(argv[i]));
+ argc--;
+ i--;
+ } else if (!*p) /* reached "--", no more options */
+ break;
}
}
+
+ *argc_p = argc;
}
static void
}
}
- /* Handle --help and --version. --help can be either for the program as
- * a whole (cmd == CMD_NONE) or just for a specific command (cmd !=
- * CMD_NONE). Note: help_or_version() will not return if a --help or
- * --version argument was found. */
- help_or_version(argc, argv, cmd);
+ /* Handle common options. May exit early (for --help or --version). */
+ do_common_options(&argc, argv, cmd);
/* Bail if a valid command was not specified. */
if (cmd == CMD_NONE) {