Merged revisions 179973 via svnmerge from

https://origsvn.digium.com/svn/asterisk/trunk

................
  r179973 | murf | 2009-03-03 15:12:02 -0700 (Tue, 03 Mar 2009) | 33 lines
  
  Merged revisions 179807 via svnmerge from 
  https://origsvn.digium.com/svn/asterisk/branches/1.4
  
  I had some work to do to port these changes to trunk; the 
  check_expr stuff hasn't been updated here for quite some
  time, it appears. I added some more tests to the check_expr2
  suite. I had to play around with the makefile a bit, etc.
  
  I added STANDALONE2 #ifdefs to ast_expr2.y so as not to
  conflict structure with aelparse.
  
  ........
    r179807 | murf | 2009-03-03 11:11:34 -0700 (Tue, 03 Mar 2009) | 19 lines
    
    These changes allow AEL to better check ${} constructs within $[...], that are concatenated with text.
    
    I modified and added rules in ast_expr2.fl to better handle
    the concatenations.
    
    I added some default routines to ast_expr2.y so the standalone would
    compile. It also looks like I haven't run this thru bison since 2.1, so
    it's good to get this updated.
    
    The Makefile has comments added now for check_expr2 and check_expr to
    explain what they are for, and how to run them. 
    
    The testexpr2s stuff has been removed, in favor of check_expr2.
    
    expr2.testinput has been updated to include the two expressions
    that inspired these changes (from mcnobody on #asterisk this morning)
    The regression has been run and all looks well.
  ........
................


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.6.0@180058 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.6.0
Steve Murphy 16 years ago
parent d24e3e05bc
commit ce5bbc3eb8

@ -146,7 +146,8 @@
#include <sys/types.h>
#include <stdio.h>
#if !defined(STANDALONE)
#if !defined(STANDALONE) && !defined(STANDALONE2) \
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#else
#ifndef __USE_ISOC99
@ -341,7 +342,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/ast_expr.h"
#include "asterisk/logger.h"
#ifndef STANDALONE
#if !defined(STANDALONE) && !defined(STANDALONE2)
#include "asterisk/pbx.h"
#endif
@ -369,7 +370,7 @@ enum valtype {
AST_EXPR_number, AST_EXPR_numeric_string, AST_EXPR_string
} ;
#ifdef STANDALONE
#if defined(STANDALONE) || defined(STANDALONE2)
void ast_log(int level, const char *file, int line, const char *function, const char *fmt, ...) __attribute__ ((format (printf,5,6)));
#endif
@ -482,13 +483,13 @@ int ast_yyerror(const char *,YYLTYPE *, struct parse_io *);
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
typedef union YYSTYPE
#line 343 "ast_expr2.y"
#line 344 "ast_expr2.y"
{
struct val *val;
struct expr_node *arglist;
}
/* Line 187 of yacc.c. */
#line 492 "ast_expr2.c"
#line 493 "ast_expr2.c"
YYSTYPE;
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
@ -510,13 +511,13 @@ typedef struct YYLTYPE
/* Copy the second part of user declarations. */
#line 348 "ast_expr2.y"
#line 349 "ast_expr2.y"
extern int ast_yylex __P((YYSTYPE *, YYLTYPE *, yyscan_t));
/* Line 216 of yacc.c. */
#line 520 "ast_expr2.c"
#line 521 "ast_expr2.c"
#ifdef short
# undef short
@ -812,9 +813,9 @@ static const yytype_int8 yyrhs[] =
/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
static const yytype_uint16 yyrline[] =
{
0, 374, 374, 382, 389, 390, 396, 405, 411, 412,
416, 420, 424, 428, 432, 436, 440, 444, 448, 452,
456, 460, 464, 468, 472, 476, 480, 484
0, 375, 375, 383, 390, 391, 397, 406, 412, 413,
417, 421, 425, 429, 433, 437, 441, 445, 449, 453,
457, 461, 465, 469, 473, 477, 481, 485
};
#endif
@ -1467,114 +1468,114 @@ yydestruct (yymsg, yytype, yyvaluep, yylocationp)
switch (yytype)
{
case 4: /* "TOK_COLONCOLON" */
#line 368 "ast_expr2.y"
#line 369 "ast_expr2.y"
{ free_value((yyvaluep->val)); };
#line 1473 "ast_expr2.c"
#line 1474 "ast_expr2.c"
break;
case 5: /* "TOK_COND" */
#line 368 "ast_expr2.y"
#line 369 "ast_expr2.y"
{ free_value((yyvaluep->val)); };
#line 1478 "ast_expr2.c"
#line 1479 "ast_expr2.c"
break;
case 6: /* "TOK_OR" */
#line 368 "ast_expr2.y"
#line 369 "ast_expr2.y"
{ free_value((yyvaluep->val)); };
#line 1483 "ast_expr2.c"
#line 1484 "ast_expr2.c"
break;
case 7: /* "TOK_AND" */
#line 368 "ast_expr2.y"
#line 369 "ast_expr2.y"
{ free_value((yyvaluep->val)); };
#line 1488 "ast_expr2.c"
#line 1489 "ast_expr2.c"
break;
case 8: /* "TOK_NE" */
#line 368 "ast_expr2.y"
#line 369 "ast_expr2.y"
{ free_value((yyvaluep->val)); };
#line 1493 "ast_expr2.c"
#line 1494 "ast_expr2.c"
break;
case 9: /* "TOK_LE" */
#line 368 "ast_expr2.y"
#line 369 "ast_expr2.y"
{ free_value((yyvaluep->val)); };
#line 1498 "ast_expr2.c"
#line 1499 "ast_expr2.c"
break;
case 10: /* "TOK_GE" */
#line 368 "ast_expr2.y"
#line 369 "ast_expr2.y"
{ free_value((yyvaluep->val)); };
#line 1503 "ast_expr2.c"
#line 1504 "ast_expr2.c"
break;
case 11: /* "TOK_LT" */
#line 368 "ast_expr2.y"
#line 369 "ast_expr2.y"
{ free_value((yyvaluep->val)); };
#line 1508 "ast_expr2.c"
#line 1509 "ast_expr2.c"
break;
case 12: /* "TOK_GT" */
#line 368 "ast_expr2.y"
#line 369 "ast_expr2.y"
{ free_value((yyvaluep->val)); };
#line 1513 "ast_expr2.c"
#line 1514 "ast_expr2.c"
break;
case 13: /* "TOK_EQ" */
#line 368 "ast_expr2.y"
#line 369 "ast_expr2.y"
{ free_value((yyvaluep->val)); };
#line 1518 "ast_expr2.c"
#line 1519 "ast_expr2.c"
break;
case 14: /* "TOK_MINUS" */
#line 368 "ast_expr2.y"
#line 369 "ast_expr2.y"
{ free_value((yyvaluep->val)); };
#line 1523 "ast_expr2.c"
#line 1524 "ast_expr2.c"
break;
case 15: /* "TOK_PLUS" */
#line 368 "ast_expr2.y"
#line 369 "ast_expr2.y"
{ free_value((yyvaluep->val)); };
#line 1528 "ast_expr2.c"
#line 1529 "ast_expr2.c"
break;
case 16: /* "TOK_MOD" */
#line 368 "ast_expr2.y"
#line 369 "ast_expr2.y"
{ free_value((yyvaluep->val)); };
#line 1533 "ast_expr2.c"
#line 1534 "ast_expr2.c"
break;
case 17: /* "TOK_DIV" */
#line 368 "ast_expr2.y"
#line 369 "ast_expr2.y"
{ free_value((yyvaluep->val)); };
#line 1538 "ast_expr2.c"
#line 1539 "ast_expr2.c"
break;
case 18: /* "TOK_MULT" */
#line 368 "ast_expr2.y"
#line 369 "ast_expr2.y"
{ free_value((yyvaluep->val)); };
#line 1543 "ast_expr2.c"
#line 1544 "ast_expr2.c"
break;
case 19: /* "TOK_COMPL" */
#line 368 "ast_expr2.y"
#line 369 "ast_expr2.y"
{ free_value((yyvaluep->val)); };
#line 1548 "ast_expr2.c"
#line 1549 "ast_expr2.c"
break;
case 20: /* "TOK_EQTILDE" */
#line 368 "ast_expr2.y"
#line 369 "ast_expr2.y"
{ free_value((yyvaluep->val)); };
#line 1553 "ast_expr2.c"
#line 1554 "ast_expr2.c"
break;
case 21: /* "TOK_COLON" */
#line 368 "ast_expr2.y"
#line 369 "ast_expr2.y"
{ free_value((yyvaluep->val)); };
#line 1558 "ast_expr2.c"
#line 1559 "ast_expr2.c"
break;
case 22: /* "TOK_LP" */
#line 368 "ast_expr2.y"
#line 369 "ast_expr2.y"
{ free_value((yyvaluep->val)); };
#line 1563 "ast_expr2.c"
#line 1564 "ast_expr2.c"
break;
case 23: /* "TOK_RP" */
#line 368 "ast_expr2.y"
#line 369 "ast_expr2.y"
{ free_value((yyvaluep->val)); };
#line 1568 "ast_expr2.c"
#line 1569 "ast_expr2.c"
break;
case 24: /* "TOKEN" */
#line 368 "ast_expr2.y"
#line 369 "ast_expr2.y"
{ free_value((yyvaluep->val)); };
#line 1573 "ast_expr2.c"
#line 1574 "ast_expr2.c"
break;
case 28: /* "expr" */
#line 368 "ast_expr2.y"
#line 369 "ast_expr2.y"
{ free_value((yyvaluep->val)); };
#line 1578 "ast_expr2.c"
#line 1579 "ast_expr2.c"
break;
default:
@ -1897,7 +1898,7 @@ yyreduce:
switch (yyn)
{
case 2:
#line 374 "ast_expr2.y"
#line 375 "ast_expr2.y"
{ ((struct parse_io *)parseio)->val = (struct val *)calloc(sizeof(struct val),1);
((struct parse_io *)parseio)->val->type = (yyvsp[(1) - (1)].val)->type;
if( (yyvsp[(1) - (1)].val)->type == AST_EXPR_number )
@ -1909,7 +1910,7 @@ yyreduce:
break;
case 3:
#line 382 "ast_expr2.y"
#line 383 "ast_expr2.y"
{/* nothing */ ((struct parse_io *)parseio)->val = (struct val *)calloc(sizeof(struct val),1);
((struct parse_io *)parseio)->val->type = AST_EXPR_string;
((struct parse_io *)parseio)->val->u.s = strdup("");
@ -1917,12 +1918,12 @@ yyreduce:
break;
case 4:
#line 389 "ast_expr2.y"
#line 390 "ast_expr2.y"
{ (yyval.arglist) = alloc_expr_node(AST_EXPR_NODE_VAL); (yyval.arglist)->val = (yyvsp[(1) - (1)].val);;}
break;
case 5:
#line 390 "ast_expr2.y"
#line 391 "ast_expr2.y"
{struct expr_node *x = alloc_expr_node(AST_EXPR_NODE_VAL);
struct expr_node *t;
DESTROY((yyvsp[(2) - (3)].val));
@ -1932,7 +1933,7 @@ yyreduce:
break;
case 6:
#line 396 "ast_expr2.y"
#line 397 "ast_expr2.y"
{struct expr_node *x = alloc_expr_node(AST_EXPR_NODE_VAL);
struct expr_node *t; /* NULL args should OK */
DESTROY((yyvsp[(2) - (2)].val));
@ -1942,7 +1943,7 @@ yyreduce:
break;
case 7:
#line 405 "ast_expr2.y"
#line 406 "ast_expr2.y"
{ (yyval.val) = op_func((yyvsp[(1) - (4)].val),(yyvsp[(3) - (4)].arglist), ((struct parse_io *)parseio)->chan);
DESTROY((yyvsp[(2) - (4)].val));
DESTROY((yyvsp[(4) - (4)].val));
@ -1952,12 +1953,12 @@ yyreduce:
break;
case 8:
#line 411 "ast_expr2.y"
#line 412 "ast_expr2.y"
{(yyval.val) = (yyvsp[(1) - (1)].val);;}
break;
case 9:
#line 412 "ast_expr2.y"
#line 413 "ast_expr2.y"
{ (yyval.val) = (yyvsp[(2) - (3)].val);
(yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
(yyloc).first_line=0; (yyloc).last_line=0;
@ -1965,7 +1966,7 @@ yyreduce:
break;
case 10:
#line 416 "ast_expr2.y"
#line 417 "ast_expr2.y"
{ (yyval.val) = op_or ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
DESTROY((yyvsp[(2) - (3)].val));
(yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
@ -1973,7 +1974,7 @@ yyreduce:
break;
case 11:
#line 420 "ast_expr2.y"
#line 421 "ast_expr2.y"
{ (yyval.val) = op_and ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
DESTROY((yyvsp[(2) - (3)].val));
(yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
@ -1981,7 +1982,7 @@ yyreduce:
break;
case 12:
#line 424 "ast_expr2.y"
#line 425 "ast_expr2.y"
{ (yyval.val) = op_eq ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
DESTROY((yyvsp[(2) - (3)].val));
(yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
@ -1989,7 +1990,7 @@ yyreduce:
break;
case 13:
#line 428 "ast_expr2.y"
#line 429 "ast_expr2.y"
{ (yyval.val) = op_gt ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
DESTROY((yyvsp[(2) - (3)].val));
(yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
@ -1997,7 +1998,7 @@ yyreduce:
break;
case 14:
#line 432 "ast_expr2.y"
#line 433 "ast_expr2.y"
{ (yyval.val) = op_lt ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
DESTROY((yyvsp[(2) - (3)].val));
(yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
@ -2005,7 +2006,7 @@ yyreduce:
break;
case 15:
#line 436 "ast_expr2.y"
#line 437 "ast_expr2.y"
{ (yyval.val) = op_ge ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
DESTROY((yyvsp[(2) - (3)].val));
(yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
@ -2013,7 +2014,7 @@ yyreduce:
break;
case 16:
#line 440 "ast_expr2.y"
#line 441 "ast_expr2.y"
{ (yyval.val) = op_le ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
DESTROY((yyvsp[(2) - (3)].val));
(yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
@ -2021,7 +2022,7 @@ yyreduce:
break;
case 17:
#line 444 "ast_expr2.y"
#line 445 "ast_expr2.y"
{ (yyval.val) = op_ne ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
DESTROY((yyvsp[(2) - (3)].val));
(yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
@ -2029,7 +2030,7 @@ yyreduce:
break;
case 18:
#line 448 "ast_expr2.y"
#line 449 "ast_expr2.y"
{ (yyval.val) = op_plus ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
DESTROY((yyvsp[(2) - (3)].val));
(yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
@ -2037,7 +2038,7 @@ yyreduce:
break;
case 19:
#line 452 "ast_expr2.y"
#line 453 "ast_expr2.y"
{ (yyval.val) = op_minus ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
DESTROY((yyvsp[(2) - (3)].val));
(yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
@ -2045,7 +2046,7 @@ yyreduce:
break;
case 20:
#line 456 "ast_expr2.y"
#line 457 "ast_expr2.y"
{ (yyval.val) = op_negate ((yyvsp[(2) - (2)].val));
DESTROY((yyvsp[(1) - (2)].val));
(yyloc).first_column = (yylsp[(1) - (2)]).first_column; (yyloc).last_column = (yylsp[(2) - (2)]).last_column;
@ -2053,7 +2054,7 @@ yyreduce:
break;
case 21:
#line 460 "ast_expr2.y"
#line 461 "ast_expr2.y"
{ (yyval.val) = op_compl ((yyvsp[(2) - (2)].val));
DESTROY((yyvsp[(1) - (2)].val));
(yyloc).first_column = (yylsp[(1) - (2)]).first_column; (yyloc).last_column = (yylsp[(2) - (2)]).last_column;
@ -2061,7 +2062,7 @@ yyreduce:
break;
case 22:
#line 464 "ast_expr2.y"
#line 465 "ast_expr2.y"
{ (yyval.val) = op_times ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
DESTROY((yyvsp[(2) - (3)].val));
(yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
@ -2069,7 +2070,7 @@ yyreduce:
break;
case 23:
#line 468 "ast_expr2.y"
#line 469 "ast_expr2.y"
{ (yyval.val) = op_div ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
DESTROY((yyvsp[(2) - (3)].val));
(yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
@ -2077,7 +2078,7 @@ yyreduce:
break;
case 24:
#line 472 "ast_expr2.y"
#line 473 "ast_expr2.y"
{ (yyval.val) = op_rem ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
DESTROY((yyvsp[(2) - (3)].val));
(yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
@ -2085,7 +2086,7 @@ yyreduce:
break;
case 25:
#line 476 "ast_expr2.y"
#line 477 "ast_expr2.y"
{ (yyval.val) = op_colon ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
DESTROY((yyvsp[(2) - (3)].val));
(yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
@ -2093,7 +2094,7 @@ yyreduce:
break;
case 26:
#line 480 "ast_expr2.y"
#line 481 "ast_expr2.y"
{ (yyval.val) = op_eqtilde ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
DESTROY((yyvsp[(2) - (3)].val));
(yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
@ -2101,7 +2102,7 @@ yyreduce:
break;
case 27:
#line 484 "ast_expr2.y"
#line 485 "ast_expr2.y"
{ (yyval.val) = op_cond ((yyvsp[(1) - (5)].val), (yyvsp[(3) - (5)].val), (yyvsp[(5) - (5)].val));
DESTROY((yyvsp[(2) - (5)].val));
DESTROY((yyvsp[(4) - (5)].val));
@ -2111,7 +2112,7 @@ yyreduce:
/* Line 1267 of yacc.c. */
#line 2115 "ast_expr2.c"
#line 2116 "ast_expr2.c"
default: break;
}
YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@ -2331,7 +2332,7 @@ yyreturn:
}
#line 491 "ast_expr2.y"
#line 492 "ast_expr2.y"
static struct expr_node *alloc_expr_node(enum node_type nt)
@ -2497,6 +2498,62 @@ is_zero_or_null (struct val *vp)
/* NOTREACHED */
}
#ifdef STANDALONE2
void ast_log(int level, const char *file, int line, const char *function, const char *fmt, ...)
{
va_list vars;
va_start(vars,fmt);
printf("LOG: lev:%d file:%s line:%d func: %s ",
level, file, line, function);
vprintf(fmt, vars);
fflush(stdout);
va_end(vars);
}
int main(int argc,char **argv) {
char s[4096];
char out[4096];
FILE *infile;
if( !argv[1] )
exit(20);
if( access(argv[1],F_OK)== 0 )
{
int ret;
infile = fopen(argv[1],"r");
if( !infile )
{
printf("Sorry, couldn't open %s for reading!\n", argv[1]);
exit(10);
}
while( fgets(s,sizeof(s),infile) )
{
if( s[strlen(s)-1] == '\n' )
s[strlen(s)-1] = 0;
ret = ast_expr(s, out, sizeof(out), NULL);
printf("Expression: %s Result: [%d] '%s'\n",
s, ret, out);
}
fclose(infile);
}
else
{
if (ast_expr(argv[1], s, sizeof(s), NULL))
printf("=====%s======\n",s);
else
printf("No result\n");
}
return 0;
}
#endif
#undef ast_yyerror
#define ast_yyerror(x) ast_yyerror(x, YYLTYPE *yylloc, struct parse_io *parseio)
@ -2521,7 +2578,7 @@ static void destroy_arglist(struct expr_node *arglist)
}
}
#if !defined(STANDALONE)
#if !defined(STANDALONE) && !defined(STANDALONE2)
static char *compose_func_args(struct expr_node *arglist)
{
struct expr_node *t = arglist;
@ -2815,7 +2872,7 @@ static struct val *op_func(struct val *funcname, struct expr_node *arglist, stru
#endif
} else {
/* is this a custom function we should execute and collect the results of? */
#ifndef STANDALONE
#if !defined(STANDALONE) && !defined(STANDALONE2)
struct ast_custom_function *f = ast_custom_function_find(funcname->u.s);
if (!chan)
ast_log(LOG_WARNING,"Hey! chan is NULL.\n");

@ -171,12 +171,17 @@ static char *expr2_token_subst(const char *mess);
return TOKEN;
}
([a-zA-Z0-9\.';\\_^$#@]|[\x80-\xff])+ {
([a-zA-Z0-9\.';\\_^#@]|[\x80-\xff]|($[^{]))+ {
SET_COLUMNS;
SET_STRING;
return TOKEN;
}
([a-zA-Z0-9\.';\\_^#@]|[\x80-\xff]|($[^{]))+\$\{ {
curlycount = 0;
BEGIN(var);
yymore();
}
<var>[^{}]*\} {
curlycount--;
@ -201,6 +206,12 @@ static char *expr2_token_subst(const char *mess);
return TOKEN;
}
<trail>[^-\t\r \n$():?%/+=*<>!|&]*\$\{ {
curlycount = 0;
BEGIN(var);
yymore();
}
<trail>[-\t\r \n$():?%/+=*<>!|&] {
char c = yytext[yyleng-1];
BEGIN(0);
@ -210,12 +221,6 @@ static char *expr2_token_subst(const char *mess);
return TOKEN;
}
<trail>\$\{ {
curlycount = 0;
BEGIN(var);
yymore();
}
<trail><<EOF>> {
BEGIN(0);
SET_COLUMNS;

@ -92,7 +92,7 @@
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
typedef union YYSTYPE
#line 343 "ast_expr2.y"
#line 344 "ast_expr2.y"
{
struct val *val;
struct expr_node *arglist;

@ -17,7 +17,8 @@
#include <sys/types.h>
#include <stdio.h>
#if !defined(STANDALONE)
#if !defined(STANDALONE) && !defined(STANDALONE2) \
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#else
#ifndef __USE_ISOC99
@ -212,7 +213,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/ast_expr.h"
#include "asterisk/logger.h"
#ifndef STANDALONE
#if !defined(STANDALONE) && !defined(STANDALONE2)
#include "asterisk/pbx.h"
#endif
@ -240,7 +241,7 @@ enum valtype {
AST_EXPR_number, AST_EXPR_numeric_string, AST_EXPR_string
} ;
#ifdef STANDALONE
#if defined(STANDALONE) || defined(STANDALONE2)
void ast_log(int level, const char *file, int line, const char *function, const char *fmt, ...) __attribute__ ((format (printf,5,6)));
#endif
@ -653,6 +654,62 @@ is_zero_or_null (struct val *vp)
/* NOTREACHED */
}
#ifdef STANDALONE2
void ast_log(int level, const char *file, int line, const char *function, const char *fmt, ...)
{
va_list vars;
va_start(vars,fmt);
printf("LOG: lev:%d file:%s line:%d func: %s ",
level, file, line, function);
vprintf(fmt, vars);
fflush(stdout);
va_end(vars);
}
int main(int argc,char **argv) {
char s[4096];
char out[4096];
FILE *infile;
if( !argv[1] )
exit(20);
if( access(argv[1],F_OK)== 0 )
{
int ret;
infile = fopen(argv[1],"r");
if( !infile )
{
printf("Sorry, couldn't open %s for reading!\n", argv[1]);
exit(10);
}
while( fgets(s,sizeof(s),infile) )
{
if( s[strlen(s)-1] == '\n' )
s[strlen(s)-1] = 0;
ret = ast_expr(s, out, sizeof(out), NULL);
printf("Expression: %s Result: [%d] '%s'\n",
s, ret, out);
}
fclose(infile);
}
else
{
if (ast_expr(argv[1], s, sizeof(s), NULL))
printf("=====%s======\n",s);
else
printf("No result\n");
}
return 0;
}
#endif
#undef ast_yyerror
#define ast_yyerror(x) ast_yyerror(x, YYLTYPE *yylloc, struct parse_io *parseio)
@ -677,7 +734,7 @@ static void destroy_arglist(struct expr_node *arglist)
}
}
#if !defined(STANDALONE)
#if !defined(STANDALONE) && !defined(STANDALONE2)
static char *compose_func_args(struct expr_node *arglist)
{
struct expr_node *t = arglist;
@ -971,7 +1028,7 @@ static struct val *op_func(struct val *funcname, struct expr_node *arglist, stru
#endif
} else {
/* is this a custom function we should execute and collect the results of? */
#ifndef STANDALONE
#if !defined(STANDALONE) && !defined(STANDALONE2)
struct ast_custom_function *f = ast_custom_function_find(funcname->u.s);
if (!chan)
ast_log(LOG_WARNING,"Hey! chan is NULL.\n");

@ -353,8 +353,8 @@ static void yy_fatal_error (yyconst char msg[] ,yyscan_t yyscanner );
*yy_cp = '\0'; \
yyg->yy_c_buf_p = yy_cp;
#define YY_NUM_RULES 36
#define YY_END_OF_BUFFER 37
#define YY_NUM_RULES 37
#define YY_END_OF_BUFFER 38
/* This struct is not used in this scanner,
but its presence is necessary. */
struct yy_trans_info
@ -362,14 +362,14 @@ struct yy_trans_info
flex_int32_t yy_verify;
flex_int32_t yy_nxt;
};
static yyconst flex_int16_t yy_accept[58] =
static yyconst flex_int16_t yy_accept[61] =
{ 0,
0, 0, 0, 0, 33, 33, 37, 36, 26, 28,
20, 36, 30, 30, 18, 2, 23, 24, 16, 13,
0, 0, 0, 0, 34, 34, 38, 37, 26, 28,
20, 37, 30, 37, 18, 2, 23, 24, 16, 13,
14, 15, 17, 29, 21, 9, 3, 8, 19, 1,
36, 32, 31, 33, 34, 34, 12, 0, 27, 30,
25, 5, 30, 29, 22, 11, 6, 7, 10, 4,
0, 32, 31, 33, 35, 29, 0
37, 33, 32, 34, 36, 36, 12, 0, 27, 30,
0, 25, 5, 30, 29, 22, 11, 6, 7, 10,
4, 0, 33, 32, 34, 0, 35, 31, 29, 0
} ;
static yyconst flex_int32_t yy_ec[256] =
@ -406,69 +406,73 @@ static yyconst flex_int32_t yy_ec[256] =
static yyconst flex_int32_t yy_meta[29] =
{ 0,
1, 2, 2, 2, 1, 3, 4, 2, 2, 2,
1, 2, 2, 2, 1, 3, 3, 2, 2, 2,
2, 2, 2, 1, 2, 3, 2, 3, 2, 2,
2, 2, 2, 1, 2, 1, 1, 3
} ;
static yyconst flex_int16_t yy_base[64] =
static yyconst flex_int16_t yy_base[68] =
{ 0,
0, 0, 5, 6, 32, 60, 64, 110, 110, 110,
42, 57, 0, 33, 110, 46, 110, 110, 110, 110,
110, 110, 110, 18, 35, 32, 14, 31, 110, 26,
16, 110, 110, 0, 110, 25, 110, 42, 110, 0,
110, 110, 26, 0, 110, 110, 110, 110, 110, 110,
19, 110, 110, 0, 110, 0, 110, 88, 92, 96,
98, 102, 106
0, 0, 5, 6, 32, 60, 72, 130, 130, 130,
50, 65, 62, 44, 130, 55, 130, 130, 130, 130,
130, 130, 130, 83, 44, 41, 13, 36, 130, 30,
17, 130, 130, 47, 130, 29, 130, 47, 130, 44,
25, 130, 130, 29, 0, 130, 130, 130, 130, 130,
130, 18, 130, 130, 38, 12, 130, 130, 0, 130,
111, 114, 117, 32, 120, 123, 126
} ;
static yyconst flex_int16_t yy_def[64] =
static yyconst flex_int16_t yy_def[68] =
{ 0,
57, 1, 58, 58, 59, 59, 57, 57, 57, 57,
57, 60, 61, 61, 57, 57, 57, 57, 57, 57,
57, 57, 57, 61, 57, 57, 57, 57, 57, 57,
62, 57, 57, 63, 57, 57, 57, 60, 57, 61,
57, 57, 61, 24, 57, 57, 57, 57, 57, 57,
62, 57, 57, 63, 57, 43, 0, 57, 57, 57,
57, 57, 57
60, 1, 61, 61, 62, 62, 60, 60, 60, 60,
60, 63, 64, 65, 60, 60, 60, 60, 60, 60,
60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
66, 60, 60, 67, 60, 60, 60, 63, 60, 64,
65, 60, 60, 40, 24, 60, 60, 60, 60, 60,
60, 66, 60, 60, 67, 60, 60, 60, 44, 0,
60, 60, 60, 60, 60, 60, 60
} ;
static yyconst flex_int16_t yy_nxt[139] =
static yyconst flex_int16_t yy_nxt[159] =
{ 0,
8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
18, 19, 20, 21, 22, 13, 23, 24, 25, 26,
27, 28, 29, 8, 30, 8, 8, 13, 32, 32,
33, 33, 34, 43, 47, 44, 34, 34, 36, 52,
48, 53, 52, 56, 53, 34, 39, 34, 55, 34,
50, 49, 46, 45, 42, 34, 41, 34, 34, 34,
34, 39, 37, 57, 34, 34, 36, 57, 57, 57,
57, 57, 57, 34, 57, 34, 57, 34, 57, 57,
57, 57, 57, 34, 57, 34, 34, 34, 31, 31,
31, 31, 35, 35, 35, 35, 38, 38, 38, 38,
40, 40, 51, 51, 51, 51, 54, 57, 54, 7,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57
33, 33, 34, 48, 40, 57, 34, 34, 36, 49,
53, 53, 54, 54, 56, 34, 59, 34, 58, 34,
41, 39, 57, 56, 51, 34, 50, 34, 34, 34,
34, 47, 46, 43, 34, 34, 36, 42, 41, 39,
37, 60, 60, 34, 60, 34, 60, 34, 60, 60,
60, 60, 60, 34, 60, 34, 34, 34, 40, 41,
60, 60, 60, 60, 60, 60, 60, 60, 44, 60,
45, 60, 60, 60, 60, 60, 60, 60, 60, 60,
40, 31, 31, 31, 35, 35, 35, 38, 38, 38,
40, 40, 40, 52, 52, 52, 55, 60, 55, 7,
60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
60, 60, 60, 60, 60, 60, 60, 60
} ;
static yyconst flex_int16_t yy_chk[139] =
static yyconst flex_int16_t yy_chk[159] =
{ 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 3, 4,
3, 4, 5, 24, 27, 24, 5, 5, 5, 31,
27, 31, 51, 43, 51, 5, 38, 5, 36, 5,
30, 28, 26, 25, 16, 5, 14, 5, 5, 5,
6, 12, 11, 7, 6, 6, 6, 0, 0, 0,
0, 0, 0, 6, 0, 6, 0, 6, 0, 0,
0, 0, 0, 6, 0, 6, 6, 6, 58, 58,
58, 58, 59, 59, 59, 59, 60, 60, 60, 60,
61, 61, 62, 62, 62, 62, 63, 0, 63, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57
3, 4, 5, 27, 64, 56, 5, 5, 5, 27,
31, 52, 31, 52, 55, 5, 44, 5, 41, 5,
40, 38, 36, 34, 30, 5, 28, 5, 5, 5,
6, 26, 25, 16, 6, 6, 6, 14, 13, 12,
11, 7, 0, 6, 0, 6, 0, 6, 0, 0,
0, 0, 0, 6, 0, 6, 6, 6, 24, 24,
0, 0, 0, 0, 0, 0, 0, 0, 24, 0,
24, 0, 0, 0, 0, 0, 0, 0, 0, 0,
24, 61, 61, 61, 62, 62, 62, 63, 63, 63,
65, 65, 65, 66, 66, 66, 67, 0, 67, 60,
60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
60, 60, 60, 60, 60, 60, 60, 60
} ;
/* The intent behind this definition is that it'll catch
@ -591,7 +595,7 @@ int ast_yyget_column(yyscan_t yyscanner);
static int curlycount = 0;
static char *expr2_token_subst(const char *mess);
#line 593 "ast_expr2f.c"
#line 597 "ast_expr2f.c"
#define INITIAL 0
#define var 1
@ -837,7 +841,7 @@ YY_DECL
#line 125 "ast_expr2.fl"
#line 839 "ast_expr2f.c"
#line 843 "ast_expr2f.c"
yylval = yylval_param;
@ -900,13 +904,13 @@ yy_match:
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
if ( yy_current_state >= 58 )
if ( yy_current_state >= 61 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
++yy_cp;
}
while ( yy_current_state != 57 );
while ( yy_current_state != 60 );
yy_cp = yyg->yy_last_accepting_cpos;
yy_current_state = yyg->yy_last_accepting_state;
@ -1089,6 +1093,7 @@ YY_RULE_SETUP
}
YY_BREAK
case 30:
/* rule 30 can match eol */
YY_RULE_SETUP
#line 174 "ast_expr2.fl"
{
@ -1100,7 +1105,17 @@ YY_RULE_SETUP
case 31:
/* rule 31 can match eol */
YY_RULE_SETUP
#line 181 "ast_expr2.fl"
#line 180 "ast_expr2.fl"
{
curlycount = 0;
BEGIN(var);
yymore();
}
YY_BREAK
case 32:
/* rule 32 can match eol */
YY_RULE_SETUP
#line 186 "ast_expr2.fl"
{
curlycount--;
if (curlycount < 0) {
@ -1111,18 +1126,18 @@ YY_RULE_SETUP
}
}
YY_BREAK
case 32:
/* rule 32 can match eol */
case 33:
/* rule 33 can match eol */
YY_RULE_SETUP
#line 191 "ast_expr2.fl"
#line 196 "ast_expr2.fl"
{
curlycount++;
yymore();
}
YY_BREAK
case 33:
case 34:
YY_RULE_SETUP
#line 197 "ast_expr2.fl"
#line 202 "ast_expr2.fl"
{
BEGIN(0);
SET_COLUMNS;
@ -1130,10 +1145,19 @@ YY_RULE_SETUP
return TOKEN;
}
YY_BREAK
case 34:
/* rule 34 can match eol */
case 35:
YY_RULE_SETUP
#line 204 "ast_expr2.fl"
#line 209 "ast_expr2.fl"
{
curlycount = 0;
BEGIN(var);
yymore();
}
YY_BREAK
case 36:
/* rule 36 can match eol */
YY_RULE_SETUP
#line 215 "ast_expr2.fl"
{
char c = yytext[yyleng-1];
BEGIN(0);
@ -1143,17 +1167,8 @@ YY_RULE_SETUP
return TOKEN;
}
YY_BREAK
case 35:
YY_RULE_SETUP
#line 213 "ast_expr2.fl"
{
curlycount = 0;
BEGIN(var);
yymore();
}
YY_BREAK
case YY_STATE_EOF(trail):
#line 219 "ast_expr2.fl"
#line 224 "ast_expr2.fl"
{
BEGIN(0);
SET_COLUMNS;
@ -1162,12 +1177,12 @@ case YY_STATE_EOF(trail):
/*actually, if an expr is only a variable ref, this could happen a LOT */
}
YY_BREAK
case 36:
case 37:
YY_RULE_SETUP
#line 227 "ast_expr2.fl"
#line 232 "ast_expr2.fl"
ECHO;
YY_BREAK
#line 1169 "ast_expr2f.c"
#line 1184 "ast_expr2f.c"
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(var):
yyterminate();
@ -1463,7 +1478,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
if ( yy_current_state >= 58 )
if ( yy_current_state >= 61 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@ -1492,11 +1507,11 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
if ( yy_current_state >= 58 )
if ( yy_current_state >= 61 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
yy_is_jam = (yy_current_state == 57);
yy_is_jam = (yy_current_state == 60);
return yy_is_jam ? 0 : yy_current_state;
}
@ -2343,7 +2358,7 @@ void *ast_yyrealloc (void * ptr, yy_size_t size , yyscan_t yyscanner)
#define YYTABLES_NAME "yytables"
#line 227 "ast_expr2.fl"
#line 232 "ast_expr2.fl"

@ -16,10 +16,21 @@ ASTTOPDIR?=..
.PHONY: clean all uninstall
ALL_UTILS:=astman smsq stereorize streamplayer muted check_expr hashtest2 hashtest astcanary aelparse conf2ael
# to get check_expr, add it to the ALL_UTILS list -- this is a somewhat old checking
# program that wants an ael file for input, and will check each $[] expr for
# possible (old) problems, like spacing around operators, which dates back to
# the 1.2 days. The neat part is that it will actually evaluate the expressions.
# Users could use this to quickly check expressions in their .ael file.
# to get check_expr2, add it to the ALL_UTILS list -- this is a program that will
# read in a file containing expressions (as if they were in $[ ]), one per line.
# It will, of course signal any syntax errors. Devs (like murf) should use this whenever
# changes are made to ast_expr2.y or ast_expr2.fl (or the corresponding .c files),
# as a regression test. Others (mere mortals?) need not bother, but they are
# more than welcome to play! The regression test itself is in expr2.testinput.
ALL_UTILS:=astman smsq stereorize streamplayer muted hashtest2 hashtest astcanary aelparse conf2ael
UTILS:=$(ALL_UTILS)
LIBS += $(BKTR_LIB) # astobj2 with devmode uses backtrace
LIBS += $(BKTR_LIB) # astobj2 with devmode uses backtrace
include $(ASTTOPDIR)/Makefile.rules
@ -73,7 +84,7 @@ clean:
rm -f *.o $(ALL_UTILS) check_expr
rm -f .*.d
rm -f *.s *.i
rm -f md5.c strcompat.c ast_expr2.c ast_expr2f.c pbx_ael.c pval.c hashtab.c
rm -f md5.c strcompat.c ast_expr2.c ast_expr2.h ast_expr2f.c pbx_ael.c pval.c hashtab.c
rm -f aelparse.c aelbison.c conf2ael
rm -f utils.c threadstorage.c sha1.c astobj2.c hashtest2 hashtest
@ -104,6 +115,10 @@ ast_expr2.c: $(ASTTOPDIR)/main/ast_expr2.c
@cp "$<" "$@"
ast_expr2.o: ASTCFLAGS+=-DSTANDALONE
ast_expr2.h: $(ASTTOPDIR)/main/ast_expr2.h
$(ECHO_PREFIX) echo " [CP] $(subst $(ASTTOPDIR)/,,$<) -> $@"
$(CMD_PREFIX) cp "$<" "$@"
ast_expr2f.c: $(ASTTOPDIR)/main/ast_expr2f.c
@cp "$<" "$@"
ast_expr2f.o: ASTCFLAGS+=-DSTANDALONE -I$(ASTTOPDIR)/main -Wno-unused
@ -125,6 +140,7 @@ aelparse.c: $(ASTTOPDIR)/res/ael/ael_lex.c
ael_main.o: ASTCFLAGS+=-DSTANDALONE
aelparse.o: ASTCFLAGS+=-I$(ASTTOPDIR)/res -DSTANDALONE -Wno-unused
aelparse: LIBS+=-lm
aelparse: aelparse.o aelbison.o pbx_ael.o hashtab.o ael_main.o ast_expr2f.o ast_expr2.o strcompat.o pval.o extconf.o
astobj2.c: $(ASTTOPDIR)/main/astobj2.c
@ -153,12 +169,16 @@ extconf.o: extconf.c
conf2ael: conf2ael.o ast_expr2f.o ast_expr2.o hashtab.o aelbison.o aelparse.o pbx_ael.o pval.o extconf.o strcompat.o
testexpr2s: $(ASTTOPDIR)/main/ast_expr2f.c $(ASTTOPDIR)/main/ast_expr2.c $(ASTTOPDIR)/main/ast_expr2.h
$(CC) -g -c -I$(ASTTOPDIR)/include -DSTANDALONE $(ASTTOPDIR)/main/ast_expr2f.c -o ast_expr2f.o
$(CC) -g -c -I$(ASTTOPDIR)/include -DSTANDALONE $(ASTTOPDIR)/main/ast_expr2.c -o ast_expr2.o
$(CC) -g -o testexpr2s ast_expr2f.o ast_expr2.o
rm ast_expr2.o ast_expr2f.o
./testexpr2s expr2.testinput
check_expr2: $(ASTTOPDIR)/main/ast_expr2f.c $(ASTTOPDIR)/main/ast_expr2.c $(ASTTOPDIR)/main/ast_expr2.h
$(ECHO_PREFIX) echo " [CC] ast_expr2f.c -> ast_expr2fz.o"
$(CC) -g -c -I$(ASTTOPDIR)/include -DSTANDALONE $(ASTTOPDIR)/main/ast_expr2f.c -o ast_expr2fz.o
$(ECHO_PREFIX) echo " [CC] ast_expr2.c -> ast_expr2z.o"
$(CC) -g -c -I$(ASTTOPDIR)/include -DSTANDALONE2 $(ASTTOPDIR)/main/ast_expr2.c -o ast_expr2z.o
$(ECHO_PREFIX) echo " [LD] ast_expr2fz.o ast_expr2z.o -> check_expr2"
$(CC) -g -o check_expr2 ast_expr2fz.o ast_expr2z.o -lm
$(ECHO_PREFIX) echo " [RM] ast_expr2fz.o ast_expr2z.o"
rm ast_expr2z.o ast_expr2fz.o
./check_expr2 expr2.testinput
smsq: smsq.o strcompat.o
smsq: LIBS+=$(POPT_LIB)

@ -123,4 +123,12 @@ ACOS(12)
ASIN(1)
ATAN(10)
SQRT(2)*SQRT(2)
ATAN(12) + TRUNC(2.4) *ASIN(14.3) *ACOS(1.2)
ATAN(.912)
TRUNC(2.4)
ASIN(0.705)
ACOS(.12)
ATAN(.912) + TRUNC(2.4) - ASIN(0.705) + ACOS(.12)
MATH(3*9)
${GLOBAL(ULKOPREFIX)}9${x}
512059${x}

Loading…
Cancel
Save