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