major re-work of dialplan functions, including:
[asterisk/asterisk.git] / funcs / func_logic.c
1 /*
2  * Asterisk -- A telephony toolkit for Linux.
3  *
4  * MD5 digest related dialplan functions
5  * 
6  * Copyright (C) 2005, Digium, Inc.
7  *
8  * This program is free software, distributed under the terms of
9  * the GNU General Public License
10  */
11
12 #include <stdlib.h>
13 #include <string.h>
14 #include <sys/types.h>
15
16 #include "asterisk/channel.h"
17 #include "asterisk/pbx.h"
18 #include "asterisk/logger.h"
19 #include "asterisk/utils.h"
20 #include "asterisk/app.h"
21 #include "asterisk/config.h"            /* for ast_true */
22
23 static char *builtin_function_isnull(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) 
24 {
25         char *ret_true = "1", *ret_false = "0";
26
27         return data && *data ? ret_false : ret_true;
28 }
29
30 static char *builtin_function_exists(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) 
31 {
32         char *ret_true = "1", *ret_false = "0";
33
34         return data && *data ? ret_true : ret_false;
35 }
36
37 static char *builtin_function_if(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) 
38 {
39         char *ret = NULL;
40         char *mydata = NULL;
41         char *expr = NULL;
42         char *iftrue = NULL;
43         char *iffalse = NULL;
44
45         if((mydata = ast_strdupa(data))) {
46                 expr = mydata;
47                 if ((iftrue = strchr(mydata, '?'))) {
48                         *iftrue = '\0';
49                         iftrue++;
50                         if ((iffalse = strchr(iftrue, ':'))) {
51                                 *iffalse = '\0';
52                                 iffalse++;
53                         }
54                 } else 
55                         iffalse = "";
56                 if (expr && iftrue) {
57                         ret = ast_true(expr) ? iftrue : iffalse;
58                         strncpy(buf, ret, len);
59                         ret = buf;
60                 } else {
61                         ast_log(LOG_WARNING, "Syntax $(if <expr>?[<truecond>][:<falsecond>])\n");
62                         ret = NULL;
63                 }
64         } else {
65                 ast_log(LOG_WARNING, "Memory Error!\n");
66                 ret = NULL;
67         }
68
69         return ret;
70 }
71
72 #ifndef BUILTIN_FUNC
73 static
74 #endif
75 struct ast_custom_function isnull_function = {
76         .name = "ISNULL",
77         .synopsis = "NULL Test: Returns 1 if NULL or 0 otherwise",
78         .syntax = "ISNULL(<data>)",
79         .read = builtin_function_isnull,
80 };
81
82 #ifndef BUILTIN_FUNC
83 static
84 #endif
85 struct ast_custom_function exists_function = {
86         .name = "EXISTS",
87         .synopsis = "Existence Test: Returns 1 if exists, 0 otherwise",
88         .syntax = "EXISTS(<data>)",
89         .read = builtin_function_exists,
90 };
91
92 #ifndef BUILTIN_FUNC
93 static
94 #endif
95 struct ast_custom_function if_function = {
96         .name = "IF",
97         .synopsis = "Conditional: Returns the data following '?' if true else the data following ':'",
98         .syntax = "IF(<expr>?<true>:<false>)",
99         .read = builtin_function_if,
100 };