[misc] Add vsc_strtoui().
authorMaximilian Wilhelm <max@rfc2324.org>
Tue, 15 Sep 2009 21:32:04 +0000 (23:32 +0200)
committerMaximilian Wilhelm <max@rfc2324.org>
Tue, 15 Sep 2009 21:32:04 +0000 (23:32 +0200)
Signed-off-by: Maximilian Wilhelm <max@rfc2324.org>

include/libvscmisc/Makefile
include/libvscmisc/string.h
include/libvscmisc/types.h
misc/string.c

index 61246a3..d6e4d0f 100644 (file)
@@ -17,7 +17,6 @@ TARGET   = libvscmisc
 
 .PHONY: install force
 
-install: $(HEADERS)
-
 include ../../rules.mk
 
+install: $(HEADERS)
index ccc7992..a56b3b1 100644 (file)
@@ -44,6 +44,9 @@ vsc_strerror (int errnum);
 int
 vsc_strtoi (struct VscError *error, const char *string, char **tail, int base);
 
+uint32_t
+vsc_strtoui (struct VscError *error, const char *string, char **tail, int base);
+
 int
 vsc_strcmp (const char *string1, const char *string2);
 
index 8d7891b..b45454e 100644 (file)
@@ -25,6 +25,7 @@
 #ifndef __VSC_MISC__TYPES_H__
 #define __VSC_MISC__TYPES_H__
 
+#include <stdint.h> /* for uint32_t */
 #include <stdlib.h> /* for size_t */
 #include <sys/time.h> /* for struct timeval */
 
index e13c99f..021408f 100644 (file)
@@ -201,6 +201,51 @@ vsc_strtoi (struct VscError *error, const char *string, char **tail, int base)
 }
 
 /*!
+ * @brief Stricter version of strtoul, returning an uint32_t as result.
+ *
+ * If tail is NULL there must be no non-number character at the end of the
+ * string, otherwise an error occurs.
+ */
+uint32_t
+vsc_strtoui (struct VscError *error, const char *string, char **tail, int base)
+{
+       unsigned long int value = 0;
+       char *temp = NULL;
+
+       VSC__ASSERT (error != NULL);
+       VSC__ASSERT (! error->occured);
+       VSC__ASSERT (string != NULL);
+
+       errno = 0;
+       value = strtoul (string, &temp, base);
+
+       if (errno != 0) {
+               VSC__ERROR2 (error, VSC__ERROR_CODE__ERRNO,
+                            "Converting '%s' yields errno %s (%d)", string,
+                            vsc_strerror (errno), errno);
+       }
+       else if (tail == NULL && *temp != '\0') {
+               VSC__ERROR2 (error, VSC__ERROR_CODE__INVALID_ARGUMENT,
+                            "Expecting '\\0' after the last digit in '%s' "
+                            "but found '%c'", string, *temp);
+       }
+       else if (temp == string) {
+               VSC__ERROR2 (error, VSC__ERROR_CODE__INVALID_ARGUMENT,
+                            "Nothing of '%s' was converted", string);
+       }
+       else if ((uint32_t) value != value) {
+               VSC__ERROR2 (error, VSC__ERROR_CODE__INVALID_ARGUMENT,
+                            "'%s' is not representable as uint32_t", string);
+       }
+
+       if (tail != NULL) {
+               *tail = temp;
+       }
+
+       return value;
+}
+
+/*!
  * @brief A version of strcmp that accepts NULL as parameter.
  *
  * @note NULL pointers compare equal.