Fossil SCM

Update the built-in pikchr.c file to the latest version with the preliminary fix for the chop bug.

drh 2021-07-17 17:29 trunk
Commit 60c9dc9f5f96d6f296a51e8290db3def220d10d7b6fd9709b9ede1cf388401e8
1 file changed +248 -233
+248 -233
--- src/pikchr.c
+++ src/pikchr.c
@@ -452,10 +452,11 @@
452452
static short int pik_nth_value(Pik*,PToken*);
453453
static PObj *pik_find_nth(Pik*,PObj*,PToken*);
454454
static PObj *pik_find_byname(Pik*,PObj*,PToken*);
455455
static PPoint pik_place_of_elem(Pik*,PObj*,PToken*);
456456
static int pik_bbox_isempty(PBox*);
457
+static int pik_bbox_contains_point(PBox*,PPoint*);
457458
static void pik_bbox_init(PBox*);
458459
static void pik_bbox_addbox(PBox*,PBox*);
459460
static void pik_bbox_add_xy(PBox*,PNum,PNum);
460461
static void pik_bbox_addellipse(PBox*,PNum x,PNum y,PNum rx,PNum ry);
461462
static void pik_add_txt(Pik*,PToken*,int);
@@ -476,11 +477,11 @@
476477
static PObj *pik_position_assert(Pik*,PPoint*,PToken*,PPoint*);
477478
static PNum pik_dist(PPoint*,PPoint*);
478479
static void pik_add_macro(Pik*,PToken *pId,PToken *pCode);
479480
480481
481
-#line 507 "pikchr.c"
482
+#line 508 "pikchr.c"
482483
/**************** End of %include directives **********************************/
483484
/* These constants specify the various numeric values for terminal symbols.
484485
***************** Begin token definitions *************************************/
485486
#ifndef T_ID
486487
#define T_ID 1
@@ -1705,22 +1706,22 @@
17051706
** inside the C code.
17061707
*/
17071708
/********* Begin destructor definitions ***************************************/
17081709
case 99: /* statement_list */
17091710
{
1710
-#line 496 "pikchr.y"
1711
+#line 497 "pikchr.y"
17111712
pik_elist_free(p,(yypminor->yy227));
1712
-#line 1737 "pikchr.c"
1713
+#line 1738 "pikchr.c"
17131714
}
17141715
break;
17151716
case 100: /* statement */
17161717
case 101: /* unnamed_statement */
17171718
case 102: /* basetype */
17181719
{
1719
-#line 498 "pikchr.y"
1720
+#line 499 "pikchr.y"
17201721
pik_elem_free(p,(yypminor->yy36));
1721
-#line 1746 "pikchr.c"
1722
+#line 1747 "pikchr.c"
17221723
}
17231724
break;
17241725
/********* End destructor definitions *****************************************/
17251726
default: break; /* If no destructor action specified: do nothing */
17261727
}
@@ -1934,14 +1935,14 @@
19341935
#endif
19351936
while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
19361937
/* Here code is inserted which will execute if the parser
19371938
** stack every overflows */
19381939
/******** Begin %stack_overflow code ******************************************/
1939
-#line 530 "pikchr.y"
1940
+#line 531 "pikchr.y"
19401941
19411942
pik_error(p, 0, "parser stack overflow");
1942
-#line 1967 "pikchr.c"
1943
+#line 1968 "pikchr.c"
19431944
/******** End %stack_overflow code ********************************************/
19441945
pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
19451946
pik_parserCTX_STORE
19461947
}
19471948
@@ -2417,619 +2418,619 @@
24172418
** break;
24182419
*/
24192420
/********** Begin reduce actions **********************************************/
24202421
YYMINORTYPE yylhsminor;
24212422
case 0: /* document ::= statement_list */
2422
-#line 534 "pikchr.y"
2423
+#line 535 "pikchr.y"
24232424
{pik_render(p,yymsp[0].minor.yy227);}
2424
-#line 2449 "pikchr.c"
2425
+#line 2450 "pikchr.c"
24252426
break;
24262427
case 1: /* statement_list ::= statement */
2427
-#line 537 "pikchr.y"
2428
+#line 538 "pikchr.y"
24282429
{ yylhsminor.yy227 = pik_elist_append(p,0,yymsp[0].minor.yy36); }
2429
-#line 2454 "pikchr.c"
2430
+#line 2455 "pikchr.c"
24302431
yymsp[0].minor.yy227 = yylhsminor.yy227;
24312432
break;
24322433
case 2: /* statement_list ::= statement_list EOL statement */
2433
-#line 539 "pikchr.y"
2434
+#line 540 "pikchr.y"
24342435
{ yylhsminor.yy227 = pik_elist_append(p,yymsp[-2].minor.yy227,yymsp[0].minor.yy36); }
2435
-#line 2460 "pikchr.c"
2436
+#line 2461 "pikchr.c"
24362437
yymsp[-2].minor.yy227 = yylhsminor.yy227;
24372438
break;
24382439
case 3: /* statement ::= */
2439
-#line 542 "pikchr.y"
2440
+#line 543 "pikchr.y"
24402441
{ yymsp[1].minor.yy36 = 0; }
2441
-#line 2466 "pikchr.c"
2442
+#line 2467 "pikchr.c"
24422443
break;
24432444
case 4: /* statement ::= direction */
2444
-#line 543 "pikchr.y"
2445
+#line 544 "pikchr.y"
24452446
{ pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy36=0; }
2446
-#line 2471 "pikchr.c"
2447
+#line 2472 "pikchr.c"
24472448
yymsp[0].minor.yy36 = yylhsminor.yy36;
24482449
break;
24492450
case 5: /* statement ::= lvalue ASSIGN rvalue */
2450
-#line 544 "pikchr.y"
2451
+#line 545 "pikchr.y"
24512452
{pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy153,&yymsp[-1].minor.yy0); yylhsminor.yy36=0;}
2452
-#line 2477 "pikchr.c"
2453
+#line 2478 "pikchr.c"
24532454
yymsp[-2].minor.yy36 = yylhsminor.yy36;
24542455
break;
24552456
case 6: /* statement ::= PLACENAME COLON unnamed_statement */
2456
-#line 546 "pikchr.y"
2457
+#line 547 "pikchr.y"
24572458
{ yylhsminor.yy36 = yymsp[0].minor.yy36; pik_elem_setname(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0); }
2458
-#line 2483 "pikchr.c"
2459
+#line 2484 "pikchr.c"
24592460
yymsp[-2].minor.yy36 = yylhsminor.yy36;
24602461
break;
24612462
case 7: /* statement ::= PLACENAME COLON position */
2462
-#line 548 "pikchr.y"
2463
+#line 549 "pikchr.y"
24632464
{ yylhsminor.yy36 = pik_elem_new(p,0,0,0);
24642465
if(yylhsminor.yy36){ yylhsminor.yy36->ptAt = yymsp[0].minor.yy79; pik_elem_setname(p,yylhsminor.yy36,&yymsp[-2].minor.yy0); }}
2465
-#line 2490 "pikchr.c"
2466
+#line 2491 "pikchr.c"
24662467
yymsp[-2].minor.yy36 = yylhsminor.yy36;
24672468
break;
24682469
case 8: /* statement ::= unnamed_statement */
2469
-#line 550 "pikchr.y"
2470
+#line 551 "pikchr.y"
24702471
{yylhsminor.yy36 = yymsp[0].minor.yy36;}
2471
-#line 2496 "pikchr.c"
2472
+#line 2497 "pikchr.c"
24722473
yymsp[0].minor.yy36 = yylhsminor.yy36;
24732474
break;
24742475
case 9: /* statement ::= print prlist */
2475
-#line 551 "pikchr.y"
2476
+#line 552 "pikchr.y"
24762477
{pik_append(p,"<br>\n",5); yymsp[-1].minor.yy36=0;}
2477
-#line 2502 "pikchr.c"
2478
+#line 2503 "pikchr.c"
24782479
break;
24792480
case 10: /* statement ::= ASSERT LP expr EQ expr RP */
2480
-#line 556 "pikchr.y"
2481
+#line 557 "pikchr.y"
24812482
{yymsp[-5].minor.yy36=pik_assert(p,yymsp[-3].minor.yy153,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy153);}
2482
-#line 2507 "pikchr.c"
2483
+#line 2508 "pikchr.c"
24832484
break;
24842485
case 11: /* statement ::= ASSERT LP position EQ position RP */
2485
-#line 558 "pikchr.y"
2486
+#line 559 "pikchr.y"
24862487
{yymsp[-5].minor.yy36=pik_position_assert(p,&yymsp[-3].minor.yy79,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy79);}
2487
-#line 2512 "pikchr.c"
2488
+#line 2513 "pikchr.c"
24882489
break;
24892490
case 12: /* statement ::= DEFINE ID CODEBLOCK */
2490
-#line 559 "pikchr.y"
2491
+#line 560 "pikchr.y"
24912492
{yymsp[-2].minor.yy36=0; pik_add_macro(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
2492
-#line 2517 "pikchr.c"
2493
+#line 2518 "pikchr.c"
24932494
break;
24942495
case 13: /* rvalue ::= PLACENAME */
2495
-#line 570 "pikchr.y"
2496
+#line 571 "pikchr.y"
24962497
{yylhsminor.yy153 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2497
-#line 2522 "pikchr.c"
2498
+#line 2523 "pikchr.c"
24982499
yymsp[0].minor.yy153 = yylhsminor.yy153;
24992500
break;
25002501
case 14: /* pritem ::= FILL */
25012502
case 15: /* pritem ::= COLOR */ yytestcase(yyruleno==15);
25022503
case 16: /* pritem ::= THICKNESS */ yytestcase(yyruleno==16);
2503
-#line 575 "pikchr.y"
2504
+#line 576 "pikchr.y"
25042505
{pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2505
-#line 2530 "pikchr.c"
2506
+#line 2531 "pikchr.c"
25062507
break;
25072508
case 17: /* pritem ::= rvalue */
2508
-#line 578 "pikchr.y"
2509
+#line 579 "pikchr.y"
25092510
{pik_append_num(p,"",yymsp[0].minor.yy153);}
2510
-#line 2535 "pikchr.c"
2511
+#line 2536 "pikchr.c"
25112512
break;
25122513
case 18: /* pritem ::= STRING */
2513
-#line 579 "pikchr.y"
2514
+#line 580 "pikchr.y"
25142515
{pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2515
-#line 2540 "pikchr.c"
2516
+#line 2541 "pikchr.c"
25162517
break;
25172518
case 19: /* prsep ::= COMMA */
2518
-#line 580 "pikchr.y"
2519
+#line 581 "pikchr.y"
25192520
{pik_append(p, " ", 1);}
2520
-#line 2545 "pikchr.c"
2521
+#line 2546 "pikchr.c"
25212522
break;
25222523
case 20: /* unnamed_statement ::= basetype attribute_list */
2523
-#line 583 "pikchr.y"
2524
+#line 584 "pikchr.y"
25242525
{yylhsminor.yy36 = yymsp[-1].minor.yy36; pik_after_adding_attributes(p,yylhsminor.yy36);}
2525
-#line 2550 "pikchr.c"
2526
+#line 2551 "pikchr.c"
25262527
yymsp[-1].minor.yy36 = yylhsminor.yy36;
25272528
break;
25282529
case 21: /* basetype ::= CLASSNAME */
2529
-#line 585 "pikchr.y"
2530
+#line 586 "pikchr.y"
25302531
{yylhsminor.yy36 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2531
-#line 2556 "pikchr.c"
2532
+#line 2557 "pikchr.c"
25322533
yymsp[0].minor.yy36 = yylhsminor.yy36;
25332534
break;
25342535
case 22: /* basetype ::= STRING textposition */
2535
-#line 587 "pikchr.y"
2536
+#line 588 "pikchr.y"
25362537
{yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy164; yylhsminor.yy36 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2537
-#line 2562 "pikchr.c"
2538
+#line 2563 "pikchr.c"
25382539
yymsp[-1].minor.yy36 = yylhsminor.yy36;
25392540
break;
25402541
case 23: /* basetype ::= LB savelist statement_list RB */
2541
-#line 589 "pikchr.y"
2542
+#line 590 "pikchr.y"
25422543
{ 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; }
2543
-#line 2568 "pikchr.c"
2544
+#line 2569 "pikchr.c"
25442545
break;
25452546
case 24: /* savelist ::= */
2546
-#line 594 "pikchr.y"
2547
+#line 595 "pikchr.y"
25472548
{yymsp[1].minor.yy227 = p->list; p->list = 0;}
2548
-#line 2573 "pikchr.c"
2549
+#line 2574 "pikchr.c"
25492550
break;
25502551
case 25: /* relexpr ::= expr */
2551
-#line 601 "pikchr.y"
2552
+#line 602 "pikchr.y"
25522553
{yylhsminor.yy10.rAbs = yymsp[0].minor.yy153; yylhsminor.yy10.rRel = 0;}
2553
-#line 2578 "pikchr.c"
2554
+#line 2579 "pikchr.c"
25542555
yymsp[0].minor.yy10 = yylhsminor.yy10;
25552556
break;
25562557
case 26: /* relexpr ::= expr PERCENT */
2557
-#line 602 "pikchr.y"
2558
+#line 603 "pikchr.y"
25582559
{yylhsminor.yy10.rAbs = 0; yylhsminor.yy10.rRel = yymsp[-1].minor.yy153/100;}
2559
-#line 2584 "pikchr.c"
2560
+#line 2585 "pikchr.c"
25602561
yymsp[-1].minor.yy10 = yylhsminor.yy10;
25612562
break;
25622563
case 27: /* optrelexpr ::= */
2563
-#line 604 "pikchr.y"
2564
+#line 605 "pikchr.y"
25642565
{yymsp[1].minor.yy10.rAbs = 0; yymsp[1].minor.yy10.rRel = 1.0;}
2565
-#line 2590 "pikchr.c"
2566
+#line 2591 "pikchr.c"
25662567
break;
25672568
case 28: /* attribute_list ::= relexpr alist */
2568
-#line 606 "pikchr.y"
2569
+#line 607 "pikchr.y"
25692570
{pik_add_direction(p,0,&yymsp[-1].minor.yy10);}
2570
-#line 2595 "pikchr.c"
2571
+#line 2596 "pikchr.c"
25712572
break;
25722573
case 29: /* attribute ::= numproperty relexpr */
2573
-#line 610 "pikchr.y"
2574
+#line 611 "pikchr.y"
25742575
{ pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy10); }
2575
-#line 2600 "pikchr.c"
2576
+#line 2601 "pikchr.c"
25762577
break;
25772578
case 30: /* attribute ::= dashproperty expr */
2578
-#line 611 "pikchr.y"
2579
+#line 612 "pikchr.y"
25792580
{ pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy153); }
2580
-#line 2605 "pikchr.c"
2581
+#line 2606 "pikchr.c"
25812582
break;
25822583
case 31: /* attribute ::= dashproperty */
2583
-#line 612 "pikchr.y"
2584
+#line 613 "pikchr.y"
25842585
{ pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2585
-#line 2610 "pikchr.c"
2586
+#line 2611 "pikchr.c"
25862587
break;
25872588
case 32: /* attribute ::= colorproperty rvalue */
2588
-#line 613 "pikchr.y"
2589
+#line 614 "pikchr.y"
25892590
{ pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy153); }
2590
-#line 2615 "pikchr.c"
2591
+#line 2616 "pikchr.c"
25912592
break;
25922593
case 33: /* attribute ::= go direction optrelexpr */
2593
-#line 614 "pikchr.y"
2594
+#line 615 "pikchr.y"
25942595
{ pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy10);}
2595
-#line 2620 "pikchr.c"
2596
+#line 2621 "pikchr.c"
25962597
break;
25972598
case 34: /* attribute ::= go direction even position */
2598
-#line 615 "pikchr.y"
2599
+#line 616 "pikchr.y"
25992600
{pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy79);}
2600
-#line 2625 "pikchr.c"
2601
+#line 2626 "pikchr.c"
26012602
break;
26022603
case 35: /* attribute ::= CLOSE */
2603
-#line 616 "pikchr.y"
2604
+#line 617 "pikchr.y"
26042605
{ pik_close_path(p,&yymsp[0].minor.yy0); }
2605
-#line 2630 "pikchr.c"
2606
+#line 2631 "pikchr.c"
26062607
break;
26072608
case 36: /* attribute ::= CHOP */
2608
-#line 617 "pikchr.y"
2609
+#line 618 "pikchr.y"
26092610
{ p->cur->bChop = 1; }
2610
-#line 2635 "pikchr.c"
2611
+#line 2636 "pikchr.c"
26112612
break;
26122613
case 37: /* attribute ::= FROM position */
2613
-#line 618 "pikchr.y"
2614
+#line 619 "pikchr.y"
26142615
{ pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy79); }
2615
-#line 2640 "pikchr.c"
2616
+#line 2641 "pikchr.c"
26162617
break;
26172618
case 38: /* attribute ::= TO position */
2618
-#line 619 "pikchr.y"
2619
+#line 620 "pikchr.y"
26192620
{ pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy79); }
2620
-#line 2645 "pikchr.c"
2621
+#line 2646 "pikchr.c"
26212622
break;
26222623
case 39: /* attribute ::= THEN */
2623
-#line 620 "pikchr.y"
2624
+#line 621 "pikchr.y"
26242625
{ pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2625
-#line 2650 "pikchr.c"
2626
+#line 2651 "pikchr.c"
26262627
break;
26272628
case 40: /* attribute ::= THEN optrelexpr HEADING expr */
26282629
case 42: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==42);
2629
-#line 622 "pikchr.y"
2630
+#line 623 "pikchr.y"
26302631
{pik_move_hdg(p,&yymsp[-2].minor.yy10,&yymsp[-1].minor.yy0,yymsp[0].minor.yy153,0,&yymsp[-3].minor.yy0);}
2631
-#line 2656 "pikchr.c"
2632
+#line 2657 "pikchr.c"
26322633
break;
26332634
case 41: /* attribute ::= THEN optrelexpr EDGEPT */
26342635
case 43: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==43);
2635
-#line 623 "pikchr.y"
2636
+#line 624 "pikchr.y"
26362637
{pik_move_hdg(p,&yymsp[-1].minor.yy10,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2637
-#line 2662 "pikchr.c"
2638
+#line 2663 "pikchr.c"
26382639
break;
26392640
case 44: /* attribute ::= AT position */
2640
-#line 628 "pikchr.y"
2641
+#line 629 "pikchr.y"
26412642
{ pik_set_at(p,0,&yymsp[0].minor.yy79,&yymsp[-1].minor.yy0); }
2642
-#line 2667 "pikchr.c"
2643
+#line 2668 "pikchr.c"
26432644
break;
26442645
case 45: /* attribute ::= SAME */
2645
-#line 630 "pikchr.y"
2646
+#line 631 "pikchr.y"
26462647
{pik_same(p,0,&yymsp[0].minor.yy0);}
2647
-#line 2672 "pikchr.c"
2648
+#line 2673 "pikchr.c"
26482649
break;
26492650
case 46: /* attribute ::= SAME AS object */
2650
-#line 631 "pikchr.y"
2651
+#line 632 "pikchr.y"
26512652
{pik_same(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2652
-#line 2677 "pikchr.c"
2653
+#line 2678 "pikchr.c"
26532654
break;
26542655
case 47: /* attribute ::= STRING textposition */
2655
-#line 632 "pikchr.y"
2656
+#line 633 "pikchr.y"
26562657
{pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy164);}
2657
-#line 2682 "pikchr.c"
2658
+#line 2683 "pikchr.c"
26582659
break;
26592660
case 48: /* attribute ::= FIT */
2660
-#line 633 "pikchr.y"
2661
+#line 634 "pikchr.y"
26612662
{pik_size_to_fit(p,&yymsp[0].minor.yy0,3); }
2662
-#line 2687 "pikchr.c"
2663
+#line 2688 "pikchr.c"
26632664
break;
26642665
case 49: /* attribute ::= BEHIND object */
2665
-#line 634 "pikchr.y"
2666
+#line 635 "pikchr.y"
26662667
{pik_behind(p,yymsp[0].minor.yy36);}
2667
-#line 2692 "pikchr.c"
2668
+#line 2693 "pikchr.c"
26682669
break;
26692670
case 50: /* withclause ::= DOT_E edge AT position */
26702671
case 51: /* withclause ::= edge AT position */ yytestcase(yyruleno==51);
2671
-#line 642 "pikchr.y"
2672
+#line 643 "pikchr.y"
26722673
{ pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy79,&yymsp[-1].minor.yy0); }
2673
-#line 2698 "pikchr.c"
2674
+#line 2699 "pikchr.c"
26742675
break;
26752676
case 52: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2676
-#line 646 "pikchr.y"
2677
+#line 647 "pikchr.y"
26772678
{yylhsminor.yy0 = yymsp[0].minor.yy0;}
2678
-#line 2703 "pikchr.c"
2679
+#line 2704 "pikchr.c"
26792680
yymsp[0].minor.yy0 = yylhsminor.yy0;
26802681
break;
26812682
case 53: /* boolproperty ::= CW */
2682
-#line 657 "pikchr.y"
2683
+#line 658 "pikchr.y"
26832684
{p->cur->cw = 1;}
2684
-#line 2709 "pikchr.c"
2685
+#line 2710 "pikchr.c"
26852686
break;
26862687
case 54: /* boolproperty ::= CCW */
2687
-#line 658 "pikchr.y"
2688
+#line 659 "pikchr.y"
26882689
{p->cur->cw = 0;}
2689
-#line 2714 "pikchr.c"
2690
+#line 2715 "pikchr.c"
26902691
break;
26912692
case 55: /* boolproperty ::= LARROW */
2692
-#line 659 "pikchr.y"
2693
+#line 660 "pikchr.y"
26932694
{p->cur->larrow=1; p->cur->rarrow=0; }
2694
-#line 2719 "pikchr.c"
2695
+#line 2720 "pikchr.c"
26952696
break;
26962697
case 56: /* boolproperty ::= RARROW */
2697
-#line 660 "pikchr.y"
2698
+#line 661 "pikchr.y"
26982699
{p->cur->larrow=0; p->cur->rarrow=1; }
2699
-#line 2724 "pikchr.c"
2700
+#line 2725 "pikchr.c"
27002701
break;
27012702
case 57: /* boolproperty ::= LRARROW */
2702
-#line 661 "pikchr.y"
2703
+#line 662 "pikchr.y"
27032704
{p->cur->larrow=1; p->cur->rarrow=1; }
2704
-#line 2729 "pikchr.c"
2705
+#line 2730 "pikchr.c"
27052706
break;
27062707
case 58: /* boolproperty ::= INVIS */
2707
-#line 662 "pikchr.y"
2708
+#line 663 "pikchr.y"
27082709
{p->cur->sw = 0.0;}
2709
-#line 2734 "pikchr.c"
2710
+#line 2735 "pikchr.c"
27102711
break;
27112712
case 59: /* boolproperty ::= THICK */
2712
-#line 663 "pikchr.y"
2713
+#line 664 "pikchr.y"
27132714
{p->cur->sw *= 1.5;}
2714
-#line 2739 "pikchr.c"
2715
+#line 2740 "pikchr.c"
27152716
break;
27162717
case 60: /* boolproperty ::= THIN */
2717
-#line 664 "pikchr.y"
2718
+#line 665 "pikchr.y"
27182719
{p->cur->sw *= 0.67;}
2719
-#line 2744 "pikchr.c"
2720
+#line 2745 "pikchr.c"
27202721
break;
27212722
case 61: /* boolproperty ::= SOLID */
2722
-#line 665 "pikchr.y"
2723
+#line 666 "pikchr.y"
27232724
{p->cur->sw = pik_value(p,"thickness",9,0);
27242725
p->cur->dotted = p->cur->dashed = 0.0;}
2725
-#line 2750 "pikchr.c"
2726
+#line 2751 "pikchr.c"
27262727
break;
27272728
case 62: /* textposition ::= */
2728
-#line 668 "pikchr.y"
2729
+#line 669 "pikchr.y"
27292730
{yymsp[1].minor.yy164 = 0;}
2730
-#line 2755 "pikchr.c"
2731
+#line 2756 "pikchr.c"
27312732
break;
27322733
case 63: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2733
-#line 671 "pikchr.y"
2734
+#line 672 "pikchr.y"
27342735
{yylhsminor.yy164 = (short int)pik_text_position(yymsp[-1].minor.yy164,&yymsp[0].minor.yy0);}
2735
-#line 2760 "pikchr.c"
2736
+#line 2761 "pikchr.c"
27362737
yymsp[-1].minor.yy164 = yylhsminor.yy164;
27372738
break;
27382739
case 64: /* position ::= expr COMMA expr */
2739
-#line 674 "pikchr.y"
2740
+#line 675 "pikchr.y"
27402741
{yylhsminor.yy79.x=yymsp[-2].minor.yy153; yylhsminor.yy79.y=yymsp[0].minor.yy153;}
2741
-#line 2766 "pikchr.c"
2742
+#line 2767 "pikchr.c"
27422743
yymsp[-2].minor.yy79 = yylhsminor.yy79;
27432744
break;
27442745
case 65: /* position ::= place PLUS expr COMMA expr */
2745
-#line 676 "pikchr.y"
2746
+#line 677 "pikchr.y"
27462747
{yylhsminor.yy79.x=yymsp[-4].minor.yy79.x+yymsp[-2].minor.yy153; yylhsminor.yy79.y=yymsp[-4].minor.yy79.y+yymsp[0].minor.yy153;}
2747
-#line 2772 "pikchr.c"
2748
+#line 2773 "pikchr.c"
27482749
yymsp[-4].minor.yy79 = yylhsminor.yy79;
27492750
break;
27502751
case 66: /* position ::= place MINUS expr COMMA expr */
2751
-#line 677 "pikchr.y"
2752
+#line 678 "pikchr.y"
27522753
{yylhsminor.yy79.x=yymsp[-4].minor.yy79.x-yymsp[-2].minor.yy153; yylhsminor.yy79.y=yymsp[-4].minor.yy79.y-yymsp[0].minor.yy153;}
2753
-#line 2778 "pikchr.c"
2754
+#line 2779 "pikchr.c"
27542755
yymsp[-4].minor.yy79 = yylhsminor.yy79;
27552756
break;
27562757
case 67: /* position ::= place PLUS LP expr COMMA expr RP */
2757
-#line 679 "pikchr.y"
2758
+#line 680 "pikchr.y"
27582759
{yylhsminor.yy79.x=yymsp[-6].minor.yy79.x+yymsp[-3].minor.yy153; yylhsminor.yy79.y=yymsp[-6].minor.yy79.y+yymsp[-1].minor.yy153;}
2759
-#line 2784 "pikchr.c"
2760
+#line 2785 "pikchr.c"
27602761
yymsp[-6].minor.yy79 = yylhsminor.yy79;
27612762
break;
27622763
case 68: /* position ::= place MINUS LP expr COMMA expr RP */
2763
-#line 681 "pikchr.y"
2764
+#line 682 "pikchr.y"
27642765
{yylhsminor.yy79.x=yymsp[-6].minor.yy79.x-yymsp[-3].minor.yy153; yylhsminor.yy79.y=yymsp[-6].minor.yy79.y-yymsp[-1].minor.yy153;}
2765
-#line 2790 "pikchr.c"
2766
+#line 2791 "pikchr.c"
27662767
yymsp[-6].minor.yy79 = yylhsminor.yy79;
27672768
break;
27682769
case 69: /* position ::= LP position COMMA position RP */
2769
-#line 682 "pikchr.y"
2770
+#line 683 "pikchr.y"
27702771
{yymsp[-4].minor.yy79.x=yymsp[-3].minor.yy79.x; yymsp[-4].minor.yy79.y=yymsp[-1].minor.yy79.y;}
2771
-#line 2796 "pikchr.c"
2772
+#line 2797 "pikchr.c"
27722773
break;
27732774
case 70: /* position ::= LP position RP */
2774
-#line 683 "pikchr.y"
2775
+#line 684 "pikchr.y"
27752776
{yymsp[-2].minor.yy79=yymsp[-1].minor.yy79;}
2776
-#line 2801 "pikchr.c"
2777
+#line 2802 "pikchr.c"
27772778
break;
27782779
case 71: /* position ::= expr between position AND position */
2779
-#line 685 "pikchr.y"
2780
+#line 686 "pikchr.y"
27802781
{yylhsminor.yy79 = pik_position_between(yymsp[-4].minor.yy153,yymsp[-2].minor.yy79,yymsp[0].minor.yy79);}
2781
-#line 2806 "pikchr.c"
2782
+#line 2807 "pikchr.c"
27822783
yymsp[-4].minor.yy79 = yylhsminor.yy79;
27832784
break;
27842785
case 72: /* position ::= expr LT position COMMA position GT */
2785
-#line 687 "pikchr.y"
2786
+#line 688 "pikchr.y"
27862787
{yylhsminor.yy79 = pik_position_between(yymsp[-5].minor.yy153,yymsp[-3].minor.yy79,yymsp[-1].minor.yy79);}
2787
-#line 2812 "pikchr.c"
2788
+#line 2813 "pikchr.c"
27882789
yymsp[-5].minor.yy79 = yylhsminor.yy79;
27892790
break;
27902791
case 73: /* position ::= expr ABOVE position */
2791
-#line 688 "pikchr.y"
2792
+#line 689 "pikchr.y"
27922793
{yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.y += yymsp[-2].minor.yy153;}
2793
-#line 2818 "pikchr.c"
2794
+#line 2819 "pikchr.c"
27942795
yymsp[-2].minor.yy79 = yylhsminor.yy79;
27952796
break;
27962797
case 74: /* position ::= expr BELOW position */
2797
-#line 689 "pikchr.y"
2798
+#line 690 "pikchr.y"
27982799
{yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.y -= yymsp[-2].minor.yy153;}
2799
-#line 2824 "pikchr.c"
2800
+#line 2825 "pikchr.c"
28002801
yymsp[-2].minor.yy79 = yylhsminor.yy79;
28012802
break;
28022803
case 75: /* position ::= expr LEFT OF position */
2803
-#line 690 "pikchr.y"
2804
+#line 691 "pikchr.y"
28042805
{yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.x -= yymsp[-3].minor.yy153;}
2805
-#line 2830 "pikchr.c"
2806
+#line 2831 "pikchr.c"
28062807
yymsp[-3].minor.yy79 = yylhsminor.yy79;
28072808
break;
28082809
case 76: /* position ::= expr RIGHT OF position */
2809
-#line 691 "pikchr.y"
2810
+#line 692 "pikchr.y"
28102811
{yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.x += yymsp[-3].minor.yy153;}
2811
-#line 2836 "pikchr.c"
2812
+#line 2837 "pikchr.c"
28122813
yymsp[-3].minor.yy79 = yylhsminor.yy79;
28132814
break;
28142815
case 77: /* position ::= expr ON HEADING EDGEPT OF position */
2815
-#line 693 "pikchr.y"
2816
+#line 694 "pikchr.y"
28162817
{yylhsminor.yy79 = pik_position_at_hdg(yymsp[-5].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2817
-#line 2842 "pikchr.c"
2818
+#line 2843 "pikchr.c"
28182819
yymsp[-5].minor.yy79 = yylhsminor.yy79;
28192820
break;
28202821
case 78: /* position ::= expr HEADING EDGEPT OF position */
2821
-#line 695 "pikchr.y"
2822
+#line 696 "pikchr.y"
28222823
{yylhsminor.yy79 = pik_position_at_hdg(yymsp[-4].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2823
-#line 2848 "pikchr.c"
2824
+#line 2849 "pikchr.c"
28242825
yymsp[-4].minor.yy79 = yylhsminor.yy79;
28252826
break;
28262827
case 79: /* position ::= expr EDGEPT OF position */
2827
-#line 697 "pikchr.y"
2828
+#line 698 "pikchr.y"
28282829
{yylhsminor.yy79 = pik_position_at_hdg(yymsp[-3].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2829
-#line 2854 "pikchr.c"
2830
+#line 2855 "pikchr.c"
28302831
yymsp[-3].minor.yy79 = yylhsminor.yy79;
28312832
break;
28322833
case 80: /* position ::= expr ON HEADING expr FROM position */
2833
-#line 699 "pikchr.y"
2834
+#line 700 "pikchr.y"
28342835
{yylhsminor.yy79 = pik_position_at_angle(yymsp[-5].minor.yy153,yymsp[-2].minor.yy153,yymsp[0].minor.yy79);}
2835
-#line 2860 "pikchr.c"
2836
+#line 2861 "pikchr.c"
28362837
yymsp[-5].minor.yy79 = yylhsminor.yy79;
28372838
break;
28382839
case 81: /* position ::= expr HEADING expr FROM position */
2839
-#line 701 "pikchr.y"
2840
+#line 702 "pikchr.y"
28402841
{yylhsminor.yy79 = pik_position_at_angle(yymsp[-4].minor.yy153,yymsp[-2].minor.yy153,yymsp[0].minor.yy79);}
2841
-#line 2866 "pikchr.c"
2842
+#line 2867 "pikchr.c"
28422843
yymsp[-4].minor.yy79 = yylhsminor.yy79;
28432844
break;
28442845
case 82: /* place ::= edge OF object */
2845
-#line 713 "pikchr.y"
2846
+#line 714 "pikchr.y"
28462847
{yylhsminor.yy79 = pik_place_of_elem(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2847
-#line 2872 "pikchr.c"
2848
+#line 2873 "pikchr.c"
28482849
yymsp[-2].minor.yy79 = yylhsminor.yy79;
28492850
break;
28502851
case 83: /* place2 ::= object */
2851
-#line 714 "pikchr.y"
2852
+#line 715 "pikchr.y"
28522853
{yylhsminor.yy79 = pik_place_of_elem(p,yymsp[0].minor.yy36,0);}
2853
-#line 2878 "pikchr.c"
2854
+#line 2879 "pikchr.c"
28542855
yymsp[0].minor.yy79 = yylhsminor.yy79;
28552856
break;
28562857
case 84: /* place2 ::= object DOT_E edge */
2857
-#line 715 "pikchr.y"
2858
+#line 716 "pikchr.y"
28582859
{yylhsminor.yy79 = pik_place_of_elem(p,yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
2859
-#line 2884 "pikchr.c"
2860
+#line 2885 "pikchr.c"
28602861
yymsp[-2].minor.yy79 = yylhsminor.yy79;
28612862
break;
28622863
case 85: /* place2 ::= NTH VERTEX OF object */
2863
-#line 716 "pikchr.y"
2864
+#line 717 "pikchr.y"
28642865
{yylhsminor.yy79 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy36);}
2865
-#line 2890 "pikchr.c"
2866
+#line 2891 "pikchr.c"
28662867
yymsp[-3].minor.yy79 = yylhsminor.yy79;
28672868
break;
28682869
case 86: /* object ::= nth */
2869
-#line 728 "pikchr.y"
2870
+#line 729 "pikchr.y"
28702871
{yylhsminor.yy36 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2871
-#line 2896 "pikchr.c"
2872
+#line 2897 "pikchr.c"
28722873
yymsp[0].minor.yy36 = yylhsminor.yy36;
28732874
break;
28742875
case 87: /* object ::= nth OF|IN object */
2875
-#line 729 "pikchr.y"
2876
+#line 730 "pikchr.y"
28762877
{yylhsminor.yy36 = pik_find_nth(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2877
-#line 2902 "pikchr.c"
2878
+#line 2903 "pikchr.c"
28782879
yymsp[-2].minor.yy36 = yylhsminor.yy36;
28792880
break;
28802881
case 88: /* objectname ::= THIS */
2881
-#line 731 "pikchr.y"
2882
+#line 732 "pikchr.y"
28822883
{yymsp[0].minor.yy36 = p->cur;}
2883
-#line 2908 "pikchr.c"
2884
+#line 2909 "pikchr.c"
28842885
break;
28852886
case 89: /* objectname ::= PLACENAME */
2886
-#line 732 "pikchr.y"
2887
+#line 733 "pikchr.y"
28872888
{yylhsminor.yy36 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2888
-#line 2913 "pikchr.c"
2889
+#line 2914 "pikchr.c"
28892890
yymsp[0].minor.yy36 = yylhsminor.yy36;
28902891
break;
28912892
case 90: /* objectname ::= objectname DOT_U PLACENAME */
2892
-#line 734 "pikchr.y"
2893
+#line 735 "pikchr.y"
28932894
{yylhsminor.yy36 = pik_find_byname(p,yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
2894
-#line 2919 "pikchr.c"
2895
+#line 2920 "pikchr.c"
28952896
yymsp[-2].minor.yy36 = yylhsminor.yy36;
28962897
break;
28972898
case 91: /* nth ::= NTH CLASSNAME */
2898
-#line 736 "pikchr.y"
2899
+#line 737 "pikchr.y"
28992900
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2900
-#line 2925 "pikchr.c"
2901
+#line 2926 "pikchr.c"
29012902
yymsp[-1].minor.yy0 = yylhsminor.yy0;
29022903
break;
29032904
case 92: /* nth ::= NTH LAST CLASSNAME */
2904
-#line 737 "pikchr.y"
2905
+#line 738 "pikchr.y"
29052906
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2906
-#line 2931 "pikchr.c"
2907
+#line 2932 "pikchr.c"
29072908
yymsp[-2].minor.yy0 = yylhsminor.yy0;
29082909
break;
29092910
case 93: /* nth ::= LAST CLASSNAME */
2910
-#line 738 "pikchr.y"
2911
+#line 739 "pikchr.y"
29112912
{yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2912
-#line 2937 "pikchr.c"
2913
+#line 2938 "pikchr.c"
29132914
break;
29142915
case 94: /* nth ::= LAST */
2915
-#line 739 "pikchr.y"
2916
+#line 740 "pikchr.y"
29162917
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2917
-#line 2942 "pikchr.c"
2918
+#line 2943 "pikchr.c"
29182919
yymsp[0].minor.yy0 = yylhsminor.yy0;
29192920
break;
29202921
case 95: /* nth ::= NTH LB RB */
2921
-#line 740 "pikchr.y"
2922
+#line 741 "pikchr.y"
29222923
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2923
-#line 2948 "pikchr.c"
2924
+#line 2949 "pikchr.c"
29242925
yymsp[-2].minor.yy0 = yylhsminor.yy0;
29252926
break;
29262927
case 96: /* nth ::= NTH LAST LB RB */
2927
-#line 741 "pikchr.y"
2928
+#line 742 "pikchr.y"
29282929
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2929
-#line 2954 "pikchr.c"
2930
+#line 2955 "pikchr.c"
29302931
yymsp[-3].minor.yy0 = yylhsminor.yy0;
29312932
break;
29322933
case 97: /* nth ::= LAST LB RB */
2933
-#line 742 "pikchr.y"
2934
+#line 743 "pikchr.y"
29342935
{yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2935
-#line 2960 "pikchr.c"
2936
+#line 2961 "pikchr.c"
29362937
break;
29372938
case 98: /* expr ::= expr PLUS expr */
2938
-#line 744 "pikchr.y"
2939
+#line 745 "pikchr.y"
29392940
{yylhsminor.yy153=yymsp[-2].minor.yy153+yymsp[0].minor.yy153;}
2940
-#line 2965 "pikchr.c"
2941
+#line 2966 "pikchr.c"
29412942
yymsp[-2].minor.yy153 = yylhsminor.yy153;
29422943
break;
29432944
case 99: /* expr ::= expr MINUS expr */
2944
-#line 745 "pikchr.y"
2945
+#line 746 "pikchr.y"
29452946
{yylhsminor.yy153=yymsp[-2].minor.yy153-yymsp[0].minor.yy153;}
2946
-#line 2971 "pikchr.c"
2947
+#line 2972 "pikchr.c"
29472948
yymsp[-2].minor.yy153 = yylhsminor.yy153;
29482949
break;
29492950
case 100: /* expr ::= expr STAR expr */
2950
-#line 746 "pikchr.y"
2951
+#line 747 "pikchr.y"
29512952
{yylhsminor.yy153=yymsp[-2].minor.yy153*yymsp[0].minor.yy153;}
2952
-#line 2977 "pikchr.c"
2953
+#line 2978 "pikchr.c"
29532954
yymsp[-2].minor.yy153 = yylhsminor.yy153;
29542955
break;
29552956
case 101: /* expr ::= expr SLASH expr */
2956
-#line 747 "pikchr.y"
2957
+#line 748 "pikchr.y"
29572958
{
29582959
if( yymsp[0].minor.yy153==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy153 = 0.0; }
29592960
else{ yylhsminor.yy153 = yymsp[-2].minor.yy153/yymsp[0].minor.yy153; }
29602961
}
2961
-#line 2986 "pikchr.c"
2962
+#line 2987 "pikchr.c"
29622963
yymsp[-2].minor.yy153 = yylhsminor.yy153;
29632964
break;
29642965
case 102: /* expr ::= MINUS expr */
2965
-#line 751 "pikchr.y"
2966
+#line 752 "pikchr.y"
29662967
{yymsp[-1].minor.yy153=-yymsp[0].minor.yy153;}
2967
-#line 2992 "pikchr.c"
2968
+#line 2993 "pikchr.c"
29682969
break;
29692970
case 103: /* expr ::= PLUS expr */
2970
-#line 752 "pikchr.y"
2971
+#line 753 "pikchr.y"
29712972
{yymsp[-1].minor.yy153=yymsp[0].minor.yy153;}
2972
-#line 2997 "pikchr.c"
2973
+#line 2998 "pikchr.c"
29732974
break;
29742975
case 104: /* expr ::= LP expr RP */
2975
-#line 753 "pikchr.y"
2976
+#line 754 "pikchr.y"
29762977
{yymsp[-2].minor.yy153=yymsp[-1].minor.yy153;}
2977
-#line 3002 "pikchr.c"
2978
+#line 3003 "pikchr.c"
29782979
break;
29792980
case 105: /* expr ::= LP FILL|COLOR|THICKNESS RP */
2980
-#line 754 "pikchr.y"
2981
+#line 755 "pikchr.y"
29812982
{yymsp[-2].minor.yy153=pik_get_var(p,&yymsp[-1].minor.yy0);}
2982
-#line 3007 "pikchr.c"
2983
+#line 3008 "pikchr.c"
29832984
break;
29842985
case 106: /* expr ::= NUMBER */
2985
-#line 755 "pikchr.y"
2986
+#line 756 "pikchr.y"
29862987
{yylhsminor.yy153=pik_atof(&yymsp[0].minor.yy0);}
2987
-#line 3012 "pikchr.c"
2988
+#line 3013 "pikchr.c"
29882989
yymsp[0].minor.yy153 = yylhsminor.yy153;
29892990
break;
29902991
case 107: /* expr ::= ID */
2991
-#line 756 "pikchr.y"
2992
+#line 757 "pikchr.y"
29922993
{yylhsminor.yy153=pik_get_var(p,&yymsp[0].minor.yy0);}
2993
-#line 3018 "pikchr.c"
2994
+#line 3019 "pikchr.c"
29942995
yymsp[0].minor.yy153 = yylhsminor.yy153;
29952996
break;
29962997
case 108: /* expr ::= FUNC1 LP expr RP */
2997
-#line 757 "pikchr.y"
2998
+#line 758 "pikchr.y"
29982999
{yylhsminor.yy153 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy153,0.0);}
2999
-#line 3024 "pikchr.c"
3000
+#line 3025 "pikchr.c"
30003001
yymsp[-3].minor.yy153 = yylhsminor.yy153;
30013002
break;
30023003
case 109: /* expr ::= FUNC2 LP expr COMMA expr RP */
3003
-#line 758 "pikchr.y"
3004
+#line 759 "pikchr.y"
30043005
{yylhsminor.yy153 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy153,yymsp[-1].minor.yy153);}
3005
-#line 3030 "pikchr.c"
3006
+#line 3031 "pikchr.c"
30063007
yymsp[-5].minor.yy153 = yylhsminor.yy153;
30073008
break;
30083009
case 110: /* expr ::= DIST LP position COMMA position RP */
3009
-#line 759 "pikchr.y"
3010
+#line 760 "pikchr.y"
30103011
{yymsp[-5].minor.yy153 = pik_dist(&yymsp[-3].minor.yy79,&yymsp[-1].minor.yy79);}
3011
-#line 3036 "pikchr.c"
3012
+#line 3037 "pikchr.c"
30123013
break;
30133014
case 111: /* expr ::= place2 DOT_XY X */
3014
-#line 760 "pikchr.y"
3015
+#line 761 "pikchr.y"
30153016
{yylhsminor.yy153 = yymsp[-2].minor.yy79.x;}
3016
-#line 3041 "pikchr.c"
3017
+#line 3042 "pikchr.c"
30173018
yymsp[-2].minor.yy153 = yylhsminor.yy153;
30183019
break;
30193020
case 112: /* expr ::= place2 DOT_XY Y */
3020
-#line 761 "pikchr.y"
3021
+#line 762 "pikchr.y"
30213022
{yylhsminor.yy153 = yymsp[-2].minor.yy79.y;}
3022
-#line 3047 "pikchr.c"
3023
+#line 3048 "pikchr.c"
30233024
yymsp[-2].minor.yy153 = yylhsminor.yy153;
30243025
break;
30253026
case 113: /* expr ::= object DOT_L numproperty */
30263027
case 114: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==114);
30273028
case 115: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==115);
3028
-#line 762 "pikchr.y"
3029
+#line 763 "pikchr.y"
30293030
{yylhsminor.yy153=pik_property_of(yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
3030
-#line 3055 "pikchr.c"
3031
+#line 3056 "pikchr.c"
30313032
yymsp[-2].minor.yy153 = yylhsminor.yy153;
30323033
break;
30333034
default:
30343035
/* (116) lvalue ::= ID */ yytestcase(yyruleno==116);
30353036
/* (117) lvalue ::= FILL */ yytestcase(yyruleno==117);
@@ -3128,19 +3129,19 @@
31283129
){
31293130
pik_parserARG_FETCH
31303131
pik_parserCTX_FETCH
31313132
#define TOKEN yyminor
31323133
/************ Begin %syntax_error code ****************************************/
3133
-#line 522 "pikchr.y"
3134
+#line 523 "pikchr.y"
31343135
31353136
if( TOKEN.z && TOKEN.z[0] ){
31363137
pik_error(p, &TOKEN, "syntax error");
31373138
}else{
31383139
pik_error(p, 0, "syntax error");
31393140
}
31403141
UNUSED_PARAMETER(yymajor);
3141
-#line 3166 "pikchr.c"
3142
+#line 3167 "pikchr.c"
31423143
/************ End %syntax_error code ******************************************/
31433144
pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
31443145
pik_parserCTX_STORE
31453146
}
31463147
@@ -3369,11 +3370,11 @@
33693370
#else
33703371
(void)iToken;
33713372
return 0;
33723373
#endif
33733374
}
3374
-#line 767 "pikchr.y"
3375
+#line 768 "pikchr.y"
33753376
33763377
33773378
33783379
/* Chart of the 148 official CSS color names with their
33793380
** corresponding RGB values thru Color Module Level 4:
@@ -5243,10 +5244,21 @@
52435244
/* Return true if a bounding box is empty.
52445245
*/
52455246
static int pik_bbox_isempty(PBox *p){
52465247
return p->sw.x>p->ne.x;
52475248
}
5249
+
5250
+/* Return true if point pPt is contained within the bounding box pBox
5251
+*/
5252
+static int pik_bbox_contains_point(PBox *pBox, PPoint *pPt){
5253
+ if( pik_bbox_isempty(pBox) ) return 0;
5254
+ if( pPt->x < pBox->sw.x ) return 0;
5255
+ if( pPt->x > pBox->ne.x ) return 0;
5256
+ if( pPt->y < pBox->sw.y ) return 0;
5257
+ if( pPt->y > pBox->ne.y ) return 0;
5258
+ return 1;
5259
+}
52485260
52495261
/* Initialize a bounding box to an empty container
52505262
*/
52515263
static void pik_bbox_init(PBox *p){
52525264
p->sw.x = 1.0;
@@ -6635,25 +6647,28 @@
66356647
}
66366648
return;
66376649
}
66386650
66396651
/*
6640
-** Search for object located at *pCenter that has an xChop method.
6652
+** Search for object located at *pCenter that has an xChop method and
6653
+** that does not enclose point pOther.
6654
+**
66416655
** Return a pointer to the object, or NULL if not found.
66426656
*/
6643
-static PObj *pik_find_chopper(PList *pList, PPoint *pCenter){
6657
+static PObj *pik_find_chopper(PList *pList, PPoint *pCenter, PPoint *pOther){
66446658
int i;
66456659
if( pList==0 ) return 0;
66466660
for(i=pList->n-1; i>=0; i--){
66476661
PObj *pObj = pList->a[i];
66486662
if( pObj->type->xChop!=0
66496663
&& pObj->ptAt.x==pCenter->x
66506664
&& pObj->ptAt.y==pCenter->y
6665
+ && !pik_bbox_contains_point(&pObj->bbox, pOther)
66516666
){
66526667
return pObj;
66536668
}else if( pObj->pSublist ){
6654
- pObj = pik_find_chopper(pObj->pSublist,pCenter);
6669
+ pObj = pik_find_chopper(pObj->pSublist,pCenter,pOther);
66556670
if( pObj ) return pObj;
66566671
}
66576672
}
66586673
return 0;
66596674
}
@@ -6664,11 +6679,11 @@
66646679
** If point pTo is the exact enter of a choppable object,
66656680
** then adjust pTo by the appropriate amount in the direction
66666681
** of pFrom.
66676682
*/
66686683
static void pik_autochop(Pik *p, PPoint *pFrom, PPoint *pTo){
6669
- PObj *pObj = pik_find_chopper(p->list, pTo);
6684
+ PObj *pObj = pik_find_chopper(p->list, pTo, pFrom);
66706685
if( pObj ){
66716686
*pTo = pObj->type->xChop(p, pObj, pFrom);
66726687
}
66736688
}
66746689
@@ -8026,6 +8041,6 @@
80268041
80278042
80288043
#endif /* PIKCHR_TCL */
80298044
80308045
8031
-#line 8056 "pikchr.c"
8046
+#line 8071 "pikchr.c"
80328047
--- src/pikchr.c
+++ src/pikchr.c
@@ -452,10 +452,11 @@
452 static short int pik_nth_value(Pik*,PToken*);
453 static PObj *pik_find_nth(Pik*,PObj*,PToken*);
454 static PObj *pik_find_byname(Pik*,PObj*,PToken*);
455 static PPoint pik_place_of_elem(Pik*,PObj*,PToken*);
456 static int pik_bbox_isempty(PBox*);
 
457 static void pik_bbox_init(PBox*);
458 static void pik_bbox_addbox(PBox*,PBox*);
459 static void pik_bbox_add_xy(PBox*,PNum,PNum);
460 static void pik_bbox_addellipse(PBox*,PNum x,PNum y,PNum rx,PNum ry);
461 static void pik_add_txt(Pik*,PToken*,int);
@@ -476,11 +477,11 @@
476 static PObj *pik_position_assert(Pik*,PPoint*,PToken*,PPoint*);
477 static PNum pik_dist(PPoint*,PPoint*);
478 static void pik_add_macro(Pik*,PToken *pId,PToken *pCode);
479
480
481 #line 507 "pikchr.c"
482 /**************** End of %include directives **********************************/
483 /* These constants specify the various numeric values for terminal symbols.
484 ***************** Begin token definitions *************************************/
485 #ifndef T_ID
486 #define T_ID 1
@@ -1705,22 +1706,22 @@
1705 ** inside the C code.
1706 */
1707 /********* Begin destructor definitions ***************************************/
1708 case 99: /* statement_list */
1709 {
1710 #line 496 "pikchr.y"
1711 pik_elist_free(p,(yypminor->yy227));
1712 #line 1737 "pikchr.c"
1713 }
1714 break;
1715 case 100: /* statement */
1716 case 101: /* unnamed_statement */
1717 case 102: /* basetype */
1718 {
1719 #line 498 "pikchr.y"
1720 pik_elem_free(p,(yypminor->yy36));
1721 #line 1746 "pikchr.c"
1722 }
1723 break;
1724 /********* End destructor definitions *****************************************/
1725 default: break; /* If no destructor action specified: do nothing */
1726 }
@@ -1934,14 +1935,14 @@
1934 #endif
1935 while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
1936 /* Here code is inserted which will execute if the parser
1937 ** stack every overflows */
1938 /******** Begin %stack_overflow code ******************************************/
1939 #line 530 "pikchr.y"
1940
1941 pik_error(p, 0, "parser stack overflow");
1942 #line 1967 "pikchr.c"
1943 /******** End %stack_overflow code ********************************************/
1944 pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
1945 pik_parserCTX_STORE
1946 }
1947
@@ -2417,619 +2418,619 @@
2417 ** break;
2418 */
2419 /********** Begin reduce actions **********************************************/
2420 YYMINORTYPE yylhsminor;
2421 case 0: /* document ::= statement_list */
2422 #line 534 "pikchr.y"
2423 {pik_render(p,yymsp[0].minor.yy227);}
2424 #line 2449 "pikchr.c"
2425 break;
2426 case 1: /* statement_list ::= statement */
2427 #line 537 "pikchr.y"
2428 { yylhsminor.yy227 = pik_elist_append(p,0,yymsp[0].minor.yy36); }
2429 #line 2454 "pikchr.c"
2430 yymsp[0].minor.yy227 = yylhsminor.yy227;
2431 break;
2432 case 2: /* statement_list ::= statement_list EOL statement */
2433 #line 539 "pikchr.y"
2434 { yylhsminor.yy227 = pik_elist_append(p,yymsp[-2].minor.yy227,yymsp[0].minor.yy36); }
2435 #line 2460 "pikchr.c"
2436 yymsp[-2].minor.yy227 = yylhsminor.yy227;
2437 break;
2438 case 3: /* statement ::= */
2439 #line 542 "pikchr.y"
2440 { yymsp[1].minor.yy36 = 0; }
2441 #line 2466 "pikchr.c"
2442 break;
2443 case 4: /* statement ::= direction */
2444 #line 543 "pikchr.y"
2445 { pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy36=0; }
2446 #line 2471 "pikchr.c"
2447 yymsp[0].minor.yy36 = yylhsminor.yy36;
2448 break;
2449 case 5: /* statement ::= lvalue ASSIGN rvalue */
2450 #line 544 "pikchr.y"
2451 {pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy153,&yymsp[-1].minor.yy0); yylhsminor.yy36=0;}
2452 #line 2477 "pikchr.c"
2453 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2454 break;
2455 case 6: /* statement ::= PLACENAME COLON unnamed_statement */
2456 #line 546 "pikchr.y"
2457 { yylhsminor.yy36 = yymsp[0].minor.yy36; pik_elem_setname(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0); }
2458 #line 2483 "pikchr.c"
2459 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2460 break;
2461 case 7: /* statement ::= PLACENAME COLON position */
2462 #line 548 "pikchr.y"
2463 { yylhsminor.yy36 = pik_elem_new(p,0,0,0);
2464 if(yylhsminor.yy36){ yylhsminor.yy36->ptAt = yymsp[0].minor.yy79; pik_elem_setname(p,yylhsminor.yy36,&yymsp[-2].minor.yy0); }}
2465 #line 2490 "pikchr.c"
2466 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2467 break;
2468 case 8: /* statement ::= unnamed_statement */
2469 #line 550 "pikchr.y"
2470 {yylhsminor.yy36 = yymsp[0].minor.yy36;}
2471 #line 2496 "pikchr.c"
2472 yymsp[0].minor.yy36 = yylhsminor.yy36;
2473 break;
2474 case 9: /* statement ::= print prlist */
2475 #line 551 "pikchr.y"
2476 {pik_append(p,"<br>\n",5); yymsp[-1].minor.yy36=0;}
2477 #line 2502 "pikchr.c"
2478 break;
2479 case 10: /* statement ::= ASSERT LP expr EQ expr RP */
2480 #line 556 "pikchr.y"
2481 {yymsp[-5].minor.yy36=pik_assert(p,yymsp[-3].minor.yy153,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy153);}
2482 #line 2507 "pikchr.c"
2483 break;
2484 case 11: /* statement ::= ASSERT LP position EQ position RP */
2485 #line 558 "pikchr.y"
2486 {yymsp[-5].minor.yy36=pik_position_assert(p,&yymsp[-3].minor.yy79,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy79);}
2487 #line 2512 "pikchr.c"
2488 break;
2489 case 12: /* statement ::= DEFINE ID CODEBLOCK */
2490 #line 559 "pikchr.y"
2491 {yymsp[-2].minor.yy36=0; pik_add_macro(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
2492 #line 2517 "pikchr.c"
2493 break;
2494 case 13: /* rvalue ::= PLACENAME */
2495 #line 570 "pikchr.y"
2496 {yylhsminor.yy153 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2497 #line 2522 "pikchr.c"
2498 yymsp[0].minor.yy153 = yylhsminor.yy153;
2499 break;
2500 case 14: /* pritem ::= FILL */
2501 case 15: /* pritem ::= COLOR */ yytestcase(yyruleno==15);
2502 case 16: /* pritem ::= THICKNESS */ yytestcase(yyruleno==16);
2503 #line 575 "pikchr.y"
2504 {pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2505 #line 2530 "pikchr.c"
2506 break;
2507 case 17: /* pritem ::= rvalue */
2508 #line 578 "pikchr.y"
2509 {pik_append_num(p,"",yymsp[0].minor.yy153);}
2510 #line 2535 "pikchr.c"
2511 break;
2512 case 18: /* pritem ::= STRING */
2513 #line 579 "pikchr.y"
2514 {pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2515 #line 2540 "pikchr.c"
2516 break;
2517 case 19: /* prsep ::= COMMA */
2518 #line 580 "pikchr.y"
2519 {pik_append(p, " ", 1);}
2520 #line 2545 "pikchr.c"
2521 break;
2522 case 20: /* unnamed_statement ::= basetype attribute_list */
2523 #line 583 "pikchr.y"
2524 {yylhsminor.yy36 = yymsp[-1].minor.yy36; pik_after_adding_attributes(p,yylhsminor.yy36);}
2525 #line 2550 "pikchr.c"
2526 yymsp[-1].minor.yy36 = yylhsminor.yy36;
2527 break;
2528 case 21: /* basetype ::= CLASSNAME */
2529 #line 585 "pikchr.y"
2530 {yylhsminor.yy36 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2531 #line 2556 "pikchr.c"
2532 yymsp[0].minor.yy36 = yylhsminor.yy36;
2533 break;
2534 case 22: /* basetype ::= STRING textposition */
2535 #line 587 "pikchr.y"
2536 {yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy164; yylhsminor.yy36 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2537 #line 2562 "pikchr.c"
2538 yymsp[-1].minor.yy36 = yylhsminor.yy36;
2539 break;
2540 case 23: /* basetype ::= LB savelist statement_list RB */
2541 #line 589 "pikchr.y"
2542 { 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; }
2543 #line 2568 "pikchr.c"
2544 break;
2545 case 24: /* savelist ::= */
2546 #line 594 "pikchr.y"
2547 {yymsp[1].minor.yy227 = p->list; p->list = 0;}
2548 #line 2573 "pikchr.c"
2549 break;
2550 case 25: /* relexpr ::= expr */
2551 #line 601 "pikchr.y"
2552 {yylhsminor.yy10.rAbs = yymsp[0].minor.yy153; yylhsminor.yy10.rRel = 0;}
2553 #line 2578 "pikchr.c"
2554 yymsp[0].minor.yy10 = yylhsminor.yy10;
2555 break;
2556 case 26: /* relexpr ::= expr PERCENT */
2557 #line 602 "pikchr.y"
2558 {yylhsminor.yy10.rAbs = 0; yylhsminor.yy10.rRel = yymsp[-1].minor.yy153/100;}
2559 #line 2584 "pikchr.c"
2560 yymsp[-1].minor.yy10 = yylhsminor.yy10;
2561 break;
2562 case 27: /* optrelexpr ::= */
2563 #line 604 "pikchr.y"
2564 {yymsp[1].minor.yy10.rAbs = 0; yymsp[1].minor.yy10.rRel = 1.0;}
2565 #line 2590 "pikchr.c"
2566 break;
2567 case 28: /* attribute_list ::= relexpr alist */
2568 #line 606 "pikchr.y"
2569 {pik_add_direction(p,0,&yymsp[-1].minor.yy10);}
2570 #line 2595 "pikchr.c"
2571 break;
2572 case 29: /* attribute ::= numproperty relexpr */
2573 #line 610 "pikchr.y"
2574 { pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy10); }
2575 #line 2600 "pikchr.c"
2576 break;
2577 case 30: /* attribute ::= dashproperty expr */
2578 #line 611 "pikchr.y"
2579 { pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy153); }
2580 #line 2605 "pikchr.c"
2581 break;
2582 case 31: /* attribute ::= dashproperty */
2583 #line 612 "pikchr.y"
2584 { pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2585 #line 2610 "pikchr.c"
2586 break;
2587 case 32: /* attribute ::= colorproperty rvalue */
2588 #line 613 "pikchr.y"
2589 { pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy153); }
2590 #line 2615 "pikchr.c"
2591 break;
2592 case 33: /* attribute ::= go direction optrelexpr */
2593 #line 614 "pikchr.y"
2594 { pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy10);}
2595 #line 2620 "pikchr.c"
2596 break;
2597 case 34: /* attribute ::= go direction even position */
2598 #line 615 "pikchr.y"
2599 {pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy79);}
2600 #line 2625 "pikchr.c"
2601 break;
2602 case 35: /* attribute ::= CLOSE */
2603 #line 616 "pikchr.y"
2604 { pik_close_path(p,&yymsp[0].minor.yy0); }
2605 #line 2630 "pikchr.c"
2606 break;
2607 case 36: /* attribute ::= CHOP */
2608 #line 617 "pikchr.y"
2609 { p->cur->bChop = 1; }
2610 #line 2635 "pikchr.c"
2611 break;
2612 case 37: /* attribute ::= FROM position */
2613 #line 618 "pikchr.y"
2614 { pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy79); }
2615 #line 2640 "pikchr.c"
2616 break;
2617 case 38: /* attribute ::= TO position */
2618 #line 619 "pikchr.y"
2619 { pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy79); }
2620 #line 2645 "pikchr.c"
2621 break;
2622 case 39: /* attribute ::= THEN */
2623 #line 620 "pikchr.y"
2624 { pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2625 #line 2650 "pikchr.c"
2626 break;
2627 case 40: /* attribute ::= THEN optrelexpr HEADING expr */
2628 case 42: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==42);
2629 #line 622 "pikchr.y"
2630 {pik_move_hdg(p,&yymsp[-2].minor.yy10,&yymsp[-1].minor.yy0,yymsp[0].minor.yy153,0,&yymsp[-3].minor.yy0);}
2631 #line 2656 "pikchr.c"
2632 break;
2633 case 41: /* attribute ::= THEN optrelexpr EDGEPT */
2634 case 43: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==43);
2635 #line 623 "pikchr.y"
2636 {pik_move_hdg(p,&yymsp[-1].minor.yy10,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2637 #line 2662 "pikchr.c"
2638 break;
2639 case 44: /* attribute ::= AT position */
2640 #line 628 "pikchr.y"
2641 { pik_set_at(p,0,&yymsp[0].minor.yy79,&yymsp[-1].minor.yy0); }
2642 #line 2667 "pikchr.c"
2643 break;
2644 case 45: /* attribute ::= SAME */
2645 #line 630 "pikchr.y"
2646 {pik_same(p,0,&yymsp[0].minor.yy0);}
2647 #line 2672 "pikchr.c"
2648 break;
2649 case 46: /* attribute ::= SAME AS object */
2650 #line 631 "pikchr.y"
2651 {pik_same(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2652 #line 2677 "pikchr.c"
2653 break;
2654 case 47: /* attribute ::= STRING textposition */
2655 #line 632 "pikchr.y"
2656 {pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy164);}
2657 #line 2682 "pikchr.c"
2658 break;
2659 case 48: /* attribute ::= FIT */
2660 #line 633 "pikchr.y"
2661 {pik_size_to_fit(p,&yymsp[0].minor.yy0,3); }
2662 #line 2687 "pikchr.c"
2663 break;
2664 case 49: /* attribute ::= BEHIND object */
2665 #line 634 "pikchr.y"
2666 {pik_behind(p,yymsp[0].minor.yy36);}
2667 #line 2692 "pikchr.c"
2668 break;
2669 case 50: /* withclause ::= DOT_E edge AT position */
2670 case 51: /* withclause ::= edge AT position */ yytestcase(yyruleno==51);
2671 #line 642 "pikchr.y"
2672 { pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy79,&yymsp[-1].minor.yy0); }
2673 #line 2698 "pikchr.c"
2674 break;
2675 case 52: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2676 #line 646 "pikchr.y"
2677 {yylhsminor.yy0 = yymsp[0].minor.yy0;}
2678 #line 2703 "pikchr.c"
2679 yymsp[0].minor.yy0 = yylhsminor.yy0;
2680 break;
2681 case 53: /* boolproperty ::= CW */
2682 #line 657 "pikchr.y"
2683 {p->cur->cw = 1;}
2684 #line 2709 "pikchr.c"
2685 break;
2686 case 54: /* boolproperty ::= CCW */
2687 #line 658 "pikchr.y"
2688 {p->cur->cw = 0;}
2689 #line 2714 "pikchr.c"
2690 break;
2691 case 55: /* boolproperty ::= LARROW */
2692 #line 659 "pikchr.y"
2693 {p->cur->larrow=1; p->cur->rarrow=0; }
2694 #line 2719 "pikchr.c"
2695 break;
2696 case 56: /* boolproperty ::= RARROW */
2697 #line 660 "pikchr.y"
2698 {p->cur->larrow=0; p->cur->rarrow=1; }
2699 #line 2724 "pikchr.c"
2700 break;
2701 case 57: /* boolproperty ::= LRARROW */
2702 #line 661 "pikchr.y"
2703 {p->cur->larrow=1; p->cur->rarrow=1; }
2704 #line 2729 "pikchr.c"
2705 break;
2706 case 58: /* boolproperty ::= INVIS */
2707 #line 662 "pikchr.y"
2708 {p->cur->sw = 0.0;}
2709 #line 2734 "pikchr.c"
2710 break;
2711 case 59: /* boolproperty ::= THICK */
2712 #line 663 "pikchr.y"
2713 {p->cur->sw *= 1.5;}
2714 #line 2739 "pikchr.c"
2715 break;
2716 case 60: /* boolproperty ::= THIN */
2717 #line 664 "pikchr.y"
2718 {p->cur->sw *= 0.67;}
2719 #line 2744 "pikchr.c"
2720 break;
2721 case 61: /* boolproperty ::= SOLID */
2722 #line 665 "pikchr.y"
2723 {p->cur->sw = pik_value(p,"thickness",9,0);
2724 p->cur->dotted = p->cur->dashed = 0.0;}
2725 #line 2750 "pikchr.c"
2726 break;
2727 case 62: /* textposition ::= */
2728 #line 668 "pikchr.y"
2729 {yymsp[1].minor.yy164 = 0;}
2730 #line 2755 "pikchr.c"
2731 break;
2732 case 63: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2733 #line 671 "pikchr.y"
2734 {yylhsminor.yy164 = (short int)pik_text_position(yymsp[-1].minor.yy164,&yymsp[0].minor.yy0);}
2735 #line 2760 "pikchr.c"
2736 yymsp[-1].minor.yy164 = yylhsminor.yy164;
2737 break;
2738 case 64: /* position ::= expr COMMA expr */
2739 #line 674 "pikchr.y"
2740 {yylhsminor.yy79.x=yymsp[-2].minor.yy153; yylhsminor.yy79.y=yymsp[0].minor.yy153;}
2741 #line 2766 "pikchr.c"
2742 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2743 break;
2744 case 65: /* position ::= place PLUS expr COMMA expr */
2745 #line 676 "pikchr.y"
2746 {yylhsminor.yy79.x=yymsp[-4].minor.yy79.x+yymsp[-2].minor.yy153; yylhsminor.yy79.y=yymsp[-4].minor.yy79.y+yymsp[0].minor.yy153;}
2747 #line 2772 "pikchr.c"
2748 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2749 break;
2750 case 66: /* position ::= place MINUS expr COMMA expr */
2751 #line 677 "pikchr.y"
2752 {yylhsminor.yy79.x=yymsp[-4].minor.yy79.x-yymsp[-2].minor.yy153; yylhsminor.yy79.y=yymsp[-4].minor.yy79.y-yymsp[0].minor.yy153;}
2753 #line 2778 "pikchr.c"
2754 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2755 break;
2756 case 67: /* position ::= place PLUS LP expr COMMA expr RP */
2757 #line 679 "pikchr.y"
2758 {yylhsminor.yy79.x=yymsp[-6].minor.yy79.x+yymsp[-3].minor.yy153; yylhsminor.yy79.y=yymsp[-6].minor.yy79.y+yymsp[-1].minor.yy153;}
2759 #line 2784 "pikchr.c"
2760 yymsp[-6].minor.yy79 = yylhsminor.yy79;
2761 break;
2762 case 68: /* position ::= place MINUS LP expr COMMA expr RP */
2763 #line 681 "pikchr.y"
2764 {yylhsminor.yy79.x=yymsp[-6].minor.yy79.x-yymsp[-3].minor.yy153; yylhsminor.yy79.y=yymsp[-6].minor.yy79.y-yymsp[-1].minor.yy153;}
2765 #line 2790 "pikchr.c"
2766 yymsp[-6].minor.yy79 = yylhsminor.yy79;
2767 break;
2768 case 69: /* position ::= LP position COMMA position RP */
2769 #line 682 "pikchr.y"
2770 {yymsp[-4].minor.yy79.x=yymsp[-3].minor.yy79.x; yymsp[-4].minor.yy79.y=yymsp[-1].minor.yy79.y;}
2771 #line 2796 "pikchr.c"
2772 break;
2773 case 70: /* position ::= LP position RP */
2774 #line 683 "pikchr.y"
2775 {yymsp[-2].minor.yy79=yymsp[-1].minor.yy79;}
2776 #line 2801 "pikchr.c"
2777 break;
2778 case 71: /* position ::= expr between position AND position */
2779 #line 685 "pikchr.y"
2780 {yylhsminor.yy79 = pik_position_between(yymsp[-4].minor.yy153,yymsp[-2].minor.yy79,yymsp[0].minor.yy79);}
2781 #line 2806 "pikchr.c"
2782 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2783 break;
2784 case 72: /* position ::= expr LT position COMMA position GT */
2785 #line 687 "pikchr.y"
2786 {yylhsminor.yy79 = pik_position_between(yymsp[-5].minor.yy153,yymsp[-3].minor.yy79,yymsp[-1].minor.yy79);}
2787 #line 2812 "pikchr.c"
2788 yymsp[-5].minor.yy79 = yylhsminor.yy79;
2789 break;
2790 case 73: /* position ::= expr ABOVE position */
2791 #line 688 "pikchr.y"
2792 {yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.y += yymsp[-2].minor.yy153;}
2793 #line 2818 "pikchr.c"
2794 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2795 break;
2796 case 74: /* position ::= expr BELOW position */
2797 #line 689 "pikchr.y"
2798 {yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.y -= yymsp[-2].minor.yy153;}
2799 #line 2824 "pikchr.c"
2800 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2801 break;
2802 case 75: /* position ::= expr LEFT OF position */
2803 #line 690 "pikchr.y"
2804 {yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.x -= yymsp[-3].minor.yy153;}
2805 #line 2830 "pikchr.c"
2806 yymsp[-3].minor.yy79 = yylhsminor.yy79;
2807 break;
2808 case 76: /* position ::= expr RIGHT OF position */
2809 #line 691 "pikchr.y"
2810 {yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.x += yymsp[-3].minor.yy153;}
2811 #line 2836 "pikchr.c"
2812 yymsp[-3].minor.yy79 = yylhsminor.yy79;
2813 break;
2814 case 77: /* position ::= expr ON HEADING EDGEPT OF position */
2815 #line 693 "pikchr.y"
2816 {yylhsminor.yy79 = pik_position_at_hdg(yymsp[-5].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2817 #line 2842 "pikchr.c"
2818 yymsp[-5].minor.yy79 = yylhsminor.yy79;
2819 break;
2820 case 78: /* position ::= expr HEADING EDGEPT OF position */
2821 #line 695 "pikchr.y"
2822 {yylhsminor.yy79 = pik_position_at_hdg(yymsp[-4].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2823 #line 2848 "pikchr.c"
2824 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2825 break;
2826 case 79: /* position ::= expr EDGEPT OF position */
2827 #line 697 "pikchr.y"
2828 {yylhsminor.yy79 = pik_position_at_hdg(yymsp[-3].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2829 #line 2854 "pikchr.c"
2830 yymsp[-3].minor.yy79 = yylhsminor.yy79;
2831 break;
2832 case 80: /* position ::= expr ON HEADING expr FROM position */
2833 #line 699 "pikchr.y"
2834 {yylhsminor.yy79 = pik_position_at_angle(yymsp[-5].minor.yy153,yymsp[-2].minor.yy153,yymsp[0].minor.yy79);}
2835 #line 2860 "pikchr.c"
2836 yymsp[-5].minor.yy79 = yylhsminor.yy79;
2837 break;
2838 case 81: /* position ::= expr HEADING expr FROM position */
2839 #line 701 "pikchr.y"
2840 {yylhsminor.yy79 = pik_position_at_angle(yymsp[-4].minor.yy153,yymsp[-2].minor.yy153,yymsp[0].minor.yy79);}
2841 #line 2866 "pikchr.c"
2842 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2843 break;
2844 case 82: /* place ::= edge OF object */
2845 #line 713 "pikchr.y"
2846 {yylhsminor.yy79 = pik_place_of_elem(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2847 #line 2872 "pikchr.c"
2848 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2849 break;
2850 case 83: /* place2 ::= object */
2851 #line 714 "pikchr.y"
2852 {yylhsminor.yy79 = pik_place_of_elem(p,yymsp[0].minor.yy36,0);}
2853 #line 2878 "pikchr.c"
2854 yymsp[0].minor.yy79 = yylhsminor.yy79;
2855 break;
2856 case 84: /* place2 ::= object DOT_E edge */
2857 #line 715 "pikchr.y"
2858 {yylhsminor.yy79 = pik_place_of_elem(p,yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
2859 #line 2884 "pikchr.c"
2860 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2861 break;
2862 case 85: /* place2 ::= NTH VERTEX OF object */
2863 #line 716 "pikchr.y"
2864 {yylhsminor.yy79 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy36);}
2865 #line 2890 "pikchr.c"
2866 yymsp[-3].minor.yy79 = yylhsminor.yy79;
2867 break;
2868 case 86: /* object ::= nth */
2869 #line 728 "pikchr.y"
2870 {yylhsminor.yy36 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2871 #line 2896 "pikchr.c"
2872 yymsp[0].minor.yy36 = yylhsminor.yy36;
2873 break;
2874 case 87: /* object ::= nth OF|IN object */
2875 #line 729 "pikchr.y"
2876 {yylhsminor.yy36 = pik_find_nth(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2877 #line 2902 "pikchr.c"
2878 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2879 break;
2880 case 88: /* objectname ::= THIS */
2881 #line 731 "pikchr.y"
2882 {yymsp[0].minor.yy36 = p->cur;}
2883 #line 2908 "pikchr.c"
2884 break;
2885 case 89: /* objectname ::= PLACENAME */
2886 #line 732 "pikchr.y"
2887 {yylhsminor.yy36 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2888 #line 2913 "pikchr.c"
2889 yymsp[0].minor.yy36 = yylhsminor.yy36;
2890 break;
2891 case 90: /* objectname ::= objectname DOT_U PLACENAME */
2892 #line 734 "pikchr.y"
2893 {yylhsminor.yy36 = pik_find_byname(p,yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
2894 #line 2919 "pikchr.c"
2895 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2896 break;
2897 case 91: /* nth ::= NTH CLASSNAME */
2898 #line 736 "pikchr.y"
2899 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2900 #line 2925 "pikchr.c"
2901 yymsp[-1].minor.yy0 = yylhsminor.yy0;
2902 break;
2903 case 92: /* nth ::= NTH LAST CLASSNAME */
2904 #line 737 "pikchr.y"
2905 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2906 #line 2931 "pikchr.c"
2907 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2908 break;
2909 case 93: /* nth ::= LAST CLASSNAME */
2910 #line 738 "pikchr.y"
2911 {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2912 #line 2937 "pikchr.c"
2913 break;
2914 case 94: /* nth ::= LAST */
2915 #line 739 "pikchr.y"
2916 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2917 #line 2942 "pikchr.c"
2918 yymsp[0].minor.yy0 = yylhsminor.yy0;
2919 break;
2920 case 95: /* nth ::= NTH LB RB */
2921 #line 740 "pikchr.y"
2922 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2923 #line 2948 "pikchr.c"
2924 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2925 break;
2926 case 96: /* nth ::= NTH LAST LB RB */
2927 #line 741 "pikchr.y"
2928 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2929 #line 2954 "pikchr.c"
2930 yymsp[-3].minor.yy0 = yylhsminor.yy0;
2931 break;
2932 case 97: /* nth ::= LAST LB RB */
2933 #line 742 "pikchr.y"
2934 {yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2935 #line 2960 "pikchr.c"
2936 break;
2937 case 98: /* expr ::= expr PLUS expr */
2938 #line 744 "pikchr.y"
2939 {yylhsminor.yy153=yymsp[-2].minor.yy153+yymsp[0].minor.yy153;}
2940 #line 2965 "pikchr.c"
2941 yymsp[-2].minor.yy153 = yylhsminor.yy153;
2942 break;
2943 case 99: /* expr ::= expr MINUS expr */
2944 #line 745 "pikchr.y"
2945 {yylhsminor.yy153=yymsp[-2].minor.yy153-yymsp[0].minor.yy153;}
2946 #line 2971 "pikchr.c"
2947 yymsp[-2].minor.yy153 = yylhsminor.yy153;
2948 break;
2949 case 100: /* expr ::= expr STAR expr */
2950 #line 746 "pikchr.y"
2951 {yylhsminor.yy153=yymsp[-2].minor.yy153*yymsp[0].minor.yy153;}
2952 #line 2977 "pikchr.c"
2953 yymsp[-2].minor.yy153 = yylhsminor.yy153;
2954 break;
2955 case 101: /* expr ::= expr SLASH expr */
2956 #line 747 "pikchr.y"
2957 {
2958 if( yymsp[0].minor.yy153==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy153 = 0.0; }
2959 else{ yylhsminor.yy153 = yymsp[-2].minor.yy153/yymsp[0].minor.yy153; }
2960 }
2961 #line 2986 "pikchr.c"
2962 yymsp[-2].minor.yy153 = yylhsminor.yy153;
2963 break;
2964 case 102: /* expr ::= MINUS expr */
2965 #line 751 "pikchr.y"
2966 {yymsp[-1].minor.yy153=-yymsp[0].minor.yy153;}
2967 #line 2992 "pikchr.c"
2968 break;
2969 case 103: /* expr ::= PLUS expr */
2970 #line 752 "pikchr.y"
2971 {yymsp[-1].minor.yy153=yymsp[0].minor.yy153;}
2972 #line 2997 "pikchr.c"
2973 break;
2974 case 104: /* expr ::= LP expr RP */
2975 #line 753 "pikchr.y"
2976 {yymsp[-2].minor.yy153=yymsp[-1].minor.yy153;}
2977 #line 3002 "pikchr.c"
2978 break;
2979 case 105: /* expr ::= LP FILL|COLOR|THICKNESS RP */
2980 #line 754 "pikchr.y"
2981 {yymsp[-2].minor.yy153=pik_get_var(p,&yymsp[-1].minor.yy0);}
2982 #line 3007 "pikchr.c"
2983 break;
2984 case 106: /* expr ::= NUMBER */
2985 #line 755 "pikchr.y"
2986 {yylhsminor.yy153=pik_atof(&yymsp[0].minor.yy0);}
2987 #line 3012 "pikchr.c"
2988 yymsp[0].minor.yy153 = yylhsminor.yy153;
2989 break;
2990 case 107: /* expr ::= ID */
2991 #line 756 "pikchr.y"
2992 {yylhsminor.yy153=pik_get_var(p,&yymsp[0].minor.yy0);}
2993 #line 3018 "pikchr.c"
2994 yymsp[0].minor.yy153 = yylhsminor.yy153;
2995 break;
2996 case 108: /* expr ::= FUNC1 LP expr RP */
2997 #line 757 "pikchr.y"
2998 {yylhsminor.yy153 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy153,0.0);}
2999 #line 3024 "pikchr.c"
3000 yymsp[-3].minor.yy153 = yylhsminor.yy153;
3001 break;
3002 case 109: /* expr ::= FUNC2 LP expr COMMA expr RP */
3003 #line 758 "pikchr.y"
3004 {yylhsminor.yy153 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy153,yymsp[-1].minor.yy153);}
3005 #line 3030 "pikchr.c"
3006 yymsp[-5].minor.yy153 = yylhsminor.yy153;
3007 break;
3008 case 110: /* expr ::= DIST LP position COMMA position RP */
3009 #line 759 "pikchr.y"
3010 {yymsp[-5].minor.yy153 = pik_dist(&yymsp[-3].minor.yy79,&yymsp[-1].minor.yy79);}
3011 #line 3036 "pikchr.c"
3012 break;
3013 case 111: /* expr ::= place2 DOT_XY X */
3014 #line 760 "pikchr.y"
3015 {yylhsminor.yy153 = yymsp[-2].minor.yy79.x;}
3016 #line 3041 "pikchr.c"
3017 yymsp[-2].minor.yy153 = yylhsminor.yy153;
3018 break;
3019 case 112: /* expr ::= place2 DOT_XY Y */
3020 #line 761 "pikchr.y"
3021 {yylhsminor.yy153 = yymsp[-2].minor.yy79.y;}
3022 #line 3047 "pikchr.c"
3023 yymsp[-2].minor.yy153 = yylhsminor.yy153;
3024 break;
3025 case 113: /* expr ::= object DOT_L numproperty */
3026 case 114: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==114);
3027 case 115: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==115);
3028 #line 762 "pikchr.y"
3029 {yylhsminor.yy153=pik_property_of(yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
3030 #line 3055 "pikchr.c"
3031 yymsp[-2].minor.yy153 = yylhsminor.yy153;
3032 break;
3033 default:
3034 /* (116) lvalue ::= ID */ yytestcase(yyruleno==116);
3035 /* (117) lvalue ::= FILL */ yytestcase(yyruleno==117);
@@ -3128,19 +3129,19 @@
3128 ){
3129 pik_parserARG_FETCH
3130 pik_parserCTX_FETCH
3131 #define TOKEN yyminor
3132 /************ Begin %syntax_error code ****************************************/
3133 #line 522 "pikchr.y"
3134
3135 if( TOKEN.z && TOKEN.z[0] ){
3136 pik_error(p, &TOKEN, "syntax error");
3137 }else{
3138 pik_error(p, 0, "syntax error");
3139 }
3140 UNUSED_PARAMETER(yymajor);
3141 #line 3166 "pikchr.c"
3142 /************ End %syntax_error code ******************************************/
3143 pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
3144 pik_parserCTX_STORE
3145 }
3146
@@ -3369,11 +3370,11 @@
3369 #else
3370 (void)iToken;
3371 return 0;
3372 #endif
3373 }
3374 #line 767 "pikchr.y"
3375
3376
3377
3378 /* Chart of the 148 official CSS color names with their
3379 ** corresponding RGB values thru Color Module Level 4:
@@ -5243,10 +5244,21 @@
5243 /* Return true if a bounding box is empty.
5244 */
5245 static int pik_bbox_isempty(PBox *p){
5246 return p->sw.x>p->ne.x;
5247 }
 
 
 
 
 
 
 
 
 
 
 
5248
5249 /* Initialize a bounding box to an empty container
5250 */
5251 static void pik_bbox_init(PBox *p){
5252 p->sw.x = 1.0;
@@ -6635,25 +6647,28 @@
6635 }
6636 return;
6637 }
6638
6639 /*
6640 ** Search for object located at *pCenter that has an xChop method.
 
 
6641 ** Return a pointer to the object, or NULL if not found.
6642 */
6643 static PObj *pik_find_chopper(PList *pList, PPoint *pCenter){
6644 int i;
6645 if( pList==0 ) return 0;
6646 for(i=pList->n-1; i>=0; i--){
6647 PObj *pObj = pList->a[i];
6648 if( pObj->type->xChop!=0
6649 && pObj->ptAt.x==pCenter->x
6650 && pObj->ptAt.y==pCenter->y
 
6651 ){
6652 return pObj;
6653 }else if( pObj->pSublist ){
6654 pObj = pik_find_chopper(pObj->pSublist,pCenter);
6655 if( pObj ) return pObj;
6656 }
6657 }
6658 return 0;
6659 }
@@ -6664,11 +6679,11 @@
6664 ** If point pTo is the exact enter of a choppable object,
6665 ** then adjust pTo by the appropriate amount in the direction
6666 ** of pFrom.
6667 */
6668 static void pik_autochop(Pik *p, PPoint *pFrom, PPoint *pTo){
6669 PObj *pObj = pik_find_chopper(p->list, pTo);
6670 if( pObj ){
6671 *pTo = pObj->type->xChop(p, pObj, pFrom);
6672 }
6673 }
6674
@@ -8026,6 +8041,6 @@
8026
8027
8028 #endif /* PIKCHR_TCL */
8029
8030
8031 #line 8056 "pikchr.c"
8032
--- src/pikchr.c
+++ src/pikchr.c
@@ -452,10 +452,11 @@
452 static short int pik_nth_value(Pik*,PToken*);
453 static PObj *pik_find_nth(Pik*,PObj*,PToken*);
454 static PObj *pik_find_byname(Pik*,PObj*,PToken*);
455 static PPoint pik_place_of_elem(Pik*,PObj*,PToken*);
456 static int pik_bbox_isempty(PBox*);
457 static int pik_bbox_contains_point(PBox*,PPoint*);
458 static void pik_bbox_init(PBox*);
459 static void pik_bbox_addbox(PBox*,PBox*);
460 static void pik_bbox_add_xy(PBox*,PNum,PNum);
461 static void pik_bbox_addellipse(PBox*,PNum x,PNum y,PNum rx,PNum ry);
462 static void pik_add_txt(Pik*,PToken*,int);
@@ -476,11 +477,11 @@
477 static PObj *pik_position_assert(Pik*,PPoint*,PToken*,PPoint*);
478 static PNum pik_dist(PPoint*,PPoint*);
479 static void pik_add_macro(Pik*,PToken *pId,PToken *pCode);
480
481
482 #line 508 "pikchr.c"
483 /**************** End of %include directives **********************************/
484 /* These constants specify the various numeric values for terminal symbols.
485 ***************** Begin token definitions *************************************/
486 #ifndef T_ID
487 #define T_ID 1
@@ -1705,22 +1706,22 @@
1706 ** inside the C code.
1707 */
1708 /********* Begin destructor definitions ***************************************/
1709 case 99: /* statement_list */
1710 {
1711 #line 497 "pikchr.y"
1712 pik_elist_free(p,(yypminor->yy227));
1713 #line 1738 "pikchr.c"
1714 }
1715 break;
1716 case 100: /* statement */
1717 case 101: /* unnamed_statement */
1718 case 102: /* basetype */
1719 {
1720 #line 499 "pikchr.y"
1721 pik_elem_free(p,(yypminor->yy36));
1722 #line 1747 "pikchr.c"
1723 }
1724 break;
1725 /********* End destructor definitions *****************************************/
1726 default: break; /* If no destructor action specified: do nothing */
1727 }
@@ -1934,14 +1935,14 @@
1935 #endif
1936 while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
1937 /* Here code is inserted which will execute if the parser
1938 ** stack every overflows */
1939 /******** Begin %stack_overflow code ******************************************/
1940 #line 531 "pikchr.y"
1941
1942 pik_error(p, 0, "parser stack overflow");
1943 #line 1968 "pikchr.c"
1944 /******** End %stack_overflow code ********************************************/
1945 pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
1946 pik_parserCTX_STORE
1947 }
1948
@@ -2417,619 +2418,619 @@
2418 ** break;
2419 */
2420 /********** Begin reduce actions **********************************************/
2421 YYMINORTYPE yylhsminor;
2422 case 0: /* document ::= statement_list */
2423 #line 535 "pikchr.y"
2424 {pik_render(p,yymsp[0].minor.yy227);}
2425 #line 2450 "pikchr.c"
2426 break;
2427 case 1: /* statement_list ::= statement */
2428 #line 538 "pikchr.y"
2429 { yylhsminor.yy227 = pik_elist_append(p,0,yymsp[0].minor.yy36); }
2430 #line 2455 "pikchr.c"
2431 yymsp[0].minor.yy227 = yylhsminor.yy227;
2432 break;
2433 case 2: /* statement_list ::= statement_list EOL statement */
2434 #line 540 "pikchr.y"
2435 { yylhsminor.yy227 = pik_elist_append(p,yymsp[-2].minor.yy227,yymsp[0].minor.yy36); }
2436 #line 2461 "pikchr.c"
2437 yymsp[-2].minor.yy227 = yylhsminor.yy227;
2438 break;
2439 case 3: /* statement ::= */
2440 #line 543 "pikchr.y"
2441 { yymsp[1].minor.yy36 = 0; }
2442 #line 2467 "pikchr.c"
2443 break;
2444 case 4: /* statement ::= direction */
2445 #line 544 "pikchr.y"
2446 { pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy36=0; }
2447 #line 2472 "pikchr.c"
2448 yymsp[0].minor.yy36 = yylhsminor.yy36;
2449 break;
2450 case 5: /* statement ::= lvalue ASSIGN rvalue */
2451 #line 545 "pikchr.y"
2452 {pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy153,&yymsp[-1].minor.yy0); yylhsminor.yy36=0;}
2453 #line 2478 "pikchr.c"
2454 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2455 break;
2456 case 6: /* statement ::= PLACENAME COLON unnamed_statement */
2457 #line 547 "pikchr.y"
2458 { yylhsminor.yy36 = yymsp[0].minor.yy36; pik_elem_setname(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0); }
2459 #line 2484 "pikchr.c"
2460 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2461 break;
2462 case 7: /* statement ::= PLACENAME COLON position */
2463 #line 549 "pikchr.y"
2464 { yylhsminor.yy36 = pik_elem_new(p,0,0,0);
2465 if(yylhsminor.yy36){ yylhsminor.yy36->ptAt = yymsp[0].minor.yy79; pik_elem_setname(p,yylhsminor.yy36,&yymsp[-2].minor.yy0); }}
2466 #line 2491 "pikchr.c"
2467 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2468 break;
2469 case 8: /* statement ::= unnamed_statement */
2470 #line 551 "pikchr.y"
2471 {yylhsminor.yy36 = yymsp[0].minor.yy36;}
2472 #line 2497 "pikchr.c"
2473 yymsp[0].minor.yy36 = yylhsminor.yy36;
2474 break;
2475 case 9: /* statement ::= print prlist */
2476 #line 552 "pikchr.y"
2477 {pik_append(p,"<br>\n",5); yymsp[-1].minor.yy36=0;}
2478 #line 2503 "pikchr.c"
2479 break;
2480 case 10: /* statement ::= ASSERT LP expr EQ expr RP */
2481 #line 557 "pikchr.y"
2482 {yymsp[-5].minor.yy36=pik_assert(p,yymsp[-3].minor.yy153,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy153);}
2483 #line 2508 "pikchr.c"
2484 break;
2485 case 11: /* statement ::= ASSERT LP position EQ position RP */
2486 #line 559 "pikchr.y"
2487 {yymsp[-5].minor.yy36=pik_position_assert(p,&yymsp[-3].minor.yy79,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy79);}
2488 #line 2513 "pikchr.c"
2489 break;
2490 case 12: /* statement ::= DEFINE ID CODEBLOCK */
2491 #line 560 "pikchr.y"
2492 {yymsp[-2].minor.yy36=0; pik_add_macro(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
2493 #line 2518 "pikchr.c"
2494 break;
2495 case 13: /* rvalue ::= PLACENAME */
2496 #line 571 "pikchr.y"
2497 {yylhsminor.yy153 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2498 #line 2523 "pikchr.c"
2499 yymsp[0].minor.yy153 = yylhsminor.yy153;
2500 break;
2501 case 14: /* pritem ::= FILL */
2502 case 15: /* pritem ::= COLOR */ yytestcase(yyruleno==15);
2503 case 16: /* pritem ::= THICKNESS */ yytestcase(yyruleno==16);
2504 #line 576 "pikchr.y"
2505 {pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2506 #line 2531 "pikchr.c"
2507 break;
2508 case 17: /* pritem ::= rvalue */
2509 #line 579 "pikchr.y"
2510 {pik_append_num(p,"",yymsp[0].minor.yy153);}
2511 #line 2536 "pikchr.c"
2512 break;
2513 case 18: /* pritem ::= STRING */
2514 #line 580 "pikchr.y"
2515 {pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2516 #line 2541 "pikchr.c"
2517 break;
2518 case 19: /* prsep ::= COMMA */
2519 #line 581 "pikchr.y"
2520 {pik_append(p, " ", 1);}
2521 #line 2546 "pikchr.c"
2522 break;
2523 case 20: /* unnamed_statement ::= basetype attribute_list */
2524 #line 584 "pikchr.y"
2525 {yylhsminor.yy36 = yymsp[-1].minor.yy36; pik_after_adding_attributes(p,yylhsminor.yy36);}
2526 #line 2551 "pikchr.c"
2527 yymsp[-1].minor.yy36 = yylhsminor.yy36;
2528 break;
2529 case 21: /* basetype ::= CLASSNAME */
2530 #line 586 "pikchr.y"
2531 {yylhsminor.yy36 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2532 #line 2557 "pikchr.c"
2533 yymsp[0].minor.yy36 = yylhsminor.yy36;
2534 break;
2535 case 22: /* basetype ::= STRING textposition */
2536 #line 588 "pikchr.y"
2537 {yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy164; yylhsminor.yy36 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2538 #line 2563 "pikchr.c"
2539 yymsp[-1].minor.yy36 = yylhsminor.yy36;
2540 break;
2541 case 23: /* basetype ::= LB savelist statement_list RB */
2542 #line 590 "pikchr.y"
2543 { 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; }
2544 #line 2569 "pikchr.c"
2545 break;
2546 case 24: /* savelist ::= */
2547 #line 595 "pikchr.y"
2548 {yymsp[1].minor.yy227 = p->list; p->list = 0;}
2549 #line 2574 "pikchr.c"
2550 break;
2551 case 25: /* relexpr ::= expr */
2552 #line 602 "pikchr.y"
2553 {yylhsminor.yy10.rAbs = yymsp[0].minor.yy153; yylhsminor.yy10.rRel = 0;}
2554 #line 2579 "pikchr.c"
2555 yymsp[0].minor.yy10 = yylhsminor.yy10;
2556 break;
2557 case 26: /* relexpr ::= expr PERCENT */
2558 #line 603 "pikchr.y"
2559 {yylhsminor.yy10.rAbs = 0; yylhsminor.yy10.rRel = yymsp[-1].minor.yy153/100;}
2560 #line 2585 "pikchr.c"
2561 yymsp[-1].minor.yy10 = yylhsminor.yy10;
2562 break;
2563 case 27: /* optrelexpr ::= */
2564 #line 605 "pikchr.y"
2565 {yymsp[1].minor.yy10.rAbs = 0; yymsp[1].minor.yy10.rRel = 1.0;}
2566 #line 2591 "pikchr.c"
2567 break;
2568 case 28: /* attribute_list ::= relexpr alist */
2569 #line 607 "pikchr.y"
2570 {pik_add_direction(p,0,&yymsp[-1].minor.yy10);}
2571 #line 2596 "pikchr.c"
2572 break;
2573 case 29: /* attribute ::= numproperty relexpr */
2574 #line 611 "pikchr.y"
2575 { pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy10); }
2576 #line 2601 "pikchr.c"
2577 break;
2578 case 30: /* attribute ::= dashproperty expr */
2579 #line 612 "pikchr.y"
2580 { pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy153); }
2581 #line 2606 "pikchr.c"
2582 break;
2583 case 31: /* attribute ::= dashproperty */
2584 #line 613 "pikchr.y"
2585 { pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2586 #line 2611 "pikchr.c"
2587 break;
2588 case 32: /* attribute ::= colorproperty rvalue */
2589 #line 614 "pikchr.y"
2590 { pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy153); }
2591 #line 2616 "pikchr.c"
2592 break;
2593 case 33: /* attribute ::= go direction optrelexpr */
2594 #line 615 "pikchr.y"
2595 { pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy10);}
2596 #line 2621 "pikchr.c"
2597 break;
2598 case 34: /* attribute ::= go direction even position */
2599 #line 616 "pikchr.y"
2600 {pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy79);}
2601 #line 2626 "pikchr.c"
2602 break;
2603 case 35: /* attribute ::= CLOSE */
2604 #line 617 "pikchr.y"
2605 { pik_close_path(p,&yymsp[0].minor.yy0); }
2606 #line 2631 "pikchr.c"
2607 break;
2608 case 36: /* attribute ::= CHOP */
2609 #line 618 "pikchr.y"
2610 { p->cur->bChop = 1; }
2611 #line 2636 "pikchr.c"
2612 break;
2613 case 37: /* attribute ::= FROM position */
2614 #line 619 "pikchr.y"
2615 { pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy79); }
2616 #line 2641 "pikchr.c"
2617 break;
2618 case 38: /* attribute ::= TO position */
2619 #line 620 "pikchr.y"
2620 { pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy79); }
2621 #line 2646 "pikchr.c"
2622 break;
2623 case 39: /* attribute ::= THEN */
2624 #line 621 "pikchr.y"
2625 { pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2626 #line 2651 "pikchr.c"
2627 break;
2628 case 40: /* attribute ::= THEN optrelexpr HEADING expr */
2629 case 42: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==42);
2630 #line 623 "pikchr.y"
2631 {pik_move_hdg(p,&yymsp[-2].minor.yy10,&yymsp[-1].minor.yy0,yymsp[0].minor.yy153,0,&yymsp[-3].minor.yy0);}
2632 #line 2657 "pikchr.c"
2633 break;
2634 case 41: /* attribute ::= THEN optrelexpr EDGEPT */
2635 case 43: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==43);
2636 #line 624 "pikchr.y"
2637 {pik_move_hdg(p,&yymsp[-1].minor.yy10,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2638 #line 2663 "pikchr.c"
2639 break;
2640 case 44: /* attribute ::= AT position */
2641 #line 629 "pikchr.y"
2642 { pik_set_at(p,0,&yymsp[0].minor.yy79,&yymsp[-1].minor.yy0); }
2643 #line 2668 "pikchr.c"
2644 break;
2645 case 45: /* attribute ::= SAME */
2646 #line 631 "pikchr.y"
2647 {pik_same(p,0,&yymsp[0].minor.yy0);}
2648 #line 2673 "pikchr.c"
2649 break;
2650 case 46: /* attribute ::= SAME AS object */
2651 #line 632 "pikchr.y"
2652 {pik_same(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2653 #line 2678 "pikchr.c"
2654 break;
2655 case 47: /* attribute ::= STRING textposition */
2656 #line 633 "pikchr.y"
2657 {pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy164);}
2658 #line 2683 "pikchr.c"
2659 break;
2660 case 48: /* attribute ::= FIT */
2661 #line 634 "pikchr.y"
2662 {pik_size_to_fit(p,&yymsp[0].minor.yy0,3); }
2663 #line 2688 "pikchr.c"
2664 break;
2665 case 49: /* attribute ::= BEHIND object */
2666 #line 635 "pikchr.y"
2667 {pik_behind(p,yymsp[0].minor.yy36);}
2668 #line 2693 "pikchr.c"
2669 break;
2670 case 50: /* withclause ::= DOT_E edge AT position */
2671 case 51: /* withclause ::= edge AT position */ yytestcase(yyruleno==51);
2672 #line 643 "pikchr.y"
2673 { pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy79,&yymsp[-1].minor.yy0); }
2674 #line 2699 "pikchr.c"
2675 break;
2676 case 52: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2677 #line 647 "pikchr.y"
2678 {yylhsminor.yy0 = yymsp[0].minor.yy0;}
2679 #line 2704 "pikchr.c"
2680 yymsp[0].minor.yy0 = yylhsminor.yy0;
2681 break;
2682 case 53: /* boolproperty ::= CW */
2683 #line 658 "pikchr.y"
2684 {p->cur->cw = 1;}
2685 #line 2710 "pikchr.c"
2686 break;
2687 case 54: /* boolproperty ::= CCW */
2688 #line 659 "pikchr.y"
2689 {p->cur->cw = 0;}
2690 #line 2715 "pikchr.c"
2691 break;
2692 case 55: /* boolproperty ::= LARROW */
2693 #line 660 "pikchr.y"
2694 {p->cur->larrow=1; p->cur->rarrow=0; }
2695 #line 2720 "pikchr.c"
2696 break;
2697 case 56: /* boolproperty ::= RARROW */
2698 #line 661 "pikchr.y"
2699 {p->cur->larrow=0; p->cur->rarrow=1; }
2700 #line 2725 "pikchr.c"
2701 break;
2702 case 57: /* boolproperty ::= LRARROW */
2703 #line 662 "pikchr.y"
2704 {p->cur->larrow=1; p->cur->rarrow=1; }
2705 #line 2730 "pikchr.c"
2706 break;
2707 case 58: /* boolproperty ::= INVIS */
2708 #line 663 "pikchr.y"
2709 {p->cur->sw = 0.0;}
2710 #line 2735 "pikchr.c"
2711 break;
2712 case 59: /* boolproperty ::= THICK */
2713 #line 664 "pikchr.y"
2714 {p->cur->sw *= 1.5;}
2715 #line 2740 "pikchr.c"
2716 break;
2717 case 60: /* boolproperty ::= THIN */
2718 #line 665 "pikchr.y"
2719 {p->cur->sw *= 0.67;}
2720 #line 2745 "pikchr.c"
2721 break;
2722 case 61: /* boolproperty ::= SOLID */
2723 #line 666 "pikchr.y"
2724 {p->cur->sw = pik_value(p,"thickness",9,0);
2725 p->cur->dotted = p->cur->dashed = 0.0;}
2726 #line 2751 "pikchr.c"
2727 break;
2728 case 62: /* textposition ::= */
2729 #line 669 "pikchr.y"
2730 {yymsp[1].minor.yy164 = 0;}
2731 #line 2756 "pikchr.c"
2732 break;
2733 case 63: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2734 #line 672 "pikchr.y"
2735 {yylhsminor.yy164 = (short int)pik_text_position(yymsp[-1].minor.yy164,&yymsp[0].minor.yy0);}
2736 #line 2761 "pikchr.c"
2737 yymsp[-1].minor.yy164 = yylhsminor.yy164;
2738 break;
2739 case 64: /* position ::= expr COMMA expr */
2740 #line 675 "pikchr.y"
2741 {yylhsminor.yy79.x=yymsp[-2].minor.yy153; yylhsminor.yy79.y=yymsp[0].minor.yy153;}
2742 #line 2767 "pikchr.c"
2743 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2744 break;
2745 case 65: /* position ::= place PLUS expr COMMA expr */
2746 #line 677 "pikchr.y"
2747 {yylhsminor.yy79.x=yymsp[-4].minor.yy79.x+yymsp[-2].minor.yy153; yylhsminor.yy79.y=yymsp[-4].minor.yy79.y+yymsp[0].minor.yy153;}
2748 #line 2773 "pikchr.c"
2749 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2750 break;
2751 case 66: /* position ::= place MINUS expr COMMA expr */
2752 #line 678 "pikchr.y"
2753 {yylhsminor.yy79.x=yymsp[-4].minor.yy79.x-yymsp[-2].minor.yy153; yylhsminor.yy79.y=yymsp[-4].minor.yy79.y-yymsp[0].minor.yy153;}
2754 #line 2779 "pikchr.c"
2755 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2756 break;
2757 case 67: /* position ::= place PLUS LP expr COMMA expr RP */
2758 #line 680 "pikchr.y"
2759 {yylhsminor.yy79.x=yymsp[-6].minor.yy79.x+yymsp[-3].minor.yy153; yylhsminor.yy79.y=yymsp[-6].minor.yy79.y+yymsp[-1].minor.yy153;}
2760 #line 2785 "pikchr.c"
2761 yymsp[-6].minor.yy79 = yylhsminor.yy79;
2762 break;
2763 case 68: /* position ::= place MINUS LP expr COMMA expr RP */
2764 #line 682 "pikchr.y"
2765 {yylhsminor.yy79.x=yymsp[-6].minor.yy79.x-yymsp[-3].minor.yy153; yylhsminor.yy79.y=yymsp[-6].minor.yy79.y-yymsp[-1].minor.yy153;}
2766 #line 2791 "pikchr.c"
2767 yymsp[-6].minor.yy79 = yylhsminor.yy79;
2768 break;
2769 case 69: /* position ::= LP position COMMA position RP */
2770 #line 683 "pikchr.y"
2771 {yymsp[-4].minor.yy79.x=yymsp[-3].minor.yy79.x; yymsp[-4].minor.yy79.y=yymsp[-1].minor.yy79.y;}
2772 #line 2797 "pikchr.c"
2773 break;
2774 case 70: /* position ::= LP position RP */
2775 #line 684 "pikchr.y"
2776 {yymsp[-2].minor.yy79=yymsp[-1].minor.yy79;}
2777 #line 2802 "pikchr.c"
2778 break;
2779 case 71: /* position ::= expr between position AND position */
2780 #line 686 "pikchr.y"
2781 {yylhsminor.yy79 = pik_position_between(yymsp[-4].minor.yy153,yymsp[-2].minor.yy79,yymsp[0].minor.yy79);}
2782 #line 2807 "pikchr.c"
2783 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2784 break;
2785 case 72: /* position ::= expr LT position COMMA position GT */
2786 #line 688 "pikchr.y"
2787 {yylhsminor.yy79 = pik_position_between(yymsp[-5].minor.yy153,yymsp[-3].minor.yy79,yymsp[-1].minor.yy79);}
2788 #line 2813 "pikchr.c"
2789 yymsp[-5].minor.yy79 = yylhsminor.yy79;
2790 break;
2791 case 73: /* position ::= expr ABOVE position */
2792 #line 689 "pikchr.y"
2793 {yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.y += yymsp[-2].minor.yy153;}
2794 #line 2819 "pikchr.c"
2795 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2796 break;
2797 case 74: /* position ::= expr BELOW position */
2798 #line 690 "pikchr.y"
2799 {yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.y -= yymsp[-2].minor.yy153;}
2800 #line 2825 "pikchr.c"
2801 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2802 break;
2803 case 75: /* position ::= expr LEFT OF position */
2804 #line 691 "pikchr.y"
2805 {yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.x -= yymsp[-3].minor.yy153;}
2806 #line 2831 "pikchr.c"
2807 yymsp[-3].minor.yy79 = yylhsminor.yy79;
2808 break;
2809 case 76: /* position ::= expr RIGHT OF position */
2810 #line 692 "pikchr.y"
2811 {yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.x += yymsp[-3].minor.yy153;}
2812 #line 2837 "pikchr.c"
2813 yymsp[-3].minor.yy79 = yylhsminor.yy79;
2814 break;
2815 case 77: /* position ::= expr ON HEADING EDGEPT OF position */
2816 #line 694 "pikchr.y"
2817 {yylhsminor.yy79 = pik_position_at_hdg(yymsp[-5].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2818 #line 2843 "pikchr.c"
2819 yymsp[-5].minor.yy79 = yylhsminor.yy79;
2820 break;
2821 case 78: /* position ::= expr HEADING EDGEPT OF position */
2822 #line 696 "pikchr.y"
2823 {yylhsminor.yy79 = pik_position_at_hdg(yymsp[-4].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2824 #line 2849 "pikchr.c"
2825 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2826 break;
2827 case 79: /* position ::= expr EDGEPT OF position */
2828 #line 698 "pikchr.y"
2829 {yylhsminor.yy79 = pik_position_at_hdg(yymsp[-3].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2830 #line 2855 "pikchr.c"
2831 yymsp[-3].minor.yy79 = yylhsminor.yy79;
2832 break;
2833 case 80: /* position ::= expr ON HEADING expr FROM position */
2834 #line 700 "pikchr.y"
2835 {yylhsminor.yy79 = pik_position_at_angle(yymsp[-5].minor.yy153,yymsp[-2].minor.yy153,yymsp[0].minor.yy79);}
2836 #line 2861 "pikchr.c"
2837 yymsp[-5].minor.yy79 = yylhsminor.yy79;
2838 break;
2839 case 81: /* position ::= expr HEADING expr FROM position */
2840 #line 702 "pikchr.y"
2841 {yylhsminor.yy79 = pik_position_at_angle(yymsp[-4].minor.yy153,yymsp[-2].minor.yy153,yymsp[0].minor.yy79);}
2842 #line 2867 "pikchr.c"
2843 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2844 break;
2845 case 82: /* place ::= edge OF object */
2846 #line 714 "pikchr.y"
2847 {yylhsminor.yy79 = pik_place_of_elem(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2848 #line 2873 "pikchr.c"
2849 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2850 break;
2851 case 83: /* place2 ::= object */
2852 #line 715 "pikchr.y"
2853 {yylhsminor.yy79 = pik_place_of_elem(p,yymsp[0].minor.yy36,0);}
2854 #line 2879 "pikchr.c"
2855 yymsp[0].minor.yy79 = yylhsminor.yy79;
2856 break;
2857 case 84: /* place2 ::= object DOT_E edge */
2858 #line 716 "pikchr.y"
2859 {yylhsminor.yy79 = pik_place_of_elem(p,yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
2860 #line 2885 "pikchr.c"
2861 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2862 break;
2863 case 85: /* place2 ::= NTH VERTEX OF object */
2864 #line 717 "pikchr.y"
2865 {yylhsminor.yy79 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy36);}
2866 #line 2891 "pikchr.c"
2867 yymsp[-3].minor.yy79 = yylhsminor.yy79;
2868 break;
2869 case 86: /* object ::= nth */
2870 #line 729 "pikchr.y"
2871 {yylhsminor.yy36 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2872 #line 2897 "pikchr.c"
2873 yymsp[0].minor.yy36 = yylhsminor.yy36;
2874 break;
2875 case 87: /* object ::= nth OF|IN object */
2876 #line 730 "pikchr.y"
2877 {yylhsminor.yy36 = pik_find_nth(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2878 #line 2903 "pikchr.c"
2879 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2880 break;
2881 case 88: /* objectname ::= THIS */
2882 #line 732 "pikchr.y"
2883 {yymsp[0].minor.yy36 = p->cur;}
2884 #line 2909 "pikchr.c"
2885 break;
2886 case 89: /* objectname ::= PLACENAME */
2887 #line 733 "pikchr.y"
2888 {yylhsminor.yy36 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2889 #line 2914 "pikchr.c"
2890 yymsp[0].minor.yy36 = yylhsminor.yy36;
2891 break;
2892 case 90: /* objectname ::= objectname DOT_U PLACENAME */
2893 #line 735 "pikchr.y"
2894 {yylhsminor.yy36 = pik_find_byname(p,yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
2895 #line 2920 "pikchr.c"
2896 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2897 break;
2898 case 91: /* nth ::= NTH CLASSNAME */
2899 #line 737 "pikchr.y"
2900 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2901 #line 2926 "pikchr.c"
2902 yymsp[-1].minor.yy0 = yylhsminor.yy0;
2903 break;
2904 case 92: /* nth ::= NTH LAST CLASSNAME */
2905 #line 738 "pikchr.y"
2906 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2907 #line 2932 "pikchr.c"
2908 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2909 break;
2910 case 93: /* nth ::= LAST CLASSNAME */
2911 #line 739 "pikchr.y"
2912 {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2913 #line 2938 "pikchr.c"
2914 break;
2915 case 94: /* nth ::= LAST */
2916 #line 740 "pikchr.y"
2917 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2918 #line 2943 "pikchr.c"
2919 yymsp[0].minor.yy0 = yylhsminor.yy0;
2920 break;
2921 case 95: /* nth ::= NTH LB RB */
2922 #line 741 "pikchr.y"
2923 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2924 #line 2949 "pikchr.c"
2925 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2926 break;
2927 case 96: /* nth ::= NTH LAST LB RB */
2928 #line 742 "pikchr.y"
2929 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2930 #line 2955 "pikchr.c"
2931 yymsp[-3].minor.yy0 = yylhsminor.yy0;
2932 break;
2933 case 97: /* nth ::= LAST LB RB */
2934 #line 743 "pikchr.y"
2935 {yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2936 #line 2961 "pikchr.c"
2937 break;
2938 case 98: /* expr ::= expr PLUS expr */
2939 #line 745 "pikchr.y"
2940 {yylhsminor.yy153=yymsp[-2].minor.yy153+yymsp[0].minor.yy153;}
2941 #line 2966 "pikchr.c"
2942 yymsp[-2].minor.yy153 = yylhsminor.yy153;
2943 break;
2944 case 99: /* expr ::= expr MINUS expr */
2945 #line 746 "pikchr.y"
2946 {yylhsminor.yy153=yymsp[-2].minor.yy153-yymsp[0].minor.yy153;}
2947 #line 2972 "pikchr.c"
2948 yymsp[-2].minor.yy153 = yylhsminor.yy153;
2949 break;
2950 case 100: /* expr ::= expr STAR expr */
2951 #line 747 "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 101: /* expr ::= expr SLASH expr */
2957 #line 748 "pikchr.y"
2958 {
2959 if( yymsp[0].minor.yy153==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy153 = 0.0; }
2960 else{ yylhsminor.yy153 = yymsp[-2].minor.yy153/yymsp[0].minor.yy153; }
2961 }
2962 #line 2987 "pikchr.c"
2963 yymsp[-2].minor.yy153 = yylhsminor.yy153;
2964 break;
2965 case 102: /* expr ::= MINUS expr */
2966 #line 752 "pikchr.y"
2967 {yymsp[-1].minor.yy153=-yymsp[0].minor.yy153;}
2968 #line 2993 "pikchr.c"
2969 break;
2970 case 103: /* expr ::= PLUS expr */
2971 #line 753 "pikchr.y"
2972 {yymsp[-1].minor.yy153=yymsp[0].minor.yy153;}
2973 #line 2998 "pikchr.c"
2974 break;
2975 case 104: /* expr ::= LP expr RP */
2976 #line 754 "pikchr.y"
2977 {yymsp[-2].minor.yy153=yymsp[-1].minor.yy153;}
2978 #line 3003 "pikchr.c"
2979 break;
2980 case 105: /* expr ::= LP FILL|COLOR|THICKNESS RP */
2981 #line 755 "pikchr.y"
2982 {yymsp[-2].minor.yy153=pik_get_var(p,&yymsp[-1].minor.yy0);}
2983 #line 3008 "pikchr.c"
2984 break;
2985 case 106: /* expr ::= NUMBER */
2986 #line 756 "pikchr.y"
2987 {yylhsminor.yy153=pik_atof(&yymsp[0].minor.yy0);}
2988 #line 3013 "pikchr.c"
2989 yymsp[0].minor.yy153 = yylhsminor.yy153;
2990 break;
2991 case 107: /* expr ::= ID */
2992 #line 757 "pikchr.y"
2993 {yylhsminor.yy153=pik_get_var(p,&yymsp[0].minor.yy0);}
2994 #line 3019 "pikchr.c"
2995 yymsp[0].minor.yy153 = yylhsminor.yy153;
2996 break;
2997 case 108: /* expr ::= FUNC1 LP expr RP */
2998 #line 758 "pikchr.y"
2999 {yylhsminor.yy153 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy153,0.0);}
3000 #line 3025 "pikchr.c"
3001 yymsp[-3].minor.yy153 = yylhsminor.yy153;
3002 break;
3003 case 109: /* expr ::= FUNC2 LP expr COMMA expr RP */
3004 #line 759 "pikchr.y"
3005 {yylhsminor.yy153 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy153,yymsp[-1].minor.yy153);}
3006 #line 3031 "pikchr.c"
3007 yymsp[-5].minor.yy153 = yylhsminor.yy153;
3008 break;
3009 case 110: /* expr ::= DIST LP position COMMA position RP */
3010 #line 760 "pikchr.y"
3011 {yymsp[-5].minor.yy153 = pik_dist(&yymsp[-3].minor.yy79,&yymsp[-1].minor.yy79);}
3012 #line 3037 "pikchr.c"
3013 break;
3014 case 111: /* expr ::= place2 DOT_XY X */
3015 #line 761 "pikchr.y"
3016 {yylhsminor.yy153 = yymsp[-2].minor.yy79.x;}
3017 #line 3042 "pikchr.c"
3018 yymsp[-2].minor.yy153 = yylhsminor.yy153;
3019 break;
3020 case 112: /* expr ::= place2 DOT_XY Y */
3021 #line 762 "pikchr.y"
3022 {yylhsminor.yy153 = yymsp[-2].minor.yy79.y;}
3023 #line 3048 "pikchr.c"
3024 yymsp[-2].minor.yy153 = yylhsminor.yy153;
3025 break;
3026 case 113: /* expr ::= object DOT_L numproperty */
3027 case 114: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==114);
3028 case 115: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==115);
3029 #line 763 "pikchr.y"
3030 {yylhsminor.yy153=pik_property_of(yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
3031 #line 3056 "pikchr.c"
3032 yymsp[-2].minor.yy153 = yylhsminor.yy153;
3033 break;
3034 default:
3035 /* (116) lvalue ::= ID */ yytestcase(yyruleno==116);
3036 /* (117) lvalue ::= FILL */ yytestcase(yyruleno==117);
@@ -3128,19 +3129,19 @@
3129 ){
3130 pik_parserARG_FETCH
3131 pik_parserCTX_FETCH
3132 #define TOKEN yyminor
3133 /************ Begin %syntax_error code ****************************************/
3134 #line 523 "pikchr.y"
3135
3136 if( TOKEN.z && TOKEN.z[0] ){
3137 pik_error(p, &TOKEN, "syntax error");
3138 }else{
3139 pik_error(p, 0, "syntax error");
3140 }
3141 UNUSED_PARAMETER(yymajor);
3142 #line 3167 "pikchr.c"
3143 /************ End %syntax_error code ******************************************/
3144 pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
3145 pik_parserCTX_STORE
3146 }
3147
@@ -3369,11 +3370,11 @@
3370 #else
3371 (void)iToken;
3372 return 0;
3373 #endif
3374 }
3375 #line 768 "pikchr.y"
3376
3377
3378
3379 /* Chart of the 148 official CSS color names with their
3380 ** corresponding RGB values thru Color Module Level 4:
@@ -5243,10 +5244,21 @@
5244 /* Return true if a bounding box is empty.
5245 */
5246 static int pik_bbox_isempty(PBox *p){
5247 return p->sw.x>p->ne.x;
5248 }
5249
5250 /* Return true if point pPt is contained within the bounding box pBox
5251 */
5252 static int pik_bbox_contains_point(PBox *pBox, PPoint *pPt){
5253 if( pik_bbox_isempty(pBox) ) return 0;
5254 if( pPt->x < pBox->sw.x ) return 0;
5255 if( pPt->x > pBox->ne.x ) return 0;
5256 if( pPt->y < pBox->sw.y ) return 0;
5257 if( pPt->y > pBox->ne.y ) return 0;
5258 return 1;
5259 }
5260
5261 /* Initialize a bounding box to an empty container
5262 */
5263 static void pik_bbox_init(PBox *p){
5264 p->sw.x = 1.0;
@@ -6635,25 +6647,28 @@
6647 }
6648 return;
6649 }
6650
6651 /*
6652 ** Search for object located at *pCenter that has an xChop method and
6653 ** that does not enclose point pOther.
6654 **
6655 ** Return a pointer to the object, or NULL if not found.
6656 */
6657 static PObj *pik_find_chopper(PList *pList, PPoint *pCenter, PPoint *pOther){
6658 int i;
6659 if( pList==0 ) return 0;
6660 for(i=pList->n-1; i>=0; i--){
6661 PObj *pObj = pList->a[i];
6662 if( pObj->type->xChop!=0
6663 && pObj->ptAt.x==pCenter->x
6664 && pObj->ptAt.y==pCenter->y
6665 && !pik_bbox_contains_point(&pObj->bbox, pOther)
6666 ){
6667 return pObj;
6668 }else if( pObj->pSublist ){
6669 pObj = pik_find_chopper(pObj->pSublist,pCenter,pOther);
6670 if( pObj ) return pObj;
6671 }
6672 }
6673 return 0;
6674 }
@@ -6664,11 +6679,11 @@
6679 ** If point pTo is the exact enter of a choppable object,
6680 ** then adjust pTo by the appropriate amount in the direction
6681 ** of pFrom.
6682 */
6683 static void pik_autochop(Pik *p, PPoint *pFrom, PPoint *pTo){
6684 PObj *pObj = pik_find_chopper(p->list, pTo, pFrom);
6685 if( pObj ){
6686 *pTo = pObj->type->xChop(p, pObj, pFrom);
6687 }
6688 }
6689
@@ -8026,6 +8041,6 @@
8041
8042
8043 #endif /* PIKCHR_TCL */
8044
8045
8046 #line 8071 "pikchr.c"
8047

Keyboard Shortcuts

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