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
1.6.0
Luigi Rizzo 18 years ago
parent 241f271a99
commit 8afacf169b

@ -289,15 +289,18 @@ enum ast_parse_flags {
/* numeric types, with optional default value and bound checks. /* numeric types, with optional default value and bound checks.
* Additional arguments are passed by value. * Additional arguments are passed by value.
*/ */
PARSE_INT16 = 0x0001, PARSE_INT32 = 0x0001,
PARSE_INT32 = 0x0002, PARSE_UINT32 = 0x0002,
PARSE_UINT16 = 0x0003, PARSE_DOUBLE = 0x0003,
PARSE_UINT32 = 0x0004, #if 0 /* not supported yet */
PARSE_INT16 = 0x0004,
PARSE_UINT16 = 0x0005,
#endif
/* Returns a struct sockaddr_in, with optional default value /* Returns a struct sockaddr_in, with optional default value
* (passed by reference) and port handling (accept, ignore, * (passed by reference) and port handling (accept, ignore,
* require, forbid). The format is 'host.name[:port]' * require, forbid). The format is 'host.name[:port]'
*/ */
PARSE_INADDR = 0x0005, PARSE_INADDR = 0x000f,
/* Other data types can be added as needed */ /* Other data types can be added as needed */

@ -35,6 +35,8 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include <time.h> #include <time.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <math.h> /* HUGE_VAL */
#define AST_INCLUDE_GLOB 1 #define AST_INCLUDE_GLOB 1
#ifdef AST_INCLUDE_GLOB #ifdef AST_INCLUDE_GLOB
@ -2149,6 +2151,32 @@ int ast_parse_arg(const char *arg, enum ast_parse_flags flags,
break; 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: case PARSE_INADDR:
{ {
char *port, *buf; char *port, *buf;

Loading…
Cancel
Save