diff --git a/funcs/func_cdr.c b/funcs/func_cdr.c index c934e87c9..c5cadc758 100644 --- a/funcs/func_cdr.c +++ b/funcs/func_cdr.c @@ -38,13 +38,24 @@ #include "asterisk/app.h" #include "asterisk/cdr.h" +enum { + OPT_RECURSIVE = (1 << 0), +} cdr_option_flags; + +AST_APP_OPTIONS(cdr_func_options, { + AST_APP_OPTION('r', OPT_RECURSIVE), +}); + static char *builtin_function_cdr_read(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) { char *ret; - char *mydata; - int argc; - char *argv[2]; - int recursive = 0; + char *parse; + struct ast_flags flags = {0}; + + AST_DECLARE_APP_ARGS(args, + AST_APP_ARG(variable); + AST_APP_ARG(options); + ); if (ast_strlen_zero(data)) return NULL; @@ -52,47 +63,54 @@ static char *builtin_function_cdr_read(struct ast_channel *chan, char *cmd, char if (!chan->cdr) return NULL; - mydata = ast_strdupa(data); - argc = ast_app_separate_args(mydata, '|', argv, sizeof(argv) / sizeof(argv[0])); - - /* check for a trailing flags argument */ - if (argc > 1) { - argc--; - if (strchr(argv[argc], 'r')) - recursive = 1; + parse = ast_strdupa(data); + if (!parse) { + ast_log(LOG_ERROR, "Out of memory!\n"); + return NULL; } - ast_cdr_getvar(chan->cdr, argv[0], &ret, buf, len, recursive); + AST_STANDARD_APP_ARGS(args, parse); + + if(!ast_strlen_zero(args.options) ) { + ast_app_parse_options(cdr_func_options, &flags, NULL, args.options); + } + ast_cdr_getvar(chan->cdr, args.variable, &ret, buf, len, (ast_test_flag(&flags,OPT_RECURSIVE) ) ? 1 : 0 ); return ret; } static void builtin_function_cdr_write(struct ast_channel *chan, char *cmd, char *data, const char *value) { - char *mydata; - int argc; - char *argv[2]; - int recursive = 0; + char *parse; + struct ast_flags flags = {0}; + + AST_DECLARE_APP_ARGS(args, + AST_APP_ARG(variable); + AST_APP_ARG(options); + ); if (ast_strlen_zero(data) || !value) return; - mydata = ast_strdupa(data); - argc = ast_app_separate_args(mydata, '|', argv, sizeof(argv) / sizeof(argv[0])); - - /* check for a trailing flags argument */ - if (argc > 1) { - argc--; - if (strchr(argv[argc], 'r')) - recursive = 1; + parse = ast_strdupa(data); + if (!parse) { + ast_log(LOG_ERROR, "Out of memory!\n"); + return; } - if (!strcasecmp(argv[0], "accountcode")) + AST_STANDARD_APP_ARGS(args, parse); + + /* check for a trailing flags argument */ + if(!ast_strlen_zero(args.options) ) { + ast_app_parse_options(cdr_func_options, &flags, NULL, args.options); + } + + if (!strcasecmp(args.variable, "accountcode")) ast_cdr_setaccount(chan, value); - else if (!strcasecmp(argv[0], "userfield")) + else if (!strcasecmp(args.variable, "userfield")) ast_cdr_setuserfield(chan, value); else if (chan->cdr) - ast_cdr_setvar(chan->cdr, argv[0], value, recursive); + ast_cdr_setvar(chan->cdr, args.variable, value, (ast_test_flag(&flags,OPT_RECURSIVE) ) ? 1 : 0 ); } #ifndef BUILTIN_FUNC diff --git a/funcs/func_cut.c b/funcs/func_cut.c index 1c3eaa489..1df47030e 100644 --- a/funcs/func_cut.c +++ b/funcs/func_cut.c @@ -133,42 +133,40 @@ static int sort_internal(struct ast_channel *chan, char *data, char *buffer, siz static int cut_internal(struct ast_channel *chan, char *data, char *buffer, size_t buflen) { - char *s, *args[3], *varname=NULL, *delimiter=NULL, *field=NULL; - int args_okay = 0; + char *parse; + AST_DECLARE_APP_ARGS(args, + AST_APP_ARG(varname); + AST_APP_ARG(delimiter); + AST_APP_ARG(field); + ); - memset(buffer, 0, buflen); - - /* Check and parse arguments */ - if (data) { - s = ast_strdupa((char *)data); - if (s) { - ast_app_separate_args(s, '|', args, 3); - varname = args[0]; - delimiter = args[1]; - field = args[2]; - - if (field) { - args_okay = 1; - } - } else { - return ERROR_NOMEM; - } + memset(buffer, 0, buflen); + + parse = ast_strdupa(data); + if (!parse) { + ast_log(LOG_ERROR, "Out of memory!\n"); + return ERROR_NOMEM; } - if (args_okay) { + AST_STANDARD_APP_ARGS(args, parse); + + /* Check and parse arguments */ + if(args.argc < 3){ + return ERROR_NOARG; + } else { char d, ds[2]; - char *tmp = alloca(strlen(varname) + 4); + char *tmp = alloca(strlen(args.varname) + 4); char varvalue[MAXRESULT], *tmp2=varvalue; if (tmp) { - snprintf(tmp, strlen(varname) + 4, "${%s}", varname); + snprintf(tmp, strlen(args.varname) + 4, "${%s}", args.varname); memset(varvalue, 0, sizeof(varvalue)); } else { return ERROR_NOMEM; } - if (delimiter[0]) - d = delimiter[0]; + if (args.delimiter[0]) + d = args.delimiter[0]; else d = '-'; @@ -179,8 +177,8 @@ static int cut_internal(struct ast_channel *chan, char *data, char *buffer, size if (tmp2) { int curfieldnum = 1; - while ((tmp2 != NULL) && (field != NULL)) { - char *nextgroup = strsep(&field, "&"); + while ((tmp2 != NULL) && (args.field != NULL)) { + char *nextgroup = strsep(&(args.field), "&"); int num1 = 0, num2 = MAXRESULT; char trashchar; @@ -231,8 +229,6 @@ static int cut_internal(struct ast_channel *chan, char *data, char *buffer, size } } } - } else { - return ERROR_NOARG; } return 0; } @@ -267,7 +263,7 @@ static char *acf_cut_exec(struct ast_channel *chan, char *cmd, char *data, char switch (cut_internal(chan, data, buf, len)) { case ERROR_NOARG: - ast_log(LOG_ERROR, "CUT() requires an argument\n"); + ast_log(LOG_ERROR, "Syntax: CUT(,,) - missing argument!\n"); break; case ERROR_NOMEM: ast_log(LOG_ERROR, "Out of memory\n");