| Index: src/xzdec/xzdec.c
|
| ===================================================================
|
| --- src/xzdec/xzdec.c (revision 50504)
|
| +++ src/xzdec/xzdec.c (working copy)
|
| @@ -35,18 +35,12 @@
|
| #endif
|
|
|
|
|
| -/// Number of bytes to use memory at maximum
|
| -static uint64_t memlimit;
|
| -
|
| -/// Total amount of physical RAM
|
| -static uint64_t total_ram;
|
| -
|
| /// Error messages are suppressed if this is zero, which is the case when
|
| /// --quiet has been given at least twice.
|
| static unsigned int display_errors = 2;
|
|
|
|
|
| -static void lzma_attribute((format(printf, 1, 2)))
|
| +static void lzma_attribute((__format__(__printf__, 1, 2)))
|
| my_errorf(const char *fmt, ...)
|
| {
|
| va_list ap;
|
| @@ -63,13 +57,9 @@
|
| }
|
|
|
|
|
| -static void lzma_attribute((noreturn))
|
| +static void lzma_attribute((__noreturn__))
|
| help(void)
|
| {
|
| - // Round up to the next MiB and do it correctly also with UINT64_MAX.
|
| - const uint64_t mem_mib = (memlimit >> 20)
|
| - + ((memlimit & ((UINT32_C(1) << 20) - 1)) != 0);
|
| -
|
| printf(
|
| "Usage: %s [OPTION]... [FILE]...\n"
|
| "Uncompress files in the ." TOOL_FORMAT " format to the standard output.\n"
|
| @@ -77,7 +67,6 @@
|
| " -c, --stdout (ignored)\n"
|
| " -d, --decompress (ignored)\n"
|
| " -k, --keep (ignored)\n"
|
| -" -M, --memory=NUM use NUM bytes of memory at maximum (0 means default)\n"
|
| " -q, --quiet specify *twice* to suppress errors\n"
|
| " -Q, --no-warn (ignored)\n"
|
| " -h, --help display this help and exit\n"
|
| @@ -85,16 +74,14 @@
|
| "\n"
|
| "With no FILE, or when FILE is -, read standard input.\n"
|
| "\n"
|
| -"On this system and configuration, this program will use a maximum of roughly\n"
|
| -"%" PRIu64 " MiB RAM.\n"
|
| -"\n"
|
| "Report bugs to <" PACKAGE_BUGREPORT "> (in English or Finnish).\n"
|
| -PACKAGE_NAME " home page: <" PACKAGE_URL ">\n", progname, mem_mib);
|
| +PACKAGE_NAME " home page: <" PACKAGE_URL ">\n", progname);
|
| +
|
| tuklib_exit(EXIT_SUCCESS, EXIT_FAILURE, display_errors);
|
| }
|
|
|
|
|
| -static void lzma_attribute((noreturn))
|
| +static void lzma_attribute((__noreturn__))
|
| version(void)
|
| {
|
| printf(TOOL_FORMAT "dec (" PACKAGE_NAME ") " LZMA_VERSION_STRING "\n"
|
| @@ -104,126 +91,6 @@
|
| }
|
|
|
|
|
| -/// Find out the amount of physical memory (RAM) in the system, and set
|
| -/// the memory usage limit to the given percentage of RAM.
|
| -static void
|
| -memlimit_set_percentage(uint32_t percentage)
|
| -{
|
| - memlimit = percentage * total_ram / 100;
|
| - return;
|
| -}
|
| -
|
| -
|
| -/// Set the memory usage limit to give number of bytes. Zero is a special
|
| -/// value to indicate the default limit.
|
| -static void
|
| -memlimit_set(uint64_t new_memlimit)
|
| -{
|
| - if (new_memlimit != 0) {
|
| - memlimit = new_memlimit;
|
| - } else {
|
| - memlimit = 40 * total_ram / 100;
|
| - if (memlimit < UINT64_C(80) * 1024 * 1024) {
|
| - memlimit = 80 * total_ram / 100;
|
| - if (memlimit > UINT64_C(80) * 1024 * 1024)
|
| - memlimit = UINT64_C(80) * 1024 * 1024;
|
| - }
|
| - }
|
| -
|
| - return;
|
| -}
|
| -
|
| -
|
| -/// Get the total amount of physical RAM and set the memory usage limit
|
| -/// to the default value.
|
| -static void
|
| -memlimit_init(void)
|
| -{
|
| - // If we cannot determine the amount of RAM, use the assumption
|
| - // defined by the configure script.
|
| - total_ram = lzma_physmem();
|
| - if (total_ram == 0)
|
| - total_ram = (uint64_t)(ASSUME_RAM) * 1024 * 1024;
|
| -
|
| - memlimit_set(0);
|
| - return;
|
| -}
|
| -
|
| -
|
| -/// \brief Convert a string to uint64_t
|
| -///
|
| -/// This is rudely copied from src/xz/util.c and modified a little. :-(
|
| -/// Since this function is used only for parsing the memory usage limit,
|
| -/// this cheats a little and saturates too big values to UINT64_MAX instead
|
| -/// of giving an error.
|
| -///
|
| -/// \param max Return value when the string "max" was specified.
|
| -///
|
| -static uint64_t
|
| -str_to_uint64(const char *value, uint64_t max)
|
| -{
|
| - uint64_t result = 0;
|
| -
|
| - // Accept special value "max".
|
| - if (strcmp(value, "max") == 0)
|
| - return max;
|
| -
|
| - if (*value < '0' || *value > '9') {
|
| - my_errorf("%s: Value is not a non-negative decimal integer",
|
| - value);
|
| - exit(EXIT_FAILURE);
|
| - }
|
| -
|
| - do {
|
| - // Don't overflow.
|
| - if (result > UINT64_MAX / 10)
|
| - return UINT64_MAX;
|
| -
|
| - result *= 10;
|
| -
|
| - // Another overflow check
|
| - const uint32_t add = *value - '0';
|
| - if (UINT64_MAX - add < result)
|
| - return UINT64_MAX;
|
| -
|
| - result += add;
|
| - ++value;
|
| - } while (*value >= '0' && *value <= '9');
|
| -
|
| - if (*value != '\0') {
|
| - // Look for suffix.
|
| - uint64_t multiplier = 0;
|
| - if (*value == 'k' || *value == 'K')
|
| - multiplier = UINT64_C(1) << 10;
|
| - else if (*value == 'm' || *value == 'M')
|
| - multiplier = UINT64_C(1) << 20;
|
| - else if (*value == 'g' || *value == 'G')
|
| - multiplier = UINT64_C(1) << 30;
|
| -
|
| - ++value;
|
| -
|
| - // Allow also e.g. Ki, KiB, and KB.
|
| - if (*value != '\0' && strcmp(value, "i") != 0
|
| - && strcmp(value, "iB") != 0
|
| - && strcmp(value, "B") != 0)
|
| - multiplier = 0;
|
| -
|
| - if (multiplier == 0) {
|
| - my_errorf("%s: Invalid suffix", value - 1);
|
| - exit(EXIT_FAILURE);
|
| - }
|
| -
|
| - // Don't overflow here either.
|
| - if (result > UINT64_MAX / multiplier)
|
| - result = UINT64_MAX;
|
| - else
|
| - result *= multiplier;
|
| - }
|
| -
|
| - return result;
|
| -}
|
| -
|
| -
|
| /// Parses command line options.
|
| static void
|
| parse_options(int argc, char **argv)
|
| @@ -235,7 +102,6 @@
|
| { "decompress", no_argument, NULL, 'd' },
|
| { "uncompress", no_argument, NULL, 'd' },
|
| { "keep", no_argument, NULL, 'k' },
|
| - { "memory", required_argument, NULL, 'M' },
|
| { "quiet", no_argument, NULL, 'q' },
|
| { "no-warn", no_argument, NULL, 'Q' },
|
| { "help", no_argument, NULL, 'h' },
|
| @@ -254,31 +120,6 @@
|
| case 'Q':
|
| break;
|
|
|
| - case 'M': {
|
| - // Support specifying the limit as a percentage of
|
| - // installed physical RAM.
|
| - const size_t len = strlen(optarg);
|
| - if (len > 0 && optarg[len - 1] == '%') {
|
| - // Memory limit is a percentage of total
|
| - // installed RAM.
|
| - optarg[len - 1] = '\0';
|
| - const uint64_t percentage
|
| - = str_to_uint64(optarg, 100);
|
| - if (percentage < 1 || percentage > 100) {
|
| - my_errorf("Percentage must be in "
|
| - "the range [1, 100]");
|
| - exit(EXIT_FAILURE);
|
| - }
|
| -
|
| - memlimit_set_percentage(percentage);
|
| - } else {
|
| - memlimit_set(str_to_uint64(
|
| - optarg, UINT64_MAX));
|
| - }
|
| -
|
| - break;
|
| - }
|
| -
|
| case 'q':
|
| if (display_errors > 0)
|
| --display_errors;
|
| @@ -307,13 +148,12 @@
|
|
|
| // Initialize the decoder
|
| #ifdef LZMADEC
|
| - ret = lzma_alone_decoder(strm, memlimit);
|
| + ret = lzma_alone_decoder(strm, UINT64_MAX);
|
| #else
|
| - ret = lzma_stream_decoder(strm, memlimit, LZMA_CONCATENATED);
|
| + ret = lzma_stream_decoder(strm, UINT64_MAX, LZMA_CONCATENATED);
|
| #endif
|
|
|
| // The only reasonable error here is LZMA_MEM_ERROR.
|
| - // FIXME: Maybe also LZMA_MEMLIMIT_ERROR in future?
|
| if (ret != LZMA_OK) {
|
| my_errorf("%s", ret == LZMA_MEM_ERROR ? strerror(ENOMEM)
|
| : "Internal error (bug)");
|
| @@ -401,10 +241,6 @@
|
| msg = strerror(ENOMEM);
|
| break;
|
|
|
| - case LZMA_MEMLIMIT_ERROR:
|
| - msg = "Memory usage limit reached";
|
| - break;
|
| -
|
| case LZMA_FORMAT_ERROR:
|
| msg = "File format not recognized";
|
| break;
|
| @@ -440,10 +276,6 @@
|
| // Initialize progname which we will be used in error messages.
|
| tuklib_progname_init(argv);
|
|
|
| - // Set the default memory usage limit. This is needed before parsing
|
| - // the command line arguments.
|
| - memlimit_init();
|
| -
|
| // Parse the command line options.
|
| parse_options(argc, argv);
|
|
|
|
|