Fossil SCM

Update to the latest Pikchr version that includes improved resistance to exponential macro-expansion attacks.

drh 2022-04-05 14:41 trunk
Commit f7530419619d7e671a80c5dcceee7f2bdc26bcf8ef6f60ed2eb517a7b905b72a
1 file changed +243 -229
+243 -229
--- extsrc/pikchr.c
+++ extsrc/pikchr.c
@@ -124,10 +124,19 @@
124124
#include <assert.h>
125125
#define count(X) (sizeof(X)/sizeof(X[0]))
126126
#ifndef M_PI
127127
# define M_PI 3.1415926535897932385
128128
#endif
129
+
130
+/* Limit the number of tokens in a single script to avoid run-away
131
+** macro expansion attacks. See forum post
132
+** https://pikchr.org/home/forumpost/ef8684c6955a411a
133
+*/
134
+#ifndef PIKCHR_TOKEN_LIMIT
135
+# define PIKCHR_TOKEN_LIMIT 100000
136
+#endif
137
+
129138
130139
/* Tag intentionally unused parameters with this macro to prevent
131140
** compiler warnings with -Wextra */
132141
#define UNUSED_PARAMETER(X) (void)(X)
133142
@@ -341,10 +350,11 @@
341350
/* Each call to the pikchr() subroutine uses an instance of the following
342351
** object to pass around context to all of its subroutines.
343352
*/
344353
struct Pik {
345354
unsigned nErr; /* Number of errors seen */
355
+ unsigned nToken; /* Number of tokens parsed */
346356
PToken sIn; /* Input Pikchr-language text */
347357
char *zOut; /* Result accumulates here */
348358
unsigned int nOut; /* Bytes written to zOut[] so far */
349359
unsigned int nOutAlloc; /* Space allocated to zOut[] */
350360
unsigned char eDir; /* Current direction */
@@ -479,11 +489,11 @@
479489
static PObj *pik_position_assert(Pik*,PPoint*,PToken*,PPoint*);
480490
static PNum pik_dist(PPoint*,PPoint*);
481491
static void pik_add_macro(Pik*,PToken *pId,PToken *pCode);
482492
483493
484
-#line 510 "pikchr.c"
494
+#line 520 "pikchr.c"
485495
/**************** End of %include directives **********************************/
486496
/* These constants specify the various numeric values for terminal symbols.
487497
***************** Begin token definitions *************************************/
488498
#ifndef T_ID
489499
#define T_ID 1
@@ -1708,22 +1718,22 @@
17081718
** inside the C code.
17091719
*/
17101720
/********* Begin destructor definitions ***************************************/
17111721
case 99: /* statement_list */
17121722
{
1713
-#line 499 "pikchr.y"
1723
+#line 509 "pikchr.y"
17141724
pik_elist_free(p,(yypminor->yy227));
1715
-#line 1740 "pikchr.c"
1725
+#line 1750 "pikchr.c"
17161726
}
17171727
break;
17181728
case 100: /* statement */
17191729
case 101: /* unnamed_statement */
17201730
case 102: /* basetype */
17211731
{
1722
-#line 501 "pikchr.y"
1732
+#line 511 "pikchr.y"
17231733
pik_elem_free(p,(yypminor->yy36));
1724
-#line 1749 "pikchr.c"
1734
+#line 1759 "pikchr.c"
17251735
}
17261736
break;
17271737
/********* End destructor definitions *****************************************/
17281738
default: break; /* If no destructor action specified: do nothing */
17291739
}
@@ -1937,14 +1947,14 @@
19371947
#endif
19381948
while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
19391949
/* Here code is inserted which will execute if the parser
19401950
** stack every overflows */
19411951
/******** Begin %stack_overflow code ******************************************/
1942
-#line 533 "pikchr.y"
1952
+#line 543 "pikchr.y"
19431953
19441954
pik_error(p, 0, "parser stack overflow");
1945
-#line 1970 "pikchr.c"
1955
+#line 1980 "pikchr.c"
19461956
/******** End %stack_overflow code ********************************************/
19471957
pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
19481958
pik_parserCTX_STORE
19491959
}
19501960
@@ -2420,619 +2430,619 @@
24202430
** break;
24212431
*/
24222432
/********** Begin reduce actions **********************************************/
24232433
YYMINORTYPE yylhsminor;
24242434
case 0: /* document ::= statement_list */
2425
-#line 537 "pikchr.y"
2435
+#line 547 "pikchr.y"
24262436
{pik_render(p,yymsp[0].minor.yy227);}
2427
-#line 2452 "pikchr.c"
2437
+#line 2462 "pikchr.c"
24282438
break;
24292439
case 1: /* statement_list ::= statement */
2430
-#line 540 "pikchr.y"
2440
+#line 550 "pikchr.y"
24312441
{ yylhsminor.yy227 = pik_elist_append(p,0,yymsp[0].minor.yy36); }
2432
-#line 2457 "pikchr.c"
2442
+#line 2467 "pikchr.c"
24332443
yymsp[0].minor.yy227 = yylhsminor.yy227;
24342444
break;
24352445
case 2: /* statement_list ::= statement_list EOL statement */
2436
-#line 542 "pikchr.y"
2446
+#line 552 "pikchr.y"
24372447
{ yylhsminor.yy227 = pik_elist_append(p,yymsp[-2].minor.yy227,yymsp[0].minor.yy36); }
2438
-#line 2463 "pikchr.c"
2448
+#line 2473 "pikchr.c"
24392449
yymsp[-2].minor.yy227 = yylhsminor.yy227;
24402450
break;
24412451
case 3: /* statement ::= */
2442
-#line 545 "pikchr.y"
2452
+#line 555 "pikchr.y"
24432453
{ yymsp[1].minor.yy36 = 0; }
2444
-#line 2469 "pikchr.c"
2454
+#line 2479 "pikchr.c"
24452455
break;
24462456
case 4: /* statement ::= direction */
2447
-#line 546 "pikchr.y"
2457
+#line 556 "pikchr.y"
24482458
{ pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy36=0; }
2449
-#line 2474 "pikchr.c"
2459
+#line 2484 "pikchr.c"
24502460
yymsp[0].minor.yy36 = yylhsminor.yy36;
24512461
break;
24522462
case 5: /* statement ::= lvalue ASSIGN rvalue */
2453
-#line 547 "pikchr.y"
2463
+#line 557 "pikchr.y"
24542464
{pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy153,&yymsp[-1].minor.yy0); yylhsminor.yy36=0;}
2455
-#line 2480 "pikchr.c"
2465
+#line 2490 "pikchr.c"
24562466
yymsp[-2].minor.yy36 = yylhsminor.yy36;
24572467
break;
24582468
case 6: /* statement ::= PLACENAME COLON unnamed_statement */
2459
-#line 549 "pikchr.y"
2469
+#line 559 "pikchr.y"
24602470
{ yylhsminor.yy36 = yymsp[0].minor.yy36; pik_elem_setname(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0); }
2461
-#line 2486 "pikchr.c"
2471
+#line 2496 "pikchr.c"
24622472
yymsp[-2].minor.yy36 = yylhsminor.yy36;
24632473
break;
24642474
case 7: /* statement ::= PLACENAME COLON position */
2465
-#line 551 "pikchr.y"
2475
+#line 561 "pikchr.y"
24662476
{ yylhsminor.yy36 = pik_elem_new(p,0,0,0);
24672477
if(yylhsminor.yy36){ yylhsminor.yy36->ptAt = yymsp[0].minor.yy79; pik_elem_setname(p,yylhsminor.yy36,&yymsp[-2].minor.yy0); }}
2468
-#line 2493 "pikchr.c"
2478
+#line 2503 "pikchr.c"
24692479
yymsp[-2].minor.yy36 = yylhsminor.yy36;
24702480
break;
24712481
case 8: /* statement ::= unnamed_statement */
2472
-#line 553 "pikchr.y"
2482
+#line 563 "pikchr.y"
24732483
{yylhsminor.yy36 = yymsp[0].minor.yy36;}
2474
-#line 2499 "pikchr.c"
2484
+#line 2509 "pikchr.c"
24752485
yymsp[0].minor.yy36 = yylhsminor.yy36;
24762486
break;
24772487
case 9: /* statement ::= print prlist */
2478
-#line 554 "pikchr.y"
2488
+#line 564 "pikchr.y"
24792489
{pik_append(p,"<br>\n",5); yymsp[-1].minor.yy36=0;}
2480
-#line 2505 "pikchr.c"
2490
+#line 2515 "pikchr.c"
24812491
break;
24822492
case 10: /* statement ::= ASSERT LP expr EQ expr RP */
2483
-#line 559 "pikchr.y"
2493
+#line 569 "pikchr.y"
24842494
{yymsp[-5].minor.yy36=pik_assert(p,yymsp[-3].minor.yy153,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy153);}
2485
-#line 2510 "pikchr.c"
2495
+#line 2520 "pikchr.c"
24862496
break;
24872497
case 11: /* statement ::= ASSERT LP position EQ position RP */
2488
-#line 561 "pikchr.y"
2498
+#line 571 "pikchr.y"
24892499
{yymsp[-5].minor.yy36=pik_position_assert(p,&yymsp[-3].minor.yy79,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy79);}
2490
-#line 2515 "pikchr.c"
2500
+#line 2525 "pikchr.c"
24912501
break;
24922502
case 12: /* statement ::= DEFINE ID CODEBLOCK */
2493
-#line 562 "pikchr.y"
2503
+#line 572 "pikchr.y"
24942504
{yymsp[-2].minor.yy36=0; pik_add_macro(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
2495
-#line 2520 "pikchr.c"
2505
+#line 2530 "pikchr.c"
24962506
break;
24972507
case 13: /* rvalue ::= PLACENAME */
2498
-#line 573 "pikchr.y"
2508
+#line 583 "pikchr.y"
24992509
{yylhsminor.yy153 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2500
-#line 2525 "pikchr.c"
2510
+#line 2535 "pikchr.c"
25012511
yymsp[0].minor.yy153 = yylhsminor.yy153;
25022512
break;
25032513
case 14: /* pritem ::= FILL */
25042514
case 15: /* pritem ::= COLOR */ yytestcase(yyruleno==15);
25052515
case 16: /* pritem ::= THICKNESS */ yytestcase(yyruleno==16);
2506
-#line 578 "pikchr.y"
2516
+#line 588 "pikchr.y"
25072517
{pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2508
-#line 2533 "pikchr.c"
2518
+#line 2543 "pikchr.c"
25092519
break;
25102520
case 17: /* pritem ::= rvalue */
2511
-#line 581 "pikchr.y"
2521
+#line 591 "pikchr.y"
25122522
{pik_append_num(p,"",yymsp[0].minor.yy153);}
2513
-#line 2538 "pikchr.c"
2523
+#line 2548 "pikchr.c"
25142524
break;
25152525
case 18: /* pritem ::= STRING */
2516
-#line 582 "pikchr.y"
2526
+#line 592 "pikchr.y"
25172527
{pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2518
-#line 2543 "pikchr.c"
2528
+#line 2553 "pikchr.c"
25192529
break;
25202530
case 19: /* prsep ::= COMMA */
2521
-#line 583 "pikchr.y"
2531
+#line 593 "pikchr.y"
25222532
{pik_append(p, " ", 1);}
2523
-#line 2548 "pikchr.c"
2533
+#line 2558 "pikchr.c"
25242534
break;
25252535
case 20: /* unnamed_statement ::= basetype attribute_list */
2526
-#line 586 "pikchr.y"
2536
+#line 596 "pikchr.y"
25272537
{yylhsminor.yy36 = yymsp[-1].minor.yy36; pik_after_adding_attributes(p,yylhsminor.yy36);}
2528
-#line 2553 "pikchr.c"
2538
+#line 2563 "pikchr.c"
25292539
yymsp[-1].minor.yy36 = yylhsminor.yy36;
25302540
break;
25312541
case 21: /* basetype ::= CLASSNAME */
2532
-#line 588 "pikchr.y"
2542
+#line 598 "pikchr.y"
25332543
{yylhsminor.yy36 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2534
-#line 2559 "pikchr.c"
2544
+#line 2569 "pikchr.c"
25352545
yymsp[0].minor.yy36 = yylhsminor.yy36;
25362546
break;
25372547
case 22: /* basetype ::= STRING textposition */
2538
-#line 590 "pikchr.y"
2548
+#line 600 "pikchr.y"
25392549
{yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy164; yylhsminor.yy36 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2540
-#line 2565 "pikchr.c"
2550
+#line 2575 "pikchr.c"
25412551
yymsp[-1].minor.yy36 = yylhsminor.yy36;
25422552
break;
25432553
case 23: /* basetype ::= LB savelist statement_list RB */
2544
-#line 592 "pikchr.y"
2554
+#line 602 "pikchr.y"
25452555
{ p->list = yymsp[-2].minor.yy227; yymsp[-3].minor.yy36 = pik_elem_new(p,0,0,yymsp[-1].minor.yy227); if(yymsp[-3].minor.yy36) yymsp[-3].minor.yy36->errTok = yymsp[0].minor.yy0; }
2546
-#line 2571 "pikchr.c"
2556
+#line 2581 "pikchr.c"
25472557
break;
25482558
case 24: /* savelist ::= */
2549
-#line 597 "pikchr.y"
2559
+#line 607 "pikchr.y"
25502560
{yymsp[1].minor.yy227 = p->list; p->list = 0;}
2551
-#line 2576 "pikchr.c"
2561
+#line 2586 "pikchr.c"
25522562
break;
25532563
case 25: /* relexpr ::= expr */
2554
-#line 604 "pikchr.y"
2564
+#line 614 "pikchr.y"
25552565
{yylhsminor.yy10.rAbs = yymsp[0].minor.yy153; yylhsminor.yy10.rRel = 0;}
2556
-#line 2581 "pikchr.c"
2566
+#line 2591 "pikchr.c"
25572567
yymsp[0].minor.yy10 = yylhsminor.yy10;
25582568
break;
25592569
case 26: /* relexpr ::= expr PERCENT */
2560
-#line 605 "pikchr.y"
2570
+#line 615 "pikchr.y"
25612571
{yylhsminor.yy10.rAbs = 0; yylhsminor.yy10.rRel = yymsp[-1].minor.yy153/100;}
2562
-#line 2587 "pikchr.c"
2572
+#line 2597 "pikchr.c"
25632573
yymsp[-1].minor.yy10 = yylhsminor.yy10;
25642574
break;
25652575
case 27: /* optrelexpr ::= */
2566
-#line 607 "pikchr.y"
2576
+#line 617 "pikchr.y"
25672577
{yymsp[1].minor.yy10.rAbs = 0; yymsp[1].minor.yy10.rRel = 1.0;}
2568
-#line 2593 "pikchr.c"
2578
+#line 2603 "pikchr.c"
25692579
break;
25702580
case 28: /* attribute_list ::= relexpr alist */
2571
-#line 609 "pikchr.y"
2581
+#line 619 "pikchr.y"
25722582
{pik_add_direction(p,0,&yymsp[-1].minor.yy10);}
2573
-#line 2598 "pikchr.c"
2583
+#line 2608 "pikchr.c"
25742584
break;
25752585
case 29: /* attribute ::= numproperty relexpr */
2576
-#line 613 "pikchr.y"
2586
+#line 623 "pikchr.y"
25772587
{ pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy10); }
2578
-#line 2603 "pikchr.c"
2588
+#line 2613 "pikchr.c"
25792589
break;
25802590
case 30: /* attribute ::= dashproperty expr */
2581
-#line 614 "pikchr.y"
2591
+#line 624 "pikchr.y"
25822592
{ pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy153); }
2583
-#line 2608 "pikchr.c"
2593
+#line 2618 "pikchr.c"
25842594
break;
25852595
case 31: /* attribute ::= dashproperty */
2586
-#line 615 "pikchr.y"
2596
+#line 625 "pikchr.y"
25872597
{ pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2588
-#line 2613 "pikchr.c"
2598
+#line 2623 "pikchr.c"
25892599
break;
25902600
case 32: /* attribute ::= colorproperty rvalue */
2591
-#line 616 "pikchr.y"
2601
+#line 626 "pikchr.y"
25922602
{ pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy153); }
2593
-#line 2618 "pikchr.c"
2603
+#line 2628 "pikchr.c"
25942604
break;
25952605
case 33: /* attribute ::= go direction optrelexpr */
2596
-#line 617 "pikchr.y"
2606
+#line 627 "pikchr.y"
25972607
{ pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy10);}
2598
-#line 2623 "pikchr.c"
2608
+#line 2633 "pikchr.c"
25992609
break;
26002610
case 34: /* attribute ::= go direction even position */
2601
-#line 618 "pikchr.y"
2611
+#line 628 "pikchr.y"
26022612
{pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy79);}
2603
-#line 2628 "pikchr.c"
2613
+#line 2638 "pikchr.c"
26042614
break;
26052615
case 35: /* attribute ::= CLOSE */
2606
-#line 619 "pikchr.y"
2616
+#line 629 "pikchr.y"
26072617
{ pik_close_path(p,&yymsp[0].minor.yy0); }
2608
-#line 2633 "pikchr.c"
2618
+#line 2643 "pikchr.c"
26092619
break;
26102620
case 36: /* attribute ::= CHOP */
2611
-#line 620 "pikchr.y"
2621
+#line 630 "pikchr.y"
26122622
{ p->cur->bChop = 1; }
2613
-#line 2638 "pikchr.c"
2623
+#line 2648 "pikchr.c"
26142624
break;
26152625
case 37: /* attribute ::= FROM position */
2616
-#line 621 "pikchr.y"
2626
+#line 631 "pikchr.y"
26172627
{ pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy79); }
2618
-#line 2643 "pikchr.c"
2628
+#line 2653 "pikchr.c"
26192629
break;
26202630
case 38: /* attribute ::= TO position */
2621
-#line 622 "pikchr.y"
2631
+#line 632 "pikchr.y"
26222632
{ pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy79); }
2623
-#line 2648 "pikchr.c"
2633
+#line 2658 "pikchr.c"
26242634
break;
26252635
case 39: /* attribute ::= THEN */
2626
-#line 623 "pikchr.y"
2636
+#line 633 "pikchr.y"
26272637
{ pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2628
-#line 2653 "pikchr.c"
2638
+#line 2663 "pikchr.c"
26292639
break;
26302640
case 40: /* attribute ::= THEN optrelexpr HEADING expr */
26312641
case 42: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==42);
2632
-#line 625 "pikchr.y"
2642
+#line 635 "pikchr.y"
26332643
{pik_move_hdg(p,&yymsp[-2].minor.yy10,&yymsp[-1].minor.yy0,yymsp[0].minor.yy153,0,&yymsp[-3].minor.yy0);}
2634
-#line 2659 "pikchr.c"
2644
+#line 2669 "pikchr.c"
26352645
break;
26362646
case 41: /* attribute ::= THEN optrelexpr EDGEPT */
26372647
case 43: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==43);
2638
-#line 626 "pikchr.y"
2648
+#line 636 "pikchr.y"
26392649
{pik_move_hdg(p,&yymsp[-1].minor.yy10,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2640
-#line 2665 "pikchr.c"
2650
+#line 2675 "pikchr.c"
26412651
break;
26422652
case 44: /* attribute ::= AT position */
2643
-#line 631 "pikchr.y"
2653
+#line 641 "pikchr.y"
26442654
{ pik_set_at(p,0,&yymsp[0].minor.yy79,&yymsp[-1].minor.yy0); }
2645
-#line 2670 "pikchr.c"
2655
+#line 2680 "pikchr.c"
26462656
break;
26472657
case 45: /* attribute ::= SAME */
2648
-#line 633 "pikchr.y"
2658
+#line 643 "pikchr.y"
26492659
{pik_same(p,0,&yymsp[0].minor.yy0);}
2650
-#line 2675 "pikchr.c"
2660
+#line 2685 "pikchr.c"
26512661
break;
26522662
case 46: /* attribute ::= SAME AS object */
2653
-#line 634 "pikchr.y"
2663
+#line 644 "pikchr.y"
26542664
{pik_same(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2655
-#line 2680 "pikchr.c"
2665
+#line 2690 "pikchr.c"
26562666
break;
26572667
case 47: /* attribute ::= STRING textposition */
2658
-#line 635 "pikchr.y"
2668
+#line 645 "pikchr.y"
26592669
{pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy164);}
2660
-#line 2685 "pikchr.c"
2670
+#line 2695 "pikchr.c"
26612671
break;
26622672
case 48: /* attribute ::= FIT */
2663
-#line 636 "pikchr.y"
2673
+#line 646 "pikchr.y"
26642674
{pik_size_to_fit(p,&yymsp[0].minor.yy0,3); }
2665
-#line 2690 "pikchr.c"
2675
+#line 2700 "pikchr.c"
26662676
break;
26672677
case 49: /* attribute ::= BEHIND object */
2668
-#line 637 "pikchr.y"
2678
+#line 647 "pikchr.y"
26692679
{pik_behind(p,yymsp[0].minor.yy36);}
2670
-#line 2695 "pikchr.c"
2680
+#line 2705 "pikchr.c"
26712681
break;
26722682
case 50: /* withclause ::= DOT_E edge AT position */
26732683
case 51: /* withclause ::= edge AT position */ yytestcase(yyruleno==51);
2674
-#line 645 "pikchr.y"
2684
+#line 655 "pikchr.y"
26752685
{ pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy79,&yymsp[-1].minor.yy0); }
2676
-#line 2701 "pikchr.c"
2686
+#line 2711 "pikchr.c"
26772687
break;
26782688
case 52: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2679
-#line 649 "pikchr.y"
2689
+#line 659 "pikchr.y"
26802690
{yylhsminor.yy0 = yymsp[0].minor.yy0;}
2681
-#line 2706 "pikchr.c"
2691
+#line 2716 "pikchr.c"
26822692
yymsp[0].minor.yy0 = yylhsminor.yy0;
26832693
break;
26842694
case 53: /* boolproperty ::= CW */
2685
-#line 660 "pikchr.y"
2695
+#line 670 "pikchr.y"
26862696
{p->cur->cw = 1;}
2687
-#line 2712 "pikchr.c"
2697
+#line 2722 "pikchr.c"
26882698
break;
26892699
case 54: /* boolproperty ::= CCW */
2690
-#line 661 "pikchr.y"
2700
+#line 671 "pikchr.y"
26912701
{p->cur->cw = 0;}
2692
-#line 2717 "pikchr.c"
2702
+#line 2727 "pikchr.c"
26932703
break;
26942704
case 55: /* boolproperty ::= LARROW */
2695
-#line 662 "pikchr.y"
2705
+#line 672 "pikchr.y"
26962706
{p->cur->larrow=1; p->cur->rarrow=0; }
2697
-#line 2722 "pikchr.c"
2707
+#line 2732 "pikchr.c"
26982708
break;
26992709
case 56: /* boolproperty ::= RARROW */
2700
-#line 663 "pikchr.y"
2710
+#line 673 "pikchr.y"
27012711
{p->cur->larrow=0; p->cur->rarrow=1; }
2702
-#line 2727 "pikchr.c"
2712
+#line 2737 "pikchr.c"
27032713
break;
27042714
case 57: /* boolproperty ::= LRARROW */
2705
-#line 664 "pikchr.y"
2715
+#line 674 "pikchr.y"
27062716
{p->cur->larrow=1; p->cur->rarrow=1; }
2707
-#line 2732 "pikchr.c"
2717
+#line 2742 "pikchr.c"
27082718
break;
27092719
case 58: /* boolproperty ::= INVIS */
2710
-#line 665 "pikchr.y"
2720
+#line 675 "pikchr.y"
27112721
{p->cur->sw = 0.0;}
2712
-#line 2737 "pikchr.c"
2722
+#line 2747 "pikchr.c"
27132723
break;
27142724
case 59: /* boolproperty ::= THICK */
2715
-#line 666 "pikchr.y"
2725
+#line 676 "pikchr.y"
27162726
{p->cur->sw *= 1.5;}
2717
-#line 2742 "pikchr.c"
2727
+#line 2752 "pikchr.c"
27182728
break;
27192729
case 60: /* boolproperty ::= THIN */
2720
-#line 667 "pikchr.y"
2730
+#line 677 "pikchr.y"
27212731
{p->cur->sw *= 0.67;}
2722
-#line 2747 "pikchr.c"
2732
+#line 2757 "pikchr.c"
27232733
break;
27242734
case 61: /* boolproperty ::= SOLID */
2725
-#line 668 "pikchr.y"
2735
+#line 678 "pikchr.y"
27262736
{p->cur->sw = pik_value(p,"thickness",9,0);
27272737
p->cur->dotted = p->cur->dashed = 0.0;}
2728
-#line 2753 "pikchr.c"
2738
+#line 2763 "pikchr.c"
27292739
break;
27302740
case 62: /* textposition ::= */
2731
-#line 671 "pikchr.y"
2741
+#line 681 "pikchr.y"
27322742
{yymsp[1].minor.yy164 = 0;}
2733
-#line 2758 "pikchr.c"
2743
+#line 2768 "pikchr.c"
27342744
break;
27352745
case 63: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2736
-#line 674 "pikchr.y"
2746
+#line 684 "pikchr.y"
27372747
{yylhsminor.yy164 = (short int)pik_text_position(yymsp[-1].minor.yy164,&yymsp[0].minor.yy0);}
2738
-#line 2763 "pikchr.c"
2748
+#line 2773 "pikchr.c"
27392749
yymsp[-1].minor.yy164 = yylhsminor.yy164;
27402750
break;
27412751
case 64: /* position ::= expr COMMA expr */
2742
-#line 677 "pikchr.y"
2752
+#line 687 "pikchr.y"
27432753
{yylhsminor.yy79.x=yymsp[-2].minor.yy153; yylhsminor.yy79.y=yymsp[0].minor.yy153;}
2744
-#line 2769 "pikchr.c"
2754
+#line 2779 "pikchr.c"
27452755
yymsp[-2].minor.yy79 = yylhsminor.yy79;
27462756
break;
27472757
case 65: /* position ::= place PLUS expr COMMA expr */
2748
-#line 679 "pikchr.y"
2758
+#line 689 "pikchr.y"
27492759
{yylhsminor.yy79.x=yymsp[-4].minor.yy79.x+yymsp[-2].minor.yy153; yylhsminor.yy79.y=yymsp[-4].minor.yy79.y+yymsp[0].minor.yy153;}
2750
-#line 2775 "pikchr.c"
2760
+#line 2785 "pikchr.c"
27512761
yymsp[-4].minor.yy79 = yylhsminor.yy79;
27522762
break;
27532763
case 66: /* position ::= place MINUS expr COMMA expr */
2754
-#line 680 "pikchr.y"
2764
+#line 690 "pikchr.y"
27552765
{yylhsminor.yy79.x=yymsp[-4].minor.yy79.x-yymsp[-2].minor.yy153; yylhsminor.yy79.y=yymsp[-4].minor.yy79.y-yymsp[0].minor.yy153;}
2756
-#line 2781 "pikchr.c"
2766
+#line 2791 "pikchr.c"
27572767
yymsp[-4].minor.yy79 = yylhsminor.yy79;
27582768
break;
27592769
case 67: /* position ::= place PLUS LP expr COMMA expr RP */
2760
-#line 682 "pikchr.y"
2770
+#line 692 "pikchr.y"
27612771
{yylhsminor.yy79.x=yymsp[-6].minor.yy79.x+yymsp[-3].minor.yy153; yylhsminor.yy79.y=yymsp[-6].minor.yy79.y+yymsp[-1].minor.yy153;}
2762
-#line 2787 "pikchr.c"
2772
+#line 2797 "pikchr.c"
27632773
yymsp[-6].minor.yy79 = yylhsminor.yy79;
27642774
break;
27652775
case 68: /* position ::= place MINUS LP expr COMMA expr RP */
2766
-#line 684 "pikchr.y"
2776
+#line 694 "pikchr.y"
27672777
{yylhsminor.yy79.x=yymsp[-6].minor.yy79.x-yymsp[-3].minor.yy153; yylhsminor.yy79.y=yymsp[-6].minor.yy79.y-yymsp[-1].minor.yy153;}
2768
-#line 2793 "pikchr.c"
2778
+#line 2803 "pikchr.c"
27692779
yymsp[-6].minor.yy79 = yylhsminor.yy79;
27702780
break;
27712781
case 69: /* position ::= LP position COMMA position RP */
2772
-#line 685 "pikchr.y"
2782
+#line 695 "pikchr.y"
27732783
{yymsp[-4].minor.yy79.x=yymsp[-3].minor.yy79.x; yymsp[-4].minor.yy79.y=yymsp[-1].minor.yy79.y;}
2774
-#line 2799 "pikchr.c"
2784
+#line 2809 "pikchr.c"
27752785
break;
27762786
case 70: /* position ::= LP position RP */
2777
-#line 686 "pikchr.y"
2787
+#line 696 "pikchr.y"
27782788
{yymsp[-2].minor.yy79=yymsp[-1].minor.yy79;}
2779
-#line 2804 "pikchr.c"
2789
+#line 2814 "pikchr.c"
27802790
break;
27812791
case 71: /* position ::= expr between position AND position */
2782
-#line 688 "pikchr.y"
2792
+#line 698 "pikchr.y"
27832793
{yylhsminor.yy79 = pik_position_between(yymsp[-4].minor.yy153,yymsp[-2].minor.yy79,yymsp[0].minor.yy79);}
2784
-#line 2809 "pikchr.c"
2794
+#line 2819 "pikchr.c"
27852795
yymsp[-4].minor.yy79 = yylhsminor.yy79;
27862796
break;
27872797
case 72: /* position ::= expr LT position COMMA position GT */
2788
-#line 690 "pikchr.y"
2798
+#line 700 "pikchr.y"
27892799
{yylhsminor.yy79 = pik_position_between(yymsp[-5].minor.yy153,yymsp[-3].minor.yy79,yymsp[-1].minor.yy79);}
2790
-#line 2815 "pikchr.c"
2800
+#line 2825 "pikchr.c"
27912801
yymsp[-5].minor.yy79 = yylhsminor.yy79;
27922802
break;
27932803
case 73: /* position ::= expr ABOVE position */
2794
-#line 691 "pikchr.y"
2804
+#line 701 "pikchr.y"
27952805
{yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.y += yymsp[-2].minor.yy153;}
2796
-#line 2821 "pikchr.c"
2806
+#line 2831 "pikchr.c"
27972807
yymsp[-2].minor.yy79 = yylhsminor.yy79;
27982808
break;
27992809
case 74: /* position ::= expr BELOW position */
2800
-#line 692 "pikchr.y"
2810
+#line 702 "pikchr.y"
28012811
{yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.y -= yymsp[-2].minor.yy153;}
2802
-#line 2827 "pikchr.c"
2812
+#line 2837 "pikchr.c"
28032813
yymsp[-2].minor.yy79 = yylhsminor.yy79;
28042814
break;
28052815
case 75: /* position ::= expr LEFT OF position */
2806
-#line 693 "pikchr.y"
2816
+#line 703 "pikchr.y"
28072817
{yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.x -= yymsp[-3].minor.yy153;}
2808
-#line 2833 "pikchr.c"
2818
+#line 2843 "pikchr.c"
28092819
yymsp[-3].minor.yy79 = yylhsminor.yy79;
28102820
break;
28112821
case 76: /* position ::= expr RIGHT OF position */
2812
-#line 694 "pikchr.y"
2822
+#line 704 "pikchr.y"
28132823
{yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.x += yymsp[-3].minor.yy153;}
2814
-#line 2839 "pikchr.c"
2824
+#line 2849 "pikchr.c"
28152825
yymsp[-3].minor.yy79 = yylhsminor.yy79;
28162826
break;
28172827
case 77: /* position ::= expr ON HEADING EDGEPT OF position */
2818
-#line 696 "pikchr.y"
2828
+#line 706 "pikchr.y"
28192829
{yylhsminor.yy79 = pik_position_at_hdg(yymsp[-5].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2820
-#line 2845 "pikchr.c"
2830
+#line 2855 "pikchr.c"
28212831
yymsp[-5].minor.yy79 = yylhsminor.yy79;
28222832
break;
28232833
case 78: /* position ::= expr HEADING EDGEPT OF position */
2824
-#line 698 "pikchr.y"
2834
+#line 708 "pikchr.y"
28252835
{yylhsminor.yy79 = pik_position_at_hdg(yymsp[-4].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2826
-#line 2851 "pikchr.c"
2836
+#line 2861 "pikchr.c"
28272837
yymsp[-4].minor.yy79 = yylhsminor.yy79;
28282838
break;
28292839
case 79: /* position ::= expr EDGEPT OF position */
2830
-#line 700 "pikchr.y"
2840
+#line 710 "pikchr.y"
28312841
{yylhsminor.yy79 = pik_position_at_hdg(yymsp[-3].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2832
-#line 2857 "pikchr.c"
2842
+#line 2867 "pikchr.c"
28332843
yymsp[-3].minor.yy79 = yylhsminor.yy79;
28342844
break;
28352845
case 80: /* position ::= expr ON HEADING expr FROM position */
2836
-#line 702 "pikchr.y"
2846
+#line 712 "pikchr.y"
28372847
{yylhsminor.yy79 = pik_position_at_angle(yymsp[-5].minor.yy153,yymsp[-2].minor.yy153,yymsp[0].minor.yy79);}
2838
-#line 2863 "pikchr.c"
2848
+#line 2873 "pikchr.c"
28392849
yymsp[-5].minor.yy79 = yylhsminor.yy79;
28402850
break;
28412851
case 81: /* position ::= expr HEADING expr FROM position */
2842
-#line 704 "pikchr.y"
2852
+#line 714 "pikchr.y"
28432853
{yylhsminor.yy79 = pik_position_at_angle(yymsp[-4].minor.yy153,yymsp[-2].minor.yy153,yymsp[0].minor.yy79);}
2844
-#line 2869 "pikchr.c"
2854
+#line 2879 "pikchr.c"
28452855
yymsp[-4].minor.yy79 = yylhsminor.yy79;
28462856
break;
28472857
case 82: /* place ::= edge OF object */
2848
-#line 716 "pikchr.y"
2858
+#line 726 "pikchr.y"
28492859
{yylhsminor.yy79 = pik_place_of_elem(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2850
-#line 2875 "pikchr.c"
2860
+#line 2885 "pikchr.c"
28512861
yymsp[-2].minor.yy79 = yylhsminor.yy79;
28522862
break;
28532863
case 83: /* place2 ::= object */
2854
-#line 717 "pikchr.y"
2864
+#line 727 "pikchr.y"
28552865
{yylhsminor.yy79 = pik_place_of_elem(p,yymsp[0].minor.yy36,0);}
2856
-#line 2881 "pikchr.c"
2866
+#line 2891 "pikchr.c"
28572867
yymsp[0].minor.yy79 = yylhsminor.yy79;
28582868
break;
28592869
case 84: /* place2 ::= object DOT_E edge */
2860
-#line 718 "pikchr.y"
2870
+#line 728 "pikchr.y"
28612871
{yylhsminor.yy79 = pik_place_of_elem(p,yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
2862
-#line 2887 "pikchr.c"
2872
+#line 2897 "pikchr.c"
28632873
yymsp[-2].minor.yy79 = yylhsminor.yy79;
28642874
break;
28652875
case 85: /* place2 ::= NTH VERTEX OF object */
2866
-#line 719 "pikchr.y"
2876
+#line 729 "pikchr.y"
28672877
{yylhsminor.yy79 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy36);}
2868
-#line 2893 "pikchr.c"
2878
+#line 2903 "pikchr.c"
28692879
yymsp[-3].minor.yy79 = yylhsminor.yy79;
28702880
break;
28712881
case 86: /* object ::= nth */
2872
-#line 731 "pikchr.y"
2882
+#line 741 "pikchr.y"
28732883
{yylhsminor.yy36 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2874
-#line 2899 "pikchr.c"
2884
+#line 2909 "pikchr.c"
28752885
yymsp[0].minor.yy36 = yylhsminor.yy36;
28762886
break;
28772887
case 87: /* object ::= nth OF|IN object */
2878
-#line 732 "pikchr.y"
2888
+#line 742 "pikchr.y"
28792889
{yylhsminor.yy36 = pik_find_nth(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2880
-#line 2905 "pikchr.c"
2890
+#line 2915 "pikchr.c"
28812891
yymsp[-2].minor.yy36 = yylhsminor.yy36;
28822892
break;
28832893
case 88: /* objectname ::= THIS */
2884
-#line 734 "pikchr.y"
2894
+#line 744 "pikchr.y"
28852895
{yymsp[0].minor.yy36 = p->cur;}
2886
-#line 2911 "pikchr.c"
2896
+#line 2921 "pikchr.c"
28872897
break;
28882898
case 89: /* objectname ::= PLACENAME */
2889
-#line 735 "pikchr.y"
2899
+#line 745 "pikchr.y"
28902900
{yylhsminor.yy36 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2891
-#line 2916 "pikchr.c"
2901
+#line 2926 "pikchr.c"
28922902
yymsp[0].minor.yy36 = yylhsminor.yy36;
28932903
break;
28942904
case 90: /* objectname ::= objectname DOT_U PLACENAME */
2895
-#line 737 "pikchr.y"
2905
+#line 747 "pikchr.y"
28962906
{yylhsminor.yy36 = pik_find_byname(p,yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
2897
-#line 2922 "pikchr.c"
2907
+#line 2932 "pikchr.c"
28982908
yymsp[-2].minor.yy36 = yylhsminor.yy36;
28992909
break;
29002910
case 91: /* nth ::= NTH CLASSNAME */
2901
-#line 739 "pikchr.y"
2911
+#line 749 "pikchr.y"
29022912
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2903
-#line 2928 "pikchr.c"
2913
+#line 2938 "pikchr.c"
29042914
yymsp[-1].minor.yy0 = yylhsminor.yy0;
29052915
break;
29062916
case 92: /* nth ::= NTH LAST CLASSNAME */
2907
-#line 740 "pikchr.y"
2917
+#line 750 "pikchr.y"
29082918
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2909
-#line 2934 "pikchr.c"
2919
+#line 2944 "pikchr.c"
29102920
yymsp[-2].minor.yy0 = yylhsminor.yy0;
29112921
break;
29122922
case 93: /* nth ::= LAST CLASSNAME */
2913
-#line 741 "pikchr.y"
2923
+#line 751 "pikchr.y"
29142924
{yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2915
-#line 2940 "pikchr.c"
2925
+#line 2950 "pikchr.c"
29162926
break;
29172927
case 94: /* nth ::= LAST */
2918
-#line 742 "pikchr.y"
2928
+#line 752 "pikchr.y"
29192929
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2920
-#line 2945 "pikchr.c"
2930
+#line 2955 "pikchr.c"
29212931
yymsp[0].minor.yy0 = yylhsminor.yy0;
29222932
break;
29232933
case 95: /* nth ::= NTH LB RB */
2924
-#line 743 "pikchr.y"
2934
+#line 753 "pikchr.y"
29252935
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2926
-#line 2951 "pikchr.c"
2936
+#line 2961 "pikchr.c"
29272937
yymsp[-2].minor.yy0 = yylhsminor.yy0;
29282938
break;
29292939
case 96: /* nth ::= NTH LAST LB RB */
2930
-#line 744 "pikchr.y"
2940
+#line 754 "pikchr.y"
29312941
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2932
-#line 2957 "pikchr.c"
2942
+#line 2967 "pikchr.c"
29332943
yymsp[-3].minor.yy0 = yylhsminor.yy0;
29342944
break;
29352945
case 97: /* nth ::= LAST LB RB */
2936
-#line 745 "pikchr.y"
2946
+#line 755 "pikchr.y"
29372947
{yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2938
-#line 2963 "pikchr.c"
2948
+#line 2973 "pikchr.c"
29392949
break;
29402950
case 98: /* expr ::= expr PLUS expr */
2941
-#line 747 "pikchr.y"
2951
+#line 757 "pikchr.y"
29422952
{yylhsminor.yy153=yymsp[-2].minor.yy153+yymsp[0].minor.yy153;}
2943
-#line 2968 "pikchr.c"
2953
+#line 2978 "pikchr.c"
29442954
yymsp[-2].minor.yy153 = yylhsminor.yy153;
29452955
break;
29462956
case 99: /* expr ::= expr MINUS expr */
2947
-#line 748 "pikchr.y"
2957
+#line 758 "pikchr.y"
29482958
{yylhsminor.yy153=yymsp[-2].minor.yy153-yymsp[0].minor.yy153;}
2949
-#line 2974 "pikchr.c"
2959
+#line 2984 "pikchr.c"
29502960
yymsp[-2].minor.yy153 = yylhsminor.yy153;
29512961
break;
29522962
case 100: /* expr ::= expr STAR expr */
2953
-#line 749 "pikchr.y"
2963
+#line 759 "pikchr.y"
29542964
{yylhsminor.yy153=yymsp[-2].minor.yy153*yymsp[0].minor.yy153;}
2955
-#line 2980 "pikchr.c"
2965
+#line 2990 "pikchr.c"
29562966
yymsp[-2].minor.yy153 = yylhsminor.yy153;
29572967
break;
29582968
case 101: /* expr ::= expr SLASH expr */
2959
-#line 750 "pikchr.y"
2969
+#line 760 "pikchr.y"
29602970
{
29612971
if( yymsp[0].minor.yy153==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy153 = 0.0; }
29622972
else{ yylhsminor.yy153 = yymsp[-2].minor.yy153/yymsp[0].minor.yy153; }
29632973
}
2964
-#line 2989 "pikchr.c"
2974
+#line 2999 "pikchr.c"
29652975
yymsp[-2].minor.yy153 = yylhsminor.yy153;
29662976
break;
29672977
case 102: /* expr ::= MINUS expr */
2968
-#line 754 "pikchr.y"
2978
+#line 764 "pikchr.y"
29692979
{yymsp[-1].minor.yy153=-yymsp[0].minor.yy153;}
2970
-#line 2995 "pikchr.c"
2980
+#line 3005 "pikchr.c"
29712981
break;
29722982
case 103: /* expr ::= PLUS expr */
2973
-#line 755 "pikchr.y"
2983
+#line 765 "pikchr.y"
29742984
{yymsp[-1].minor.yy153=yymsp[0].minor.yy153;}
2975
-#line 3000 "pikchr.c"
2985
+#line 3010 "pikchr.c"
29762986
break;
29772987
case 104: /* expr ::= LP expr RP */
2978
-#line 756 "pikchr.y"
2988
+#line 766 "pikchr.y"
29792989
{yymsp[-2].minor.yy153=yymsp[-1].minor.yy153;}
2980
-#line 3005 "pikchr.c"
2990
+#line 3015 "pikchr.c"
29812991
break;
29822992
case 105: /* expr ::= LP FILL|COLOR|THICKNESS RP */
2983
-#line 757 "pikchr.y"
2993
+#line 767 "pikchr.y"
29842994
{yymsp[-2].minor.yy153=pik_get_var(p,&yymsp[-1].minor.yy0);}
2985
-#line 3010 "pikchr.c"
2995
+#line 3020 "pikchr.c"
29862996
break;
29872997
case 106: /* expr ::= NUMBER */
2988
-#line 758 "pikchr.y"
2998
+#line 768 "pikchr.y"
29892999
{yylhsminor.yy153=pik_atof(&yymsp[0].minor.yy0);}
2990
-#line 3015 "pikchr.c"
3000
+#line 3025 "pikchr.c"
29913001
yymsp[0].minor.yy153 = yylhsminor.yy153;
29923002
break;
29933003
case 107: /* expr ::= ID */
2994
-#line 759 "pikchr.y"
3004
+#line 769 "pikchr.y"
29953005
{yylhsminor.yy153=pik_get_var(p,&yymsp[0].minor.yy0);}
2996
-#line 3021 "pikchr.c"
3006
+#line 3031 "pikchr.c"
29973007
yymsp[0].minor.yy153 = yylhsminor.yy153;
29983008
break;
29993009
case 108: /* expr ::= FUNC1 LP expr RP */
3000
-#line 760 "pikchr.y"
3010
+#line 770 "pikchr.y"
30013011
{yylhsminor.yy153 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy153,0.0);}
3002
-#line 3027 "pikchr.c"
3012
+#line 3037 "pikchr.c"
30033013
yymsp[-3].minor.yy153 = yylhsminor.yy153;
30043014
break;
30053015
case 109: /* expr ::= FUNC2 LP expr COMMA expr RP */
3006
-#line 761 "pikchr.y"
3016
+#line 771 "pikchr.y"
30073017
{yylhsminor.yy153 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy153,yymsp[-1].minor.yy153);}
3008
-#line 3033 "pikchr.c"
3018
+#line 3043 "pikchr.c"
30093019
yymsp[-5].minor.yy153 = yylhsminor.yy153;
30103020
break;
30113021
case 110: /* expr ::= DIST LP position COMMA position RP */
3012
-#line 762 "pikchr.y"
3022
+#line 772 "pikchr.y"
30133023
{yymsp[-5].minor.yy153 = pik_dist(&yymsp[-3].minor.yy79,&yymsp[-1].minor.yy79);}
3014
-#line 3039 "pikchr.c"
3024
+#line 3049 "pikchr.c"
30153025
break;
30163026
case 111: /* expr ::= place2 DOT_XY X */
3017
-#line 763 "pikchr.y"
3027
+#line 773 "pikchr.y"
30183028
{yylhsminor.yy153 = yymsp[-2].minor.yy79.x;}
3019
-#line 3044 "pikchr.c"
3029
+#line 3054 "pikchr.c"
30203030
yymsp[-2].minor.yy153 = yylhsminor.yy153;
30213031
break;
30223032
case 112: /* expr ::= place2 DOT_XY Y */
3023
-#line 764 "pikchr.y"
3033
+#line 774 "pikchr.y"
30243034
{yylhsminor.yy153 = yymsp[-2].minor.yy79.y;}
3025
-#line 3050 "pikchr.c"
3035
+#line 3060 "pikchr.c"
30263036
yymsp[-2].minor.yy153 = yylhsminor.yy153;
30273037
break;
30283038
case 113: /* expr ::= object DOT_L numproperty */
30293039
case 114: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==114);
30303040
case 115: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==115);
3031
-#line 765 "pikchr.y"
3041
+#line 775 "pikchr.y"
30323042
{yylhsminor.yy153=pik_property_of(yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
3033
-#line 3058 "pikchr.c"
3043
+#line 3068 "pikchr.c"
30343044
yymsp[-2].minor.yy153 = yylhsminor.yy153;
30353045
break;
30363046
default:
30373047
/* (116) lvalue ::= ID */ yytestcase(yyruleno==116);
30383048
/* (117) lvalue ::= FILL */ yytestcase(yyruleno==117);
@@ -3131,19 +3141,19 @@
31313141
){
31323142
pik_parserARG_FETCH
31333143
pik_parserCTX_FETCH
31343144
#define TOKEN yyminor
31353145
/************ Begin %syntax_error code ****************************************/
3136
-#line 525 "pikchr.y"
3146
+#line 535 "pikchr.y"
31373147
31383148
if( TOKEN.z && TOKEN.z[0] ){
31393149
pik_error(p, &TOKEN, "syntax error");
31403150
}else{
31413151
pik_error(p, 0, "syntax error");
31423152
}
31433153
UNUSED_PARAMETER(yymajor);
3144
-#line 3169 "pikchr.c"
3154
+#line 3179 "pikchr.c"
31453155
/************ End %syntax_error code ******************************************/
31463156
pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
31473157
pik_parserCTX_STORE
31483158
}
31493159
@@ -3372,11 +3382,11 @@
33723382
#else
33733383
(void)iToken;
33743384
return 0;
33753385
#endif
33763386
}
3377
-#line 770 "pikchr.y"
3387
+#line 780 "pikchr.y"
33783388
33793389
33803390
33813391
/* Chart of the 148 official CSS color names with their
33823392
** corresponding RGB values thru Color Module Level 4:
@@ -7744,10 +7754,14 @@
77447754
printf("******** Token %s (%d): \"%.*s\" **************\n",
77457755
yyTokenName[token.eType], token.eType,
77467756
(int)(isspace(token.z[0]) ? 0 : sz), token.z);
77477757
#endif
77487758
token.n = (unsigned short)(sz & 0xffff);
7759
+ if( p->nToken++ > PIKCHR_TOKEN_LIMIT ){
7760
+ pik_error(p, &token, "script is too complex");
7761
+ break;
7762
+ }
77497763
pik_parser(pParser, token.eType, token);
77507764
}
77517765
}
77527766
}
77537767
@@ -8081,6 +8095,6 @@
80818095
80828096
80838097
#endif /* PIKCHR_TCL */
80848098
80858099
8086
-#line 8111 "pikchr.c"
8100
+#line 8125 "pikchr.c"
80878101
--- extsrc/pikchr.c
+++ extsrc/pikchr.c
@@ -124,10 +124,19 @@
124 #include <assert.h>
125 #define count(X) (sizeof(X)/sizeof(X[0]))
126 #ifndef M_PI
127 # define M_PI 3.1415926535897932385
128 #endif
 
 
 
 
 
 
 
 
 
129
130 /* Tag intentionally unused parameters with this macro to prevent
131 ** compiler warnings with -Wextra */
132 #define UNUSED_PARAMETER(X) (void)(X)
133
@@ -341,10 +350,11 @@
341 /* Each call to the pikchr() subroutine uses an instance of the following
342 ** object to pass around context to all of its subroutines.
343 */
344 struct Pik {
345 unsigned nErr; /* Number of errors seen */
 
346 PToken sIn; /* Input Pikchr-language text */
347 char *zOut; /* Result accumulates here */
348 unsigned int nOut; /* Bytes written to zOut[] so far */
349 unsigned int nOutAlloc; /* Space allocated to zOut[] */
350 unsigned char eDir; /* Current direction */
@@ -479,11 +489,11 @@
479 static PObj *pik_position_assert(Pik*,PPoint*,PToken*,PPoint*);
480 static PNum pik_dist(PPoint*,PPoint*);
481 static void pik_add_macro(Pik*,PToken *pId,PToken *pCode);
482
483
484 #line 510 "pikchr.c"
485 /**************** End of %include directives **********************************/
486 /* These constants specify the various numeric values for terminal symbols.
487 ***************** Begin token definitions *************************************/
488 #ifndef T_ID
489 #define T_ID 1
@@ -1708,22 +1718,22 @@
1708 ** inside the C code.
1709 */
1710 /********* Begin destructor definitions ***************************************/
1711 case 99: /* statement_list */
1712 {
1713 #line 499 "pikchr.y"
1714 pik_elist_free(p,(yypminor->yy227));
1715 #line 1740 "pikchr.c"
1716 }
1717 break;
1718 case 100: /* statement */
1719 case 101: /* unnamed_statement */
1720 case 102: /* basetype */
1721 {
1722 #line 501 "pikchr.y"
1723 pik_elem_free(p,(yypminor->yy36));
1724 #line 1749 "pikchr.c"
1725 }
1726 break;
1727 /********* End destructor definitions *****************************************/
1728 default: break; /* If no destructor action specified: do nothing */
1729 }
@@ -1937,14 +1947,14 @@
1937 #endif
1938 while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
1939 /* Here code is inserted which will execute if the parser
1940 ** stack every overflows */
1941 /******** Begin %stack_overflow code ******************************************/
1942 #line 533 "pikchr.y"
1943
1944 pik_error(p, 0, "parser stack overflow");
1945 #line 1970 "pikchr.c"
1946 /******** End %stack_overflow code ********************************************/
1947 pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
1948 pik_parserCTX_STORE
1949 }
1950
@@ -2420,619 +2430,619 @@
2420 ** break;
2421 */
2422 /********** Begin reduce actions **********************************************/
2423 YYMINORTYPE yylhsminor;
2424 case 0: /* document ::= statement_list */
2425 #line 537 "pikchr.y"
2426 {pik_render(p,yymsp[0].minor.yy227);}
2427 #line 2452 "pikchr.c"
2428 break;
2429 case 1: /* statement_list ::= statement */
2430 #line 540 "pikchr.y"
2431 { yylhsminor.yy227 = pik_elist_append(p,0,yymsp[0].minor.yy36); }
2432 #line 2457 "pikchr.c"
2433 yymsp[0].minor.yy227 = yylhsminor.yy227;
2434 break;
2435 case 2: /* statement_list ::= statement_list EOL statement */
2436 #line 542 "pikchr.y"
2437 { yylhsminor.yy227 = pik_elist_append(p,yymsp[-2].minor.yy227,yymsp[0].minor.yy36); }
2438 #line 2463 "pikchr.c"
2439 yymsp[-2].minor.yy227 = yylhsminor.yy227;
2440 break;
2441 case 3: /* statement ::= */
2442 #line 545 "pikchr.y"
2443 { yymsp[1].minor.yy36 = 0; }
2444 #line 2469 "pikchr.c"
2445 break;
2446 case 4: /* statement ::= direction */
2447 #line 546 "pikchr.y"
2448 { pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy36=0; }
2449 #line 2474 "pikchr.c"
2450 yymsp[0].minor.yy36 = yylhsminor.yy36;
2451 break;
2452 case 5: /* statement ::= lvalue ASSIGN rvalue */
2453 #line 547 "pikchr.y"
2454 {pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy153,&yymsp[-1].minor.yy0); yylhsminor.yy36=0;}
2455 #line 2480 "pikchr.c"
2456 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2457 break;
2458 case 6: /* statement ::= PLACENAME COLON unnamed_statement */
2459 #line 549 "pikchr.y"
2460 { yylhsminor.yy36 = yymsp[0].minor.yy36; pik_elem_setname(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0); }
2461 #line 2486 "pikchr.c"
2462 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2463 break;
2464 case 7: /* statement ::= PLACENAME COLON position */
2465 #line 551 "pikchr.y"
2466 { yylhsminor.yy36 = pik_elem_new(p,0,0,0);
2467 if(yylhsminor.yy36){ yylhsminor.yy36->ptAt = yymsp[0].minor.yy79; pik_elem_setname(p,yylhsminor.yy36,&yymsp[-2].minor.yy0); }}
2468 #line 2493 "pikchr.c"
2469 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2470 break;
2471 case 8: /* statement ::= unnamed_statement */
2472 #line 553 "pikchr.y"
2473 {yylhsminor.yy36 = yymsp[0].minor.yy36;}
2474 #line 2499 "pikchr.c"
2475 yymsp[0].minor.yy36 = yylhsminor.yy36;
2476 break;
2477 case 9: /* statement ::= print prlist */
2478 #line 554 "pikchr.y"
2479 {pik_append(p,"<br>\n",5); yymsp[-1].minor.yy36=0;}
2480 #line 2505 "pikchr.c"
2481 break;
2482 case 10: /* statement ::= ASSERT LP expr EQ expr RP */
2483 #line 559 "pikchr.y"
2484 {yymsp[-5].minor.yy36=pik_assert(p,yymsp[-3].minor.yy153,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy153);}
2485 #line 2510 "pikchr.c"
2486 break;
2487 case 11: /* statement ::= ASSERT LP position EQ position RP */
2488 #line 561 "pikchr.y"
2489 {yymsp[-5].minor.yy36=pik_position_assert(p,&yymsp[-3].minor.yy79,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy79);}
2490 #line 2515 "pikchr.c"
2491 break;
2492 case 12: /* statement ::= DEFINE ID CODEBLOCK */
2493 #line 562 "pikchr.y"
2494 {yymsp[-2].minor.yy36=0; pik_add_macro(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
2495 #line 2520 "pikchr.c"
2496 break;
2497 case 13: /* rvalue ::= PLACENAME */
2498 #line 573 "pikchr.y"
2499 {yylhsminor.yy153 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2500 #line 2525 "pikchr.c"
2501 yymsp[0].minor.yy153 = yylhsminor.yy153;
2502 break;
2503 case 14: /* pritem ::= FILL */
2504 case 15: /* pritem ::= COLOR */ yytestcase(yyruleno==15);
2505 case 16: /* pritem ::= THICKNESS */ yytestcase(yyruleno==16);
2506 #line 578 "pikchr.y"
2507 {pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2508 #line 2533 "pikchr.c"
2509 break;
2510 case 17: /* pritem ::= rvalue */
2511 #line 581 "pikchr.y"
2512 {pik_append_num(p,"",yymsp[0].minor.yy153);}
2513 #line 2538 "pikchr.c"
2514 break;
2515 case 18: /* pritem ::= STRING */
2516 #line 582 "pikchr.y"
2517 {pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2518 #line 2543 "pikchr.c"
2519 break;
2520 case 19: /* prsep ::= COMMA */
2521 #line 583 "pikchr.y"
2522 {pik_append(p, " ", 1);}
2523 #line 2548 "pikchr.c"
2524 break;
2525 case 20: /* unnamed_statement ::= basetype attribute_list */
2526 #line 586 "pikchr.y"
2527 {yylhsminor.yy36 = yymsp[-1].minor.yy36; pik_after_adding_attributes(p,yylhsminor.yy36);}
2528 #line 2553 "pikchr.c"
2529 yymsp[-1].minor.yy36 = yylhsminor.yy36;
2530 break;
2531 case 21: /* basetype ::= CLASSNAME */
2532 #line 588 "pikchr.y"
2533 {yylhsminor.yy36 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2534 #line 2559 "pikchr.c"
2535 yymsp[0].minor.yy36 = yylhsminor.yy36;
2536 break;
2537 case 22: /* basetype ::= STRING textposition */
2538 #line 590 "pikchr.y"
2539 {yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy164; yylhsminor.yy36 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2540 #line 2565 "pikchr.c"
2541 yymsp[-1].minor.yy36 = yylhsminor.yy36;
2542 break;
2543 case 23: /* basetype ::= LB savelist statement_list RB */
2544 #line 592 "pikchr.y"
2545 { p->list = yymsp[-2].minor.yy227; yymsp[-3].minor.yy36 = pik_elem_new(p,0,0,yymsp[-1].minor.yy227); if(yymsp[-3].minor.yy36) yymsp[-3].minor.yy36->errTok = yymsp[0].minor.yy0; }
2546 #line 2571 "pikchr.c"
2547 break;
2548 case 24: /* savelist ::= */
2549 #line 597 "pikchr.y"
2550 {yymsp[1].minor.yy227 = p->list; p->list = 0;}
2551 #line 2576 "pikchr.c"
2552 break;
2553 case 25: /* relexpr ::= expr */
2554 #line 604 "pikchr.y"
2555 {yylhsminor.yy10.rAbs = yymsp[0].minor.yy153; yylhsminor.yy10.rRel = 0;}
2556 #line 2581 "pikchr.c"
2557 yymsp[0].minor.yy10 = yylhsminor.yy10;
2558 break;
2559 case 26: /* relexpr ::= expr PERCENT */
2560 #line 605 "pikchr.y"
2561 {yylhsminor.yy10.rAbs = 0; yylhsminor.yy10.rRel = yymsp[-1].minor.yy153/100;}
2562 #line 2587 "pikchr.c"
2563 yymsp[-1].minor.yy10 = yylhsminor.yy10;
2564 break;
2565 case 27: /* optrelexpr ::= */
2566 #line 607 "pikchr.y"
2567 {yymsp[1].minor.yy10.rAbs = 0; yymsp[1].minor.yy10.rRel = 1.0;}
2568 #line 2593 "pikchr.c"
2569 break;
2570 case 28: /* attribute_list ::= relexpr alist */
2571 #line 609 "pikchr.y"
2572 {pik_add_direction(p,0,&yymsp[-1].minor.yy10);}
2573 #line 2598 "pikchr.c"
2574 break;
2575 case 29: /* attribute ::= numproperty relexpr */
2576 #line 613 "pikchr.y"
2577 { pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy10); }
2578 #line 2603 "pikchr.c"
2579 break;
2580 case 30: /* attribute ::= dashproperty expr */
2581 #line 614 "pikchr.y"
2582 { pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy153); }
2583 #line 2608 "pikchr.c"
2584 break;
2585 case 31: /* attribute ::= dashproperty */
2586 #line 615 "pikchr.y"
2587 { pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2588 #line 2613 "pikchr.c"
2589 break;
2590 case 32: /* attribute ::= colorproperty rvalue */
2591 #line 616 "pikchr.y"
2592 { pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy153); }
2593 #line 2618 "pikchr.c"
2594 break;
2595 case 33: /* attribute ::= go direction optrelexpr */
2596 #line 617 "pikchr.y"
2597 { pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy10);}
2598 #line 2623 "pikchr.c"
2599 break;
2600 case 34: /* attribute ::= go direction even position */
2601 #line 618 "pikchr.y"
2602 {pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy79);}
2603 #line 2628 "pikchr.c"
2604 break;
2605 case 35: /* attribute ::= CLOSE */
2606 #line 619 "pikchr.y"
2607 { pik_close_path(p,&yymsp[0].minor.yy0); }
2608 #line 2633 "pikchr.c"
2609 break;
2610 case 36: /* attribute ::= CHOP */
2611 #line 620 "pikchr.y"
2612 { p->cur->bChop = 1; }
2613 #line 2638 "pikchr.c"
2614 break;
2615 case 37: /* attribute ::= FROM position */
2616 #line 621 "pikchr.y"
2617 { pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy79); }
2618 #line 2643 "pikchr.c"
2619 break;
2620 case 38: /* attribute ::= TO position */
2621 #line 622 "pikchr.y"
2622 { pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy79); }
2623 #line 2648 "pikchr.c"
2624 break;
2625 case 39: /* attribute ::= THEN */
2626 #line 623 "pikchr.y"
2627 { pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2628 #line 2653 "pikchr.c"
2629 break;
2630 case 40: /* attribute ::= THEN optrelexpr HEADING expr */
2631 case 42: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==42);
2632 #line 625 "pikchr.y"
2633 {pik_move_hdg(p,&yymsp[-2].minor.yy10,&yymsp[-1].minor.yy0,yymsp[0].minor.yy153,0,&yymsp[-3].minor.yy0);}
2634 #line 2659 "pikchr.c"
2635 break;
2636 case 41: /* attribute ::= THEN optrelexpr EDGEPT */
2637 case 43: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==43);
2638 #line 626 "pikchr.y"
2639 {pik_move_hdg(p,&yymsp[-1].minor.yy10,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2640 #line 2665 "pikchr.c"
2641 break;
2642 case 44: /* attribute ::= AT position */
2643 #line 631 "pikchr.y"
2644 { pik_set_at(p,0,&yymsp[0].minor.yy79,&yymsp[-1].minor.yy0); }
2645 #line 2670 "pikchr.c"
2646 break;
2647 case 45: /* attribute ::= SAME */
2648 #line 633 "pikchr.y"
2649 {pik_same(p,0,&yymsp[0].minor.yy0);}
2650 #line 2675 "pikchr.c"
2651 break;
2652 case 46: /* attribute ::= SAME AS object */
2653 #line 634 "pikchr.y"
2654 {pik_same(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2655 #line 2680 "pikchr.c"
2656 break;
2657 case 47: /* attribute ::= STRING textposition */
2658 #line 635 "pikchr.y"
2659 {pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy164);}
2660 #line 2685 "pikchr.c"
2661 break;
2662 case 48: /* attribute ::= FIT */
2663 #line 636 "pikchr.y"
2664 {pik_size_to_fit(p,&yymsp[0].minor.yy0,3); }
2665 #line 2690 "pikchr.c"
2666 break;
2667 case 49: /* attribute ::= BEHIND object */
2668 #line 637 "pikchr.y"
2669 {pik_behind(p,yymsp[0].minor.yy36);}
2670 #line 2695 "pikchr.c"
2671 break;
2672 case 50: /* withclause ::= DOT_E edge AT position */
2673 case 51: /* withclause ::= edge AT position */ yytestcase(yyruleno==51);
2674 #line 645 "pikchr.y"
2675 { pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy79,&yymsp[-1].minor.yy0); }
2676 #line 2701 "pikchr.c"
2677 break;
2678 case 52: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2679 #line 649 "pikchr.y"
2680 {yylhsminor.yy0 = yymsp[0].minor.yy0;}
2681 #line 2706 "pikchr.c"
2682 yymsp[0].minor.yy0 = yylhsminor.yy0;
2683 break;
2684 case 53: /* boolproperty ::= CW */
2685 #line 660 "pikchr.y"
2686 {p->cur->cw = 1;}
2687 #line 2712 "pikchr.c"
2688 break;
2689 case 54: /* boolproperty ::= CCW */
2690 #line 661 "pikchr.y"
2691 {p->cur->cw = 0;}
2692 #line 2717 "pikchr.c"
2693 break;
2694 case 55: /* boolproperty ::= LARROW */
2695 #line 662 "pikchr.y"
2696 {p->cur->larrow=1; p->cur->rarrow=0; }
2697 #line 2722 "pikchr.c"
2698 break;
2699 case 56: /* boolproperty ::= RARROW */
2700 #line 663 "pikchr.y"
2701 {p->cur->larrow=0; p->cur->rarrow=1; }
2702 #line 2727 "pikchr.c"
2703 break;
2704 case 57: /* boolproperty ::= LRARROW */
2705 #line 664 "pikchr.y"
2706 {p->cur->larrow=1; p->cur->rarrow=1; }
2707 #line 2732 "pikchr.c"
2708 break;
2709 case 58: /* boolproperty ::= INVIS */
2710 #line 665 "pikchr.y"
2711 {p->cur->sw = 0.0;}
2712 #line 2737 "pikchr.c"
2713 break;
2714 case 59: /* boolproperty ::= THICK */
2715 #line 666 "pikchr.y"
2716 {p->cur->sw *= 1.5;}
2717 #line 2742 "pikchr.c"
2718 break;
2719 case 60: /* boolproperty ::= THIN */
2720 #line 667 "pikchr.y"
2721 {p->cur->sw *= 0.67;}
2722 #line 2747 "pikchr.c"
2723 break;
2724 case 61: /* boolproperty ::= SOLID */
2725 #line 668 "pikchr.y"
2726 {p->cur->sw = pik_value(p,"thickness",9,0);
2727 p->cur->dotted = p->cur->dashed = 0.0;}
2728 #line 2753 "pikchr.c"
2729 break;
2730 case 62: /* textposition ::= */
2731 #line 671 "pikchr.y"
2732 {yymsp[1].minor.yy164 = 0;}
2733 #line 2758 "pikchr.c"
2734 break;
2735 case 63: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2736 #line 674 "pikchr.y"
2737 {yylhsminor.yy164 = (short int)pik_text_position(yymsp[-1].minor.yy164,&yymsp[0].minor.yy0);}
2738 #line 2763 "pikchr.c"
2739 yymsp[-1].minor.yy164 = yylhsminor.yy164;
2740 break;
2741 case 64: /* position ::= expr COMMA expr */
2742 #line 677 "pikchr.y"
2743 {yylhsminor.yy79.x=yymsp[-2].minor.yy153; yylhsminor.yy79.y=yymsp[0].minor.yy153;}
2744 #line 2769 "pikchr.c"
2745 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2746 break;
2747 case 65: /* position ::= place PLUS expr COMMA expr */
2748 #line 679 "pikchr.y"
2749 {yylhsminor.yy79.x=yymsp[-4].minor.yy79.x+yymsp[-2].minor.yy153; yylhsminor.yy79.y=yymsp[-4].minor.yy79.y+yymsp[0].minor.yy153;}
2750 #line 2775 "pikchr.c"
2751 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2752 break;
2753 case 66: /* position ::= place MINUS expr COMMA expr */
2754 #line 680 "pikchr.y"
2755 {yylhsminor.yy79.x=yymsp[-4].minor.yy79.x-yymsp[-2].minor.yy153; yylhsminor.yy79.y=yymsp[-4].minor.yy79.y-yymsp[0].minor.yy153;}
2756 #line 2781 "pikchr.c"
2757 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2758 break;
2759 case 67: /* position ::= place PLUS LP expr COMMA expr RP */
2760 #line 682 "pikchr.y"
2761 {yylhsminor.yy79.x=yymsp[-6].minor.yy79.x+yymsp[-3].minor.yy153; yylhsminor.yy79.y=yymsp[-6].minor.yy79.y+yymsp[-1].minor.yy153;}
2762 #line 2787 "pikchr.c"
2763 yymsp[-6].minor.yy79 = yylhsminor.yy79;
2764 break;
2765 case 68: /* position ::= place MINUS LP expr COMMA expr RP */
2766 #line 684 "pikchr.y"
2767 {yylhsminor.yy79.x=yymsp[-6].minor.yy79.x-yymsp[-3].minor.yy153; yylhsminor.yy79.y=yymsp[-6].minor.yy79.y-yymsp[-1].minor.yy153;}
2768 #line 2793 "pikchr.c"
2769 yymsp[-6].minor.yy79 = yylhsminor.yy79;
2770 break;
2771 case 69: /* position ::= LP position COMMA position RP */
2772 #line 685 "pikchr.y"
2773 {yymsp[-4].minor.yy79.x=yymsp[-3].minor.yy79.x; yymsp[-4].minor.yy79.y=yymsp[-1].minor.yy79.y;}
2774 #line 2799 "pikchr.c"
2775 break;
2776 case 70: /* position ::= LP position RP */
2777 #line 686 "pikchr.y"
2778 {yymsp[-2].minor.yy79=yymsp[-1].minor.yy79;}
2779 #line 2804 "pikchr.c"
2780 break;
2781 case 71: /* position ::= expr between position AND position */
2782 #line 688 "pikchr.y"
2783 {yylhsminor.yy79 = pik_position_between(yymsp[-4].minor.yy153,yymsp[-2].minor.yy79,yymsp[0].minor.yy79);}
2784 #line 2809 "pikchr.c"
2785 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2786 break;
2787 case 72: /* position ::= expr LT position COMMA position GT */
2788 #line 690 "pikchr.y"
2789 {yylhsminor.yy79 = pik_position_between(yymsp[-5].minor.yy153,yymsp[-3].minor.yy79,yymsp[-1].minor.yy79);}
2790 #line 2815 "pikchr.c"
2791 yymsp[-5].minor.yy79 = yylhsminor.yy79;
2792 break;
2793 case 73: /* position ::= expr ABOVE position */
2794 #line 691 "pikchr.y"
2795 {yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.y += yymsp[-2].minor.yy153;}
2796 #line 2821 "pikchr.c"
2797 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2798 break;
2799 case 74: /* position ::= expr BELOW position */
2800 #line 692 "pikchr.y"
2801 {yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.y -= yymsp[-2].minor.yy153;}
2802 #line 2827 "pikchr.c"
2803 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2804 break;
2805 case 75: /* position ::= expr LEFT OF position */
2806 #line 693 "pikchr.y"
2807 {yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.x -= yymsp[-3].minor.yy153;}
2808 #line 2833 "pikchr.c"
2809 yymsp[-3].minor.yy79 = yylhsminor.yy79;
2810 break;
2811 case 76: /* position ::= expr RIGHT OF position */
2812 #line 694 "pikchr.y"
2813 {yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.x += yymsp[-3].minor.yy153;}
2814 #line 2839 "pikchr.c"
2815 yymsp[-3].minor.yy79 = yylhsminor.yy79;
2816 break;
2817 case 77: /* position ::= expr ON HEADING EDGEPT OF position */
2818 #line 696 "pikchr.y"
2819 {yylhsminor.yy79 = pik_position_at_hdg(yymsp[-5].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2820 #line 2845 "pikchr.c"
2821 yymsp[-5].minor.yy79 = yylhsminor.yy79;
2822 break;
2823 case 78: /* position ::= expr HEADING EDGEPT OF position */
2824 #line 698 "pikchr.y"
2825 {yylhsminor.yy79 = pik_position_at_hdg(yymsp[-4].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2826 #line 2851 "pikchr.c"
2827 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2828 break;
2829 case 79: /* position ::= expr EDGEPT OF position */
2830 #line 700 "pikchr.y"
2831 {yylhsminor.yy79 = pik_position_at_hdg(yymsp[-3].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2832 #line 2857 "pikchr.c"
2833 yymsp[-3].minor.yy79 = yylhsminor.yy79;
2834 break;
2835 case 80: /* position ::= expr ON HEADING expr FROM position */
2836 #line 702 "pikchr.y"
2837 {yylhsminor.yy79 = pik_position_at_angle(yymsp[-5].minor.yy153,yymsp[-2].minor.yy153,yymsp[0].minor.yy79);}
2838 #line 2863 "pikchr.c"
2839 yymsp[-5].minor.yy79 = yylhsminor.yy79;
2840 break;
2841 case 81: /* position ::= expr HEADING expr FROM position */
2842 #line 704 "pikchr.y"
2843 {yylhsminor.yy79 = pik_position_at_angle(yymsp[-4].minor.yy153,yymsp[-2].minor.yy153,yymsp[0].minor.yy79);}
2844 #line 2869 "pikchr.c"
2845 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2846 break;
2847 case 82: /* place ::= edge OF object */
2848 #line 716 "pikchr.y"
2849 {yylhsminor.yy79 = pik_place_of_elem(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2850 #line 2875 "pikchr.c"
2851 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2852 break;
2853 case 83: /* place2 ::= object */
2854 #line 717 "pikchr.y"
2855 {yylhsminor.yy79 = pik_place_of_elem(p,yymsp[0].minor.yy36,0);}
2856 #line 2881 "pikchr.c"
2857 yymsp[0].minor.yy79 = yylhsminor.yy79;
2858 break;
2859 case 84: /* place2 ::= object DOT_E edge */
2860 #line 718 "pikchr.y"
2861 {yylhsminor.yy79 = pik_place_of_elem(p,yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
2862 #line 2887 "pikchr.c"
2863 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2864 break;
2865 case 85: /* place2 ::= NTH VERTEX OF object */
2866 #line 719 "pikchr.y"
2867 {yylhsminor.yy79 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy36);}
2868 #line 2893 "pikchr.c"
2869 yymsp[-3].minor.yy79 = yylhsminor.yy79;
2870 break;
2871 case 86: /* object ::= nth */
2872 #line 731 "pikchr.y"
2873 {yylhsminor.yy36 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2874 #line 2899 "pikchr.c"
2875 yymsp[0].minor.yy36 = yylhsminor.yy36;
2876 break;
2877 case 87: /* object ::= nth OF|IN object */
2878 #line 732 "pikchr.y"
2879 {yylhsminor.yy36 = pik_find_nth(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2880 #line 2905 "pikchr.c"
2881 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2882 break;
2883 case 88: /* objectname ::= THIS */
2884 #line 734 "pikchr.y"
2885 {yymsp[0].minor.yy36 = p->cur;}
2886 #line 2911 "pikchr.c"
2887 break;
2888 case 89: /* objectname ::= PLACENAME */
2889 #line 735 "pikchr.y"
2890 {yylhsminor.yy36 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2891 #line 2916 "pikchr.c"
2892 yymsp[0].minor.yy36 = yylhsminor.yy36;
2893 break;
2894 case 90: /* objectname ::= objectname DOT_U PLACENAME */
2895 #line 737 "pikchr.y"
2896 {yylhsminor.yy36 = pik_find_byname(p,yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
2897 #line 2922 "pikchr.c"
2898 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2899 break;
2900 case 91: /* nth ::= NTH CLASSNAME */
2901 #line 739 "pikchr.y"
2902 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2903 #line 2928 "pikchr.c"
2904 yymsp[-1].minor.yy0 = yylhsminor.yy0;
2905 break;
2906 case 92: /* nth ::= NTH LAST CLASSNAME */
2907 #line 740 "pikchr.y"
2908 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2909 #line 2934 "pikchr.c"
2910 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2911 break;
2912 case 93: /* nth ::= LAST CLASSNAME */
2913 #line 741 "pikchr.y"
2914 {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2915 #line 2940 "pikchr.c"
2916 break;
2917 case 94: /* nth ::= LAST */
2918 #line 742 "pikchr.y"
2919 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2920 #line 2945 "pikchr.c"
2921 yymsp[0].minor.yy0 = yylhsminor.yy0;
2922 break;
2923 case 95: /* nth ::= NTH LB RB */
2924 #line 743 "pikchr.y"
2925 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2926 #line 2951 "pikchr.c"
2927 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2928 break;
2929 case 96: /* nth ::= NTH LAST LB RB */
2930 #line 744 "pikchr.y"
2931 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2932 #line 2957 "pikchr.c"
2933 yymsp[-3].minor.yy0 = yylhsminor.yy0;
2934 break;
2935 case 97: /* nth ::= LAST LB RB */
2936 #line 745 "pikchr.y"
2937 {yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2938 #line 2963 "pikchr.c"
2939 break;
2940 case 98: /* expr ::= expr PLUS expr */
2941 #line 747 "pikchr.y"
2942 {yylhsminor.yy153=yymsp[-2].minor.yy153+yymsp[0].minor.yy153;}
2943 #line 2968 "pikchr.c"
2944 yymsp[-2].minor.yy153 = yylhsminor.yy153;
2945 break;
2946 case 99: /* expr ::= expr MINUS expr */
2947 #line 748 "pikchr.y"
2948 {yylhsminor.yy153=yymsp[-2].minor.yy153-yymsp[0].minor.yy153;}
2949 #line 2974 "pikchr.c"
2950 yymsp[-2].minor.yy153 = yylhsminor.yy153;
2951 break;
2952 case 100: /* expr ::= expr STAR expr */
2953 #line 749 "pikchr.y"
2954 {yylhsminor.yy153=yymsp[-2].minor.yy153*yymsp[0].minor.yy153;}
2955 #line 2980 "pikchr.c"
2956 yymsp[-2].minor.yy153 = yylhsminor.yy153;
2957 break;
2958 case 101: /* expr ::= expr SLASH expr */
2959 #line 750 "pikchr.y"
2960 {
2961 if( yymsp[0].minor.yy153==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy153 = 0.0; }
2962 else{ yylhsminor.yy153 = yymsp[-2].minor.yy153/yymsp[0].minor.yy153; }
2963 }
2964 #line 2989 "pikchr.c"
2965 yymsp[-2].minor.yy153 = yylhsminor.yy153;
2966 break;
2967 case 102: /* expr ::= MINUS expr */
2968 #line 754 "pikchr.y"
2969 {yymsp[-1].minor.yy153=-yymsp[0].minor.yy153;}
2970 #line 2995 "pikchr.c"
2971 break;
2972 case 103: /* expr ::= PLUS expr */
2973 #line 755 "pikchr.y"
2974 {yymsp[-1].minor.yy153=yymsp[0].minor.yy153;}
2975 #line 3000 "pikchr.c"
2976 break;
2977 case 104: /* expr ::= LP expr RP */
2978 #line 756 "pikchr.y"
2979 {yymsp[-2].minor.yy153=yymsp[-1].minor.yy153;}
2980 #line 3005 "pikchr.c"
2981 break;
2982 case 105: /* expr ::= LP FILL|COLOR|THICKNESS RP */
2983 #line 757 "pikchr.y"
2984 {yymsp[-2].minor.yy153=pik_get_var(p,&yymsp[-1].minor.yy0);}
2985 #line 3010 "pikchr.c"
2986 break;
2987 case 106: /* expr ::= NUMBER */
2988 #line 758 "pikchr.y"
2989 {yylhsminor.yy153=pik_atof(&yymsp[0].minor.yy0);}
2990 #line 3015 "pikchr.c"
2991 yymsp[0].minor.yy153 = yylhsminor.yy153;
2992 break;
2993 case 107: /* expr ::= ID */
2994 #line 759 "pikchr.y"
2995 {yylhsminor.yy153=pik_get_var(p,&yymsp[0].minor.yy0);}
2996 #line 3021 "pikchr.c"
2997 yymsp[0].minor.yy153 = yylhsminor.yy153;
2998 break;
2999 case 108: /* expr ::= FUNC1 LP expr RP */
3000 #line 760 "pikchr.y"
3001 {yylhsminor.yy153 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy153,0.0);}
3002 #line 3027 "pikchr.c"
3003 yymsp[-3].minor.yy153 = yylhsminor.yy153;
3004 break;
3005 case 109: /* expr ::= FUNC2 LP expr COMMA expr RP */
3006 #line 761 "pikchr.y"
3007 {yylhsminor.yy153 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy153,yymsp[-1].minor.yy153);}
3008 #line 3033 "pikchr.c"
3009 yymsp[-5].minor.yy153 = yylhsminor.yy153;
3010 break;
3011 case 110: /* expr ::= DIST LP position COMMA position RP */
3012 #line 762 "pikchr.y"
3013 {yymsp[-5].minor.yy153 = pik_dist(&yymsp[-3].minor.yy79,&yymsp[-1].minor.yy79);}
3014 #line 3039 "pikchr.c"
3015 break;
3016 case 111: /* expr ::= place2 DOT_XY X */
3017 #line 763 "pikchr.y"
3018 {yylhsminor.yy153 = yymsp[-2].minor.yy79.x;}
3019 #line 3044 "pikchr.c"
3020 yymsp[-2].minor.yy153 = yylhsminor.yy153;
3021 break;
3022 case 112: /* expr ::= place2 DOT_XY Y */
3023 #line 764 "pikchr.y"
3024 {yylhsminor.yy153 = yymsp[-2].minor.yy79.y;}
3025 #line 3050 "pikchr.c"
3026 yymsp[-2].minor.yy153 = yylhsminor.yy153;
3027 break;
3028 case 113: /* expr ::= object DOT_L numproperty */
3029 case 114: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==114);
3030 case 115: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==115);
3031 #line 765 "pikchr.y"
3032 {yylhsminor.yy153=pik_property_of(yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
3033 #line 3058 "pikchr.c"
3034 yymsp[-2].minor.yy153 = yylhsminor.yy153;
3035 break;
3036 default:
3037 /* (116) lvalue ::= ID */ yytestcase(yyruleno==116);
3038 /* (117) lvalue ::= FILL */ yytestcase(yyruleno==117);
@@ -3131,19 +3141,19 @@
3131 ){
3132 pik_parserARG_FETCH
3133 pik_parserCTX_FETCH
3134 #define TOKEN yyminor
3135 /************ Begin %syntax_error code ****************************************/
3136 #line 525 "pikchr.y"
3137
3138 if( TOKEN.z && TOKEN.z[0] ){
3139 pik_error(p, &TOKEN, "syntax error");
3140 }else{
3141 pik_error(p, 0, "syntax error");
3142 }
3143 UNUSED_PARAMETER(yymajor);
3144 #line 3169 "pikchr.c"
3145 /************ End %syntax_error code ******************************************/
3146 pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
3147 pik_parserCTX_STORE
3148 }
3149
@@ -3372,11 +3382,11 @@
3372 #else
3373 (void)iToken;
3374 return 0;
3375 #endif
3376 }
3377 #line 770 "pikchr.y"
3378
3379
3380
3381 /* Chart of the 148 official CSS color names with their
3382 ** corresponding RGB values thru Color Module Level 4:
@@ -7744,10 +7754,14 @@
7744 printf("******** Token %s (%d): \"%.*s\" **************\n",
7745 yyTokenName[token.eType], token.eType,
7746 (int)(isspace(token.z[0]) ? 0 : sz), token.z);
7747 #endif
7748 token.n = (unsigned short)(sz & 0xffff);
 
 
 
 
7749 pik_parser(pParser, token.eType, token);
7750 }
7751 }
7752 }
7753
@@ -8081,6 +8095,6 @@
8081
8082
8083 #endif /* PIKCHR_TCL */
8084
8085
8086 #line 8111 "pikchr.c"
8087
--- extsrc/pikchr.c
+++ extsrc/pikchr.c
@@ -124,10 +124,19 @@
124 #include <assert.h>
125 #define count(X) (sizeof(X)/sizeof(X[0]))
126 #ifndef M_PI
127 # define M_PI 3.1415926535897932385
128 #endif
129
130 /* Limit the number of tokens in a single script to avoid run-away
131 ** macro expansion attacks. See forum post
132 ** https://pikchr.org/home/forumpost/ef8684c6955a411a
133 */
134 #ifndef PIKCHR_TOKEN_LIMIT
135 # define PIKCHR_TOKEN_LIMIT 100000
136 #endif
137
138
139 /* Tag intentionally unused parameters with this macro to prevent
140 ** compiler warnings with -Wextra */
141 #define UNUSED_PARAMETER(X) (void)(X)
142
@@ -341,10 +350,11 @@
350 /* Each call to the pikchr() subroutine uses an instance of the following
351 ** object to pass around context to all of its subroutines.
352 */
353 struct Pik {
354 unsigned nErr; /* Number of errors seen */
355 unsigned nToken; /* Number of tokens parsed */
356 PToken sIn; /* Input Pikchr-language text */
357 char *zOut; /* Result accumulates here */
358 unsigned int nOut; /* Bytes written to zOut[] so far */
359 unsigned int nOutAlloc; /* Space allocated to zOut[] */
360 unsigned char eDir; /* Current direction */
@@ -479,11 +489,11 @@
489 static PObj *pik_position_assert(Pik*,PPoint*,PToken*,PPoint*);
490 static PNum pik_dist(PPoint*,PPoint*);
491 static void pik_add_macro(Pik*,PToken *pId,PToken *pCode);
492
493
494 #line 520 "pikchr.c"
495 /**************** End of %include directives **********************************/
496 /* These constants specify the various numeric values for terminal symbols.
497 ***************** Begin token definitions *************************************/
498 #ifndef T_ID
499 #define T_ID 1
@@ -1708,22 +1718,22 @@
1718 ** inside the C code.
1719 */
1720 /********* Begin destructor definitions ***************************************/
1721 case 99: /* statement_list */
1722 {
1723 #line 509 "pikchr.y"
1724 pik_elist_free(p,(yypminor->yy227));
1725 #line 1750 "pikchr.c"
1726 }
1727 break;
1728 case 100: /* statement */
1729 case 101: /* unnamed_statement */
1730 case 102: /* basetype */
1731 {
1732 #line 511 "pikchr.y"
1733 pik_elem_free(p,(yypminor->yy36));
1734 #line 1759 "pikchr.c"
1735 }
1736 break;
1737 /********* End destructor definitions *****************************************/
1738 default: break; /* If no destructor action specified: do nothing */
1739 }
@@ -1937,14 +1947,14 @@
1947 #endif
1948 while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
1949 /* Here code is inserted which will execute if the parser
1950 ** stack every overflows */
1951 /******** Begin %stack_overflow code ******************************************/
1952 #line 543 "pikchr.y"
1953
1954 pik_error(p, 0, "parser stack overflow");
1955 #line 1980 "pikchr.c"
1956 /******** End %stack_overflow code ********************************************/
1957 pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
1958 pik_parserCTX_STORE
1959 }
1960
@@ -2420,619 +2430,619 @@
2430 ** break;
2431 */
2432 /********** Begin reduce actions **********************************************/
2433 YYMINORTYPE yylhsminor;
2434 case 0: /* document ::= statement_list */
2435 #line 547 "pikchr.y"
2436 {pik_render(p,yymsp[0].minor.yy227);}
2437 #line 2462 "pikchr.c"
2438 break;
2439 case 1: /* statement_list ::= statement */
2440 #line 550 "pikchr.y"
2441 { yylhsminor.yy227 = pik_elist_append(p,0,yymsp[0].minor.yy36); }
2442 #line 2467 "pikchr.c"
2443 yymsp[0].minor.yy227 = yylhsminor.yy227;
2444 break;
2445 case 2: /* statement_list ::= statement_list EOL statement */
2446 #line 552 "pikchr.y"
2447 { yylhsminor.yy227 = pik_elist_append(p,yymsp[-2].minor.yy227,yymsp[0].minor.yy36); }
2448 #line 2473 "pikchr.c"
2449 yymsp[-2].minor.yy227 = yylhsminor.yy227;
2450 break;
2451 case 3: /* statement ::= */
2452 #line 555 "pikchr.y"
2453 { yymsp[1].minor.yy36 = 0; }
2454 #line 2479 "pikchr.c"
2455 break;
2456 case 4: /* statement ::= direction */
2457 #line 556 "pikchr.y"
2458 { pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy36=0; }
2459 #line 2484 "pikchr.c"
2460 yymsp[0].minor.yy36 = yylhsminor.yy36;
2461 break;
2462 case 5: /* statement ::= lvalue ASSIGN rvalue */
2463 #line 557 "pikchr.y"
2464 {pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy153,&yymsp[-1].minor.yy0); yylhsminor.yy36=0;}
2465 #line 2490 "pikchr.c"
2466 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2467 break;
2468 case 6: /* statement ::= PLACENAME COLON unnamed_statement */
2469 #line 559 "pikchr.y"
2470 { yylhsminor.yy36 = yymsp[0].minor.yy36; pik_elem_setname(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0); }
2471 #line 2496 "pikchr.c"
2472 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2473 break;
2474 case 7: /* statement ::= PLACENAME COLON position */
2475 #line 561 "pikchr.y"
2476 { yylhsminor.yy36 = pik_elem_new(p,0,0,0);
2477 if(yylhsminor.yy36){ yylhsminor.yy36->ptAt = yymsp[0].minor.yy79; pik_elem_setname(p,yylhsminor.yy36,&yymsp[-2].minor.yy0); }}
2478 #line 2503 "pikchr.c"
2479 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2480 break;
2481 case 8: /* statement ::= unnamed_statement */
2482 #line 563 "pikchr.y"
2483 {yylhsminor.yy36 = yymsp[0].minor.yy36;}
2484 #line 2509 "pikchr.c"
2485 yymsp[0].minor.yy36 = yylhsminor.yy36;
2486 break;
2487 case 9: /* statement ::= print prlist */
2488 #line 564 "pikchr.y"
2489 {pik_append(p,"<br>\n",5); yymsp[-1].minor.yy36=0;}
2490 #line 2515 "pikchr.c"
2491 break;
2492 case 10: /* statement ::= ASSERT LP expr EQ expr RP */
2493 #line 569 "pikchr.y"
2494 {yymsp[-5].minor.yy36=pik_assert(p,yymsp[-3].minor.yy153,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy153);}
2495 #line 2520 "pikchr.c"
2496 break;
2497 case 11: /* statement ::= ASSERT LP position EQ position RP */
2498 #line 571 "pikchr.y"
2499 {yymsp[-5].minor.yy36=pik_position_assert(p,&yymsp[-3].minor.yy79,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy79);}
2500 #line 2525 "pikchr.c"
2501 break;
2502 case 12: /* statement ::= DEFINE ID CODEBLOCK */
2503 #line 572 "pikchr.y"
2504 {yymsp[-2].minor.yy36=0; pik_add_macro(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
2505 #line 2530 "pikchr.c"
2506 break;
2507 case 13: /* rvalue ::= PLACENAME */
2508 #line 583 "pikchr.y"
2509 {yylhsminor.yy153 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2510 #line 2535 "pikchr.c"
2511 yymsp[0].minor.yy153 = yylhsminor.yy153;
2512 break;
2513 case 14: /* pritem ::= FILL */
2514 case 15: /* pritem ::= COLOR */ yytestcase(yyruleno==15);
2515 case 16: /* pritem ::= THICKNESS */ yytestcase(yyruleno==16);
2516 #line 588 "pikchr.y"
2517 {pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2518 #line 2543 "pikchr.c"
2519 break;
2520 case 17: /* pritem ::= rvalue */
2521 #line 591 "pikchr.y"
2522 {pik_append_num(p,"",yymsp[0].minor.yy153);}
2523 #line 2548 "pikchr.c"
2524 break;
2525 case 18: /* pritem ::= STRING */
2526 #line 592 "pikchr.y"
2527 {pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2528 #line 2553 "pikchr.c"
2529 break;
2530 case 19: /* prsep ::= COMMA */
2531 #line 593 "pikchr.y"
2532 {pik_append(p, " ", 1);}
2533 #line 2558 "pikchr.c"
2534 break;
2535 case 20: /* unnamed_statement ::= basetype attribute_list */
2536 #line 596 "pikchr.y"
2537 {yylhsminor.yy36 = yymsp[-1].minor.yy36; pik_after_adding_attributes(p,yylhsminor.yy36);}
2538 #line 2563 "pikchr.c"
2539 yymsp[-1].minor.yy36 = yylhsminor.yy36;
2540 break;
2541 case 21: /* basetype ::= CLASSNAME */
2542 #line 598 "pikchr.y"
2543 {yylhsminor.yy36 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2544 #line 2569 "pikchr.c"
2545 yymsp[0].minor.yy36 = yylhsminor.yy36;
2546 break;
2547 case 22: /* basetype ::= STRING textposition */
2548 #line 600 "pikchr.y"
2549 {yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy164; yylhsminor.yy36 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2550 #line 2575 "pikchr.c"
2551 yymsp[-1].minor.yy36 = yylhsminor.yy36;
2552 break;
2553 case 23: /* basetype ::= LB savelist statement_list RB */
2554 #line 602 "pikchr.y"
2555 { p->list = yymsp[-2].minor.yy227; yymsp[-3].minor.yy36 = pik_elem_new(p,0,0,yymsp[-1].minor.yy227); if(yymsp[-3].minor.yy36) yymsp[-3].minor.yy36->errTok = yymsp[0].minor.yy0; }
2556 #line 2581 "pikchr.c"
2557 break;
2558 case 24: /* savelist ::= */
2559 #line 607 "pikchr.y"
2560 {yymsp[1].minor.yy227 = p->list; p->list = 0;}
2561 #line 2586 "pikchr.c"
2562 break;
2563 case 25: /* relexpr ::= expr */
2564 #line 614 "pikchr.y"
2565 {yylhsminor.yy10.rAbs = yymsp[0].minor.yy153; yylhsminor.yy10.rRel = 0;}
2566 #line 2591 "pikchr.c"
2567 yymsp[0].minor.yy10 = yylhsminor.yy10;
2568 break;
2569 case 26: /* relexpr ::= expr PERCENT */
2570 #line 615 "pikchr.y"
2571 {yylhsminor.yy10.rAbs = 0; yylhsminor.yy10.rRel = yymsp[-1].minor.yy153/100;}
2572 #line 2597 "pikchr.c"
2573 yymsp[-1].minor.yy10 = yylhsminor.yy10;
2574 break;
2575 case 27: /* optrelexpr ::= */
2576 #line 617 "pikchr.y"
2577 {yymsp[1].minor.yy10.rAbs = 0; yymsp[1].minor.yy10.rRel = 1.0;}
2578 #line 2603 "pikchr.c"
2579 break;
2580 case 28: /* attribute_list ::= relexpr alist */
2581 #line 619 "pikchr.y"
2582 {pik_add_direction(p,0,&yymsp[-1].minor.yy10);}
2583 #line 2608 "pikchr.c"
2584 break;
2585 case 29: /* attribute ::= numproperty relexpr */
2586 #line 623 "pikchr.y"
2587 { pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy10); }
2588 #line 2613 "pikchr.c"
2589 break;
2590 case 30: /* attribute ::= dashproperty expr */
2591 #line 624 "pikchr.y"
2592 { pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy153); }
2593 #line 2618 "pikchr.c"
2594 break;
2595 case 31: /* attribute ::= dashproperty */
2596 #line 625 "pikchr.y"
2597 { pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2598 #line 2623 "pikchr.c"
2599 break;
2600 case 32: /* attribute ::= colorproperty rvalue */
2601 #line 626 "pikchr.y"
2602 { pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy153); }
2603 #line 2628 "pikchr.c"
2604 break;
2605 case 33: /* attribute ::= go direction optrelexpr */
2606 #line 627 "pikchr.y"
2607 { pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy10);}
2608 #line 2633 "pikchr.c"
2609 break;
2610 case 34: /* attribute ::= go direction even position */
2611 #line 628 "pikchr.y"
2612 {pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy79);}
2613 #line 2638 "pikchr.c"
2614 break;
2615 case 35: /* attribute ::= CLOSE */
2616 #line 629 "pikchr.y"
2617 { pik_close_path(p,&yymsp[0].minor.yy0); }
2618 #line 2643 "pikchr.c"
2619 break;
2620 case 36: /* attribute ::= CHOP */
2621 #line 630 "pikchr.y"
2622 { p->cur->bChop = 1; }
2623 #line 2648 "pikchr.c"
2624 break;
2625 case 37: /* attribute ::= FROM position */
2626 #line 631 "pikchr.y"
2627 { pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy79); }
2628 #line 2653 "pikchr.c"
2629 break;
2630 case 38: /* attribute ::= TO position */
2631 #line 632 "pikchr.y"
2632 { pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy79); }
2633 #line 2658 "pikchr.c"
2634 break;
2635 case 39: /* attribute ::= THEN */
2636 #line 633 "pikchr.y"
2637 { pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2638 #line 2663 "pikchr.c"
2639 break;
2640 case 40: /* attribute ::= THEN optrelexpr HEADING expr */
2641 case 42: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==42);
2642 #line 635 "pikchr.y"
2643 {pik_move_hdg(p,&yymsp[-2].minor.yy10,&yymsp[-1].minor.yy0,yymsp[0].minor.yy153,0,&yymsp[-3].minor.yy0);}
2644 #line 2669 "pikchr.c"
2645 break;
2646 case 41: /* attribute ::= THEN optrelexpr EDGEPT */
2647 case 43: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==43);
2648 #line 636 "pikchr.y"
2649 {pik_move_hdg(p,&yymsp[-1].minor.yy10,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2650 #line 2675 "pikchr.c"
2651 break;
2652 case 44: /* attribute ::= AT position */
2653 #line 641 "pikchr.y"
2654 { pik_set_at(p,0,&yymsp[0].minor.yy79,&yymsp[-1].minor.yy0); }
2655 #line 2680 "pikchr.c"
2656 break;
2657 case 45: /* attribute ::= SAME */
2658 #line 643 "pikchr.y"
2659 {pik_same(p,0,&yymsp[0].minor.yy0);}
2660 #line 2685 "pikchr.c"
2661 break;
2662 case 46: /* attribute ::= SAME AS object */
2663 #line 644 "pikchr.y"
2664 {pik_same(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2665 #line 2690 "pikchr.c"
2666 break;
2667 case 47: /* attribute ::= STRING textposition */
2668 #line 645 "pikchr.y"
2669 {pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy164);}
2670 #line 2695 "pikchr.c"
2671 break;
2672 case 48: /* attribute ::= FIT */
2673 #line 646 "pikchr.y"
2674 {pik_size_to_fit(p,&yymsp[0].minor.yy0,3); }
2675 #line 2700 "pikchr.c"
2676 break;
2677 case 49: /* attribute ::= BEHIND object */
2678 #line 647 "pikchr.y"
2679 {pik_behind(p,yymsp[0].minor.yy36);}
2680 #line 2705 "pikchr.c"
2681 break;
2682 case 50: /* withclause ::= DOT_E edge AT position */
2683 case 51: /* withclause ::= edge AT position */ yytestcase(yyruleno==51);
2684 #line 655 "pikchr.y"
2685 { pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy79,&yymsp[-1].minor.yy0); }
2686 #line 2711 "pikchr.c"
2687 break;
2688 case 52: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2689 #line 659 "pikchr.y"
2690 {yylhsminor.yy0 = yymsp[0].minor.yy0;}
2691 #line 2716 "pikchr.c"
2692 yymsp[0].minor.yy0 = yylhsminor.yy0;
2693 break;
2694 case 53: /* boolproperty ::= CW */
2695 #line 670 "pikchr.y"
2696 {p->cur->cw = 1;}
2697 #line 2722 "pikchr.c"
2698 break;
2699 case 54: /* boolproperty ::= CCW */
2700 #line 671 "pikchr.y"
2701 {p->cur->cw = 0;}
2702 #line 2727 "pikchr.c"
2703 break;
2704 case 55: /* boolproperty ::= LARROW */
2705 #line 672 "pikchr.y"
2706 {p->cur->larrow=1; p->cur->rarrow=0; }
2707 #line 2732 "pikchr.c"
2708 break;
2709 case 56: /* boolproperty ::= RARROW */
2710 #line 673 "pikchr.y"
2711 {p->cur->larrow=0; p->cur->rarrow=1; }
2712 #line 2737 "pikchr.c"
2713 break;
2714 case 57: /* boolproperty ::= LRARROW */
2715 #line 674 "pikchr.y"
2716 {p->cur->larrow=1; p->cur->rarrow=1; }
2717 #line 2742 "pikchr.c"
2718 break;
2719 case 58: /* boolproperty ::= INVIS */
2720 #line 675 "pikchr.y"
2721 {p->cur->sw = 0.0;}
2722 #line 2747 "pikchr.c"
2723 break;
2724 case 59: /* boolproperty ::= THICK */
2725 #line 676 "pikchr.y"
2726 {p->cur->sw *= 1.5;}
2727 #line 2752 "pikchr.c"
2728 break;
2729 case 60: /* boolproperty ::= THIN */
2730 #line 677 "pikchr.y"
2731 {p->cur->sw *= 0.67;}
2732 #line 2757 "pikchr.c"
2733 break;
2734 case 61: /* boolproperty ::= SOLID */
2735 #line 678 "pikchr.y"
2736 {p->cur->sw = pik_value(p,"thickness",9,0);
2737 p->cur->dotted = p->cur->dashed = 0.0;}
2738 #line 2763 "pikchr.c"
2739 break;
2740 case 62: /* textposition ::= */
2741 #line 681 "pikchr.y"
2742 {yymsp[1].minor.yy164 = 0;}
2743 #line 2768 "pikchr.c"
2744 break;
2745 case 63: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2746 #line 684 "pikchr.y"
2747 {yylhsminor.yy164 = (short int)pik_text_position(yymsp[-1].minor.yy164,&yymsp[0].minor.yy0);}
2748 #line 2773 "pikchr.c"
2749 yymsp[-1].minor.yy164 = yylhsminor.yy164;
2750 break;
2751 case 64: /* position ::= expr COMMA expr */
2752 #line 687 "pikchr.y"
2753 {yylhsminor.yy79.x=yymsp[-2].minor.yy153; yylhsminor.yy79.y=yymsp[0].minor.yy153;}
2754 #line 2779 "pikchr.c"
2755 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2756 break;
2757 case 65: /* position ::= place PLUS expr COMMA expr */
2758 #line 689 "pikchr.y"
2759 {yylhsminor.yy79.x=yymsp[-4].minor.yy79.x+yymsp[-2].minor.yy153; yylhsminor.yy79.y=yymsp[-4].minor.yy79.y+yymsp[0].minor.yy153;}
2760 #line 2785 "pikchr.c"
2761 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2762 break;
2763 case 66: /* position ::= place MINUS expr COMMA expr */
2764 #line 690 "pikchr.y"
2765 {yylhsminor.yy79.x=yymsp[-4].minor.yy79.x-yymsp[-2].minor.yy153; yylhsminor.yy79.y=yymsp[-4].minor.yy79.y-yymsp[0].minor.yy153;}
2766 #line 2791 "pikchr.c"
2767 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2768 break;
2769 case 67: /* position ::= place PLUS LP expr COMMA expr RP */
2770 #line 692 "pikchr.y"
2771 {yylhsminor.yy79.x=yymsp[-6].minor.yy79.x+yymsp[-3].minor.yy153; yylhsminor.yy79.y=yymsp[-6].minor.yy79.y+yymsp[-1].minor.yy153;}
2772 #line 2797 "pikchr.c"
2773 yymsp[-6].minor.yy79 = yylhsminor.yy79;
2774 break;
2775 case 68: /* position ::= place MINUS LP expr COMMA expr RP */
2776 #line 694 "pikchr.y"
2777 {yylhsminor.yy79.x=yymsp[-6].minor.yy79.x-yymsp[-3].minor.yy153; yylhsminor.yy79.y=yymsp[-6].minor.yy79.y-yymsp[-1].minor.yy153;}
2778 #line 2803 "pikchr.c"
2779 yymsp[-6].minor.yy79 = yylhsminor.yy79;
2780 break;
2781 case 69: /* position ::= LP position COMMA position RP */
2782 #line 695 "pikchr.y"
2783 {yymsp[-4].minor.yy79.x=yymsp[-3].minor.yy79.x; yymsp[-4].minor.yy79.y=yymsp[-1].minor.yy79.y;}
2784 #line 2809 "pikchr.c"
2785 break;
2786 case 70: /* position ::= LP position RP */
2787 #line 696 "pikchr.y"
2788 {yymsp[-2].minor.yy79=yymsp[-1].minor.yy79;}
2789 #line 2814 "pikchr.c"
2790 break;
2791 case 71: /* position ::= expr between position AND position */
2792 #line 698 "pikchr.y"
2793 {yylhsminor.yy79 = pik_position_between(yymsp[-4].minor.yy153,yymsp[-2].minor.yy79,yymsp[0].minor.yy79);}
2794 #line 2819 "pikchr.c"
2795 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2796 break;
2797 case 72: /* position ::= expr LT position COMMA position GT */
2798 #line 700 "pikchr.y"
2799 {yylhsminor.yy79 = pik_position_between(yymsp[-5].minor.yy153,yymsp[-3].minor.yy79,yymsp[-1].minor.yy79);}
2800 #line 2825 "pikchr.c"
2801 yymsp[-5].minor.yy79 = yylhsminor.yy79;
2802 break;
2803 case 73: /* position ::= expr ABOVE position */
2804 #line 701 "pikchr.y"
2805 {yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.y += yymsp[-2].minor.yy153;}
2806 #line 2831 "pikchr.c"
2807 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2808 break;
2809 case 74: /* position ::= expr BELOW position */
2810 #line 702 "pikchr.y"
2811 {yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.y -= yymsp[-2].minor.yy153;}
2812 #line 2837 "pikchr.c"
2813 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2814 break;
2815 case 75: /* position ::= expr LEFT OF position */
2816 #line 703 "pikchr.y"
2817 {yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.x -= yymsp[-3].minor.yy153;}
2818 #line 2843 "pikchr.c"
2819 yymsp[-3].minor.yy79 = yylhsminor.yy79;
2820 break;
2821 case 76: /* position ::= expr RIGHT OF position */
2822 #line 704 "pikchr.y"
2823 {yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.x += yymsp[-3].minor.yy153;}
2824 #line 2849 "pikchr.c"
2825 yymsp[-3].minor.yy79 = yylhsminor.yy79;
2826 break;
2827 case 77: /* position ::= expr ON HEADING EDGEPT OF position */
2828 #line 706 "pikchr.y"
2829 {yylhsminor.yy79 = pik_position_at_hdg(yymsp[-5].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2830 #line 2855 "pikchr.c"
2831 yymsp[-5].minor.yy79 = yylhsminor.yy79;
2832 break;
2833 case 78: /* position ::= expr HEADING EDGEPT OF position */
2834 #line 708 "pikchr.y"
2835 {yylhsminor.yy79 = pik_position_at_hdg(yymsp[-4].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2836 #line 2861 "pikchr.c"
2837 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2838 break;
2839 case 79: /* position ::= expr EDGEPT OF position */
2840 #line 710 "pikchr.y"
2841 {yylhsminor.yy79 = pik_position_at_hdg(yymsp[-3].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2842 #line 2867 "pikchr.c"
2843 yymsp[-3].minor.yy79 = yylhsminor.yy79;
2844 break;
2845 case 80: /* position ::= expr ON HEADING expr FROM position */
2846 #line 712 "pikchr.y"
2847 {yylhsminor.yy79 = pik_position_at_angle(yymsp[-5].minor.yy153,yymsp[-2].minor.yy153,yymsp[0].minor.yy79);}
2848 #line 2873 "pikchr.c"
2849 yymsp[-5].minor.yy79 = yylhsminor.yy79;
2850 break;
2851 case 81: /* position ::= expr HEADING expr FROM position */
2852 #line 714 "pikchr.y"
2853 {yylhsminor.yy79 = pik_position_at_angle(yymsp[-4].minor.yy153,yymsp[-2].minor.yy153,yymsp[0].minor.yy79);}
2854 #line 2879 "pikchr.c"
2855 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2856 break;
2857 case 82: /* place ::= edge OF object */
2858 #line 726 "pikchr.y"
2859 {yylhsminor.yy79 = pik_place_of_elem(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2860 #line 2885 "pikchr.c"
2861 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2862 break;
2863 case 83: /* place2 ::= object */
2864 #line 727 "pikchr.y"
2865 {yylhsminor.yy79 = pik_place_of_elem(p,yymsp[0].minor.yy36,0);}
2866 #line 2891 "pikchr.c"
2867 yymsp[0].minor.yy79 = yylhsminor.yy79;
2868 break;
2869 case 84: /* place2 ::= object DOT_E edge */
2870 #line 728 "pikchr.y"
2871 {yylhsminor.yy79 = pik_place_of_elem(p,yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
2872 #line 2897 "pikchr.c"
2873 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2874 break;
2875 case 85: /* place2 ::= NTH VERTEX OF object */
2876 #line 729 "pikchr.y"
2877 {yylhsminor.yy79 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy36);}
2878 #line 2903 "pikchr.c"
2879 yymsp[-3].minor.yy79 = yylhsminor.yy79;
2880 break;
2881 case 86: /* object ::= nth */
2882 #line 741 "pikchr.y"
2883 {yylhsminor.yy36 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2884 #line 2909 "pikchr.c"
2885 yymsp[0].minor.yy36 = yylhsminor.yy36;
2886 break;
2887 case 87: /* object ::= nth OF|IN object */
2888 #line 742 "pikchr.y"
2889 {yylhsminor.yy36 = pik_find_nth(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2890 #line 2915 "pikchr.c"
2891 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2892 break;
2893 case 88: /* objectname ::= THIS */
2894 #line 744 "pikchr.y"
2895 {yymsp[0].minor.yy36 = p->cur;}
2896 #line 2921 "pikchr.c"
2897 break;
2898 case 89: /* objectname ::= PLACENAME */
2899 #line 745 "pikchr.y"
2900 {yylhsminor.yy36 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2901 #line 2926 "pikchr.c"
2902 yymsp[0].minor.yy36 = yylhsminor.yy36;
2903 break;
2904 case 90: /* objectname ::= objectname DOT_U PLACENAME */
2905 #line 747 "pikchr.y"
2906 {yylhsminor.yy36 = pik_find_byname(p,yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
2907 #line 2932 "pikchr.c"
2908 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2909 break;
2910 case 91: /* nth ::= NTH CLASSNAME */
2911 #line 749 "pikchr.y"
2912 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2913 #line 2938 "pikchr.c"
2914 yymsp[-1].minor.yy0 = yylhsminor.yy0;
2915 break;
2916 case 92: /* nth ::= NTH LAST CLASSNAME */
2917 #line 750 "pikchr.y"
2918 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2919 #line 2944 "pikchr.c"
2920 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2921 break;
2922 case 93: /* nth ::= LAST CLASSNAME */
2923 #line 751 "pikchr.y"
2924 {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2925 #line 2950 "pikchr.c"
2926 break;
2927 case 94: /* nth ::= LAST */
2928 #line 752 "pikchr.y"
2929 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2930 #line 2955 "pikchr.c"
2931 yymsp[0].minor.yy0 = yylhsminor.yy0;
2932 break;
2933 case 95: /* nth ::= NTH LB RB */
2934 #line 753 "pikchr.y"
2935 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2936 #line 2961 "pikchr.c"
2937 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2938 break;
2939 case 96: /* nth ::= NTH LAST LB RB */
2940 #line 754 "pikchr.y"
2941 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2942 #line 2967 "pikchr.c"
2943 yymsp[-3].minor.yy0 = yylhsminor.yy0;
2944 break;
2945 case 97: /* nth ::= LAST LB RB */
2946 #line 755 "pikchr.y"
2947 {yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2948 #line 2973 "pikchr.c"
2949 break;
2950 case 98: /* expr ::= expr PLUS expr */
2951 #line 757 "pikchr.y"
2952 {yylhsminor.yy153=yymsp[-2].minor.yy153+yymsp[0].minor.yy153;}
2953 #line 2978 "pikchr.c"
2954 yymsp[-2].minor.yy153 = yylhsminor.yy153;
2955 break;
2956 case 99: /* expr ::= expr MINUS expr */
2957 #line 758 "pikchr.y"
2958 {yylhsminor.yy153=yymsp[-2].minor.yy153-yymsp[0].minor.yy153;}
2959 #line 2984 "pikchr.c"
2960 yymsp[-2].minor.yy153 = yylhsminor.yy153;
2961 break;
2962 case 100: /* expr ::= expr STAR expr */
2963 #line 759 "pikchr.y"
2964 {yylhsminor.yy153=yymsp[-2].minor.yy153*yymsp[0].minor.yy153;}
2965 #line 2990 "pikchr.c"
2966 yymsp[-2].minor.yy153 = yylhsminor.yy153;
2967 break;
2968 case 101: /* expr ::= expr SLASH expr */
2969 #line 760 "pikchr.y"
2970 {
2971 if( yymsp[0].minor.yy153==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy153 = 0.0; }
2972 else{ yylhsminor.yy153 = yymsp[-2].minor.yy153/yymsp[0].minor.yy153; }
2973 }
2974 #line 2999 "pikchr.c"
2975 yymsp[-2].minor.yy153 = yylhsminor.yy153;
2976 break;
2977 case 102: /* expr ::= MINUS expr */
2978 #line 764 "pikchr.y"
2979 {yymsp[-1].minor.yy153=-yymsp[0].minor.yy153;}
2980 #line 3005 "pikchr.c"
2981 break;
2982 case 103: /* expr ::= PLUS expr */
2983 #line 765 "pikchr.y"
2984 {yymsp[-1].minor.yy153=yymsp[0].minor.yy153;}
2985 #line 3010 "pikchr.c"
2986 break;
2987 case 104: /* expr ::= LP expr RP */
2988 #line 766 "pikchr.y"
2989 {yymsp[-2].minor.yy153=yymsp[-1].minor.yy153;}
2990 #line 3015 "pikchr.c"
2991 break;
2992 case 105: /* expr ::= LP FILL|COLOR|THICKNESS RP */
2993 #line 767 "pikchr.y"
2994 {yymsp[-2].minor.yy153=pik_get_var(p,&yymsp[-1].minor.yy0);}
2995 #line 3020 "pikchr.c"
2996 break;
2997 case 106: /* expr ::= NUMBER */
2998 #line 768 "pikchr.y"
2999 {yylhsminor.yy153=pik_atof(&yymsp[0].minor.yy0);}
3000 #line 3025 "pikchr.c"
3001 yymsp[0].minor.yy153 = yylhsminor.yy153;
3002 break;
3003 case 107: /* expr ::= ID */
3004 #line 769 "pikchr.y"
3005 {yylhsminor.yy153=pik_get_var(p,&yymsp[0].minor.yy0);}
3006 #line 3031 "pikchr.c"
3007 yymsp[0].minor.yy153 = yylhsminor.yy153;
3008 break;
3009 case 108: /* expr ::= FUNC1 LP expr RP */
3010 #line 770 "pikchr.y"
3011 {yylhsminor.yy153 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy153,0.0);}
3012 #line 3037 "pikchr.c"
3013 yymsp[-3].minor.yy153 = yylhsminor.yy153;
3014 break;
3015 case 109: /* expr ::= FUNC2 LP expr COMMA expr RP */
3016 #line 771 "pikchr.y"
3017 {yylhsminor.yy153 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy153,yymsp[-1].minor.yy153);}
3018 #line 3043 "pikchr.c"
3019 yymsp[-5].minor.yy153 = yylhsminor.yy153;
3020 break;
3021 case 110: /* expr ::= DIST LP position COMMA position RP */
3022 #line 772 "pikchr.y"
3023 {yymsp[-5].minor.yy153 = pik_dist(&yymsp[-3].minor.yy79,&yymsp[-1].minor.yy79);}
3024 #line 3049 "pikchr.c"
3025 break;
3026 case 111: /* expr ::= place2 DOT_XY X */
3027 #line 773 "pikchr.y"
3028 {yylhsminor.yy153 = yymsp[-2].minor.yy79.x;}
3029 #line 3054 "pikchr.c"
3030 yymsp[-2].minor.yy153 = yylhsminor.yy153;
3031 break;
3032 case 112: /* expr ::= place2 DOT_XY Y */
3033 #line 774 "pikchr.y"
3034 {yylhsminor.yy153 = yymsp[-2].minor.yy79.y;}
3035 #line 3060 "pikchr.c"
3036 yymsp[-2].minor.yy153 = yylhsminor.yy153;
3037 break;
3038 case 113: /* expr ::= object DOT_L numproperty */
3039 case 114: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==114);
3040 case 115: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==115);
3041 #line 775 "pikchr.y"
3042 {yylhsminor.yy153=pik_property_of(yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
3043 #line 3068 "pikchr.c"
3044 yymsp[-2].minor.yy153 = yylhsminor.yy153;
3045 break;
3046 default:
3047 /* (116) lvalue ::= ID */ yytestcase(yyruleno==116);
3048 /* (117) lvalue ::= FILL */ yytestcase(yyruleno==117);
@@ -3131,19 +3141,19 @@
3141 ){
3142 pik_parserARG_FETCH
3143 pik_parserCTX_FETCH
3144 #define TOKEN yyminor
3145 /************ Begin %syntax_error code ****************************************/
3146 #line 535 "pikchr.y"
3147
3148 if( TOKEN.z && TOKEN.z[0] ){
3149 pik_error(p, &TOKEN, "syntax error");
3150 }else{
3151 pik_error(p, 0, "syntax error");
3152 }
3153 UNUSED_PARAMETER(yymajor);
3154 #line 3179 "pikchr.c"
3155 /************ End %syntax_error code ******************************************/
3156 pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
3157 pik_parserCTX_STORE
3158 }
3159
@@ -3372,11 +3382,11 @@
3382 #else
3383 (void)iToken;
3384 return 0;
3385 #endif
3386 }
3387 #line 780 "pikchr.y"
3388
3389
3390
3391 /* Chart of the 148 official CSS color names with their
3392 ** corresponding RGB values thru Color Module Level 4:
@@ -7744,10 +7754,14 @@
7754 printf("******** Token %s (%d): \"%.*s\" **************\n",
7755 yyTokenName[token.eType], token.eType,
7756 (int)(isspace(token.z[0]) ? 0 : sz), token.z);
7757 #endif
7758 token.n = (unsigned short)(sz & 0xffff);
7759 if( p->nToken++ > PIKCHR_TOKEN_LIMIT ){
7760 pik_error(p, &token, "script is too complex");
7761 break;
7762 }
7763 pik_parser(pParser, token.eType, token);
7764 }
7765 }
7766 }
7767
@@ -8081,6 +8095,6 @@
8095
8096
8097 #endif /* PIKCHR_TCL */
8098
8099
8100 #line 8125 "pikchr.c"
8101

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button