From 7c99490b3aebefdcfbf17e1f9f18cdfe4b3004ae Mon Sep 17 00:00:00 2001 From: Mark Spencer Date: Thu, 13 Oct 2005 15:36:29 +0000 Subject: Fix ael if, while, else (bug #5370) git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@6756 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- pbx/pbx_ael.c | 106 +++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 86 insertions(+), 20 deletions(-) (limited to 'pbx/pbx_ael.c') diff --git a/pbx/pbx_ael.c b/pbx/pbx_ael.c index 03c6311ae..97fbc8455 100755 --- a/pbx/pbx_ael.c +++ b/pbx/pbx_ael.c @@ -188,8 +188,8 @@ static char *grab_else(char *args, const char *filename, int lineno) if (aeldebug & DEBUG_TOKENS) ast_verbose("Returning else clause '%s'\n", c); } + break; } - break; } c++; } @@ -457,6 +457,27 @@ static int matches_label(char *data, char **rest) return 0; } +static char *argument_end(char *str) +{ + int level=0; + while(*++str) { + switch(*str) { + case '(': + level++; + break; + case ')': + if(level) + level--; + else + return str; + break; + default: + break; + } + } + return NULL; +} + static int build_step(const char *what, const char *name, const char *filename, int lineno, struct ast_context *con, char *exten, int *pos, char *data, struct fillin **fillout, char **label); static int __build_step(const char *what, const char *name, const char *filename, int lineno, struct ast_context *con, char *exten, int *pos, char *data, struct fillin **fillout, char **label) { @@ -485,7 +506,7 @@ static int __build_step(const char *what, const char *name, const char *filename /* Switch */ args = data + strlen("switch"); while ((*args < 33) && (*args != '(')) args++; - if ((*args == '(') && (c = strchr(args, ')'))) { + if ((*args == '(') && (c = argument_end(args))) { args++; *c = '\0'; c++; @@ -570,7 +591,7 @@ static int __build_step(const char *what, const char *name, const char *filename /* If... */ args = data + strlen("if"); while ((*args < 33) && (*args != '(')) args++; - if ((*args == '(') && (c = strchr(args, ')'))) { + if ((*args == '(') && (c = argument_end(args))) { int ifblock; int ifstart; int elsestart; @@ -632,7 +653,7 @@ static int __build_step(const char *what, const char *name, const char *filename fillin = NULL; args = data + strlen("while"); while ((*args < 33) && (*args != '(')) args++; - if ((*args == '(') && (c = strchr(args, ')'))) { + if ((*args == '(') && (c = argument_end(args))) { int whileblock; int whilestart; int whileend; @@ -720,7 +741,7 @@ static int __build_step(const char *what, const char *name, const char *filename fillin = NULL; args = data + strlen("for"); while ((*args < 33) && (*args != '(')) args++; - if ((*args == '(') && (c = strchr(args, ')'))) { + if ((*args == '(') && (c = argument_end(args))) { int forblock; int forprep; int forstart; @@ -1166,15 +1187,6 @@ static int ast_ael_compile(struct ast_context **local_contexts, const char *file return 0; } -/* - * Standard module functions ... - */ -int unload_module(void) -{ - ast_context_destroy(NULL, registrar); - return 0; -} - static int pbx_load_module(void) { struct ast_context *local_contexts=NULL, *con; @@ -1186,21 +1198,75 @@ static int pbx_load_module(void) return 0; } -int load_module(void) +/* CLI interface */ +static int ael_debug_read(int fd, int argc, char *argv[]) { - if (pbx_load_module()) return -1; - + aeldebug |= DEBUG_READ; return 0; } -int reload(void) +static int ael_debug_tokens(int fd, int argc, char *argv[]) +{ + aeldebug |= DEBUG_TOKENS; + return 0; +} + +static int ael_debug_macros(int fd, int argc, char *argv[]) +{ + aeldebug |= DEBUG_MACROS; + return 0; +} + +static int ael_debug_contexts(int fd, int argc, char *argv[]) +{ + aeldebug |= DEBUG_CONTEXTS; + return 0; +} + +static int ael_no_debug(int fd, int argc, char *argv[]) +{ + aeldebug = 0; + return 0; +} + +static int ael_reload(int fd, int argc, char *argv[]) +{ + ast_context_destroy(NULL, registrar); + return (pbx_load_module()); +} + +static struct ast_cli_entry ael_cli[] = { + { { "ael", "reload", NULL }, ael_reload, "Reload AEL configuration"}, + { { "ael", "debug", "read", NULL }, ael_debug_read, "Enable AEL read debug"}, + { { "ael", "debug", "tokens", NULL }, ael_debug_tokens, "Enable AEL tokens debug"}, + { { "ael", "debug", "macros", NULL }, ael_debug_macros, "Enable AEL macros debug"}, + { { "ael", "debug", "contexts", NULL }, ael_debug_contexts, "Enable AEL contexts debug"}, + { { "ael", "no", "debug", NULL }, ael_no_debug, "Disable AEL debug messages"}, +}; + +/* + * Standard module functions ... + */ +int unload_module(void) { ast_context_destroy(NULL, registrar); - /* For martin's global variables, don't clear them on reload */ - pbx_load_module(); + ast_cli_unregister_multiple(ael_cli, sizeof(ael_cli)/ sizeof(ael_cli[0])); return 0; } + +int load_module(void) +{ + ast_cli_register_multiple(ael_cli, sizeof(ael_cli)/ sizeof(ael_cli[0])); + return (pbx_load_module()); +} + +int reload(void) +{ + unload_module(); + return (load_module()); +} + int usecount(void) { return 0; -- cgit v1.2.3