Fix ael if, while, else (bug #5370)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@6756 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.2-netsec
Mark Spencer 20 years ago
parent f48b822a20
commit 7c99490b3a

@ -188,9 +188,9 @@ static char *grab_else(char *args, const char *filename, int lineno)
if (aeldebug & DEBUG_TOKENS) if (aeldebug & DEBUG_TOKENS)
ast_verbose("Returning else clause '%s'\n", c); ast_verbose("Returning else clause '%s'\n", c);
} }
}
break; break;
} }
}
c++; c++;
} }
} }
@ -457,6 +457,27 @@ static int matches_label(char *data, char **rest)
return 0; 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);
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 */ /* Switch */
args = data + strlen("switch"); args = data + strlen("switch");
while ((*args < 33) && (*args != '(')) args++; while ((*args < 33) && (*args != '(')) args++;
if ((*args == '(') && (c = strchr(args, ')'))) { if ((*args == '(') && (c = argument_end(args))) {
args++; args++;
*c = '\0'; *c = '\0';
c++; c++;
@ -570,7 +591,7 @@ static int __build_step(const char *what, const char *name, const char *filename
/* If... */ /* If... */
args = data + strlen("if"); args = data + strlen("if");
while ((*args < 33) && (*args != '(')) args++; while ((*args < 33) && (*args != '(')) args++;
if ((*args == '(') && (c = strchr(args, ')'))) { if ((*args == '(') && (c = argument_end(args))) {
int ifblock; int ifblock;
int ifstart; int ifstart;
int elsestart; int elsestart;
@ -632,7 +653,7 @@ static int __build_step(const char *what, const char *name, const char *filename
fillin = NULL; fillin = NULL;
args = data + strlen("while"); args = data + strlen("while");
while ((*args < 33) && (*args != '(')) args++; while ((*args < 33) && (*args != '(')) args++;
if ((*args == '(') && (c = strchr(args, ')'))) { if ((*args == '(') && (c = argument_end(args))) {
int whileblock; int whileblock;
int whilestart; int whilestart;
int whileend; int whileend;
@ -720,7 +741,7 @@ static int __build_step(const char *what, const char *name, const char *filename
fillin = NULL; fillin = NULL;
args = data + strlen("for"); args = data + strlen("for");
while ((*args < 33) && (*args != '(')) args++; while ((*args < 33) && (*args != '(')) args++;
if ((*args == '(') && (c = strchr(args, ')'))) { if ((*args == '(') && (c = argument_end(args))) {
int forblock; int forblock;
int forprep; int forprep;
int forstart; int forstart;
@ -1166,15 +1187,6 @@ static int ast_ael_compile(struct ast_context **local_contexts, const char *file
return 0; return 0;
} }
/*
* Standard module functions ...
*/
int unload_module(void)
{
ast_context_destroy(NULL, registrar);
return 0;
}
static int pbx_load_module(void) static int pbx_load_module(void)
{ {
struct ast_context *local_contexts=NULL, *con; struct ast_context *local_contexts=NULL, *con;
@ -1186,21 +1198,75 @@ static int pbx_load_module(void)
return 0; 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;
}
static int ael_debug_tokens(int fd, int argc, char *argv[])
{
aeldebug |= DEBUG_TOKENS;
return 0; return 0;
} }
int reload(void) 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); ast_context_destroy(NULL, registrar);
/* For martin's global variables, don't clear them on reload */ ast_cli_unregister_multiple(ael_cli, sizeof(ael_cli)/ sizeof(ael_cli[0]));
pbx_load_module();
return 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) int usecount(void)
{ {
return 0; return 0;

Loading…
Cancel
Save