]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - lib/parser.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/cmetcalf/linux-tile
[mirror_ubuntu-artful-kernel.git] / lib / parser.c
index b6d11631231b67e330b03eae74ecdf8373073866..3278958b472a990bd777842c1b11ea0c4bb969bd 100644 (file)
@@ -151,6 +151,36 @@ static int match_number(substring_t *s, int *result, int base)
        return ret;
 }
 
+/**
+ * match_u64int: scan a number in the given base from a substring_t
+ * @s: substring to be scanned
+ * @result: resulting u64 on success
+ * @base: base to use when converting string
+ *
+ * Description: Given a &substring_t and a base, attempts to parse the substring
+ * as a number in that base. On success, sets @result to the integer represented
+ * by the string and returns 0. Returns -ENOMEM, -EINVAL, or -ERANGE on failure.
+ */
+static int match_u64int(substring_t *s, u64 *result, int base)
+{
+       char *buf;
+       int ret;
+       u64 val;
+       size_t len = s->to - s->from;
+
+       buf = kmalloc(len + 1, GFP_KERNEL);
+       if (!buf)
+               return -ENOMEM;
+       memcpy(buf, s->from, len);
+       buf[len] = '\0';
+
+       ret = kstrtoull(buf, base, &val);
+       if (!ret)
+               *result = val;
+       kfree(buf);
+       return ret;
+}
+
 /**
  * match_int: - scan a decimal representation of an integer from a substring_t
  * @s: substring_t to be scanned
@@ -166,6 +196,23 @@ int match_int(substring_t *s, int *result)
 }
 EXPORT_SYMBOL(match_int);
 
+/**
+ * match_u64: - scan a decimal representation of a u64 from
+ *                  a substring_t
+ * @s: substring_t to be scanned
+ * @result: resulting unsigned long long on success
+ *
+ * Description: Attempts to parse the &substring_t @s as a long decimal
+ * integer. On success, sets @result to the integer represented by the
+ * string and returns 0.
+ * Returns -ENOMEM, -EINVAL, or -ERANGE on failure.
+ */
+int match_u64(substring_t *s, u64 *result)
+{
+       return match_u64int(s, result, 0);
+}
+EXPORT_SYMBOL(match_u64);
+
 /**
  * match_octal: - scan an octal representation of an integer from a substring_t
  * @s: substring_t to be scanned