Merged revisions 162013 via svnmerge from

https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r162013 | murf | 2008-12-09 09:31:55 -0700 (Tue, 09 Dec 2008) | 45 lines

(closes issue #14019)
Reported by: ckjohnsonme
Patches:
      14019.diff uploaded by murf (license 17)
Tested by: ckjohnsonme, murf

This crash was the result of a few small errors that
would combine in 64-bit land to result in a crash.

32-bit land might have seen these combine to mysteriously
drop the args to an application call, in certain
circumstances.

Also, in trying to find this bug, I spotted
a situation in the flex input, where, in passing
back a 'word' to the parser, it would allocate
a buffer larger than necessary. I changed the
usage in such situations, so that strdup was
not used, but rather, an ast_malloc, followed
by ast_copy_string.

I removed a field from the pval struct, in
u2, that was never getting used, and set in
one spot in the code. I believe it was an
artifact of a previous fix to make switch
cases work invisibly with extens.

And, for goto's I removed a '!' from
before a strcmp, that has been there
since the initial merging of AEL2, that
might prevent the proper target of a 
goto from being found. This was pretty
harmless on its own, as it would just
louse up a consistency check for users.

Many thanks to ckjohnsonme for providing
a simplified and complete set of information
about the bug, that helped considerably in
finding and fixing the problem.

Now, to get aelparse up and running again
in trunk, and out of its "horribly broken" state,
so I can run the regression suite!


........


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@162079 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.6.2
Steve Murphy 17 years ago
parent e1ff75c37c
commit 67cb0526b7

@ -69,7 +69,6 @@ struct pval
struct pval *statements; /* used in case, default, catch, while's statement, CONTEXT elements, GLOBALS */ struct pval *statements; /* used in case, default, catch, while's statement, CONTEXT elements, GLOBALS */
char *val; /* used in VARDEC */ char *val; /* used in VARDEC */
char *for_test; /* used in FOR */ char *for_test; /* used in FOR */
int label_in_case; /* a boolean for LABELs */
struct pval *goto_target; /* used in GOTO */ struct pval *goto_target; /* used in GOTO */
} u2; } u2;

