summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuigi Rizzo <rizzo@icir.org>2007-12-19 15:15:03 +0000
committerLuigi Rizzo <rizzo@icir.org>2007-12-19 15:15:03 +0000
commit8afacf169b5f69e8a717d52495ece0125b6c983e (patch)
treee34b4576e2524f8f8525220925d6e4df1241a4d4
parent241f271a99e720f79878d1be1501894aa713ede1 (diff)
add support for PARSE_DOUBLE, and remove identifiers for
types not supported (INT16 and UINT16) git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@93925 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r--include/asterisk/config.h13
-rw-r--r--main/config.c28
2 files changed, 36 insertions, 5 deletions
diff --git a/include/asterisk/config.h b/include/asterisk/config.h
index c60916a90..ebc71fb8a 100644
--- a/include/asterisk/config.h
+++ b/include/asterisk/config.h
@@ -289,15 +289,18 @@ enum ast_parse_flags {
/* numeric types, with optional default value and bound checks.
* Additional arguments are passed by value.
*/
- PARSE_INT16 = 0x0001,
- PARSE_INT32 = 0x0002,
- PARSE_UINT16 = 0x0003,
- PARSE_UINT32 = 0x0004,
+ PARSE_INT32 = 0x0001,
+ PARSE_UINT32 = 0x0002,
+ PARSE_DOUBLE = 0x0003,
+#if 0 /* not supported yet */
+ PARSE_INT16 = 0x0004,
+ PARSE_UINT16 = 0x0005,
+#endif
/* Returns a struct sockaddr_in, with optional default value
* (passed by reference) and port handling (accept, ignore,
* require, forbid). The format is 'host.name[:port]'
*/
- PARSE_INADDR = 0x0005,
+ PARSE_INADDR = 0x000f,
/* Other data types can be added as needed */
diff --git a/main/config.c b/main/config.c
index 0ad813d8a..4359bcf88 100644
--- a/main/config.c
+++ b/main/config.c
@@ -35,6 +35,8 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include <time.h>
#include <sys/stat.h>
+#include <math.h> /* HUGE_VAL */
+
#define AST_INCLUDE_GLOB 1
#ifdef AST_INCLUDE_GLOB
@@ -2149,6 +2151,32 @@ int ast_parse_arg(const char *arg, enum ast_parse_flags flags,
break;
}
+ case PARSE_DOUBLE:
+ {
+ double *result = p_result;
+ double x, def = result ? *result : 0,
+ low = -HUGE_VAL, high = HUGE_VAL;
+
+ /* optional argument: first default value, then range */
+ if (flags & PARSE_DEFAULT)
+ def = va_arg(ap, double);
+ if (flags & (PARSE_IN_RANGE|PARSE_OUT_RANGE)) {
+ /* range requested, update bounds */
+ low = va_arg(ap, double);
+ high = va_arg(ap, double);
+ }
+ x = strtod(arg, NULL);
+ error = (x < low) || (x > high);
+ if (flags & PARSE_OUT_RANGE)
+ error = !error;
+ if (result)
+ *result = error ? def : x;
+ ast_debug(3,
+ "extract double from [%s] in [%f, %f] gives [%f](%d)\n",
+ arg, low, high,
+ result ? *result : x, error);
+ break;
+ }
case PARSE_INADDR:
{
char *port, *buf;