changeset 19675:364874711d5b

lib: Add str_is_float check function
author Aki Tuomi <aki.tuomi@dovecot.fi>
date Fri, 29 Jan 2016 10:28:53 +0200
parents fc0219628b49
children 286e4218fb07
files src/lib/strnum.c src/lib/strnum.h
diffstat 2 files changed, 30 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib/strnum.c	Thu Jan 28 20:47:02 2016 +0200
+++ b/src/lib/strnum.c	Fri Jan 29 10:28:53 2016 +0200
@@ -17,6 +17,32 @@
 	return TRUE;
 }
 
+bool str_is_float(const char *str, char end_char)
+{
+	bool dot_seen = FALSE;
+	bool num_seen = FALSE;
+
+	if (*str == '\0' || *str == end_char)
+		return FALSE;
+
+	while (*str != '\0' && *str != end_char) {
+		if (*str == '.') {
+			if (dot_seen || !num_seen) return FALSE;
+			dot_seen = TRUE;
+			num_seen = FALSE;
+			str++;
+			/* enforce that number follows dot */
+			continue;
+		}
+		if (*str < '0' || *str > '9')
+			return FALSE;
+		num_seen = TRUE;
+		str++;
+	}
+
+	return num_seen;
+}
+
 /* 
  * Unsigned decimal
  */
--- a/src/lib/strnum.h	Thu Jan 28 20:47:02 2016 +0200
+++ b/src/lib/strnum.h	Fri Jan 29 10:28:53 2016 +0200
@@ -180,6 +180,10 @@
    Stop when `end_char' is found from string. */
 bool str_is_numeric(const char *str, char end_char) ATTR_PURE;
 
+/* Return TRUE when string has one or more numbers, followed
+   with zero or one dot, followed with at least one number. */
+bool str_is_float(const char *str, char end_char) ATTR_PURE;
+
 /* Returns human readable string about what is wrong with the string.
    This function assumes that str_to_*() had already returned -1 for the
    string. */