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