[Libvir] PATCH: Add xstrtol variants for long long

Daniel P. Berrange berrange at redhat.com
Sat Jan 19 18:59:41 UTC 2008


Jim's xstrtol convenience function simplified the use of strtol, but only
support the 'int' variant. For the storage drivers I need a similar function
that will always be at minimum 64-bit since we may have files > 2 GB even
on 32-bit. So this adds a variant of the xstrtol functions  which use a
long long / unsigned long long type

Regards,
Dan.

diff -r 83e80c558f4d src/internal.h
--- a/src/internal.h	Wed Jan 16 09:28:01 2008 -0500
+++ b/src/internal.h	Wed Jan 16 09:28:05 2008 -0500
@@ -304,6 +304,42 @@ xstrtol_ui(char const *s, char **end_ptr
     return 0;
 }
 
+static inline int
+xstrtol_ll(char const *s, char **end_ptr, int base, long long *result)
+{
+    long long val;
+    char *p;
+    int err;
+
+    errno = 0;
+    val = strtoll(s, &p, base);
+    err = (errno || (!end_ptr && *p) || p == s || (long long) val != val);
+    if (end_ptr)
+        *end_ptr = p;
+    if (err)
+        return -1;
+    *result = val;
+    return 0;
+}
+
+/* Just like xstrtol_i, above, but produce an "unsigned long long" value.  */
+static inline int
+xstrtol_ull(char const *s, char **end_ptr, int base, unsigned long long *result)
+{
+    unsigned long long val;
+    char *p;
+    int err;
+
+    errno = 0;
+    val = strtoull(s, &p, base);
+    err = (errno || (!end_ptr && *p) || p == s || (unsigned long long) val != val);
+    if (end_ptr)
+        *end_ptr = p;
+    if (err)
+        return -1;
+    *result = val;
+    return 0;
+}
 #ifdef __cplusplus
 }
 #endif                          /* __cplusplus */


Dan.
-- 
|=- Red Hat, Engineering, Emerging Technologies, Boston.  +1 978 392 2496 -=|
|=-           Perl modules: http://search.cpan.org/~danberr/              -=|
|=-               Projects: http://freshmeat.net/~danielpb/               -=|
|=-  GnuPG: 7D3B9505   F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505  -=| 




More information about the libvir-list mailing list