From: NeilBrown Date: Sun, 13 Mar 2011 22:46:19 +0000 (+1100) Subject: Split out size parsing into separate file X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=28bb4d75f505298f7f200966c46da81bc4e6c7c0;p=lafs-utils.git Split out size parsing into separate file So we have common code for understanding 'K,M,G' suffix. Signed-off-by: NeilBrown --- diff --git a/tools/Makefile b/tools/Makefile index fb9e830..7852f57 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -27,7 +27,7 @@ LDFLAGS = -L../lib LDLIBS = libinternal.a -llafs -ltalloc -lreadline -luuid # 'internal' library -LIBSRC = open_device.c +LIBSRC = open_device.c parse.c LIBOBJ = $(patsubst %.c,%.o,$(LIBSRC)) all : mkfs.lafs lafs libinternal.a diff --git a/tools/internal.h b/tools/internal.h index 436fc73..de9a4bd 100644 --- a/tools/internal.h +++ b/tools/internal.h @@ -1,3 +1,4 @@ int open_device(char *devname, long long *device_bytes, int regular_file, char **error); +long long parse_size(char *arg, char **error); diff --git a/tools/mkfs.lafs.c b/tools/mkfs.lafs.c index 24cd154..784658d 100644 --- a/tools/mkfs.lafs.c +++ b/tools/mkfs.lafs.c @@ -96,45 +96,21 @@ char usage_text[] = static void get_size(long *valp, char *arg, char *name) { long val; - long scale = 1; - char *endp; + char *error; if (*valp != 0) { - fprintf(stderr, "mkfs.lafs: %s has already been given, value \"%s\" not permitted.\n", + fprintf(stderr, "mkfs.lafs: %s has already been given," + " value \"%s\" not permitted.\n", name, arg); exit(2); } - val = strtol(arg, &endp, 0); - - if (endp == arg) { - fprintf(stderr, "mkfs.lafs: Unrecognised size \"%s\" for %s\n", arg, name); - exit(2); - } - - switch(*endp) { - case 'k': - case 'K': - scale = 1024; - break; - case 'M': - scale = 1024*1024; - break; - case 'G': - scale = 1024*1024*1024; - break; - case '\0': - scale = 1; - break; - default: - fprintf(stderr, "mkfs.lafs: unrecognised modifier \"%s\" for %s\n", endp, name); - exit(2); - } - if (val == 0) { - fprintf(stderr, "mkfs.lafs: 0 is not a valid number for %s\n", name); + val = parse_size(arg, &error); + if (error) { + fprintf(stderr, "mkfs.lafs: %s: \"%s\" for %s\n", + error, arg, name); exit(2); } - val *= scale; *valp = val; } @@ -144,14 +120,16 @@ void get_num(int *valp, char *arg, char *name) char *endp; if (*valp != 0) { - fprintf(stderr, "mkfs.lafs: %s has already been given, value \"%s\" not permitted.\n", + fprintf(stderr, "mkfs.lafs: %s has already been given," + " value \"%s\" not permitted.\n", name, arg); exit(2); } val = strtol(arg, &endp, 0); if (endp == arg || *endp) { - fprintf(stderr, "mkfs.lafs: Unrecognised number \"%s\" for %s\n", arg, name); + fprintf(stderr, "mkfs.lafs: Unrecognised number \"%s\"" + " for %s\n", arg, name); exit(2); } if (val == 0) { diff --git a/tools/parse.c b/tools/parse.c new file mode 100644 index 0000000..30187cf --- /dev/null +++ b/tools/parse.c @@ -0,0 +1,49 @@ + +/* Simple number parsing code */ + +#include +#include "internal.h" + +long long parse_size(char *arg, char **error) +{ + long long val; + long long scale = 1; + char *endp; + + val = strtoll(arg, &endp, 0); + + if (endp == arg) { + *error = "not a valid number"; + return 0; + } + + if (endp[0] && endp[1]) { + *error = "unrecognised modifier (need K,M,G)"; + return 0; + } + switch(*endp) { + case 'k': + case 'K': + scale = 1024; + break; + case 'M': + scale = 1024*1024; + break; + case 'G': + scale = 1024*1024*1024; + break; + case '\0': + scale = 1; + break; + default: + *error = "unrecognised modifier (need K,M,G)"; + return 0; + } + if (val == 0) { + *error = "zero is not valid"; + return 0; + } + val *= scale; + error = NULL; + return val; +}