]> git.neil.brown.name Git - lafs-utils.git/commitdiff
Split out size parsing into separate file
authorNeilBrown <neilb@suse.de>
Sun, 13 Mar 2011 22:46:19 +0000 (09:46 +1100)
committerNeilBrown <neilb@suse.de>
Sun, 13 Mar 2011 22:46:19 +0000 (09:46 +1100)
So we have common code for understanding 'K,M,G' suffix.

Signed-off-by: NeilBrown <neilb@suse.de>
tools/Makefile
tools/internal.h
tools/mkfs.lafs.c
tools/parse.c [new file with mode: 0644]

index fb9e830e1584af1f3730365e8a1ba54335368238..7852f572ffff8a6d145b58ea851f332e3ca12943 100644 (file)
@@ -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
index 436fc73e450e92e54ad842bfd50cfcca72d36b06..de9a4bdb31375d7004a0b17f8bf4c6245bc2d5c5 100644 (file)
@@ -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);
index 24cd15432593b719cef24596c9ad6d92f548c2e5..784658dcf3b7dcd9a13335746c64d49c3ab4b2f8 100644 (file)
@@ -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 (file)
index 0000000..30187cf
--- /dev/null
@@ -0,0 +1,49 @@
+
+/* Simple number parsing code */
+
+#include <stdlib.h>
+#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;
+}