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