parse_num.c revision d1154eb460efe588eaed3d439c1caaca149fa362
1/* 2 * parse_num.c - Parse the number of blocks 3 * 4 * Copyright (C) 2004,2005 Theodore Ts'o <tytso@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 "config.h" 13#include "e2p.h" 14 15#include <stdlib.h> 16 17unsigned long long parse_num_blocks2(const char *arg, int log_block_size) 18{ 19 char *p; 20 unsigned long long num; 21 22 num = strtoull(arg, &p, 0); 23 24 if (p[0] && p[1]) 25 return 0; 26 27 switch (*p) { /* Using fall-through logic */ 28 case 'T': case 't': 29 num <<= 10; 30 /* fallthrough */ 31 case 'G': case 'g': 32 num <<= 10; 33 /* fallthrough */ 34 case 'M': case 'm': 35 num <<= 10; 36 /* fallthrough */ 37 case 'K': case 'k': 38 num >>= log_block_size; 39 break; 40 case 's': 41 num >>= (1+log_block_size); 42 break; 43 case '\0': 44 break; 45 default: 46 return 0; 47 } 48 return num; 49} 50 51unsigned long parse_num_blocks(const char *arg, int log_block_size) 52{ 53 return parse_num_blocks2(arg, log_block_size); 54} 55 56#ifdef DEBUG 57#include <unistd.h> 58#include <stdio.h> 59 60main(int argc, char **argv) 61{ 62 unsigned long num; 63 int log_block_size = 0; 64 65 if (argc != 2) { 66 fprintf(stderr, "Usage: %s arg\n", argv[0]); 67 exit(1); 68 } 69 70 num = parse_num_blocks(argv[1], log_block_size); 71 72 printf("Parsed number: %lu\n", num); 73 exit(0); 74} 75#endif 76