Browse Source

utils: Add utils_strtonum_base

For converting number to the given base. utils_strtonum is now just
simple wrapper calling utils_strtonum_base with base 10.

Signed-off-by: Jan Friesse <jfriesse@redhat.com>
Jan Friesse 11 tháng trước cách đây
mục cha
commit
2454a6c6cc
3 tập tin đã thay đổi với 56 bổ sung3 xóa
  1. 39 0
      qdevices/test-utils.c
  2. 14 3
      qdevices/utils.c
  3. 3 0
      qdevices/utils.h

+ 39 - 0
qdevices/test-utils.c

@@ -80,6 +80,45 @@ main(void)
 	assert(utils_strtonum("test", -1000, 1000, &ll) == -1);
 	assert(utils_strtonum("12a", -1000, 1000, &ll) == -1);
 
+	assert(utils_strtonum_base("0", 0, 0100, 8, &ll) == 0);
+	assert(ll == 0);
+
+	assert(utils_strtonum_base("100", 0, 0100, 8, &ll) == 0);
+	assert(ll == 0100);
+
+	assert(utils_strtonum_base("0100", 0, 0100, 8, &ll) == 0);
+	assert(ll == 0100);
+
+	assert(utils_strtonum_base("101", 0, 0100, 8, &ll) != 0);
+	assert(utils_strtonum_base("0", 01, 0100, 8, &ll) != 0);
+	assert(utils_strtonum_base("8", 0, 0100, 8, &ll) != 0);
+
+	for (lli = 0; lli <= 0777; lli++) {
+		assert(snprintf(buf, sizeof(buf), "%llo", lli) > 0);
+
+		assert(utils_strtonum_base(buf, 0, 0777, 8, &ll) == 0);
+		assert(ll == lli);
+	}
+
+	assert(utils_strtonum_base("0", 0, 0100, 16, &ll) == 0);
+	assert(ll == 0);
+
+	assert(utils_strtonum_base("100", 0, 0x100, 16, &ll) == 0);
+	assert(ll == 0x100);
+
+	assert(utils_strtonum_base("0x100", 0, 0x100, 16, &ll) == 0);
+	assert(ll == 0x100);
+
+	assert(utils_strtonum_base("101", 0, 0x0100, 16, &ll) != 0);
+	assert(utils_strtonum_base("0", 0x1, 0x0100, 16, &ll) != 0);
+
+	for (lli = 0; lli <= 0x100; lli++) {
+		assert(snprintf(buf, sizeof(buf), "%llx", lli) > 0);
+
+		assert(utils_strtonum_base(buf, 0, 0x100, 16, &ll) == 0);
+		assert(ll == lli);
+	}
+
 	assert(utils_parse_bool_str("on") == 1);
 	assert(utils_parse_bool_str("yes") == 1);
 	assert(utils_parse_bool_str("1") == 1);

+ 14 - 3
qdevices/utils.c

@@ -212,8 +212,8 @@ utils_fd_set_non_blocking(int fd)
  * Safer wrapper of strtoll. Return 0 on success, otherwise -1.
  */
 int
-utils_strtonum(const char *str, long long int min_val, long long int max_val,
-    long long int *res)
+utils_strtonum_base(const char *str, long long int min_val, long long int max_val,
+    int base, long long int *res)
 {
 	long long int tmp_ll;
 	char *ep;
@@ -224,7 +224,7 @@ utils_strtonum(const char *str, long long int min_val, long long int max_val,
 
 	errno = 0;
 
-	tmp_ll = strtoll(str, &ep, 10);
+	tmp_ll = strtoll(str, &ep, base);
 	if (ep == str || *ep != '\0' || errno != 0) {
 		return (-1);
 	}
@@ -238,6 +238,17 @@ utils_strtonum(const char *str, long long int min_val, long long int max_val,
 	return (0);
 }
 
+/*
+ * Shortcut for decimal utils_strtonum_base
+ */
+int
+utils_strtonum(const char *str, long long int min_val, long long int max_val,
+    long long int *res)
+{
+
+	return (utils_strtonum_base(str, min_val, max_val, 10, res));
+}
+
 /*
  * Safer wrapper of strtod. Return 0 on success, otherwise -1.
  */

+ 3 - 0
qdevices/utils.h

@@ -65,6 +65,9 @@ extern int		utils_fd_set_non_blocking(int fd);
 extern int		utils_strtonum(const char *str, long long int min_val,
     long long int max_val, long long int *res);
 
+extern int		utils_strtonum_base(const char *str, long long int min_val,
+    long long int max_val, int base, long long int *res);
+
 extern int		utils_strtod(const char *str, double min_val, double max_val,
     double *res);