X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fe2p%2Fparse_num.c;h=e8d6283ca7074d987d6efdf995b830b6ede36183;hb=eccdde1ff381591cae935ddd5444ac9445c94fc3;hp=83a329ae396b67a603360f6415a3e0837c72ba33;hpb=97d26ce9e3589e9f5fa17014467a9730a884d158;p=tools%2Fe2fsprogs.git diff --git a/lib/e2p/parse_num.c b/lib/e2p/parse_num.c index 83a329a..e8d6283 100644 --- a/lib/e2p/parse_num.c +++ b/lib/e2p/parse_num.c @@ -9,6 +9,7 @@ * %End-Header% */ +#include "config.h" #include "e2p.h" #include @@ -26,15 +27,24 @@ unsigned long long parse_num_blocks2(const char *arg, int log_block_size) switch (*p) { /* Using fall-through logic */ case 'T': case 't': num <<= 10; + /* fallthrough */ case 'G': case 'g': num <<= 10; + /* fallthrough */ case 'M': case 'm': num <<= 10; + /* fallthrough */ case 'K': case 'k': - num >>= log_block_size; + if (log_block_size < 0) + num <<= 10; + else + num >>= log_block_size; break; case 's': - num >>= (1+log_block_size); + if (log_block_size < 0) + num <<= 9; + else + num >>= (1+log_block_size); break; case '\0': break; @@ -58,11 +68,21 @@ main(int argc, char **argv) unsigned long num; int log_block_size = 0; - if (argc != 2) { - fprintf(stderr, "Usage: %s arg\n", argv[0]); + if (argc != 2 && argc != 3) { + fprintf(stderr, "Usage: %s arg [log_block_size]\n", argv[0]); exit(1); } + if (argc == 3) { + char *p; + + log_block_size = strtol(argv[2], &p, 0); + if (*p) { + fprintf(stderr, "Bad log_block_size: %s\n", argv[2]); + exit(1); + } + } + num = parse_num_blocks(argv[1], log_block_size); printf("Parsed number: %lu\n", num);