summaryrefslogtreecommitdiff
path: root/main/conversions.c
diff options
context:
space:
mode:
Diffstat (limited to 'main/conversions.c')
-rw-r--r--main/conversions.c77
1 files changed, 77 insertions, 0 deletions
diff --git a/main/conversions.c b/main/conversions.c
new file mode 100644
index 000000000..e73e1a213
--- /dev/null
+++ b/main/conversions.c
@@ -0,0 +1,77 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2017, Digium, Inc.
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/*! \file
+ *
+ * \brief Conversion utility functions
+ */
+
+/*** MODULEINFO
+ <support_level>core</support_level>
+ ***/
+
+#include <ctype.h>
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+
+#include "asterisk/conversions.h"
+
+static int str_is_negative(const char *str)
+{
+ /* Ignore any preceding white space */
+ while (isspace(*str) && *++str);
+ return *str == '-';
+}
+
+int ast_str_to_uint(const char *str, unsigned int *res)
+{
+ unsigned long val;
+
+ if (ast_str_to_ulong(str, &val) || val > UINT_MAX) {
+ return -1;
+ }
+
+ *res = val;
+ return 0;
+}
+
+int ast_str_to_ulong(const char *str, unsigned long *res)
+{
+ char *end;
+ unsigned long val;
+
+ if (!str || str_is_negative(str)) {
+ return -1;
+ }
+
+ errno = 0;
+ val = strtoul(str, &end, 0);
+
+ /*
+ * If str equals end then no digits were found. If end is not pointing to
+ * a null character then the string contained some numbers that could be
+ * converted, but some characters that could not, which we'll consider
+ * invalid.
+ */
+ if ((str == end || *end != '\0' || (errno == ERANGE && val == ULONG_MAX))) {
+ return -1;
+ }
+
+ *res = val;
+ return 0;
+
+}