Use xstrtoumax() for parsing strings into numbers
authorSteve McIntyre <steve@einval.com>
Wed, 29 Jun 2011 17:17:21 +0000 (18:17 +0100)
committerSteve McIntyre <steve@einval.com>
Wed, 29 Jun 2011 17:17:21 +0000 (18:17 +0100)
Add wrapper functions in misc.c for parsing strings. Makes it possible
to parse cache sizes as "cachesize=10G", a lot more user-friendly than
"cachesize=10485760000".

C/Makefile
C/misc.c
C/misc.h

index a72e4a4..41dd8d3 100644 (file)
@@ -8,8 +8,8 @@ SQL3_CFLAGS=$(shell pkg-config sqlite3 --cflags)
 SQL3_LIBS=$(shell pkg-config sqlite3 --libs)
 CFLAGS = -g -O2 -Wall
 
-fuse-music: fuse-music.o fmdb.o fmcache.o misc.o sha1.o
-       gcc -o fuse-music fuse-music.o fmdb.o fmcache.o misc.o sha1.o $(FUSE_LIBS) $(SQL3_LIBS)
+fuse-music: fuse-music.o fmdb.o fmcache.o misc.o sha1.o xstrtoumax.o
+       gcc -o fuse-music fuse-music.o fmdb.o fmcache.o misc.o sha1.o xstrtoumax.o $(FUSE_LIBS) $(SQL3_LIBS)
 
 fuse-music.o: fuse-music.c fmdb.h fmcache.h misc.h
        gcc -c $(CFLAGS) $(FUSE_CFLAGS) fuse-music.c -o fuse-music.o
@@ -17,10 +17,12 @@ fmdb.o: fmdb.c fmdb.h
        gcc -c $(CFLAGS) $(SQL3_CFLAGS) fmdb.c -o fmdb.o
 fmcache.o: fmcache.c fmcache.h fmdb.h misc.h
        gcc -c $(CFLAGS) fmcache.c -o fmcache.o
-misc.o: misc.c misc.h
+misc.o: misc.c misc.h xstrtol.h
        gcc -c $(CFLAGS) misc.c -o misc.o
 sha1.o: sha1.c sha1.h
        gcc -c $(CFLAGS) sha1.c -o sha1.o
+xstrtoumax.o: xstrtoumax.c xstrtol.h
+       gcc -c $(CFLAGS) xstrtoumax.c -o xstrtoumax.o
 
 clean:
        rm -f *~ fuse-music *.o
index c9a6e87..816dddc 100644 (file)
--- a/C/misc.c
+++ b/C/misc.c
@@ -2,6 +2,12 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <stdio.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <stdint.h>
+#define HAVE_LONG_LONG_INT 1
+#include <inttypes.h>
+#include "xstrtol.h"
 #include "misc.h"
 
 static pthread_mutex_t log_mutex = PTHREAD_MUTEX_INITIALIZER;
@@ -58,3 +64,25 @@ ssize_t file_size(const char *path)
 
     return st.st_size;
 }
+
+int parse_string_to_long_long(const char *in, long long *out)
+{
+    char *suffix;
+    uintmax_t value;
+    enum strtol_error e = xstrtoumax(in, &suffix, 10, &value, "bcEGkKMPTwYZ0");
+    if (e != LONGINT_OK)
+        return EINVAL;
+    /* else */
+    *out = value;
+    return 0;
+}
+
+int parse_string_to_long(const char *in, long *out)
+{
+    errno = 0;
+    *out = strtol(in, NULL, 10);
+    if (errno)
+        return errno;
+    /* else */
+    return 0;
+}
index 8435097..0ae2ab5 100644 (file)
--- a/C/misc.h
+++ b/C/misc.h
@@ -17,6 +17,7 @@ time_t file_mtime(const char *path);
 ssize_t file_size(const char *path);
 void log_lock(void);
 void log_unlock(void);
-
+int parse_string_to_long_long(const char *in, long long *out);
+int parse_string_to_long(const char *in, long *out);
 
 #endif /* MISC_H */