155f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o/*
2efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * parse_num.c		- Parse the number of blocks
355f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o *
455f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o * Copyright (C) 2004,2005  Theodore Ts'o <tytso@mit.edu>
5efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o *
6543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * %Begin-Header%
7543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * This file may be redistributed under the terms of the GNU Library
8543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * General Public License, version 2.
9543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * %End-Header%
1055f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o */
1155f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o
1255f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o#include "e2p.h"
1355f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o
1455f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o#include <stdlib.h>
1555f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o
16e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallunsigned long long parse_num_blocks2(const char *arg, int log_block_size)
1755f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o{
1855f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o	char *p;
1955f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o	unsigned long long num;
2055f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o
2155f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o	num = strtoull(arg, &p, 0);
2255f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o
23efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o	if (p[0] && p[1])
2455f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o		return 0;
2555f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o
2655f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o	switch (*p) {		/* Using fall-through logic */
27efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o	case 'T': case 't':
2855f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o		num <<= 10;
29e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		/* fallthrough */
30efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o	case 'G': case 'g':
3155f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o		num <<= 10;
32e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		/* fallthrough */
33efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o	case 'M': case 'm':
3455f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o		num <<= 10;
35e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		/* fallthrough */
36efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o	case 'K': case 'k':
37e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		if (log_block_size < 0)
38e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall			num <<= 10;
39e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		else
40e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall			num >>= log_block_size;
4155f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o		break;
42efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o	case 's':
43e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		if (log_block_size < 0)
44e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall			num <<= 9;
45e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		else
46e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall			num >>= (1+log_block_size);
4755f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o		break;
4855f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o	case '\0':
4955f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o		break;
50efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o	default:
5155f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o		return 0;
5255f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o	}
5355f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o	return num;
5455f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o}
5555f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o
56e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallunsigned long parse_num_blocks(const char *arg, int log_block_size)
57e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{
58e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	return parse_num_blocks2(arg, log_block_size);
59e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall}
60e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
6155f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o#ifdef DEBUG
6255f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o#include <unistd.h>
6355f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o#include <stdio.h>
6455f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o
6555f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'omain(int argc, char **argv)
6655f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o{
6755f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o	unsigned long num;
6855f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o	int log_block_size = 0;
6955f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o
70e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	if (argc != 2 && argc != 3) {
71e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		fprintf(stderr, "Usage: %s arg [log_block_size]\n", argv[0]);
7255f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o		exit(1);
7355f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o	}
7455f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o
75e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	if (argc == 3) {
76e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		char *p;
77e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
78e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		log_block_size = strtol(argv[2], &p, 0);
79e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		if (*p) {
80e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall			fprintf(stderr, "Bad log_block_size: %s\n", argv[2]);
81e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall			exit(1);
82e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		}
83e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	}
84e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
8555f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o	num = parse_num_blocks(argv[1], log_block_size);
8655f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o
8755f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o	printf("Parsed number: %lu\n", num);
8855f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o	exit(0);
8955f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o}
9055f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o#endif
91