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;
}
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) {
--- /dev/null
+
+/* 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;
+}