major dialplan functions update
[asterisk/asterisk.git] / funcs / func_cut.c
index 1c3eaa4..c34b7d7 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Asterisk -- An open source telephony toolkit.
  *
 /*
  * Asterisk -- An open source telephony toolkit.
  *
- * Copyright (c) 2003 Tilghman Lesher.  All rights reserved.
+ * Copyright (c) 2003-2006 Tilghman Lesher.  All rights reserved.
  *
  * Tilghman Lesher <app_cut__v003@the-tilghman.com>
  *
  *
  * Tilghman Lesher <app_cut__v003@the-tilghman.com>
  *
@@ -83,10 +83,8 @@ static int sort_internal(struct ast_channel *chan, char *data, char *buffer, siz
                return ERROR_NOARG;
        }
 
                return ERROR_NOARG;
        }
 
-       strings = ast_strdupa((char *)data);
-       if (!strings) {
+       if (!(strings = ast_strdupa(data)))
                return ERROR_NOMEM;
                return ERROR_NOMEM;
-       }
 
        for (ptrkey = strings; *ptrkey; ptrkey++) {
                if (*ptrkey == '|') {
 
        for (ptrkey = strings; *ptrkey; ptrkey++) {
                if (*ptrkey == '|') {
@@ -133,42 +131,37 @@ 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)
 {
 
 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); 
+       
+       if (!(parse = ast_strdupa(data)))
+               return ERROR_NOMEM;
 
 
-       memset(buffer, 0, buflen);
+       AST_STANDARD_APP_ARGS(args, parse);
 
        /* Check and parse arguments */
 
        /* 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;
-               }
-       }
-
-       if (args_okay) {
+       if(args.argc < 3){
+               return ERROR_NOARG;
+       } else {
                char d, ds[2];
                char d, ds[2];
-               char *tmp = alloca(strlen(varname) + 4);
+               char *tmp = alloca(strlen(args.varname) + 4);
                char varvalue[MAXRESULT], *tmp2=varvalue;
 
                if (tmp) {
                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;
                }
 
                        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 = '-';
 
                else
                        d = '-';
 
@@ -179,8 +172,8 @@ static int cut_internal(struct ast_channel *chan, char *data, char *buffer, size
 
                if (tmp2) {
                        int curfieldnum = 1;
 
                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;
 
                                int num1 = 0, num2 = MAXRESULT;
                                char trashchar;
 
@@ -231,15 +224,14 @@ static int cut_internal(struct ast_channel *chan, char *data, char *buffer, size
                                }
                        }
                }
                                }
                        }
                }
-       } else {
-               return ERROR_NOARG;
        }
        return 0;
 }
 
        }
        return 0;
 }
 
-static char *acf_sort_exec(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
+static int acf_sort_exec(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
 {
        struct localuser *u;
 {
        struct localuser *u;
+       int ret = -1;
 
        LOCAL_USER_ACF_ADD(u);
 
 
        LOCAL_USER_ACF_ADD(u);
 
@@ -251,23 +243,26 @@ static char *acf_sort_exec(struct ast_channel *chan, char *cmd, char *data, char
                ast_log(LOG_ERROR, "Out of memory\n");
                break;
        case 0:
                ast_log(LOG_ERROR, "Out of memory\n");
                break;
        case 0:
+               ret = 0;
                break;
        default:
                ast_log(LOG_ERROR, "Unknown internal error\n");
        }
        LOCAL_USER_REMOVE(u);
                break;
        default:
                ast_log(LOG_ERROR, "Unknown internal error\n");
        }
        LOCAL_USER_REMOVE(u);
-       return buf;
+
+       return ret;
 }
 
 }
 
-static char *acf_cut_exec(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
+static int acf_cut_exec(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
 {
 {
+       int ret = -1;
        struct localuser *u;
 
        LOCAL_USER_ACF_ADD(u);
 
        switch (cut_internal(chan, data, buf, len)) {
        case ERROR_NOARG:
        struct localuser *u;
 
        LOCAL_USER_ACF_ADD(u);
 
        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(<varname>,<char-delim>,<range-spec>) - missing argument!\n");
                break;
        case ERROR_NOMEM:
                ast_log(LOG_ERROR, "Out of memory\n");
                break;
        case ERROR_NOMEM:
                ast_log(LOG_ERROR, "Out of memory\n");
@@ -276,12 +271,14 @@ static char *acf_cut_exec(struct ast_channel *chan, char *cmd, char *data, char
                ast_log(LOG_ERROR, "Usage: CUT(<varname>,<char-delim>,<range-spec>)\n");
                break;
        case 0:
                ast_log(LOG_ERROR, "Usage: CUT(<varname>,<char-delim>,<range-spec>)\n");
                break;
        case 0:
+               ret = 0;
                break;
        default:
                ast_log(LOG_ERROR, "Unknown internal error\n");
        }
        LOCAL_USER_REMOVE(u);
                break;
        default:
                ast_log(LOG_ERROR, "Unknown internal error\n");
        }
        LOCAL_USER_REMOVE(u);
-       return buf;
+
+       return ret;
 }
 
 struct ast_custom_function acf_sort = {
 }
 
 struct ast_custom_function acf_sort = {
@@ -310,9 +307,9 @@ struct ast_custom_function acf_cut = {
 
 int unload_module(void)
 {
 
 int unload_module(void)
 {
-       int res;
+       int res = 0;
 
 
-       res = ast_custom_function_unregister(&acf_cut);
+       res |= ast_custom_function_unregister(&acf_cut);
        res |= ast_custom_function_unregister(&acf_sort);
 
        STANDARD_HANGUP_LOCALUSERS;
        res |= ast_custom_function_unregister(&acf_sort);
 
        STANDARD_HANGUP_LOCALUSERS;
@@ -322,9 +319,9 @@ int unload_module(void)
 
 int load_module(void)
 {
 
 int load_module(void)
 {
-       int res;
+       int res = 0;
 
 
-       res = ast_custom_function_register(&acf_cut);
+       res |= ast_custom_function_register(&acf_cut);
        res |= ast_custom_function_register(&acf_sort);
 
        return res;
        res |= ast_custom_function_register(&acf_sort);
 
        return res;