diff options
author | rizzo <rizzo@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-12-19 15:15:03 +0000 |
---|---|---|
committer | rizzo <rizzo@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-12-19 15:15:03 +0000 |
commit | 6016c98c2b4c0493ff5844f5bd79112d3f48850c (patch) | |
tree | e34b4576e2524f8f8525220925d6e4df1241a4d4 | |
parent | c6314dd7decdcaf6581e0a386dedcb997facbcd2 (diff) |
add support for PARSE_DOUBLE, and remove identifiers for
types not supported (INT16 and UINT16)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@93925 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r-- | include/asterisk/config.h | 13 | ||||
-rw-r--r-- | main/config.c | 28 |
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; |