@ -308,8 +308,8 @@ includes { STORE_POS; return KW_INCLUDES;}
/* a non-word constituent char, like a space, tab, curly, paren, etc */ /* a non-word constituent char, like a space, tab, curly, paren, etc */
char c = yytext[yyleng-1]; char c = yytext[yyleng-1];
STORE_POS; STORE_POS;
yylval->str = strdup(yytext); yylval->str = ast_malloc(yyleng);
yylval->str[yyleng-1] = 0; ast_copy_string(yylval->str, yytext, yyleng);
unput(c); /* put this ending char back in the stream */ unput(c); /* put this ending char back in the stream */
BEGIN(0); BEGIN(0);
return word; return word;
@ -321,7 +321,8 @@ includes { STORE_POS; return KW_INCLUDES;}
STORE_LOC; STORE_LOC;
ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched ')' in expression: %s !\n", my_file, my_lineno, my_col, yytext); ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched ')' in expression: %s !\n", my_file, my_lineno, my_col, yytext);
BEGIN(0); BEGIN(0);
yylval->str = strdup(yytext); yylval->str = ast_malloc(yyleng+1);
ast_copy_string(yylval->str, yytext, yyleng+1);
return word; return word;
} }
parencount2--; parencount2--;
@ -348,7 +349,8 @@ includes { STORE_POS; return KW_INCLUDES;}
ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched '%c' in expression!\n", ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched '%c' in expression!\n",
my_file, my_lineno, my_col, c); my_file, my_lineno, my_col, c);
BEGIN(0); BEGIN(0);
yylval->str = strdup(yytext); yylval->str = ast_malloc(yyleng+1);
ast_copy_string(yylval->str, yytext, yyleng+1);
return word; return word;
} }
yymore(); yymore();
@ -360,7 +362,8 @@ includes { STORE_POS; return KW_INCLUDES;}
STORE_LOC; STORE_LOC;
ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched ')' in expression: %s !\n", my_file, my_lineno, my_col, yytext); ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched ')' in expression: %s !\n", my_file, my_lineno, my_col, yytext);
BEGIN(0); BEGIN(0);
yylval->str = strdup(yytext); yylval->str = ast_malloc(yyleng+1);
ast_copy_string(yylval->str, yytext, yyleng+1);
return word; return word;
} }
parencount3--; parencount3--;
@ -387,7 +390,8 @@ includes { STORE_POS; return KW_INCLUDES;}
ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched '%c' in expression!\n", ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched '%c' in expression!\n",
my_file, my_lineno, my_col, c); my_file, my_lineno, my_col, c);
BEGIN(0); BEGIN(0);
yylval->str = strdup(yytext); yylval->str = ast_malloc(yyleng+1);
ast_copy_string(yylval->str, yytext, yyleng+1);
return word; return word;
} }
yymore(); yymore();
@ -406,7 +410,8 @@ includes { STORE_POS; return KW_INCLUDES;}
STORE_LOC; STORE_LOC;
ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched ')' in expression: %s !\n", my_file, my_lineno, my_col, yytext); ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched ')' in expression: %s !\n", my_file, my_lineno, my_col, yytext);
BEGIN(0); BEGIN(0);
yylval->str = strdup(yytext); yylval->str = ast_malloc(yyleng+1);
ast_copy_string(yylval->str, yytext, yyleng+1);
prev_word = 0; prev_word = 0;
return word; return word;
} }
@ -415,8 +420,8 @@ includes { STORE_POS; return KW_INCLUDES;}
yymore(); yymore();
} else { } else {
STORE_LOC; STORE_LOC;
yylval->str = strdup(yytext); yylval->str = ast_malloc(yyleng);
yylval->str[yyleng-1] = '\0'; /* trim trailing ')' */ ast_copy_string(yylval->str, yytext, yyleng);
unput(')'); unput(')');
BEGIN(0); BEGIN(0);
return word; return word;
@ -438,7 +443,8 @@ includes { STORE_POS; return KW_INCLUDES;}
ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched '%c' in expression!\n", ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched '%c' in expression!\n",
my_file, my_lineno, my_col, c); my_file, my_lineno, my_col, c);
BEGIN(0); BEGIN(0);
yylval->str = strdup(yytext); yylval->str = ast_malloc(yyleng+1);
ast_copy_string(yylval->str, yytext, yyleng+1);
return word; return word;
} }
yymore(); yymore();
@ -466,7 +472,8 @@ includes { STORE_POS; return KW_INCLUDES;}
STORE_LOC; STORE_LOC;
ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched ')' in expression!\n", my_file, my_lineno, my_col); ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched ')' in expression!\n", my_file, my_lineno, my_col);
BEGIN(0); BEGIN(0);
yylval->str = strdup(yytext); yylval->str = ast_malloc(yyleng+1);
ast_copy_string(yylval->str, yytext, yyleng+1);
return word; return word;
} }
@ -478,7 +485,8 @@ includes { STORE_POS; return KW_INCLUDES;}
BEGIN(0); BEGIN(0);
if ( !strcmp(yytext, ")") ) if ( !strcmp(yytext, ")") )
return RP; return RP;
yylval->str = strdup(yytext); yylval->str = ast_malloc(yyleng);
ast_copy_string(yylval->str, yytext, yyleng);
yylval->str[yyleng-1] = '\0'; /* trim trailing ')' */ yylval->str[yyleng-1] = '\0'; /* trim trailing ')' */
unput(')'); unput(')');
return word; return word;
@ -486,14 +494,14 @@ includes { STORE_POS; return KW_INCLUDES;}
} }
<argg>{NOARGG}\, { <argg>{NOARGG}\, {
if( parencount != 0) { /* printf("Folding in a comma!\n"); */ if( parencount != 0) { /* ast_log(LOG_NOTICE,"Folding in a comma!\n"); */
yymore(); yymore();
} else { } else {
STORE_LOC; STORE_LOC;
if( !strcmp(yytext,"," ) ) if( !strcmp(yytext,"," ) )
return COMMA; return COMMA;
yylval->str = strdup(yytext); yylval->str = ast_malloc(yyleng);
yylval->str[yyleng-1] = '\0'; ast_copy_string(yylval->str, yytext, yyleng);
unput(','); unput(',');
return word; return word;
} }
@ -505,7 +513,8 @@ includes { STORE_POS; return KW_INCLUDES;}
STORE_LOC; STORE_LOC;
ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched '%c' in expression!\n", my_file, my_lineno, my_col, c); ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched '%c' in expression!\n", my_file, my_lineno, my_col, c);
BEGIN(0); BEGIN(0);
yylval->str = strdup(yytext); yylval->str = ast_malloc(yyleng+1);
ast_copy_string(yylval->str, yytext, yyleng+1);
return word; return word;
} }
yymore(); yymore();
@ -528,7 +537,8 @@ includes { STORE_POS; return KW_INCLUDES;}
STORE_LOC; STORE_LOC;
ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched '%c' in expression!\n", my_file, my_lineno, my_col, c); ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched '%c' in expression!\n", my_file, my_lineno, my_col, c);
BEGIN(0); BEGIN(0);
yylval->str = strdup(yytext); yylval->str = ast_malloc(yyleng+1);
ast_copy_string(yylval->str, yytext, yyleng+1);
return word; return word;
} }
yymore(); yymore();
@ -536,8 +546,8 @@ includes { STORE_POS; return KW_INCLUDES;}
<semic>{NOSEMIC}; { <semic>{NOSEMIC}; {
STORE_LOC; STORE_LOC;
yylval->str = strdup(yytext); yylval->str = ast_malloc(yyleng);
yylval->str[yyleng-1] = '\0'; ast_copy_string(yylval->str, yytext, yyleng);
unput(';'); unput(';');
BEGIN(0); BEGIN(0);
return word; return word;

@ -1613,8 +1613,8 @@ YY_RULE_SETUP
/* a non-word constituent char, like a space, tab, curly, paren, etc */ /* a non-word constituent char, like a space, tab, curly, paren, etc */
char c = yytext[yyleng-1]; char c = yytext[yyleng-1];
STORE_POS; STORE_POS;
yylval->str = strdup(yytext); yylval->str = ast_malloc(yyleng);
yylval->str[yyleng-1] = 0; ast_copy_string(yylval->str, yytext, yyleng);
unput(c); /* put this ending char back in the stream */ unput(c); /* put this ending char back in the stream */
BEGIN(0); BEGIN(0);
return word; return word;
@ -1629,7 +1629,8 @@ YY_RULE_SETUP
STORE_LOC; STORE_LOC;
ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched ')' in expression: %s !\n", my_file, my_lineno, my_col, yytext); ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched ')' in expression: %s !\n", my_file, my_lineno, my_col, yytext);
BEGIN(0); BEGIN(0);
yylval->str = strdup(yytext); yylval->str = ast_malloc(yyleng+1);
ast_copy_string(yylval->str, yytext, yyleng+1);
return word; return word;
} }
parencount2--; parencount2--;
@ -1644,7 +1645,7 @@ YY_RULE_SETUP
case 59: case 59:
/* rule 59 can match eol */ /* rule 59 can match eol */
YY_RULE_SETUP YY_RULE_SETUP
#line 336 "ael.flex" #line 337 "ael.flex"
{ {
char c = yytext[yyleng-1]; char c = yytext[yyleng-1];
if (c == '{') if (c == '{')
@ -1656,7 +1657,7 @@ YY_RULE_SETUP
case 60: case 60:
/* rule 60 can match eol */ /* rule 60 can match eol */
YY_RULE_SETUP YY_RULE_SETUP
#line 344 "ael.flex" #line 345 "ael.flex"
{ {
char c = yytext[yyleng-1]; char c = yytext[yyleng-1];
if ( pbcpop2(c)) { /* error */ if ( pbcpop2(c)) { /* error */
@ -1664,7 +1665,8 @@ YY_RULE_SETUP
ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched '%c' in expression!\n", ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched '%c' in expression!\n",
my_file, my_lineno, my_col, c); my_file, my_lineno, my_col, c);
BEGIN(0); BEGIN(0);
yylval->str = strdup(yytext); yylval->str = ast_malloc(yyleng+1);
ast_copy_string(yylval->str, yytext, yyleng+1);
return word; return word;
} }
yymore(); yymore();
@ -1673,13 +1675,14 @@ YY_RULE_SETUP
case 61: case 61:
/* rule 61 can match eol */ /* rule 61 can match eol */
YY_RULE_SETUP YY_RULE_SETUP
#line 358 "ael.flex" #line 360 "ael.flex"
{ {
if ( pbcpop3(']') ) { /* error */ if ( pbcpop3(']') ) { /* error */
STORE_LOC; STORE_LOC;
ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched ')' in expression: %s !\n", my_file, my_lineno, my_col, yytext); ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched ')' in expression: %s !\n", my_file, my_lineno, my_col, yytext);
BEGIN(0); BEGIN(0);
yylval->str = strdup(yytext); yylval->str = ast_malloc(yyleng+1);
ast_copy_string(yylval->str, yytext, yyleng+1);
return word; return word;
} }
parencount3--; parencount3--;
@ -1694,7 +1697,7 @@ YY_RULE_SETUP
case 62: case 62:
/* rule 62 can match eol */ /* rule 62 can match eol */
YY_RULE_SETUP YY_RULE_SETUP
#line 375 "ael.flex" #line 378 "ael.flex"
{ {
char c = yytext[yyleng-1]; char c = yytext[yyleng-1];
if (c == '[') if (c == '[')
@ -1706,7 +1709,7 @@ YY_RULE_SETUP
case 63: case 63:
/* rule 63 can match eol */ /* rule 63 can match eol */
YY_RULE_SETUP YY_RULE_SETUP
#line 383 "ael.flex" #line 386 "ael.flex"
{ {
char c = yytext[yyleng-1]; char c = yytext[yyleng-1];
if ( pbcpop3(c)) { /* error */ if ( pbcpop3(c)) { /* error */
@ -1714,7 +1717,8 @@ YY_RULE_SETUP
ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched '%c' in expression!\n", ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched '%c' in expression!\n",
my_file, my_lineno, my_col, c); my_file, my_lineno, my_col, c);
BEGIN(0); BEGIN(0);
yylval->str = strdup(yytext); yylval->str = ast_malloc(yyleng+1);
ast_copy_string(yylval->str, yytext, yyleng+1);
return word; return word;
} }
yymore(); yymore();
@ -1730,13 +1734,14 @@ YY_RULE_SETUP
case 64: case 64:
/* rule 64 can match eol */ /* rule 64 can match eol */
YY_RULE_SETUP YY_RULE_SETUP
#line 404 "ael.flex" #line 408 "ael.flex"
{ {
if ( pbcpop(')') ) { /* error */ if ( pbcpop(')') ) { /* error */
STORE_LOC; STORE_LOC;
ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched ')' in expression: %s !\n", my_file, my_lineno, my_col, yytext); ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched ')' in expression: %s !\n", my_file, my_lineno, my_col, yytext);
BEGIN(0); BEGIN(0);
yylval->str = strdup(yytext); yylval->str = ast_malloc(yyleng+1);
ast_copy_string(yylval->str, yytext, yyleng+1);
prev_word = 0; prev_word = 0;
return word; return word;
} }
@ -1745,8 +1750,8 @@ YY_RULE_SETUP
yymore(); yymore();
} else { } else {
STORE_LOC; STORE_LOC;
yylval->str = strdup(yytext); yylval->str = ast_malloc(yyleng);
yylval->str[yyleng-1] = '\0'; /* trim trailing ')' */ ast_copy_string(yylval->str, yytext, yyleng);
unput(')'); unput(')');
BEGIN(0); BEGIN(0);
return word; return word;
@ -1756,7 +1761,7 @@ YY_RULE_SETUP
case 65: case 65:
/* rule 65 can match eol */ /* rule 65 can match eol */
YY_RULE_SETUP YY_RULE_SETUP
#line 426 "ael.flex" #line 431 "ael.flex"
{ {
char c = yytext[yyleng-1]; char c = yytext[yyleng-1];
if (c == '(') if (c == '(')
@ -1768,7 +1773,7 @@ YY_RULE_SETUP
case 66: case 66:
/* rule 66 can match eol */ /* rule 66 can match eol */
YY_RULE_SETUP YY_RULE_SETUP
#line 434 "ael.flex" #line 439 "ael.flex"
{ {
char c = yytext[yyleng-1]; char c = yytext[yyleng-1];
if ( pbcpop(c)) { /* error */ if ( pbcpop(c)) { /* error */
@ -1776,7 +1781,8 @@ YY_RULE_SETUP
ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched '%c' in expression!\n", ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched '%c' in expression!\n",
my_file, my_lineno, my_col, c); my_file, my_lineno, my_col, c);
BEGIN(0); BEGIN(0);
yylval->str = strdup(yytext); yylval->str = ast_malloc(yyleng+1);
ast_copy_string(yylval->str, yytext, yyleng+1);
return word; return word;
} }
yymore(); yymore();
@ -1793,7 +1799,7 @@ YY_RULE_SETUP
case 67: case 67:
/* rule 67 can match eol */ /* rule 67 can match eol */
YY_RULE_SETUP YY_RULE_SETUP
#line 456 "ael.flex" #line 462 "ael.flex"
{ {
char c = yytext[yyleng-1]; char c = yytext[yyleng-1];
if (c == '(') if (c == '(')
@ -1805,13 +1811,14 @@ YY_RULE_SETUP
case 68: case 68:
/* rule 68 can match eol */ /* rule 68 can match eol */
YY_RULE_SETUP YY_RULE_SETUP
#line 464 "ael.flex" #line 470 "ael.flex"
{ {
if ( pbcpop(')') ) { /* error */ if ( pbcpop(')') ) { /* error */
STORE_LOC; STORE_LOC;
ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched ')' in expression!\n", my_file, my_lineno, my_col); ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched ')' in expression!\n", my_file, my_lineno, my_col);
BEGIN(0); BEGIN(0);
yylval->str = strdup(yytext); yylval->str = ast_malloc(yyleng+1);
ast_copy_string(yylval->str, yytext, yyleng+1);
return word; return word;
} }
@ -1823,7 +1830,8 @@ YY_RULE_SETUP
BEGIN(0); BEGIN(0);
if ( !strcmp(yytext, ")") ) if ( !strcmp(yytext, ")") )
return RP; return RP;
yylval->str = strdup(yytext); yylval->str = ast_malloc(yyleng);
ast_copy_string(yylval->str, yytext, yyleng);
yylval->str[yyleng-1] = '\0'; /* trim trailing ')' */ yylval->str[yyleng-1] = '\0'; /* trim trailing ')' */
unput(')'); unput(')');
return word; return word;
@ -1833,16 +1841,16 @@ YY_RULE_SETUP
case 69: case 69:
/* rule 69 can match eol */ /* rule 69 can match eol */
YY_RULE_SETUP YY_RULE_SETUP
#line 488 "ael.flex" #line 496 "ael.flex"
{ {
if( parencount != 0) { /* printf("Folding in a comma!\n"); */ if( parencount != 0) { /* ast_log(LOG_NOTICE,"Folding in a comma!\n"); */
yymore(); yymore();
} else { } else {
STORE_LOC; STORE_LOC;
if( !strcmp(yytext,"," ) ) if( !strcmp(yytext,"," ) )
return COMMA; return COMMA;
yylval->str = strdup(yytext); yylval->str = ast_malloc(yyleng);
yylval->str[yyleng-1] = '\0'; ast_copy_string(yylval->str, yytext, yyleng);
unput(','); unput(',');
return word; return word;
} }
@ -1851,14 +1859,15 @@ YY_RULE_SETUP
case 70: case 70:
/* rule 70 can match eol */ /* rule 70 can match eol */
YY_RULE_SETUP YY_RULE_SETUP
#line 502 "ael.flex" #line 510 "ael.flex"
{ {
char c = yytext[yyleng-1]; char c = yytext[yyleng-1];
if ( pbcpop(c) ) { /* error */ if ( pbcpop(c) ) { /* error */
STORE_LOC; STORE_LOC;
ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched '%c' in expression!\n", my_file, my_lineno, my_col, c); ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched '%c' in expression!\n", my_file, my_lineno, my_col, c);
BEGIN(0); BEGIN(0);
yylval->str = strdup(yytext); yylval->str = ast_malloc(yyleng+1);
ast_copy_string(yylval->str, yytext, yyleng+1);
return word; return word;
} }
yymore(); yymore();
@ -1872,7 +1881,7 @@ YY_RULE_SETUP
case 71: case 71:
/* rule 71 can match eol */ /* rule 71 can match eol */
YY_RULE_SETUP YY_RULE_SETUP
#line 519 "ael.flex" #line 528 "ael.flex"
{ {
char c = yytext[yyleng-1]; char c = yytext[yyleng-1];
yymore(); yymore();
@ -1882,14 +1891,15 @@ YY_RULE_SETUP
case 72: case 72:
/* rule 72 can match eol */ /* rule 72 can match eol */
YY_RULE_SETUP YY_RULE_SETUP
#line 525 "ael.flex" #line 534 "ael.flex"
{ {
char c = yytext[yyleng-1]; char c = yytext[yyleng-1];
if ( pbcpop(c) ) { /* error */ if ( pbcpop(c) ) { /* error */
STORE_LOC; STORE_LOC;
ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched '%c' in expression!\n", my_file, my_lineno, my_col, c); ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched '%c' in expression!\n", my_file, my_lineno, my_col, c);
BEGIN(0); BEGIN(0);
yylval->str = strdup(yytext); yylval->str = ast_malloc(yyleng+1);
ast_copy_string(yylval->str, yytext, yyleng+1);
return word; return word;
} }
yymore(); yymore();
@ -1898,11 +1908,11 @@ YY_RULE_SETUP
case 73: case 73:
/* rule 73 can match eol */ /* rule 73 can match eol */
YY_RULE_SETUP YY_RULE_SETUP
#line 537 "ael.flex" #line 547 "ael.flex"
{ {
STORE_LOC; STORE_LOC;
yylval->str = strdup(yytext); yylval->str = ast_malloc(yyleng);
yylval->str[yyleng-1] = '\0'; ast_copy_string(yylval->str, yytext, yyleng);
unput(';'); unput(';');
BEGIN(0); BEGIN(0);
return word; return word;
@ -1911,7 +1921,7 @@ YY_RULE_SETUP
case 74: case 74:
/* rule 74 can match eol */ /* rule 74 can match eol */
YY_RULE_SETUP YY_RULE_SETUP
#line 546 "ael.flex" #line 556 "ael.flex"
{ {
char fnamebuf[1024],*p1,*p2; char fnamebuf[1024],*p1,*p2;
int glob_ret; int glob_ret;
@ -1964,7 +1974,7 @@ case YY_STATE_EOF(comment):
case YY_STATE_EOF(curlystate): case YY_STATE_EOF(curlystate):
case YY_STATE_EOF(wordstate): case YY_STATE_EOF(wordstate):
case YY_STATE_EOF(brackstate): case YY_STATE_EOF(brackstate):
#line 591 "ael.flex" #line 601 "ael.flex"
{ {
char fnamebuf[2048]; char fnamebuf[2048];
if (include_stack_index > 0 && include_stack[include_stack_index-1].globbuf_pos < include_stack[include_stack_index-1].globbuf.gl_pathc-1) { if (include_stack_index > 0 && include_stack[include_stack_index-1].globbuf_pos < include_stack[include_stack_index-1].globbuf.gl_pathc-1) {
@ -1999,10 +2009,10 @@ case YY_STATE_EOF(brackstate):
YY_BREAK YY_BREAK
case 75: case 75:
YY_RULE_SETUP YY_RULE_SETUP
#line 623 "ael.flex" #line 633 "ael.flex"
ECHO; ECHO;
YY_BREAK YY_BREAK
#line 2005 "ael_lex.c" #line 2015 "ael_lex.c"
case YY_END_OF_BUFFER: case YY_END_OF_BUFFER:
{ {
@ -3175,7 +3185,7 @@ void *ael_yyrealloc (void * ptr, yy_size_t size , yyscan_t yyscanner)
#define YYTABLES_NAME "yytables" #define YYTABLES_NAME "yytables"
#line 623 "ael.flex" #line 633 "ael.flex"

@ -695,7 +695,7 @@ static int extension_matches(pval *here, const char *exten, const char *pattern)
regex_t preg; regex_t preg;
/* simple case, they match exactly, the pattern and exten name */ /* simple case, they match exactly, the pattern and exten name */
if (!strcmp(pattern,exten) == 0) if (strcmp(pattern,exten) == 0)
return 1; return 1;
if (pattern[0] == '_') { if (pattern[0] == '_') {
@ -3441,7 +3441,7 @@ static void gen_prios(struct ael_extension *exten, char *label, pval *statement,
pr->type = AEL_APPCALL; pr->type = AEL_APPCALL;
p->u2.goto_target = get_goto_target(p); p->u2.goto_target = get_goto_target(p);
if( p->u2.goto_target ) { if( p->u2.goto_target ) {
p->u3.goto_target_in_case = p->u2.goto_target->u2.label_in_case = label_inside_case(p->u2.goto_target); p->u3.goto_target_in_case = label_inside_case(p->u2.goto_target);
} }
if (!p->u1.list->next) /* just one */ { if (!p->u1.list->next) /* just one */ {
@ -5788,50 +5788,3 @@ pval * linku1(pval *head, pval *tail)
return head; return head;
} }
#ifdef HERE_BY_MISTAKE_I_THINK
static char *config = "extensions.ael";
int do_pbx_load_module(void)
{
int errs, sem_err, sem_warn, sem_note;
char *rfilename;
struct ast_context *local_contexts=NULL, *con;
struct pval *parse_tree;
ast_log(LOG_NOTICE, "Starting AEL load process.\n");
if (config[0] == '/')
rfilename = (char *)config;
else {
rfilename = alloca(strlen(config) + strlen(ast_config_AST_CONFIG_DIR) + 2);
sprintf(rfilename, "%s/%s", ast_config_AST_CONFIG_DIR, config);
}
ast_log(LOG_NOTICE, "AEL load process: calculated config file name '%s'.\n", rfilename);
if (access(rfilename,R_OK) != 0) {
ast_log(LOG_NOTICE, "File %s not found; AEL declining load\n", rfilename);
return AST_MODULE_LOAD_DECLINE;
}
parse_tree = ael2_parse(rfilename, &errs);
ast_log(LOG_DEBUG, "AEL load process: parsed config file name '%s'.\n", rfilename);
ael2_semantic_check(parse_tree, &sem_err, &sem_warn, &sem_note);
if (errs == 0 && sem_err == 0) {
ast_log(LOG_DEBUG, "AEL load process: checked config file name '%s'.\n", rfilename);
ast_compile_ael2(&local_contexts, parse_tree);
ast_log(LOG_DEBUG, "AEL load process: compiled config file name '%s'.\n", rfilename);
ast_merge_contexts_and_delete(&local_contexts, registrar);
ast_log(LOG_DEBUG, "AEL load process: merged config file name '%s'.\n", rfilename);
for (con = ast_walk_contexts(NULL); con; con = ast_walk_contexts(con))
ast_context_verify_includes(con);
ast_log(LOG_DEBUG, "AEL load process: verified config file name '%s'.\n", rfilename);
} else {
ast_log(LOG_ERROR, "Sorry, but %d syntax errors and %d semantic errors were detected. It doesn't make sense to compile.\n", errs, sem_err);
destroy_pval(parse_tree); /* free up the memory */
return AST_MODULE_LOAD_FAILURE;
}
destroy_pval(parse_tree); /* free up the memory */
return AST_MODULE_LOAD_SUCCESS;
}
#endif

Loading…
Cancel
Save