paul@181 | 1 | /* |
paul@181 | 2 | * parse_num.c - Parse the number of blocks |
paul@181 | 3 | * |
paul@181 | 4 | * Copyright (C) 2004,2005 Theodore Ts'o <tytso@mit.edu> |
paul@181 | 5 | * |
paul@181 | 6 | * %Begin-Header% |
paul@181 | 7 | * This file may be redistributed under the terms of the GNU Library |
paul@181 | 8 | * General Public License, version 2. |
paul@181 | 9 | * %End-Header% |
paul@181 | 10 | */ |
paul@181 | 11 | |
paul@181 | 12 | #include "config.h" |
paul@181 | 13 | #include "e2p.h" |
paul@181 | 14 | |
paul@181 | 15 | #include <stdlib.h> |
paul@181 | 16 | |
paul@181 | 17 | unsigned long long parse_num_blocks2(const char *arg, int log_block_size) |
paul@181 | 18 | { |
paul@181 | 19 | char *p; |
paul@181 | 20 | unsigned long long num; |
paul@181 | 21 | |
paul@181 | 22 | num = strtoull(arg, &p, 0); |
paul@181 | 23 | |
paul@181 | 24 | if (p[0] && p[1]) |
paul@181 | 25 | return 0; |
paul@181 | 26 | |
paul@181 | 27 | switch (*p) { /* Using fall-through logic */ |
paul@181 | 28 | case 'T': case 't': |
paul@181 | 29 | num <<= 10; |
paul@181 | 30 | /* fallthrough */ |
paul@181 | 31 | case 'G': case 'g': |
paul@181 | 32 | num <<= 10; |
paul@181 | 33 | /* fallthrough */ |
paul@181 | 34 | case 'M': case 'm': |
paul@181 | 35 | num <<= 10; |
paul@181 | 36 | /* fallthrough */ |
paul@181 | 37 | case 'K': case 'k': |
paul@181 | 38 | if (log_block_size < 0) |
paul@181 | 39 | num <<= 10; |
paul@181 | 40 | else |
paul@181 | 41 | num >>= log_block_size; |
paul@181 | 42 | break; |
paul@181 | 43 | case 's': |
paul@181 | 44 | if (log_block_size < 0) |
paul@181 | 45 | num <<= 9; |
paul@181 | 46 | else |
paul@181 | 47 | num >>= (1+log_block_size); |
paul@181 | 48 | break; |
paul@181 | 49 | case '\0': |
paul@181 | 50 | break; |
paul@181 | 51 | default: |
paul@181 | 52 | return 0; |
paul@181 | 53 | } |
paul@181 | 54 | return num; |
paul@181 | 55 | } |
paul@181 | 56 | |
paul@181 | 57 | unsigned long parse_num_blocks(const char *arg, int log_block_size) |
paul@181 | 58 | { |
paul@181 | 59 | return parse_num_blocks2(arg, log_block_size); |
paul@181 | 60 | } |
paul@181 | 61 | |
paul@181 | 62 | #ifdef DEBUG |
paul@181 | 63 | #include <unistd.h> |
paul@181 | 64 | #include <stdio.h> |
paul@181 | 65 | |
paul@181 | 66 | main(int argc, char **argv) |
paul@181 | 67 | { |
paul@181 | 68 | unsigned long num; |
paul@181 | 69 | int log_block_size = 0; |
paul@181 | 70 | |
paul@181 | 71 | if (argc != 2 && argc != 3) { |
paul@181 | 72 | fprintf(stderr, "Usage: %s arg [log_block_size]\n", argv[0]); |
paul@181 | 73 | exit(1); |
paul@181 | 74 | } |
paul@181 | 75 | |
paul@181 | 76 | if (argc == 3) { |
paul@181 | 77 | char *p; |
paul@181 | 78 | |
paul@181 | 79 | log_block_size = strtol(argv[2], &p, 0); |
paul@181 | 80 | if (*p) { |
paul@181 | 81 | fprintf(stderr, "Bad log_block_size: %s\n", argv[2]); |
paul@181 | 82 | exit(1); |
paul@181 | 83 | } |
paul@181 | 84 | } |
paul@181 | 85 | |
paul@181 | 86 | num = parse_num_blocks(argv[1], log_block_size); |
paul@181 | 87 | |
paul@181 | 88 | printf("Parsed number: %lu\n", num); |
paul@181 | 89 | exit(0); |
paul@181 | 90 | } |
paul@181 | 91 | #endif |