mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-03 11:25:35 +00:00
Merged revisions 8276 via svnmerge from
/branches/1.2 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@8278 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
24
ast_expr2.fl
24
ast_expr2.fl
@@ -67,7 +67,7 @@ struct parse_io
|
||||
|
||||
void ast_yyset_column(int column_no, yyscan_t yyscanner);
|
||||
int ast_yyget_column(yyscan_t yyscanner);
|
||||
|
||||
static int curlycount = 0;
|
||||
%}
|
||||
|
||||
%option prefix="ast_yy"
|
||||
@@ -77,6 +77,7 @@ int ast_yyget_column(yyscan_t yyscanner);
|
||||
%option bison-bridge
|
||||
%option bison-locations
|
||||
%option noyywrap
|
||||
%x var trail
|
||||
|
||||
%%
|
||||
|
||||
@@ -98,6 +99,8 @@ int ast_yyget_column(yyscan_t yyscanner);
|
||||
\:\: { SET_COLUMNS; SET_STRING; return TOK_COLONCOLON;}
|
||||
\( { SET_COLUMNS; SET_STRING; return TOK_LP;}
|
||||
\) { SET_COLUMNS; SET_STRING; return TOK_RP;}
|
||||
\$\{ {/* gather the contents of ${} expressions, with trailing stuff, into a single TOKEN. They are much more complex now than they used to be */
|
||||
curlycount = 0; BEGIN(var); yymore();}
|
||||
|
||||
[ \r] {}
|
||||
\"[^"]*\" {SET_COLUMNS; SET_STRING; return TOKEN;}
|
||||
@@ -106,7 +109,14 @@ int ast_yyget_column(yyscan_t yyscanner);
|
||||
[0-9]+ { SET_COLUMNS; /* the original behavior of the expression parser was to bring in numbers as a numeric string */
|
||||
SET_NUMERIC_STRING;
|
||||
return TOKEN;}
|
||||
[a-zA-Z0-9,.';{}\\_^%$#@!]+ {SET_COLUMNS; SET_STRING; return TOKEN;}
|
||||
[a-zA-Z0-9,.';\\_^%$#@!]+ {SET_COLUMNS; SET_STRING; return TOKEN;}
|
||||
|
||||
<var>[^{}]*\} {curlycount--; if(curlycount < 0){ BEGIN(trail); yymore();} else { yymore();}}
|
||||
<var>[^{}]*\{ {curlycount++; yymore(); }
|
||||
<trail>[^-\t\r \n$():?%/+=*<>!|&]* {BEGIN(0); SET_COLUMNS; SET_STRING; return TOKEN;}
|
||||
<trail>[-\t\r \n$():?%/+=*<>!|&] {char c = yytext[yyleng-1]; BEGIN(0); unput(c); SET_COLUMNS; SET_STRING; return TOKEN;}
|
||||
<trail>\$\{ {curlycount = 0; BEGIN(var); yymore(); }
|
||||
<trail><<EOF>> {BEGIN(0); SET_COLUMNS; SET_STRING; return TOKEN; /* actually, if an expr is only a variable ref, this could happen a LOT */}
|
||||
|
||||
%%
|
||||
|
||||
@@ -153,6 +163,7 @@ int ast_expr(char *expr, char *buf, int length)
|
||||
ast_copy_string(buf, io.val->u.s, length);
|
||||
#endif /* STANDALONE */
|
||||
return_value = strlen(buf);
|
||||
free(io.val->u.s);
|
||||
}
|
||||
free(io.val);
|
||||
}
|
||||
@@ -167,15 +178,6 @@ int ast_yyerror (const char *s, yyltype *loc, struct parse_io *parseio )
|
||||
int i=0;
|
||||
spacebuf[0] = 0;
|
||||
|
||||
#ifdef WHEN_LOC_MEANS_SOMETHING
|
||||
if( loc->first_column > 7990 ) /* if things get out of whack, why crash? */
|
||||
loc->first_column = 7990;
|
||||
if( loc->last_column > 7990 )
|
||||
loc->last_column = 7990;
|
||||
for(i=0;i<loc->first_column;i++) spacebuf[i] = ' ';
|
||||
for( ;i<loc->last_column;i++) spacebuf[i] = '^';
|
||||
spacebuf[i] = 0;
|
||||
#endif
|
||||
for(i=0;i< (int)(yytext - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf);i++) spacebuf2[i] = ' '; /* uh... assuming yyg is defined, then I can use the yycolumn macro,
|
||||
which is the same thing as... get this:
|
||||
yyg->yy_buffer_stack[yyg->yy_buffer_stack_top]->yy_bs_column
|
||||
|
40
ast_expr2.y
40
ast_expr2.y
@@ -124,7 +124,12 @@ int ast_yyerror(const char *,YYLTYPE *, struct parse_io *);
|
||||
some useful info about the error. Not as easy as it looks, but it
|
||||
is possible. */
|
||||
#define ast_yyerror(x) ast_yyerror(x,&yyloc,parseio)
|
||||
|
||||
#define DESTROY(x) { \
|
||||
if ((x)->type == AST_EXPR_numeric_string || (x)->type == AST_EXPR_string) \
|
||||
free((x)->u.s); \
|
||||
(x)->u.s = 0; \
|
||||
free(x); \
|
||||
}
|
||||
%}
|
||||
|
||||
%pure-parser
|
||||
@@ -158,69 +163,91 @@ extern int ast_yylex __P((YYSTYPE *, YYLTYPE *, yyscan_t));
|
||||
%%
|
||||
|
||||
start: expr { ((struct parse_io *)parseio)->val = (struct val *)calloc(sizeof(struct val),1);
|
||||
((struct parse_io *)parseio)->val->type = $$->type;
|
||||
if( $$->type == AST_EXPR_integer )
|
||||
((struct parse_io *)parseio)->val->u.i = $$->u.i;
|
||||
((struct parse_io *)parseio)->val->type = $1->type;
|
||||
if( $1->type == AST_EXPR_integer )
|
||||
((struct parse_io *)parseio)->val->u.i = $1->u.i;
|
||||
else
|
||||
((struct parse_io *)parseio)->val->u.s = $$->u.s; }
|
||||
((struct parse_io *)parseio)->val->u.s = $1->u.s;
|
||||
free($1);
|
||||
}
|
||||
;
|
||||
|
||||
expr: TOKEN { $$= $1;}
|
||||
| TOK_LP expr TOK_RP { $$ = $2;
|
||||
@$.first_column = @1.first_column; @$.last_column = @3.last_column;
|
||||
@$.first_line=0; @$.last_line=0;}
|
||||
@$.first_line=0; @$.last_line=0;
|
||||
DESTROY($1); DESTROY($3); }
|
||||
| expr TOK_OR expr { $$ = op_or ($1, $3);
|
||||
DESTROY($2);
|
||||
@$.first_column = @1.first_column; @$.last_column = @3.last_column;
|
||||
@$.first_line=0; @$.last_line=0;}
|
||||
| expr TOK_AND expr { $$ = op_and ($1, $3);
|
||||
DESTROY($2);
|
||||
@$.first_column = @1.first_column; @$.last_column = @3.last_column;
|
||||
@$.first_line=0; @$.last_line=0;}
|
||||
| expr TOK_EQ expr { $$ = op_eq ($1, $3);
|
||||
DESTROY($2);
|
||||
@$.first_column = @1.first_column; @$.last_column = @3.last_column;
|
||||
@$.first_line=0; @$.last_line=0;}
|
||||
| expr TOK_GT expr { $$ = op_gt ($1, $3);
|
||||
DESTROY($2);
|
||||
@$.first_column = @1.first_column; @$.last_column = @3.last_column;
|
||||
@$.first_line=0; @$.last_line=0;}
|
||||
| expr TOK_LT expr { $$ = op_lt ($1, $3);
|
||||
DESTROY($2);
|
||||
@$.first_column = @1.first_column; @$.last_column = @3.last_column;
|
||||
@$.first_line=0; @$.last_line=0;}
|
||||
| expr TOK_GE expr { $$ = op_ge ($1, $3);
|
||||
DESTROY($2);
|
||||
@$.first_column = @1.first_column; @$.last_column = @3.last_column;
|
||||
@$.first_line=0; @$.last_line=0;}
|
||||
| expr TOK_LE expr { $$ = op_le ($1, $3);
|
||||
DESTROY($2);
|
||||
@$.first_column = @1.first_column; @$.last_column = @3.last_column;
|
||||
@$.first_line=0; @$.last_line=0;}
|
||||
| expr TOK_NE expr { $$ = op_ne ($1, $3);
|
||||
DESTROY($2);
|
||||
@$.first_column = @1.first_column; @$.last_column = @3.last_column;
|
||||
@$.first_line=0; @$.last_line=0;}
|
||||
| expr TOK_PLUS expr { $$ = op_plus ($1, $3);
|
||||
DESTROY($2);
|
||||
@$.first_column = @1.first_column; @$.last_column = @3.last_column;
|
||||
@$.first_line=0; @$.last_line=0;}
|
||||
| expr TOK_MINUS expr { $$ = op_minus ($1, $3);
|
||||
DESTROY($2);
|
||||
@$.first_column = @1.first_column; @$.last_column = @3.last_column;
|
||||
@$.first_line=0; @$.last_line=0;}
|
||||
| TOK_MINUS expr %prec TOK_COMPL { $$ = op_negate ($2);
|
||||
DESTROY($1);
|
||||
@$.first_column = @1.first_column; @$.last_column = @2.last_column;
|
||||
@$.first_line=0; @$.last_line=0;}
|
||||
| TOK_COMPL expr { $$ = op_compl ($2);
|
||||
DESTROY($1);
|
||||
@$.first_column = @1.first_column; @$.last_column = @2.last_column;
|
||||
@$.first_line=0; @$.last_line=0;}
|
||||
| expr TOK_MULT expr { $$ = op_times ($1, $3);
|
||||
DESTROY($2);
|
||||
@$.first_column = @1.first_column; @$.last_column = @3.last_column;
|
||||
@$.first_line=0; @$.last_line=0;}
|
||||
| expr TOK_DIV expr { $$ = op_div ($1, $3);
|
||||
DESTROY($2);
|
||||
@$.first_column = @1.first_column; @$.last_column = @3.last_column;
|
||||
@$.first_line=0; @$.last_line=0;}
|
||||
| expr TOK_MOD expr { $$ = op_rem ($1, $3);
|
||||
DESTROY($2);
|
||||
@$.first_column = @1.first_column; @$.last_column = @3.last_column;
|
||||
@$.first_line=0; @$.last_line=0;}
|
||||
| expr TOK_COLON expr { $$ = op_colon ($1, $3);
|
||||
DESTROY($2);
|
||||
@$.first_column = @1.first_column; @$.last_column = @3.last_column;
|
||||
@$.first_line=0; @$.last_line=0;}
|
||||
| expr TOK_EQTILDE expr { $$ = op_eqtilde ($1, $3);
|
||||
DESTROY($2);
|
||||
@$.first_column = @1.first_column; @$.last_column = @3.last_column;
|
||||
@$.first_line=0; @$.last_line=0;}
|
||||
| expr TOK_COND expr TOK_COLONCOLON expr { $$ = op_cond ($1, $3, $5);
|
||||
DESTROY($2);
|
||||
DESTROY($4);
|
||||
@$.first_column = @1.first_column; @$.last_column = @3.last_column;
|
||||
@$.first_line=0; @$.last_line=0;}
|
||||
;
|
||||
@@ -281,6 +308,7 @@ free_value (struct val *vp)
|
||||
}
|
||||
if (vp->type == AST_EXPR_string || vp->type == AST_EXPR_numeric_string)
|
||||
free (vp->u.s);
|
||||
free(vp);
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user