Improve command line integer parsing a little in lzma and
authorLasse Collin <lasse.collin@tukaani.org>
Wed, 11 Jun 2008 12:08:44 +0000 (15:08 +0300)
committerLasse Collin <lasse.collin@tukaani.org>
Wed, 11 Jun 2008 12:08:44 +0000 (15:08 +0300)
lzmadec to make them accept also KiB in addition Ki etc.
Fix also memory usage information in lzmadec --help.

src/lzma/util.c
src/lzmadec/lzmadec.c

index 6ef6eb0..4bdbf8e 100644 (file)
@@ -60,20 +60,25 @@ str_to_uint64(const char *name, const char *value, uint64_t min, uint64_t max)
        if (*value != '\0') {
                // Look for suffix.
                static const struct {
-                       const char *name;
+                       const char name[4];
                        uint64_t multiplier;
                } suffixes[] = {
-                       { "k",  UINT64_C(1000) },
-                       { "M",  UINT64_C(1000000) },
-                       { "G",  UINT64_C(1000000000) },
-                       { "Ki", UINT64_C(1024) },
-                       { "Mi", UINT64_C(1048576) },
-                       { "Gi", UINT64_C(1073741824) },
-                       { NULL, 0 }
+                       { "k",   UINT64_C(1000) },
+                       { "kB",  UINT64_C(1000) },
+                       { "M",   UINT64_C(1000000) },
+                       { "MB",  UINT64_C(1000000) },
+                       { "G",   UINT64_C(1000000000) },
+                       { "GB",  UINT64_C(1000000000) },
+                       { "Ki",  UINT64_C(1024) },
+                       { "KiB", UINT64_C(1024) },
+                       { "Mi",  UINT64_C(1048576) },
+                       { "MiB", UINT64_C(1048576) },
+                       { "Gi",  UINT64_C(1073741824) },
+                       { "GiB", UINT64_C(1073741824) }
                };
 
                uint64_t multiplier = 0;
-               for (size_t i = 0; suffixes[i].name != NULL; ++i) {
+               for (size_t i = 0; i < ARRAY_SIZE(suffixes); ++i) {
                        if (strcmp(value, suffixes[i].name) == 0) {
                                multiplier = suffixes[i].multiplier;
                                break;
index f92dead..a138384 100644 (file)
@@ -116,7 +116,7 @@ help(void)
                " MiB of memory at maximum.\n"
 "\n"
 "Report bugs to <" PACKAGE_BUGREPORT "> (in English or Finnish).\n",
-               argv0, (uint64_t)((mem_limit + 512 * 1024) / (1024 * 1024)));
+               argv0, ((uint64_t)(mem_limit) + 512 * 1024) / (1024 * 1024));
                // Using PRIu64 above instead of %zu to support pre-C99 libc.
        exit(0);
 }
@@ -196,20 +196,25 @@ str_to_size(const char *value)
        if (*value != '\0') {
                // Look for suffix.
                static const struct {
-                       const char *name;
+                       const char name[4];
                        size_t multiplier;
                } suffixes[] = {
-                       { "k",  1000 },
-                       { "M",  1000000 },
-                       { "G",  1000000000 },
-                       { "Ki", 1024 },
-                       { "Mi", 1048576 },
-                       { "Gi", 1073741824 },
-                       { NULL, 0 }
+                       { "k",   1000 },
+                       { "kB",  1000 },
+                       { "M",   1000000 },
+                       { "MB",  1000000 },
+                       { "G",   1000000000 },
+                       { "GB",  1000000000 },
+                       { "Ki",  1024 },
+                       { "KiB", 1024 },
+                       { "Mi",  1048576 },
+                       { "MiB", 1048576 },
+                       { "Gi",  1073741824 },
+                       { "GiB", 1073741824 }
                };
 
                size_t multiplier = 0;
-               for (size_t i = 0; suffixes[i].name != NULL; ++i) {
+               for (size_t i = 0; i < ARRAY_SIZE(suffixes); ++i) {
                        if (strcmp(value, suffixes[i].name) == 0) {
                                multiplier = suffixes[i].multiplier;
                                break;
@@ -224,9 +229,9 @@ str_to_size(const char *value)
 
                // Don't overflow here either.
                if (result > SIZE_MAX / multiplier)
-                       return SIZE_MAX;
-
-               result *= multiplier;
+                       result = SIZE_MAX;
+               else
+                       result *= multiplier;
        }
 
        return result;