Skip to content
Snippets Groups Projects
Commit b364c1b9 authored by Kevin P. Fleming's avatar Kevin P. Fleming
Browse files

clean up logic functions code and help texts

add IFTIME function (bug #4394, with mods)


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@5836 65c4cc65-6c06-0410-ace0-fbb531ad65f3
parent a198e5af
Branches
Tags
No related merge requests found
...@@ -23,82 +23,114 @@ ...@@ -23,82 +23,114 @@
static char *builtin_function_isnull(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) static char *builtin_function_isnull(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
{ {
char *ret_true = "1", *ret_false = "0"; return data && *data ? "0" : "1";
return data && *data ? ret_false : ret_true;
} }
static char *builtin_function_exists(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) static char *builtin_function_exists(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
{ {
char *ret_true = "1", *ret_false = "0"; return data && *data ? "1" : "0";
}
return data && *data ? ret_true : ret_false; static char *builtin_function_iftime(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
{
struct ast_timing timing;
char *ret;
char *expr;
char *iftrue;
char *iffalse;
if (!(data = ast_strdupa(data))) {
ast_log(LOG_WARNING, "Memory Error!\n");
return NULL;
}
data = ast_strip_quoted(data, "\"", "\"");
expr = strsep(&data, "?");
iftrue = strsep(&data, ":");
iffalse = data;
if (!expr || ast_strlen_zero(expr) || !(iftrue || iffalse)) {
ast_log(LOG_WARNING, "Syntax IFTIME(<timespec>?[<true>][:<false>])\n");
return NULL;
}
if (!ast_build_timing(&timing, expr)) {
ast_log(LOG_WARNING, "Invalid Time Spec.\n");
return NULL;
}
if (iftrue)
iftrue = ast_strip_quoted(iftrue, "\"", "\"");
if (iffalse)
iffalse = ast_strip_quoted(iffalse, "\"", "\"");
if ((ret = ast_check_timing(&timing) ? iftrue : iffalse)) {
ast_copy_string(buf, ret, len);
ret = buf;
}
return ret;
} }
static char *builtin_function_if(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) static char *builtin_function_if(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
{ {
char *ret = NULL; char *ret;
char *mydata = NULL; char *expr;
char *expr = NULL; char *iftrue;
char *iftrue = NULL; char *iffalse;
char *iffalse = NULL;
if (!(data = ast_strdupa(data))) {
if((mydata = ast_strdupa(data))) {
expr = mydata;
if ((iftrue = strchr(mydata, '?'))) {
*iftrue = '\0';
iftrue++;
if ((iffalse = strchr(iftrue, ':'))) {
*iffalse = '\0';
iffalse++;
}
}
if (expr && iftrue) {
expr = ast_strip_quoted(expr, "\"", "\"");
iftrue = ast_strip_quoted(iftrue, "\"", "\"");
if (iffalse) {
iffalse = ast_strip_quoted(iffalse, "\"", "\"");
}
ret = ast_true(expr) ? iftrue : iffalse;
if (ret) {
ast_copy_string(buf, ret, len);
ret = buf;
}
} else {
ast_log(LOG_WARNING, "Syntax $(if <expr>?[<truecond>][:<falsecond>])\n");
ret = NULL;
}
} else {
ast_log(LOG_WARNING, "Memory Error!\n"); ast_log(LOG_WARNING, "Memory Error!\n");
ret = NULL; return NULL;
} }
data = ast_strip_quoted(data, "\"", "\"");
expr = strsep(&data, "?");
iftrue = strsep(&data, ":");
iffalse = data;
if (!expr || ast_strlen_zero(expr) || !(iftrue || iffalse)) {
ast_log(LOG_WARNING, "Syntax IF(<timespec>?[<true>][:<false>])\n");
return NULL;
}
if (iftrue)
iftrue = ast_strip_quoted(iftrue, "\"", "\"");
if (iffalse)
iffalse = ast_strip_quoted(iffalse, "\"", "\"");
if ((ret = ast_true(expr) ? iftrue : iffalse)) {
ast_copy_string(buf, ret, len);
ret = buf;
}
return ret; return ret;
} }
static char *builtin_function_set(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) static char *builtin_function_set(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
{ {
char *ret = NULL, *varname, *val; char *varname;
char *val;
if ((varname = ast_strdupa(data))) {
if ((val = strchr(varname, '='))) {
*val = '\0';
val++;
varname = ast_strip(varname);
val = ast_strip(val);
pbx_builtin_setvar_helper(chan, varname, val);
ast_copy_string(buf, val, len);
} else {
ast_log(LOG_WARNING, "Syntax Error!\n");
}
} else {
ast_log(LOG_WARNING, "Memory Error!\n");
}
return ret; if (!(data = ast_strdupa(data))) {
ast_log(LOG_WARNING, "Memory Error!\n");
return NULL;
}
varname = strsep(&data, "=");
val = data;
if (!varname || ast_strlen_zero(varname) || !val) {
ast_log(LOG_WARNING, "Syntax SET(<varname>=[<value>])\n");
return NULL;
}
varname = ast_strip(varname);
val = ast_strip(val);
pbx_builtin_setvar_helper(chan, varname, val);
ast_copy_string(buf, val, len);
return buf;
} }
#ifndef BUILTIN_FUNC #ifndef BUILTIN_FUNC
...@@ -116,8 +148,8 @@ static ...@@ -116,8 +148,8 @@ static
#endif #endif
struct ast_custom_function set_function = { struct ast_custom_function set_function = {
.name = "SET", .name = "SET",
.synopsis = "SET assigns a value to a function call.", .synopsis = "SET assigns a value to a channel variable",
.syntax = "SET(<varname>=<value>)", .syntax = "SET(<varname>=[<value>])",
.read = builtin_function_set, .read = builtin_function_set,
}; };
...@@ -137,6 +169,17 @@ static ...@@ -137,6 +169,17 @@ static
struct ast_custom_function if_function = { struct ast_custom_function if_function = {
.name = "IF", .name = "IF",
.synopsis = "Conditional: Returns the data following '?' if true else the data following ':'", .synopsis = "Conditional: Returns the data following '?' if true else the data following ':'",
.syntax = "IF(<expr>?<true>:<false>)", .syntax = "IF(<expr>?[<true>][:<false>])",
.read = builtin_function_if, .read = builtin_function_if,
}; };
#ifndef BUILTIN_FUNC
static
#endif
struct ast_custom_function if_time_function = {
.name = "IFTIME",
.synopsis = "Temporal Conditional: Returns the data following '?' if true else the data following ':'",
.syntax = "IFTIME(<timespec>?[<true>][:<false>])",
.read = builtin_function_iftime,
};
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment