parse_num.c revision efc6f628e15de95bcd13e4f0ee223cb42115d520
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse_num.c - Parse the number of blocks 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (C) 2004,2005 Theodore Ts'o <tytso@mit.edu> 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This file can be redistributed under the terms of the GNU Library General 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Public License 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "e2p.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h> 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)unsigned long parse_num_blocks(const char *arg, int log_block_size) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *p; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long long num; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num = strtoull(arg, &p, 0); 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (p[0] && p[1]) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (*p) { /* Using fall-through logic */ 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 'T': case 't': 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num <<= 10; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 'G': case 'g': 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num <<= 10; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 'M': case 'm': 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num <<= 10; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 'K': case 'k': 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num >>= log_block_size; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 's': 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num >>= (1+log_block_size); 36 break; 37 case '\0': 38 break; 39 default: 40 return 0; 41 } 42 return num; 43} 44 45#ifdef DEBUG 46#include <unistd.h> 47#include <stdio.h> 48 49main(int argc, char **argv) 50{ 51 unsigned long num; 52 int log_block_size = 0; 53 54 if (argc != 2) { 55 fprintf(stderr, "Usage: %s arg\n", argv[0]); 56 exit(1); 57 } 58 59 num = parse_num_blocks(argv[1], log_block_size); 60 61 printf("Parsed number: %lu\n", num); 62 exit(0); 63} 64#endif 65