Fix description text for IF function. (Bug #4966)
[asterisk/asterisk.git] / funcs / func_logic.c
1 /*
2  * Asterisk -- A telephony toolkit for Linux.
3  *
4  * Conditional logic dialplan functions
5  * 
6  * Copyright (C) 2005, Digium, Inc.
7  * Portions Copyright (C) 2005, Anthony Minessale II
8  *
9  * This program is free software, distributed under the terms of
10  * the GNU General Public License
11  */
12
13 #include <stdlib.h>
14 #include <string.h>
15 #include <sys/types.h>
16
17 #include "asterisk.h"
18
19 /* ASTERISK_FILE_VERSION(__FILE__, "$Revision$") */
20
21 #include "asterisk/channel.h"
22 #include "asterisk/pbx.h"
23 #include "asterisk/logger.h"
24 #include "asterisk/utils.h"
25 #include "asterisk/app.h"
26 #include "asterisk/config.h"            /* for ast_true */
27
28 static char *builtin_function_isnull(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) 
29 {
30         return data && *data ? "0" : "1";
31 }
32
33 static char *builtin_function_exists(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) 
34 {
35         return data && *data ? "1" : "0";
36 }
37
38 static char *builtin_function_iftime(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) 
39 {
40         struct ast_timing timing;
41         char *ret;
42         char *expr;
43         char *iftrue;
44         char *iffalse;
45
46         if (!(data = ast_strdupa(data))) {
47                 ast_log(LOG_WARNING, "Memory Error!\n");
48                 return NULL;
49         }
50
51         data = ast_strip_quoted(data, "\"", "\"");
52         expr = strsep(&data, "?");
53         iftrue = strsep(&data, ":");
54         iffalse = data;
55
56         if (!expr || ast_strlen_zero(expr) || !(iftrue || iffalse)) {
57                 ast_log(LOG_WARNING, "Syntax IFTIME(<timespec>?[<true>][:<false>])\n");
58                 return NULL;
59         }
60
61         if (!ast_build_timing(&timing, expr)) {
62                 ast_log(LOG_WARNING, "Invalid Time Spec.\n");
63                 return NULL;
64         }
65
66         if (iftrue)
67                 iftrue = ast_strip_quoted(iftrue, "\"", "\"");
68         if (iffalse)
69                 iffalse = ast_strip_quoted(iffalse, "\"", "\"");
70
71         if ((ret = ast_check_timing(&timing) ? iftrue : iffalse)) {
72                 ast_copy_string(buf, ret, len);
73                 ret = buf;
74         } 
75         
76         return ret;
77 }
78
79 static char *builtin_function_if(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) 
80 {
81         char *ret;
82         char *expr;
83         char *iftrue;
84         char *iffalse;
85
86         if (!(data = ast_strdupa(data))) {
87                 ast_log(LOG_WARNING, "Memory Error!\n");
88                 return NULL;
89         }
90
91         data = ast_strip_quoted(data, "\"", "\"");
92         expr = strsep(&data, "?");
93         iftrue = strsep(&data, ":");
94         iffalse = data;
95
96         if (!expr || ast_strlen_zero(expr) || !(iftrue || iffalse)) {
97                 ast_log(LOG_WARNING, "Syntax IF(<expr>?[<true>][:<false>])\n");
98                 return NULL;
99         }
100
101         if (iftrue)
102                 iftrue = ast_strip_quoted(iftrue, "\"", "\"");
103         if (iffalse)
104                 iffalse = ast_strip_quoted(iffalse, "\"", "\"");
105
106         if ((ret = ast_true(expr) ? iftrue : iffalse)) {
107                 ast_copy_string(buf, ret, len);
108                 ret = buf;
109         } 
110         
111         return ret;
112 }
113
114 static char *builtin_function_set(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) 
115 {
116         char *varname;
117         char *val;
118
119         if (!(data = ast_strdupa(data))) {
120                 ast_log(LOG_WARNING, "Memory Error!\n");
121                 return NULL;
122         }
123
124         varname = strsep(&data, "=");
125         val = data;
126
127         if (!varname || ast_strlen_zero(varname) || !val) {
128                 ast_log(LOG_WARNING, "Syntax SET(<varname>=[<value>])\n");
129                 return NULL;
130         }
131
132         varname = ast_strip(varname);
133         val = ast_strip(val);
134         pbx_builtin_setvar_helper(chan, varname, val);
135         ast_copy_string(buf, val, len);
136
137         return buf;
138 }
139
140 #ifndef BUILTIN_FUNC
141 static
142 #endif
143 struct ast_custom_function isnull_function = {
144         .name = "ISNULL",
145         .synopsis = "NULL Test: Returns 1 if NULL or 0 otherwise",
146         .syntax = "ISNULL(<data>)",
147         .read = builtin_function_isnull,
148 };
149
150 #ifndef BUILTIN_FUNC
151 static
152 #endif
153 struct ast_custom_function set_function = {
154         .name = "SET",
155         .synopsis = "SET assigns a value to a channel variable",
156         .syntax = "SET(<varname>=[<value>])",
157         .read = builtin_function_set,
158 };
159
160 #ifndef BUILTIN_FUNC
161 static
162 #endif
163 struct ast_custom_function exists_function = {
164         .name = "EXISTS",
165         .synopsis = "Existence Test: Returns 1 if exists, 0 otherwise",
166         .syntax = "EXISTS(<data>)",
167         .read = builtin_function_exists,
168 };
169
170 #ifndef BUILTIN_FUNC
171 static
172 #endif
173 struct ast_custom_function if_function = {
174         .name = "IF",
175         .synopsis = "Conditional: Returns the data following '?' if true else the data following ':'",
176         .syntax = "IF(<expr>?[<true>][:<false>])",
177         .read = builtin_function_if,
178 };
179
180
181 #ifndef BUILTIN_FUNC
182 static
183 #endif
184 struct ast_custom_function if_time_function = {
185         .name = "IFTIME",
186         .synopsis = "Temporal Conditional: Returns the data following '?' if true else the data following ':'",
187         .syntax = "IFTIME(<timespec>?[<true>][:<false>])",
188         .read = builtin_function_iftime,
189 };