parse_num.c revision e0ed7404719a9ddd2ba427a80db5365c8bad18c0
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 "e2p.h"
13
14#include <stdlib.h>
15
16unsigned 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
56unsigned 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
65main(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