introduce a simplified interface for npval and start using it
authorLuigi Rizzo <rizzo@icir.org>
Thu, 27 Apr 2006 18:09:20 +0000 (18:09 +0000)
committerLuigi Rizzo <rizzo@icir.org>
Thu, 27 Apr 2006 18:09:20 +0000 (18:09 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@22928 65c4cc65-6c06-0410-ace0-fbb531ad65f3

pbx/ael/ael.tab.c
pbx/ael/ael.tab.h
pbx/ael/ael.y

index 673fd45..bad9056 100644 (file)
 #include "asterisk/utils.h"            /* ast_calloc() */
 #include "asterisk/ael_structs.h"
 
+/* create a new object with start-end marker */
 static pval *npval(pvaltype type, int first_line, int last_line,
        int first_column, int last_column);
+
 static void linku1(pval *head, pval *tail);
 
 void reset_parencount(yyscan_t yyscanner);
@@ -219,13 +221,13 @@ static char *ael_token_subst(char *mess);
 #endif
 
 #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
-#line 51 "ael.y"
+#line 53 "ael.y"
 typedef union YYSTYPE {
        char *str;
        struct pval *pval;
 } YYSTYPE;
 /* Line 196 of yacc.c.  */
-#line 229 "ael.tab.c"
+#line 231 "ael.tab.c"
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
 # define YYSTYPE_IS_TRIVIAL 1
@@ -246,16 +248,20 @@ typedef struct YYLTYPE
 
 
 /* Copy the second part of user declarations.  */
-#line 56 "ael.y"
+#line 58 "ael.y"
 
        /* declaring these AFTER the union makes things a lot simpler! */
 void yyerror(YYLTYPE *locp, struct parse_io *parseio, char const *s);
 int ael_yylex (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , void * yyscanner);
 
+/* create a new object with start-end marker, simplified interface.
+ * Must be declared here because YYLTYPE is not known before
+ */
+static pval *npval2(pvaltype type, YYLTYPE *first, YYLTYPE *last);
 
 
 /* Line 219 of yacc.c.  */
-#line 259 "ael.tab.c"
+#line 265 "ael.tab.c"
 
 #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
 # define YYSIZE_T __SIZE_TYPE__
@@ -555,22 +561,22 @@ static const yysigned_char yyrhs[] =
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const unsigned short int yyrline[] =
 {
-       0,   130,   130,   133,   134,   145,   148,   149,   150,   151,
-     154,   159,   163,   168,   172,   178,   183,   189,   196,   199,
-     202,   205,   210,   213,   218,   219,   220,   223,   223,   229,
-     232,   237,   240,   241,   242,   245,   248,   249,   250,   251,
-     252,   253,   253,   257,   258,   261,   266,   270,   275,   280,
-     289,   290,   293,   296,   296,   301,   301,   306,   322,   342,
-     343,   349,   350,   355,   363,   364,   368,   374,   374,   379,
-     382,   382,   386,   389,   392,   395,   396,   397,   395,   403,
-     403,   407,   411,   416,   420,   424,   427,   427,   460,   462,
-     464,   466,   471,   477,   482,   488,   493,   499,   502,   503,
-     508,   513,   520,   527,   534,   543,   548,   553,   560,   567,
-     574,   583,   583,   587,   592,   592,   602,   608,   611,   614,
-     617,   622,   629,   630,   635,   637,   638,   639,   640,   641,
-     644,   645,   650,   651,   654,   655,   658,   659,   662,   663,
-     664,   667,   668,   684,   697,   698,   713,   726,   729,   730,
-     733,   736
+       0,   136,   136,   139,   140,   151,   154,   155,   156,   157,
+     160,   164,   168,   173,   177,   183,   188,   194,   201,   204,
+     207,   210,   215,   218,   223,   224,   225,   228,   228,   234,
+     237,   242,   245,   246,   247,   250,   253,   254,   255,   256,
+     257,   258,   258,   262,   263,   266,   271,   275,   280,   285,
+     294,   295,   298,   301,   301,   306,   306,   311,   327,   347,
+     348,   354,   355,   360,   368,   369,   373,   379,   379,   387,
+     390,   390,   394,   397,   400,   403,   404,   405,   403,   411,
+     411,   415,   419,   424,   428,   432,   435,   435,   468,   470,
+     472,   474,   479,   485,   490,   496,   501,   507,   510,   511,
+     516,   521,   528,   535,   542,   551,   556,   561,   568,   575,
+     582,   591,   591,   595,   600,   600,   610,   616,   619,   622,
+     625,   630,   637,   638,   643,   645,   646,   647,   648,   649,
+     652,   653,   658,   659,   662,   663,   666,   667,   670,   671,
+     672,   675,   676,   692,   705,   706,   721,   734,   737,   738,
+     741,   744
 };
 #endif
 
@@ -1307,194 +1313,194 @@ yydestruct (yymsg, yytype, yyvaluep, yylocationp)
   switch (yytype)
     {
       case 41: /* "word" */
-#line 125 "ael.y"
+#line 131 "ael.y"
         { free((yyvaluep->str));};
-#line 1313 "ael.tab.c"
+#line 1319 "ael.tab.c"
         break;
       case 44: /* "objects" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1318 "ael.tab.c"
+#line 1324 "ael.tab.c"
         break;
       case 45: /* "object" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1323 "ael.tab.c"
+#line 1329 "ael.tab.c"
         break;
       case 46: /* "context" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1328 "ael.tab.c"
+#line 1334 "ael.tab.c"
         break;
       case 47: /* "macro" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1333 "ael.tab.c"
+#line 1339 "ael.tab.c"
         break;
       case 48: /* "globals" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1338 "ael.tab.c"
+#line 1344 "ael.tab.c"
         break;
       case 49: /* "global_statements" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1343 "ael.tab.c"
+#line 1349 "ael.tab.c"
         break;
       case 50: /* "global_statement" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1348 "ael.tab.c"
+#line 1354 "ael.tab.c"
         break;
       case 52: /* "arglist" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1353 "ael.tab.c"
+#line 1359 "ael.tab.c"
         break;
       case 53: /* "elements" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1358 "ael.tab.c"
+#line 1364 "ael.tab.c"
         break;
       case 54: /* "element" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1363 "ael.tab.c"
+#line 1369 "ael.tab.c"
         break;
       case 56: /* "ignorepat" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1368 "ael.tab.c"
+#line 1374 "ael.tab.c"
         break;
       case 57: /* "extension" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1373 "ael.tab.c"
+#line 1379 "ael.tab.c"
         break;
       case 58: /* "statements" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1378 "ael.tab.c"
+#line 1384 "ael.tab.c"
         break;
       case 59: /* "if_head" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1383 "ael.tab.c"
+#line 1389 "ael.tab.c"
         break;
       case 61: /* "random_head" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1388 "ael.tab.c"
+#line 1394 "ael.tab.c"
         break;
       case 63: /* "iftime_head" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1393 "ael.tab.c"
+#line 1399 "ael.tab.c"
         break;
       case 64: /* "word_list" */
-#line 125 "ael.y"
+#line 131 "ael.y"
         { free((yyvaluep->str));};
-#line 1398 "ael.tab.c"
+#line 1404 "ael.tab.c"
         break;
       case 65: /* "word3_list" */
-#line 125 "ael.y"
+#line 131 "ael.y"
         { free((yyvaluep->str));};
-#line 1403 "ael.tab.c"
+#line 1409 "ael.tab.c"
         break;
       case 66: /* "goto_word" */
-#line 125 "ael.y"
+#line 131 "ael.y"
         { free((yyvaluep->str));};
-#line 1408 "ael.tab.c"
+#line 1414 "ael.tab.c"
         break;
       case 67: /* "switch_head" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1413 "ael.tab.c"
+#line 1419 "ael.tab.c"
         break;
       case 69: /* "statement" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1418 "ael.tab.c"
+#line 1424 "ael.tab.c"
         break;
       case 76: /* "target" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1423 "ael.tab.c"
+#line 1429 "ael.tab.c"
         break;
       case 77: /* "jumptarget" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1428 "ael.tab.c"
+#line 1434 "ael.tab.c"
         break;
       case 78: /* "macro_call" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1433 "ael.tab.c"
+#line 1439 "ael.tab.c"
         break;
       case 80: /* "application_call_head" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1438 "ael.tab.c"
+#line 1444 "ael.tab.c"
         break;
       case 82: /* "application_call" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1443 "ael.tab.c"
+#line 1449 "ael.tab.c"
         break;
       case 83: /* "eval_arglist" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1448 "ael.tab.c"
+#line 1454 "ael.tab.c"
         break;
       case 84: /* "case_statements" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1453 "ael.tab.c"
+#line 1459 "ael.tab.c"
         break;
       case 85: /* "case_statement" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1458 "ael.tab.c"
+#line 1464 "ael.tab.c"
         break;
       case 86: /* "macro_statements" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1463 "ael.tab.c"
+#line 1469 "ael.tab.c"
         break;
       case 87: /* "macro_statement" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1468 "ael.tab.c"
+#line 1474 "ael.tab.c"
         break;
       case 88: /* "switches" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1473 "ael.tab.c"
+#line 1479 "ael.tab.c"
         break;
       case 89: /* "eswitches" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1478 "ael.tab.c"
+#line 1484 "ael.tab.c"
         break;
       case 90: /* "switchlist" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1483 "ael.tab.c"
+#line 1489 "ael.tab.c"
         break;
       case 91: /* "includeslist" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1488 "ael.tab.c"
+#line 1494 "ael.tab.c"
         break;
       case 92: /* "includedname" */
-#line 125 "ael.y"
+#line 131 "ael.y"
         { free((yyvaluep->str));};
-#line 1493 "ael.tab.c"
+#line 1499 "ael.tab.c"
         break;
       case 93: /* "includes" */
-#line 122 "ael.y"
+#line 128 "ael.y"
         { if (yymsg[0] != 'C') {destroy_pval((yyvaluep->pval)); prev_word=0;} else {printf("Cleanup destructor called for pvals\n");} };
-#line 1498 "ael.tab.c"
+#line 1504 "ael.tab.c"
         break;
 
       default:
@@ -1811,17 +1817,17 @@ yyreduce:
   switch (yyn)
     {
         case 2:
-#line 130 "ael.y"
+#line 136 "ael.y"
     { (yyval.pval) = parseio->pval = (yyvsp[0].pval); ;}
     break;
 
   case 3:
-#line 133 "ael.y"
+#line 139 "ael.y"
     {(yyval.pval)=(yyvsp[0].pval);;}
     break;
 
   case 4:
-#line 135 "ael.y"
+#line 141 "ael.y"
     {
                        if ( (yyvsp[-1].pval) && (yyvsp[0].pval) ) {
                                (yyval.pval)=(yyvsp[-1].pval);
@@ -1835,41 +1841,40 @@ yyreduce:
     break;
 
   case 5:
-#line 145 "ael.y"
+#line 151 "ael.y"
     {(yyval.pval)=(yyvsp[-1].pval);;}
     break;
 
   case 6:
-#line 148 "ael.y"
+#line 154 "ael.y"
     {(yyval.pval)=(yyvsp[0].pval);;}
     break;
 
   case 7:
-#line 149 "ael.y"
+#line 155 "ael.y"
     {(yyval.pval)=(yyvsp[0].pval);;}
     break;
 
   case 8:
-#line 150 "ael.y"
+#line 156 "ael.y"
     {(yyval.pval)=(yyvsp[0].pval);;}
     break;
 
   case 9:
-#line 151 "ael.y"
+#line 157 "ael.y"
     {(yyval.pval)=0;/* allow older docs to be read */;}
     break;
 
   case 10:
-#line 154 "ael.y"
+#line 160 "ael.y"
     {
-               (yyval.pval) = npval(PV_CONTEXT, (yylsp[-4]).first_line, (yylsp[0]).last_line,
-                       (yylsp[-4]).first_column, (yylsp[0]).last_column);
+               (yyval.pval) = npval2(PV_CONTEXT, &(yylsp[-4]), &(yylsp[0]));
                (yyval.pval)->u1.str = (yyvsp[-3].str);
                (yyval.pval)->u2.statements = (yyvsp[-1].pval); ;}
     break;
 
   case 11:
-#line 159 "ael.y"
+#line 164 "ael.y"
     {
                (yyval.pval) = npval(PV_CONTEXT, (yylsp[-3]).first_line, (yylsp[0]).last_line,
                        (yylsp[-3]).first_column, (yylsp[0]).last_column);
@@ -1877,7 +1882,7 @@ yyreduce:
     break;
 
   case 12:
-#line 163 "ael.y"
+#line 168 "ael.y"
     {
                (yyval.pval) = npval(PV_CONTEXT, (yylsp[-4]).first_line, (yylsp[0]).last_line,
                        (yylsp[-4]).first_column, (yylsp[0]).last_column);
@@ -1886,7 +1891,7 @@ yyreduce:
     break;
 
   case 13:
-#line 168 "ael.y"
+#line 173 "ael.y"
     {
                (yyval.pval) = npval(PV_CONTEXT, (yylsp[-3]).first_line, (yylsp[0]).last_line,
                        (yylsp[-3]).first_column, (yylsp[0]).last_column);
@@ -1894,7 +1899,7 @@ yyreduce:
     break;
 
   case 14:
-#line 172 "ael.y"
+#line 177 "ael.y"
     {
                (yyval.pval) = npval(PV_CONTEXT, (yylsp[-5]).first_line, (yylsp[0]).last_line,
                        (yylsp[-5]).first_column, (yylsp[0]).last_column);
@@ -1904,7 +1909,7 @@ yyreduce:
     break;
 
   case 15:
-#line 178 "ael.y"
+#line 183 "ael.y"
     {
                (yyval.pval) = npval(PV_CONTEXT, (yylsp[-4]).first_line, (yylsp[0]).last_line,
                        (yylsp[-4]).first_column, (yylsp[0]).last_column);
@@ -1913,7 +1918,7 @@ yyreduce:
     break;
 
   case 16:
-#line 183 "ael.y"
+#line 188 "ael.y"
     {
                (yyval.pval) = npval(PV_CONTEXT, (yylsp[-5]).first_line, (yylsp[0]).last_line,
                        (yylsp[-5]).first_column, (yylsp[0]).last_column);
@@ -1923,7 +1928,7 @@ yyreduce:
     break;
 
   case 17:
-#line 189 "ael.y"
+#line 194 "ael.y"
     {
                (yyval.pval) = npval(PV_CONTEXT, (yylsp[-4]).first_line, (yylsp[0]).last_line,
                        (yylsp[-4]).first_column, (yylsp[0]).last_column);
@@ -1932,69 +1937,69 @@ yyreduce:
     break;
 
   case 18:
-#line 196 "ael.y"
+#line 201 "ael.y"
     {
                (yyval.pval)=npval(PV_MACRO,(yylsp[-7]).first_line,(yylsp[0]).last_line, (yylsp[-7]).first_column, (yylsp[0]).last_column);
                (yyval.pval)->u1.str = (yyvsp[-6].str); (yyval.pval)->u2.arglist = (yyvsp[-4].pval); (yyval.pval)->u3.macro_statements = (yyvsp[-1].pval); ;}
     break;
 
   case 19:
-#line 199 "ael.y"
+#line 204 "ael.y"
     {
                (yyval.pval)=npval(PV_MACRO,(yylsp[-6]).first_line,(yylsp[0]).last_line, (yylsp[-6]).first_column, (yylsp[0]).last_column);
                (yyval.pval)->u1.str = (yyvsp[-5].str); (yyval.pval)->u2.arglist = (yyvsp[-3].pval); ;}
     break;
 
   case 20:
-#line 202 "ael.y"
+#line 207 "ael.y"
     {
                (yyval.pval)=npval(PV_MACRO,(yylsp[-6]).first_line,(yylsp[0]).last_line, (yylsp[-6]).first_column, (yylsp[0]).last_column);
                (yyval.pval)->u1.str = (yyvsp[-5].str); (yyval.pval)->u3.macro_statements = (yyvsp[-1].pval); ;}
     break;
 
   case 21:
-#line 205 "ael.y"
+#line 210 "ael.y"
     {
                (yyval.pval)=npval(PV_MACRO,(yylsp[-5]).first_line,(yylsp[0]).last_line, (yylsp[-5]).first_column, (yylsp[0]).last_column);
                (yyval.pval)->u1.str = (yyvsp[-4].str); /* pretty empty! */ ;}
     break;
 
   case 22:
-#line 210 "ael.y"
+#line 215 "ael.y"
     {
                (yyval.pval)=npval(PV_GLOBALS,(yylsp[-3]).first_line,(yylsp[0]).last_line, (yylsp[-3]).first_column, (yylsp[0]).last_column);
                (yyval.pval)->u1.statements = (yyvsp[-1].pval);;}
     break;
 
   case 23:
-#line 213 "ael.y"
+#line 218 "ael.y"
     {
                (yyval.pval)=npval(PV_GLOBALS,(yylsp[-2]).first_line,(yylsp[0]).last_line, (yylsp[-2]).first_column, (yylsp[0]).last_column);
                /* and that's all */ ;}
     break;
 
   case 24:
-#line 218 "ael.y"
+#line 223 "ael.y"
     {(yyval.pval)=(yyvsp[0].pval);;}
     break;
 
   case 25:
-#line 219 "ael.y"
+#line 224 "ael.y"
     {(yyval.pval)=(yyvsp[-1].pval); linku1((yyval.pval),(yyvsp[0].pval));;}
     break;
 
   case 26:
-#line 220 "ael.y"
+#line 225 "ael.y"
     {(yyval.pval)=(yyvsp[-1].pval);;}
     break;
 
   case 27:
-#line 223 "ael.y"
+#line 228 "ael.y"
     { reset_semicount(parseio->scanner); ;}
     break;
 
   case 28:
-#line 223 "ael.y"
+#line 228 "ael.y"
     {
                (yyval.pval)=npval(PV_VARDEC,(yylsp[-4]).first_line,(yylsp[0]).last_line, (yylsp[-4]).first_column, (yylsp[0]).last_column);
                (yyval.pval)->u1.str = (yyvsp[-4].str);
@@ -2002,14 +2007,14 @@ yyreduce:
     break;
 
   case 29:
-#line 229 "ael.y"
+#line 234 "ael.y"
     {
                (yyval.pval)= npval(PV_WORD,(yylsp[0]).first_line,(yylsp[0]).last_line, (yylsp[0]).first_column, (yylsp[0]).last_column);
                (yyval.pval)->u1.str = (yyvsp[0].str); ;}
     break;
 
   case 30:
-#line 232 "ael.y"
+#line 237 "ael.y"
     {
                pval *z = npval(PV_WORD,(yylsp[-2]).first_line,(yylsp[0]).last_line, (yylsp[-2]).first_column, (yylsp[0]).last_column);
                z->u1.str = (yyvsp[0].str);
@@ -2018,64 +2023,64 @@ yyreduce:
     break;
 
   case 31:
-#line 237 "ael.y"
+#line 242 "ael.y"
     {(yyval.pval)=(yyvsp[-1].pval);;}
     break;
 
   case 32:
-#line 240 "ael.y"
+#line 245 "ael.y"
     { (yyval.pval)=(yyvsp[0].pval);;}
     break;
 
   case 33:
-#line 241 "ael.y"
+#line 246 "ael.y"
     {(yyval.pval)=0;;}
     break;
 
   case 34:
-#line 242 "ael.y"
+#line 247 "ael.y"
     { if ( (yyvsp[-1].pval) && (yyvsp[0].pval) ) {(yyval.pval)=(yyvsp[-1].pval); linku1((yyval.pval),(yyvsp[0].pval));}
                                else if ( (yyvsp[-1].pval) ) {(yyval.pval)=(yyvsp[-1].pval);}
                                else if ( (yyvsp[0].pval) ) {(yyval.pval)=(yyvsp[0].pval);} ;}
     break;
 
   case 35:
-#line 245 "ael.y"
+#line 250 "ael.y"
     { (yyval.pval)=(yyvsp[-1].pval);;}
     break;
 
   case 36:
-#line 248 "ael.y"
+#line 253 "ael.y"
     {(yyval.pval)=(yyvsp[0].pval);;}
     break;
 
   case 37:
-#line 249 "ael.y"
+#line 254 "ael.y"
     {(yyval.pval)=(yyvsp[0].pval);;}
     break;
 
   case 38:
-#line 250 "ael.y"
+#line 255 "ael.y"
     {(yyval.pval)=(yyvsp[0].pval);;}
     break;
 
   case 39:
-#line 251 "ael.y"
+#line 256 "ael.y"
     {(yyval.pval)=(yyvsp[0].pval);;}
     break;
 
   case 40:
-#line 252 "ael.y"
+#line 257 "ael.y"
     {(yyval.pval)=(yyvsp[0].pval);;}
     break;
 
   case 41:
-#line 253 "ael.y"
+#line 258 "ael.y"
     { reset_semicount(parseio->scanner); ;}
     break;
 
   case 42:
-#line 253 "ael.y"
+#line 258 "ael.y"
     {
                (yyval.pval)=npval(PV_VARDEC,(yylsp[-4]).first_line,(yylsp[0]).last_line, (yylsp[-4]).first_column, (yylsp[0]).last_column);
                (yyval.pval)->u1.str = (yyvsp[-4].str);
@@ -2083,24 +2088,24 @@ yyreduce:
     break;
 
   case 43:
-#line 257 "ael.y"
+#line 262 "ael.y"
     {free((yyvsp[-1].str)); (yyval.pval)=0;;}
     break;
 
   case 44:
-#line 258 "ael.y"
+#line 263 "ael.y"
     {(yyval.pval)=0;/* allow older docs to be read */;}
     break;
 
   case 45:
-#line 261 "ael.y"
+#line 266 "ael.y"
     {
                (yyval.pval)=npval(PV_IGNOREPAT,(yylsp[-3]).first_line,(yylsp[0]).last_line, (yylsp[-3]).first_column, (yylsp[0]).last_column);
                (yyval.pval)->u1.str = (yyvsp[-1].str);;}
     break;
 
   case 46:
-#line 266 "ael.y"
+#line 271 "ael.y"
     {
                (yyval.pval) = npval(PV_EXTENSION,(yylsp[-2]).first_line,(yylsp[0]).last_line, (yylsp[-2]).first_column, (yylsp[0]).last_column);
                (yyval.pval)->u1.str = (yyvsp[-2].str);
@@ -2108,7 +2113,7 @@ yyreduce:
     break;
 
   case 47:
-#line 270 "ael.y"
+#line 275 "ael.y"
     {
                (yyval.pval) = npval(PV_EXTENSION,(yylsp[-3]).first_line,(yylsp[0]).last_line, (yylsp[-3]).first_column, (yylsp[0]).last_column);
                (yyval.pval)->u1.str = (yyvsp[-2].str);
@@ -2117,7 +2122,7 @@ yyreduce:
     break;
 
   case 48:
-#line 275 "ael.y"
+#line 280 "ael.y"
     {
                (yyval.pval) = npval(PV_EXTENSION,(yylsp[-6]).first_line,(yylsp[0]).last_line, (yylsp[-6]).first_column, (yylsp[0]).last_column);
                (yyval.pval)->u1.str = (yyvsp[-2].str);
@@ -2126,7 +2131,7 @@ yyreduce:
     break;
 
   case 49:
-#line 280 "ael.y"
+#line 285 "ael.y"
     {
                (yyval.pval) = npval(PV_EXTENSION,(yylsp[-7]).first_line,(yylsp[0]).last_line, (yylsp[-7]).first_column, (yylsp[0]).last_column);
                (yyval.pval)->u1.str = (yyvsp[-2].str);
@@ -2136,48 +2141,48 @@ yyreduce:
     break;
 
   case 50:
-#line 289 "ael.y"
+#line 294 "ael.y"
     {(yyval.pval)=(yyvsp[0].pval);;}
     break;
 
   case 51:
-#line 290 "ael.y"
+#line 295 "ael.y"
     {if ( (yyvsp[-1].pval) && (yyvsp[0].pval) ) {(yyval.pval)=(yyvsp[-1].pval); linku1((yyval.pval),(yyvsp[0].pval));}
                                                 else if ( (yyvsp[-1].pval) ) {(yyval.pval)=(yyvsp[-1].pval);}
                                                 else if ( (yyvsp[0].pval) ) {(yyval.pval)=(yyvsp[0].pval);} ;}
     break;
 
   case 52:
-#line 293 "ael.y"
+#line 298 "ael.y"
     {(yyval.pval)=(yyvsp[-1].pval);;}
     break;
 
   case 53:
-#line 296 "ael.y"
+#line 301 "ael.y"
     { reset_parencount(parseio->scanner); ;}
     break;
 
   case 54:
-#line 296 "ael.y"
+#line 301 "ael.y"
     {
                (yyval.pval)= npval(PV_IF,(yylsp[-4]).first_line,(yylsp[0]).last_line, (yylsp[-4]).first_column, (yylsp[0]).last_column);
                (yyval.pval)->u1.str = (yyvsp[-1].str); ;}
     break;
 
   case 55:
-#line 301 "ael.y"
+#line 306 "ael.y"
     { reset_parencount(parseio->scanner); ;}
     break;
 
   case 56:
-#line 301 "ael.y"
+#line 306 "ael.y"
     {
                (yyval.pval)= npval(PV_RANDOM,(yylsp[-4]).first_line,(yylsp[0]).last_line, (yylsp[-4]).first_column, (yylsp[0]).last_column);
                (yyval.pval)->u1.str=(yyvsp[-1].str);;}
     break;
 
   case 57:
-#line 307 "ael.y"
+#line 312 "ael.y"
     {
                (yyval.pval)= npval(PV_IFTIME,(yylsp[-13]).first_line,(yylsp[-9]).last_line, (yylsp[-13]).first_column, (yylsp[-9]).last_column);
                (yyval.pval)->u1.list = npval(PV_WORD,(yylsp[-11]).first_line,(yylsp[-11]).last_line, (yylsp[-11]).first_column, (yylsp[-11]).last_column);
@@ -2196,7 +2201,7 @@ yyreduce:
     break;
 
   case 58:
-#line 322 "ael.y"
+#line 327 "ael.y"
     {
                (yyval.pval)= npval(PV_IFTIME,(yylsp[-9]).first_line,(yylsp[-5]).last_line, (yylsp[-9]).first_column, (yylsp[-5]).last_column);
                (yyval.pval)->u1.list = npval(PV_WORD,(yylsp[-7]).first_line,(yylsp[-7]).last_line, (yylsp[-7]).first_column, (yylsp[-7]).last_column);
@@ -2212,12 +2217,12 @@ yyreduce:
     break;
 
   case 59:
-#line 342 "ael.y"
+#line 347 "ael.y"
     { (yyval.str) = (yyvsp[0].str);;}
     break;
 
   case 60:
-#line 343 "ael.y"
+#line 348 "ael.y"
     {
                asprintf(&((yyval.str)), "%s%s", (yyvsp[-1].str), (yyvsp[0].str));
                free((yyvsp[-1].str));
@@ -2226,12 +2231,12 @@ yyreduce:
     break;
 
   case 61:
-#line 349 "ael.y"
+#line 354 "ael.y"
     { (yyval.str) = (yyvsp[0].str);;}
     break;
 
   case 62:
-#line 350 "ael.y"
+#line 355 "ael.y"
     {
                asprintf(&((yyval.str)), "%s%s", (yyvsp[-1].str), (yyvsp[0].str));
                free((yyvsp[-1].str));
@@ -2240,7 +2245,7 @@ yyreduce:
     break;
 
   case 63:
-#line 355 "ael.y"
+#line 360 "ael.y"
     {
                asprintf(&((yyval.str)), "%s%s%s", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str));
                free((yyvsp[-2].str));
@@ -2250,12 +2255,12 @@ yyreduce:
     break;
 
   case 64:
-#line 363 "ael.y"
+#line 368 "ael.y"
     { (yyval.str) = (yyvsp[0].str);;}
     break;
 
   case 65:
-#line 364 "ael.y"
+#line 369 "ael.y"
     {
                asprintf(&((yyval.str)), "%s%s", (yyvsp[-1].str), (yyvsp[0].str));
                free((yyvsp[-1].str));
@@ -2263,7 +2268,7 @@ yyreduce:
     break;
 
   case 66:
-#line 368 "ael.y"
+#line 373 "ael.y"
     {
                asprintf(&((yyval.str)), "%s:%s", (yyvsp[-2].str), (yyvsp[0].str));
                free((yyvsp[-2].str));
@@ -2271,31 +2276,31 @@ yyreduce:
     break;
 
   case 67:
-#line 374 "ael.y"
+#line 379 "ael.y"
     { reset_parencount(parseio->scanner); ;}
     break;
 
   case 68:
-#line 374 "ael.y"
+#line 379 "ael.y"
     {
                (yyval.pval)=npval(PV_SWITCH,(yylsp[-5]).first_line,(yylsp[0]).last_line, (yylsp[-5]).first_column, (yylsp[0]).last_column);
                (yyval.pval)->u1.str = (yyvsp[-2].str); ;}
     break;
 
   case 69:
-#line 379 "ael.y"
+#line 387 "ael.y"
     {
-               (yyval.pval)=npval(PV_STATEMENTBLOCK,(yylsp[-2]).first_line,(yylsp[0]).last_line, (yylsp[-2]).first_column, (yylsp[0]).last_column);
+               (yyval.pval) = npval2(PV_STATEMENTBLOCK, &(yylsp[-2]), &(yylsp[0]));
                (yyval.pval)->u1.list = (yyvsp[-1].pval); ;}
     break;
 
   case 70:
-#line 382 "ael.y"
+#line 390 "ael.y"
     {reset_semicount(parseio->scanner);;}
     break;
 
   case 71:
-#line 382 "ael.y"
+#line 390 "ael.y"
     {
                (yyval.pval)=npval(PV_VARDEC,(yylsp[-4]).first_line,(yylsp[0]).last_line, (yylsp[-4]).first_column, (yylsp[0]).last_column);
                (yyval.pval)->u1.str = (yyvsp[-4].str);
@@ -2303,43 +2308,43 @@ yyreduce:
     break;
 
   case 72:
-#line 386 "ael.y"
+#line 394 "ael.y"
     {
                (yyval.pval)=npval(PV_GOTO,(yylsp[-2]).first_line,(yylsp[0]).last_line, (yylsp[-2]).first_column, (yylsp[0]).last_column);
                (yyval.pval)->u1.list = (yyvsp[-1].pval);;}
     break;
 
   case 73:
-#line 389 "ael.y"
+#line 397 "ael.y"
     {
                (yyval.pval)=npval(PV_GOTO,(yylsp[-2]).first_line,(yylsp[0]).last_line, (yylsp[-2]).first_column, (yylsp[0]).last_column);
                (yyval.pval)->u1.list = (yyvsp[-1].pval);;}
     break;
 
   case 74:
-#line 392 "ael.y"
+#line 400 "ael.y"
     {
                (yyval.pval)=npval(PV_LABEL,(yylsp[-1]).first_line,(yylsp[0]).last_line, (yylsp[-1]).first_column, (yylsp[0]).last_column);
                (yyval.pval)->u1.str = (yyvsp[-1].str); ;}
     break;
 
   case 75:
-#line 395 "ael.y"
+#line 403 "ael.y"
     {reset_semicount(parseio->scanner);;}
     break;
 
   case 76:
-#line 396 "ael.y"
+#line 404 "ael.y"
     {reset_semicount(parseio->scanner);;}
     break;
 
   case 77:
-#line 397 "ael.y"
+#line 405 "ael.y"
     {reset_parencount(parseio->scanner);;}
     break;
 
   case 78:
-#line 397 "ael.y"
+#line 405 "ael.y"
     {
                (yyval.pval)=npval(PV_FOR,(yylsp[-11]).first_line,(yylsp[0]).last_line, (yylsp[-11]).first_column, (yylsp[0]).last_column);
                (yyval.pval)->u1.for_init = (yyvsp[-8].str);
@@ -2349,12 +2354,12 @@ yyreduce:
     break;
 
   case 79:
-#line 403 "ael.y"
+#line 411 "ael.y"
     {reset_parencount(parseio->scanner);;}
     break;
 
   case 80:
-#line 403 "ael.y"
+#line 411 "ael.y"
     {
                (yyval.pval)=npval(PV_WHILE,(yylsp[-5]).first_line,(yylsp[0]).last_line, (yylsp[-5]).first_column, (yylsp[0]).last_column);
                (yyval.pval)->u1.str = (yyvsp[-2].str);
@@ -2362,7 +2367,7 @@ yyreduce:
     break;
 
   case 81:
-#line 407 "ael.y"
+#line 415 "ael.y"
     {
                (yyval.pval)=(yyvsp[-1].pval);
                (yyval.pval)->endline = (yylsp[0]).last_line;
@@ -2370,7 +2375,7 @@ yyreduce:
     break;
 
   case 82:
-#line 411 "ael.y"
+#line 419 "ael.y"
     {
                (yyval.pval)=(yyvsp[-2].pval);
                (yyval.pval)->u2.statements = (yyvsp[-1].pval);
@@ -2379,7 +2384,7 @@ yyreduce:
     break;
 
   case 83:
-#line 416 "ael.y"
+#line 424 "ael.y"
     {
                (yyval.pval) = (yyvsp[-1].pval);
                (yyval.pval)->endline = (yylsp[-1]).last_line;
@@ -2387,7 +2392,7 @@ yyreduce:
     break;
 
   case 84:
-#line 420 "ael.y"
+#line 428 "ael.y"
     {
                (yyval.pval) = (yyvsp[-1].pval);
                (yyval.pval)->endline = (yylsp[0]).last_line;
@@ -2395,19 +2400,19 @@ yyreduce:
     break;
 
   case 85:
-#line 424 "ael.y"
+#line 432 "ael.y"
     {
                (yyval.pval)= npval(PV_APPLICATION_CALL,(yylsp[-1]).first_line,(yylsp[0]).last_line, (yylsp[-1]).first_column, (yylsp[0]).last_column);
                (yyval.pval)->u1.str = (yyvsp[-1].str);;}
     break;
 
   case 86:
-#line 427 "ael.y"
+#line 435 "ael.y"
     {reset_semicount(parseio->scanner);;}
     break;
 
   case 87:
-#line 427 "ael.y"
+#line 435 "ael.y"
     {
                char *bufx;
                int tot=0;
@@ -2444,25 +2449,25 @@ yyreduce:
     break;
 
   case 88:
-#line 460 "ael.y"
+#line 468 "ael.y"
     {
                (yyval.pval) = npval(PV_BREAK,(yylsp[-1]).first_line,(yylsp[0]).last_line, (yylsp[-1]).first_column, (yylsp[0]).last_column);;}
     break;
 
   case 89:
-#line 462 "ael.y"
+#line 470 "ael.y"
     {
                (yyval.pval) = npval(PV_RETURN,(yylsp[-1]).first_line,(yylsp[0]).last_line, (yylsp[-1]).first_column, (yylsp[0]).last_column);;}
     break;
 
   case 90:
-#line 464 "ael.y"
+#line 472 "ael.y"
     {
                (yyval.pval) = npval(PV_CONTINUE,(yylsp[-1]).first_line,(yylsp[0]).last_line, (yylsp[-1]).first_column, (yylsp[0]).last_column);;}
     break;
 
   case 91:
-#line 466 "ael.y"
+#line 474 "ael.y"
     {
                (yyval.pval)=(yyvsp[-1].pval);
                (yyval.pval)->u2.statements = (yyvsp[0].pval);
@@ -2471,7 +2476,7 @@ yyreduce:
     break;
 
   case 92:
-#line 471 "ael.y"
+#line 479 "ael.y"
     {
                (yyval.pval)=(yyvsp[-3].pval);
                (yyval.pval)->u2.statements = (yyvsp[-2].pval);
@@ -2481,7 +2486,7 @@ yyreduce:
     break;
 
   case 93:
-#line 477 "ael.y"
+#line 485 "ael.y"
     {
                (yyval.pval)=(yyvsp[-1].pval);
                (yyval.pval)->u2.statements = (yyvsp[0].pval);
@@ -2490,7 +2495,7 @@ yyreduce:
     break;
 
   case 94:
-#line 482 "ael.y"
+#line 490 "ael.y"
     {
                (yyval.pval)=(yyvsp[-3].pval);
                (yyval.pval)->u2.statements = (yyvsp[-2].pval);
@@ -2500,7 +2505,7 @@ yyreduce:
     break;
 
   case 95:
-#line 488 "ael.y"
+#line 496 "ael.y"
     {
                (yyval.pval)=(yyvsp[-1].pval);
                (yyval.pval)->u2.statements = (yyvsp[0].pval);
@@ -2509,7 +2514,7 @@ yyreduce:
     break;
 
   case 96:
-#line 493 "ael.y"
+#line 501 "ael.y"
     {
                (yyval.pval)=(yyvsp[-3].pval);
                (yyval.pval)->u2.statements = (yyvsp[-2].pval);
@@ -2519,17 +2524,17 @@ yyreduce:
     break;
 
   case 97:
-#line 499 "ael.y"
+#line 507 "ael.y"
     { (yyval.pval)=0; ;}
     break;
 
   case 98:
-#line 502 "ael.y"
+#line 510 "ael.y"
     { (yyval.pval) = npval(PV_WORD,(yylsp[0]).first_line,(yylsp[0]).last_line, (yylsp[0]).first_column, (yylsp[0]).last_column); (yyval.pval)->u1.str = (yyvsp[0].str);;}
     break;
 
   case 99:
-#line 503 "ael.y"
+#line 511 "ael.y"
     {
                (yyval.pval)=npval(PV_WORD,(yylsp[-2]).first_line,(yylsp[-2]).last_line, (yylsp[-2]).first_column, (yylsp[-2]).last_column);
                (yyval.pval)->u1.str = (yyvsp[-2].str);
@@ -2538,7 +2543,7 @@ yyreduce:
     break;
 
   case 100:
-#line 508 "ael.y"
+#line 516 "ael.y"
     {
                (yyval.pval)=npval(PV_WORD,(yylsp[-2]).first_line,(yylsp[-2]).last_line, (yylsp[-2]).first_column, (yylsp[-2]).last_column);
                (yyval.pval)->u1.str = (yyvsp[-2].str);
@@ -2547,7 +2552,7 @@ yyreduce:
     break;
 
   case 101:
-#line 513 "ael.y"
+#line 521 "ael.y"
     {
                (yyval.pval)=npval(PV_WORD,(yylsp[-4]).first_line,(yylsp[-4]).last_line, (yylsp[-4]).first_column, (yylsp[-4]).last_column);
                (yyval.pval)->u1.str = (yyvsp[-4].str);
@@ -2558,7 +2563,7 @@ yyreduce:
     break;
 
   case 102:
-#line 520 "ael.y"
+#line 528 "ael.y"
     {
                (yyval.pval)=npval(PV_WORD,(yylsp[-4]).first_line,(yylsp[-4]).last_line, (yylsp[-4]).first_column, (yylsp[-4]).last_column);
                (yyval.pval)->u1.str = (yyvsp[-4].str);
@@ -2569,7 +2574,7 @@ yyreduce:
     break;
 
   case 103:
-#line 527 "ael.y"
+#line 535 "ael.y"
     {
                (yyval.pval)=npval(PV_WORD,(yylsp[-4]).first_line,(yylsp[-4]).last_line, (yylsp[-4]).first_column, (yylsp[-4]).last_column);
                (yyval.pval)->u1.str = strdup("default");
@@ -2580,7 +2585,7 @@ yyreduce:
     break;
 
   case 104:
-#line 534 "ael.y"
+#line 542 "ael.y"
     {
                (yyval.pval)=npval(PV_WORD,(yylsp[-4]).first_line,(yylsp[-4]).last_line, (yylsp[-4]).first_column, (yylsp[-4]).last_column);
                (yyval.pval)->u1.str = strdup("default");
@@ -2591,7 +2596,7 @@ yyreduce:
     break;
 
   case 105:
-#line 543 "ael.y"
+#line 551 "ael.y"
     {
                (yyval.pval)=npval(PV_WORD,(yylsp[0]).first_line,(yylsp[0]).last_line, (yylsp[0]).first_column, (yylsp[0]).last_column);
                (yyval.pval)->u1.str = (yyvsp[0].str);
@@ -2600,7 +2605,7 @@ yyreduce:
     break;
 
   case 106:
-#line 548 "ael.y"
+#line 556 "ael.y"
     {
                (yyval.pval)=npval(PV_WORD,(yylsp[-2]).first_line,(yylsp[-2]).last_line, (yylsp[-2]).first_column, (yylsp[-2]).last_column);
                (yyval.pval)->u1.str = (yyvsp[-2].str);
@@ -2609,7 +2614,7 @@ yyreduce:
     break;
 
   case 107:
-#line 553 "ael.y"
+#line 561 "ael.y"
     {
                (yyval.pval)=npval(PV_WORD,(yylsp[-4]).first_line,(yylsp[-4]).last_line, (yylsp[-4]).first_column, (yylsp[-4]).last_column);
                (yyval.pval)->u1.str = (yyvsp[0].str);
@@ -2620,7 +2625,7 @@ yyreduce:
     break;
 
   case 108:
-#line 560 "ael.y"
+#line 568 "ael.y"
     {
                (yyval.pval)=npval(PV_WORD,(yylsp[-2]).first_line,(yylsp[-2]).last_line, (yylsp[-2]).first_column, (yylsp[-2]).last_column);
                (yyval.pval)->u1.str = (yyvsp[0].str);
@@ -2631,7 +2636,7 @@ yyreduce:
     break;
 
   case 109:
-#line 567 "ael.y"
+#line 575 "ael.y"
     {
                (yyval.pval)=npval(PV_WORD,(yylsp[-4]).first_line,(yylsp[-4]).last_line, (yylsp[-4]).first_column, (yylsp[-4]).last_column);
                (yyval.pval)->u1.str = strdup("default");
@@ -2642,7 +2647,7 @@ yyreduce:
     break;
 
   case 110:
-#line 574 "ael.y"
+#line 582 "ael.y"
     {
                (yyval.pval)=npval(PV_WORD,(yylsp[-2]).first_line,(yylsp[-2]).last_line, (yylsp[-2]).first_column, (yylsp[-2]).last_column);
                (yyval.pval)->u1.str = strdup("default");
@@ -2653,12 +2658,12 @@ yyreduce:
     break;
 
   case 111:
-#line 583 "ael.y"
+#line 591 "ael.y"
     {reset_argcount(parseio->scanner);;}
     break;
 
   case 112:
-#line 583 "ael.y"
+#line 591 "ael.y"
     {
                (yyval.pval)= npval(PV_MACRO_CALL,(yylsp[-4]).first_line,(yylsp[-3]).last_line, (yylsp[-4]).first_column, (yylsp[-3]).last_column);
                (yyval.pval)->u1.str = (yyvsp[-4].str);
@@ -2666,19 +2671,19 @@ yyreduce:
     break;
 
   case 113:
-#line 587 "ael.y"
+#line 595 "ael.y"
     {
                (yyval.pval)= npval(PV_MACRO_CALL,(yylsp[-2]).first_line,(yylsp[0]).last_line, (yylsp[-2]).first_column, (yylsp[0]).last_column);
                (yyval.pval)->u1.str = (yyvsp[-2].str); ;}
     break;
 
   case 114:
-#line 592 "ael.y"
+#line 600 "ael.y"
     {reset_argcount(parseio->scanner);;}
     break;
 
   case 115:
-#line 592 "ael.y"
+#line 600 "ael.y"
     {
                if (strcasecmp((yyvsp[-2].str),"goto") == 0) {
                        (yyval.pval)= npval(PV_GOTO,(yylsp[-2]).first_line,(yylsp[0]).last_line, (yylsp[-2]).first_column, (yylsp[0]).last_column);
@@ -2690,7 +2695,7 @@ yyreduce:
     break;
 
   case 116:
-#line 602 "ael.y"
+#line 610 "ael.y"
     {(yyval.pval) = (yyvsp[-2].pval);
                if( (yyval.pval)->type == PV_GOTO )
                        (yyval.pval)->u1.list = (yyvsp[-1].pval);
@@ -2700,26 +2705,26 @@ yyreduce:
     break;
 
   case 117:
-#line 608 "ael.y"
+#line 616 "ael.y"
     {(yyval.pval)=(yyvsp[-1].pval);(yyval.pval)->endline = (yylsp[0]).last_line; (yyval.pval)->endcol = (yylsp[0]).last_column;;}
     break;
 
   case 118:
-#line 611 "ael.y"
+#line 619 "ael.y"
     { 
                (yyval.pval)= npval(PV_WORD,(yylsp[0]).first_line,(yylsp[0]).last_line, (yylsp[0]).first_column, (yylsp[0]).last_column);
                (yyval.pval)->u1.str = (yyvsp[0].str);;}
     break;
 
   case 119:
-#line 614 "ael.y"
+#line 622 "ael.y"
     {
                (yyval.pval)= npval(PV_WORD,0/*@1.first_line*/,0/*@1.last_line*/,0/* @1.first_column*/, 0/*@1.last_column*/);
                (yyval.pval)->u1.str = strdup(""); ;}
     break;
 
   case 120:
-#line 617 "ael.y"
+#line 625 "ael.y"
     {
                pval *z = npval(PV_WORD,(yylsp[0]).first_line,(yylsp[0]).last_line, (yylsp[0]).first_column, (yylsp[0]).last_column);
                (yyval.pval) = (yyvsp[-2].pval);
@@ -2728,7 +2733,7 @@ yyreduce:
     break;
 
   case 121:
-#line 622 "ael.y"
+#line 630 "ael.y"
     {
                pval *z = npval(PV_WORD,(yylsp[0]).first_line,(yylsp[0]).last_line, (yylsp[0]).first_column, (yylsp[0]).last_column);
                (yyval.pval) = (yyvsp[-1].pval);
@@ -2737,112 +2742,112 @@ yyreduce:
     break;
 
   case 122:
-#line 629 "ael.y"
+#line 637 "ael.y"
     {(yyval.pval)=(yyvsp[0].pval);;}
     break;
 
   case 123:
-#line 630 "ael.y"
+#line 638 "ael.y"
     { if ( (yyvsp[-1].pval) && (yyvsp[0].pval) ) {(yyval.pval)=(yyvsp[-1].pval); linku1((yyval.pval),(yyvsp[0].pval));}
                                                 else if ( (yyvsp[-1].pval) ) {(yyval.pval)=(yyvsp[-1].pval);}
                                                 else if ( (yyvsp[0].pval) ) {(yyval.pval)=(yyvsp[0].pval);} ;}
     break;
 
   case 124:
-#line 635 "ael.y"
+#line 643 "ael.y"
     {
                (yyval.pval) = npval(PV_CASE,(yylsp[-3]).first_line,(yylsp[-1]).last_line, (yylsp[-3]).first_column, (yylsp[-1]).last_column); (yyval.pval)->u1.str = (yyvsp[-2].str); (yyval.pval)->u2.statements = (yyvsp[0].pval);;}
     break;
 
   case 125:
-#line 637 "ael.y"
+#line 645 "ael.y"
     {(yyval.pval) = npval(PV_DEFAULT,(yylsp[-2]).first_line,(yylsp[0]).last_line, (yylsp[-2]).first_column, (yylsp[0]).last_column); (yyval.pval)->u1.str = 0; (yyval.pval)->u2.statements = (yyvsp[0].pval);;}
     break;
 
   case 126:
-#line 638 "ael.y"
+#line 646 "ael.y"
     {(yyval.pval) = npval(PV_PATTERN,(yylsp[-3]).first_line,(yylsp[-1]).last_line, (yylsp[-3]).first_column, (yylsp[-1]).last_column); (yyval.pval)->u1.str = (yyvsp[-2].str); (yyval.pval)->u2.statements = (yyvsp[0].pval);;}
     break;
 
   case 127:
-#line 639 "ael.y"
+#line 647 "ael.y"
     {(yyval.pval) = npval(PV_CASE,(yylsp[-2]).first_line,(yylsp[0]).last_line, (yylsp[-2]).first_column, (yylsp[0]).last_column); (yyval.pval)->u1.str = (yyvsp[-1].str);;}
     break;
 
   case 128:
-#line 640 "ael.y"
+#line 648 "ael.y"
     {(yyval.pval) = npval(PV_DEFAULT,(yylsp[-1]).first_line,(yylsp[0]).last_line, (yylsp[-1]).first_column, (yylsp[0]).last_column); (yyval.pval)->u1.str = 0;;}
     break;
 
   case 129:
-#line 641 "ael.y"
+#line 649 "ael.y"
     {(yyval.pval) = npval(PV_PATTERN,(yylsp[-2]).first_line,(yylsp[0]).last_line, (yylsp[-2]).first_column, (yylsp[0]).last_column); (yyval.pval)->u1.str = (yyvsp[-1].str);;}
     break;
 
   case 130:
-#line 644 "ael.y"
+#line 652 "ael.y"
     {(yyval.pval) = (yyvsp[0].pval);;}
     break;
 
   case 131:
-#line 645 "ael.y"
+#line 653 "ael.y"
     { if ( (yyvsp[-1].pval) && (yyvsp[0].pval) ) {(yyval.pval)=(yyvsp[-1].pval); linku1((yyval.pval),(yyvsp[0].pval));}
                                                 else if ( (yyvsp[-1].pval) ) {(yyval.pval)=(yyvsp[-1].pval);}
                                                 else if ( (yyvsp[0].pval) ) {(yyval.pval)=(yyvsp[0].pval);} ;}
     break;
 
   case 132:
-#line 650 "ael.y"
+#line 658 "ael.y"
     {(yyval.pval)=(yyvsp[0].pval);;}
     break;
 
   case 133:
-#line 651 "ael.y"
+#line 659 "ael.y"
     {(yyval.pval)=npval(PV_CATCH,(yylsp[-4]).first_line,(yylsp[0]).last_line, (yylsp[-4]).first_column, (yylsp[0]).last_column); (yyval.pval)->u1.str = (yyvsp[-3].str); (yyval.pval)->u2.statements = (yyvsp[-1].pval);;}
     break;
 
   case 134:
-#line 654 "ael.y"
+#line 662 "ael.y"
     {(yyval.pval)= npval(PV_SWITCHES,(yylsp[-3]).first_line,(yylsp[0]).last_line, (yylsp[-3]).first_column, (yylsp[0]).last_column); (yyval.pval)->u1.list = (yyvsp[-1].pval); ;}
     break;
 
   case 135:
-#line 655 "ael.y"
+#line 663 "ael.y"
     {(yyval.pval)= npval(PV_SWITCHES,(yylsp[-2]).first_line,(yylsp[0]).last_line, (yylsp[-2]).first_column, (yylsp[0]).last_column);;}
     break;
 
   case 136:
-#line 658 "ael.y"
+#line 666 "ael.y"
     {(yyval.pval)= npval(PV_ESWITCHES,(yylsp[-3]).first_line,(yylsp[0]).last_line, (yylsp[-3]).first_column, (yylsp[0]).last_column); (yyval.pval)->u1.list = (yyvsp[-1].pval); ;}
     break;
 
   case 137:
-#line 659 "ael.y"
+#line 667 "ael.y"
     {(yyval.pval)= npval(PV_ESWITCHES,(yylsp[-2]).first_line,(yylsp[0]).last_line, (yylsp[-2]).first_column, (yylsp[0]).last_column); ;}
     break;
 
   case 138:
-#line 662 "ael.y"
+#line 670 "ael.y"
     {(yyval.pval)=npval(PV_WORD,(yylsp[-1]).first_line,(yylsp[0]).last_line, (yylsp[-1]).first_column, (yylsp[0]).last_column); (yyval.pval)->u1.str = (yyvsp[-1].str);;}
     break;
 
   case 139:
-#line 663 "ael.y"
+#line 671 "ael.y"
     {pval *z = npval(PV_WORD,(yylsp[-1]).first_line,(yylsp[0]).last_line, (yylsp[-1]).first_column, (yylsp[0]).last_column); (yyval.pval)=(yyvsp[-2].pval); z->u1.str = (yyvsp[-1].str); linku1((yyval.pval),z); ;}
     break;
 
   case 140:
-#line 664 "ael.y"
+#line 672 "ael.y"
     {(yyval.pval)=(yyvsp[-1].pval);;}
     break;
 
   case 141:
-#line 667 "ael.y"
+#line 675 "ael.y"
     {(yyval.pval)=npval(PV_WORD,(yylsp[-1]).first_line,(yylsp[0]).last_line, (yylsp[-1]).first_column, (yylsp[0]).last_column); (yyval.pval)->u1.str = (yyvsp[-1].str);;}
     break;
 
   case 142:
-#line 668 "ael.y"
+#line 676 "ael.y"
     {
                (yyval.pval)=npval(PV_WORD,(yylsp[-13]).first_line,(yylsp[-12]).last_line, (yylsp[-13]).first_column, (yylsp[-12]).last_column);
                (yyval.pval)->u1.str = (yyvsp[-13].str);
@@ -2862,7 +2867,7 @@ yyreduce:
     break;
 
   case 143:
-#line 684 "ael.y"
+#line 692 "ael.y"
     {
                (yyval.pval)=npval(PV_WORD,(yylsp[-9]).first_line,(yylsp[-8]).last_line, (yylsp[-9]).first_column, (yylsp[-8]).last_column);
                (yyval.pval)->u1.str = (yyvsp[-9].str);
@@ -2879,12 +2884,12 @@ yyreduce:
     break;
 
   case 144:
-#line 697 "ael.y"
+#line 705 "ael.y"
     {pval *z = npval(PV_WORD,(yylsp[-1]).first_line,(yylsp[0]).last_line, (yylsp[-1]).first_column, (yylsp[0]).last_column); (yyval.pval)=(yyvsp[-2].pval); z->u1.str = (yyvsp[-1].str); linku1((yyval.pval),z); ;}
     break;
 
   case 145:
-#line 698 "ael.y"
+#line 706 "ael.y"
     {pval *z = npval(PV_WORD,(yylsp[-13]).first_line,(yylsp[-12]).last_line, (yylsp[-13]).first_column, (yylsp[-12]).last_column);
                (yyval.pval)=(yyvsp[-14].pval); z->u1.str = (yyvsp[-13].str); linku1((yyval.pval),z);
                z->u2.arglist = npval(PV_WORD,(yylsp[-11]).first_line,(yylsp[-11]).last_line, (yylsp[-11]).first_column, (yylsp[-11]).last_column);
@@ -2903,7 +2908,7 @@ yyreduce:
     break;
 
   case 146:
-#line 714 "ael.y"
+#line 722 "ael.y"
     {pval *z = npval(PV_WORD,(yylsp[-9]).first_line,(yylsp[-9]).last_line, (yylsp[-9]).first_column, (yylsp[-8]).last_column);
                (yyval.pval)=(yyvsp[-10].pval); z->u1.str = (yyvsp[-9].str); linku1((yyval.pval),z);
                z->u2.arglist = npval(PV_WORD,(yylsp[-7]).first_line,(yylsp[-7]).last_line, (yylsp[-7]).first_column, (yylsp[-7]).last_column);
@@ -2919,29 +2924,29 @@ yyreduce:
     break;
 
   case 147:
-#line 726 "ael.y"
+#line 734 "ael.y"
     {(yyval.pval)=(yyvsp[-1].pval);;}
     break;
 
   case 148:
-#line 729 "ael.y"
+#line 737 "ael.y"
     { (yyval.str) = (yyvsp[0].str);;}
     break;
 
   case 149:
-#line 730 "ael.y"
+#line 738 "ael.y"
     {(yyval.str)=strdup("default");;}
     break;
 
   case 150:
-#line 733 "ael.y"
+#line 741 "ael.y"
     {
                (yyval.pval)= npval(PV_INCLUDES,(yylsp[-3]).first_line,(yylsp[0]).last_line, (yylsp[-3]).first_column, (yylsp[0]).last_column);
                (yyval.pval)->u1.list = (yyvsp[-1].pval);;}
     break;
 
   case 151:
-#line 736 "ael.y"
+#line 744 "ael.y"
     {
                (yyval.pval)= npval(PV_INCLUDES,(yylsp[-2]).first_line,(yylsp[0]).last_line, (yylsp[-2]).first_column, (yylsp[0]).last_column);;}
     break;
@@ -2951,7 +2956,7 @@ yyreduce:
     }
 
 /* Line 1126 of yacc.c.  */
-#line 2955 "ael.tab.c"
+#line 2960 "ael.tab.c"
 \f
   yyvsp -= yylen;
   yyssp -= yylen;
@@ -3226,7 +3231,7 @@ yyreturn:
 }
 
 
-#line 741 "ael.y"
+#line 749 "ael.y"
 
 
 static char *token_equivs1[] =
@@ -3379,6 +3384,12 @@ static struct pval *npval(pvaltype type, int first_line, int last_line,
        return z;
 }
 
+static struct pval *npval2(pvaltype type, YYLTYPE *first, YYLTYPE *last)
+{
+       return npval(type, first->first_line, last->last_line,
+                       first->first_column, last->last_column);
+}
+
 /* append second element to the list in the first one */
 static void linku1(pval *head, pval *tail)
 {
index 9328eb7..d4a924b 100644 (file)
 
 
 #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
-#line 51 "ael.y"
+#line 53 "ael.y"
 typedef union YYSTYPE {
        char *str;
        struct pval *pval;
index f2594c1..56df52b 100644 (file)
 #include "asterisk/utils.h"            /* ast_calloc() */
 #include "asterisk/ael_structs.h"
 
+/* create a new object with start-end marker */
 static pval *npval(pvaltype type, int first_line, int last_line,
        int first_column, int last_column);
+
 static void linku1(pval *head, pval *tail);
 
 void reset_parencount(yyscan_t yyscanner);
@@ -58,6 +60,10 @@ static char *ael_token_subst(char *mess);
 void yyerror(YYLTYPE *locp, struct parse_io *parseio, char const *s);
 int ael_yylex (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , void * yyscanner);
 
+/* create a new object with start-end marker, simplified interface.
+ * Must be declared here because YYLTYPE is not known before
+ */
+static pval *npval2(pvaltype type, YYLTYPE *first, YYLTYPE *last);
 %}
 
 
@@ -152,8 +158,7 @@ object : context {$$=$1;}
        ;
 
 context : KW_CONTEXT word LC elements RC {
-               $$ = npval(PV_CONTEXT, @1.first_line, @5.last_line,
-                       @1.first_column, @5.last_column);
+               $$ = npval2(PV_CONTEXT, &@1, &@5);
                $$->u1.str = $2;
                $$->u2.statements = $4; }
        | KW_CONTEXT word LC RC /* empty context OK */ {
@@ -376,8 +381,11 @@ switch_head : KW_SWITCH LP { reset_parencount(parseio->scanner); } word RP  LC {
                $$->u1.str = $4; }
        ;
 
+/*
+ * Definition of a statememt in our language
+ */
 statement : LC statements RC {
-               $$=npval(PV_STATEMENTBLOCK,@1.first_line,@3.last_line, @1.first_column, @3.last_column);
+               $$ = npval2(PV_STATEMENTBLOCK, &@1, &@3);
                $$->u1.list = $2; }
        | word EQ {reset_semicount(parseio->scanner);} word SEMI {
                $$=npval(PV_VARDEC,@1.first_line,@5.last_line, @1.first_column, @5.last_column);
@@ -890,6 +898,12 @@ static struct pval *npval(pvaltype type, int first_line, int last_line,
        return z;
 }
 
+static struct pval *npval2(pvaltype type, YYLTYPE *first, YYLTYPE *last)
+{
+       return npval(type, first->first_line, last->last_line,
+                       first->first_column, last->last_column);
+}
+
 /* append second element to the list in the first one */
 static void linku1(pval *head, pval *tail)
 {