Fossil SCM

Further improvements to the "chop" mechanism of Pikchr.

drh 2021-07-17 19:26 trunk
Commit 58fb007eb8deed55a3b3971c40c275e29fd1421f144e7760f4a2b38d04f09174
1 file changed +269 -233
+269 -233
--- src/pikchr.c
+++ src/pikchr.c
@@ -317,10 +317,11 @@
317317
PToken aTxt[5]; /* Text with .eCode holding TP flags */
318318
int iLayer; /* Rendering order */
319319
int inDir, outDir; /* Entry and exit directions */
320320
int nPath; /* Number of path points */
321321
PPoint *aPath; /* Array of path points */
322
+ PObj *pFrom, *pTo; /* End-point objects of a path */
322323
PBox bbox; /* Bounding box */
323324
};
324325
325326
/* A list of graphics objects */
326327
struct PList {
@@ -347,10 +348,11 @@
347348
unsigned int nOut; /* Bytes written to zOut[] so far */
348349
unsigned int nOutAlloc; /* Space allocated to zOut[] */
349350
unsigned char eDir; /* Current direction */
350351
unsigned int mFlags; /* Flags passed to pikchr() */
351352
PObj *cur; /* Object under construction */
353
+ PObj *lastRef; /* Last object references by "place" */
352354
PList *list; /* Object list under construction */
353355
PMacro *pMacros; /* List of all defined macros */
354356
PVar *pVar; /* Application-defined variables */
355357
PBox bbox; /* Bounding box around all statements */
356358
/* Cache of layout values. <=0.0 for unknown... */
@@ -477,11 +479,11 @@
477479
static PObj *pik_position_assert(Pik*,PPoint*,PToken*,PPoint*);
478480
static PNum pik_dist(PPoint*,PPoint*);
479481
static void pik_add_macro(Pik*,PToken *pId,PToken *pCode);
480482
481483
482
-#line 508 "pikchr.c"
484
+#line 510 "pikchr.c"
483485
/**************** End of %include directives **********************************/
484486
/* These constants specify the various numeric values for terminal symbols.
485487
***************** Begin token definitions *************************************/
486488
#ifndef T_ID
487489
#define T_ID 1
@@ -1706,22 +1708,22 @@
17061708
** inside the C code.
17071709
*/
17081710
/********* Begin destructor definitions ***************************************/
17091711
case 99: /* statement_list */
17101712
{
1711
-#line 497 "pikchr.y"
1713
+#line 499 "pikchr.y"
17121714
pik_elist_free(p,(yypminor->yy227));
1713
-#line 1738 "pikchr.c"
1715
+#line 1740 "pikchr.c"
17141716
}
17151717
break;
17161718
case 100: /* statement */
17171719
case 101: /* unnamed_statement */
17181720
case 102: /* basetype */
17191721
{
1720
-#line 499 "pikchr.y"
1722
+#line 501 "pikchr.y"
17211723
pik_elem_free(p,(yypminor->yy36));
1722
-#line 1747 "pikchr.c"
1724
+#line 1749 "pikchr.c"
17231725
}
17241726
break;
17251727
/********* End destructor definitions *****************************************/
17261728
default: break; /* If no destructor action specified: do nothing */
17271729
}
@@ -1935,14 +1937,14 @@
19351937
#endif
19361938
while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
19371939
/* Here code is inserted which will execute if the parser
19381940
** stack every overflows */
19391941
/******** Begin %stack_overflow code ******************************************/
1940
-#line 531 "pikchr.y"
1942
+#line 533 "pikchr.y"
19411943
19421944
pik_error(p, 0, "parser stack overflow");
1943
-#line 1968 "pikchr.c"
1945
+#line 1970 "pikchr.c"
19441946
/******** End %stack_overflow code ********************************************/
19451947
pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
19461948
pik_parserCTX_STORE
19471949
}
19481950
@@ -2418,619 +2420,619 @@
24182420
** break;
24192421
*/
24202422
/********** Begin reduce actions **********************************************/
24212423
YYMINORTYPE yylhsminor;
24222424
case 0: /* document ::= statement_list */
2423
-#line 535 "pikchr.y"
2425
+#line 537 "pikchr.y"
24242426
{pik_render(p,yymsp[0].minor.yy227);}
2425
-#line 2450 "pikchr.c"
2427
+#line 2452 "pikchr.c"
24262428
break;
24272429
case 1: /* statement_list ::= statement */
2428
-#line 538 "pikchr.y"
2430
+#line 540 "pikchr.y"
24292431
{ yylhsminor.yy227 = pik_elist_append(p,0,yymsp[0].minor.yy36); }
2430
-#line 2455 "pikchr.c"
2432
+#line 2457 "pikchr.c"
24312433
yymsp[0].minor.yy227 = yylhsminor.yy227;
24322434
break;
24332435
case 2: /* statement_list ::= statement_list EOL statement */
2434
-#line 540 "pikchr.y"
2436
+#line 542 "pikchr.y"
24352437
{ yylhsminor.yy227 = pik_elist_append(p,yymsp[-2].minor.yy227,yymsp[0].minor.yy36); }
2436
-#line 2461 "pikchr.c"
2438
+#line 2463 "pikchr.c"
24372439
yymsp[-2].minor.yy227 = yylhsminor.yy227;
24382440
break;
24392441
case 3: /* statement ::= */
2440
-#line 543 "pikchr.y"
2442
+#line 545 "pikchr.y"
24412443
{ yymsp[1].minor.yy36 = 0; }
2442
-#line 2467 "pikchr.c"
2444
+#line 2469 "pikchr.c"
24432445
break;
24442446
case 4: /* statement ::= direction */
2445
-#line 544 "pikchr.y"
2447
+#line 546 "pikchr.y"
24462448
{ pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy36=0; }
2447
-#line 2472 "pikchr.c"
2449
+#line 2474 "pikchr.c"
24482450
yymsp[0].minor.yy36 = yylhsminor.yy36;
24492451
break;
24502452
case 5: /* statement ::= lvalue ASSIGN rvalue */
2451
-#line 545 "pikchr.y"
2453
+#line 547 "pikchr.y"
24522454
{pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy153,&yymsp[-1].minor.yy0); yylhsminor.yy36=0;}
2453
-#line 2478 "pikchr.c"
2455
+#line 2480 "pikchr.c"
24542456
yymsp[-2].minor.yy36 = yylhsminor.yy36;
24552457
break;
24562458
case 6: /* statement ::= PLACENAME COLON unnamed_statement */
2457
-#line 547 "pikchr.y"
2459
+#line 549 "pikchr.y"
24582460
{ yylhsminor.yy36 = yymsp[0].minor.yy36; pik_elem_setname(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0); }
2459
-#line 2484 "pikchr.c"
2461
+#line 2486 "pikchr.c"
24602462
yymsp[-2].minor.yy36 = yylhsminor.yy36;
24612463
break;
24622464
case 7: /* statement ::= PLACENAME COLON position */
2463
-#line 549 "pikchr.y"
2465
+#line 551 "pikchr.y"
24642466
{ yylhsminor.yy36 = pik_elem_new(p,0,0,0);
24652467
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"
2468
+#line 2493 "pikchr.c"
24672469
yymsp[-2].minor.yy36 = yylhsminor.yy36;
24682470
break;
24692471
case 8: /* statement ::= unnamed_statement */
2470
-#line 551 "pikchr.y"
2472
+#line 553 "pikchr.y"
24712473
{yylhsminor.yy36 = yymsp[0].minor.yy36;}
2472
-#line 2497 "pikchr.c"
2474
+#line 2499 "pikchr.c"
24732475
yymsp[0].minor.yy36 = yylhsminor.yy36;
24742476
break;
24752477
case 9: /* statement ::= print prlist */
2476
-#line 552 "pikchr.y"
2478
+#line 554 "pikchr.y"
24772479
{pik_append(p,"<br>\n",5); yymsp[-1].minor.yy36=0;}
2478
-#line 2503 "pikchr.c"
2480
+#line 2505 "pikchr.c"
24792481
break;
24802482
case 10: /* statement ::= ASSERT LP expr EQ expr RP */
2481
-#line 557 "pikchr.y"
2483
+#line 559 "pikchr.y"
24822484
{yymsp[-5].minor.yy36=pik_assert(p,yymsp[-3].minor.yy153,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy153);}
2483
-#line 2508 "pikchr.c"
2485
+#line 2510 "pikchr.c"
24842486
break;
24852487
case 11: /* statement ::= ASSERT LP position EQ position RP */
2486
-#line 559 "pikchr.y"
2488
+#line 561 "pikchr.y"
24872489
{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"
2490
+#line 2515 "pikchr.c"
24892491
break;
24902492
case 12: /* statement ::= DEFINE ID CODEBLOCK */
2491
-#line 560 "pikchr.y"
2493
+#line 562 "pikchr.y"
24922494
{yymsp[-2].minor.yy36=0; pik_add_macro(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
2493
-#line 2518 "pikchr.c"
2495
+#line 2520 "pikchr.c"
24942496
break;
24952497
case 13: /* rvalue ::= PLACENAME */
2496
-#line 571 "pikchr.y"
2498
+#line 573 "pikchr.y"
24972499
{yylhsminor.yy153 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2498
-#line 2523 "pikchr.c"
2500
+#line 2525 "pikchr.c"
24992501
yymsp[0].minor.yy153 = yylhsminor.yy153;
25002502
break;
25012503
case 14: /* pritem ::= FILL */
25022504
case 15: /* pritem ::= COLOR */ yytestcase(yyruleno==15);
25032505
case 16: /* pritem ::= THICKNESS */ yytestcase(yyruleno==16);
2504
-#line 576 "pikchr.y"
2506
+#line 578 "pikchr.y"
25052507
{pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2506
-#line 2531 "pikchr.c"
2508
+#line 2533 "pikchr.c"
25072509
break;
25082510
case 17: /* pritem ::= rvalue */
2509
-#line 579 "pikchr.y"
2511
+#line 581 "pikchr.y"
25102512
{pik_append_num(p,"",yymsp[0].minor.yy153);}
2511
-#line 2536 "pikchr.c"
2513
+#line 2538 "pikchr.c"
25122514
break;
25132515
case 18: /* pritem ::= STRING */
2514
-#line 580 "pikchr.y"
2516
+#line 582 "pikchr.y"
25152517
{pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2516
-#line 2541 "pikchr.c"
2518
+#line 2543 "pikchr.c"
25172519
break;
25182520
case 19: /* prsep ::= COMMA */
2519
-#line 581 "pikchr.y"
2521
+#line 583 "pikchr.y"
25202522
{pik_append(p, " ", 1);}
2521
-#line 2546 "pikchr.c"
2523
+#line 2548 "pikchr.c"
25222524
break;
25232525
case 20: /* unnamed_statement ::= basetype attribute_list */
2524
-#line 584 "pikchr.y"
2526
+#line 586 "pikchr.y"
25252527
{yylhsminor.yy36 = yymsp[-1].minor.yy36; pik_after_adding_attributes(p,yylhsminor.yy36);}
2526
-#line 2551 "pikchr.c"
2528
+#line 2553 "pikchr.c"
25272529
yymsp[-1].minor.yy36 = yylhsminor.yy36;
25282530
break;
25292531
case 21: /* basetype ::= CLASSNAME */
2530
-#line 586 "pikchr.y"
2532
+#line 588 "pikchr.y"
25312533
{yylhsminor.yy36 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2532
-#line 2557 "pikchr.c"
2534
+#line 2559 "pikchr.c"
25332535
yymsp[0].minor.yy36 = yylhsminor.yy36;
25342536
break;
25352537
case 22: /* basetype ::= STRING textposition */
2536
-#line 588 "pikchr.y"
2538
+#line 590 "pikchr.y"
25372539
{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"
2540
+#line 2565 "pikchr.c"
25392541
yymsp[-1].minor.yy36 = yylhsminor.yy36;
25402542
break;
25412543
case 23: /* basetype ::= LB savelist statement_list RB */
2542
-#line 590 "pikchr.y"
2544
+#line 592 "pikchr.y"
25432545
{ 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"
2546
+#line 2571 "pikchr.c"
25452547
break;
25462548
case 24: /* savelist ::= */
2547
-#line 595 "pikchr.y"
2549
+#line 597 "pikchr.y"
25482550
{yymsp[1].minor.yy227 = p->list; p->list = 0;}
2549
-#line 2574 "pikchr.c"
2551
+#line 2576 "pikchr.c"
25502552
break;
25512553
case 25: /* relexpr ::= expr */
2552
-#line 602 "pikchr.y"
2554
+#line 604 "pikchr.y"
25532555
{yylhsminor.yy10.rAbs = yymsp[0].minor.yy153; yylhsminor.yy10.rRel = 0;}
2554
-#line 2579 "pikchr.c"
2556
+#line 2581 "pikchr.c"
25552557
yymsp[0].minor.yy10 = yylhsminor.yy10;
25562558
break;
25572559
case 26: /* relexpr ::= expr PERCENT */
2558
-#line 603 "pikchr.y"
2560
+#line 605 "pikchr.y"
25592561
{yylhsminor.yy10.rAbs = 0; yylhsminor.yy10.rRel = yymsp[-1].minor.yy153/100;}
2560
-#line 2585 "pikchr.c"
2562
+#line 2587 "pikchr.c"
25612563
yymsp[-1].minor.yy10 = yylhsminor.yy10;
25622564
break;
25632565
case 27: /* optrelexpr ::= */
2564
-#line 605 "pikchr.y"
2566
+#line 607 "pikchr.y"
25652567
{yymsp[1].minor.yy10.rAbs = 0; yymsp[1].minor.yy10.rRel = 1.0;}
2566
-#line 2591 "pikchr.c"
2568
+#line 2593 "pikchr.c"
25672569
break;
25682570
case 28: /* attribute_list ::= relexpr alist */
2569
-#line 607 "pikchr.y"
2571
+#line 609 "pikchr.y"
25702572
{pik_add_direction(p,0,&yymsp[-1].minor.yy10);}
2571
-#line 2596 "pikchr.c"
2573
+#line 2598 "pikchr.c"
25722574
break;
25732575
case 29: /* attribute ::= numproperty relexpr */
2574
-#line 611 "pikchr.y"
2576
+#line 613 "pikchr.y"
25752577
{ pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy10); }
2576
-#line 2601 "pikchr.c"
2578
+#line 2603 "pikchr.c"
25772579
break;
25782580
case 30: /* attribute ::= dashproperty expr */
2579
-#line 612 "pikchr.y"
2581
+#line 614 "pikchr.y"
25802582
{ pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy153); }
2581
-#line 2606 "pikchr.c"
2583
+#line 2608 "pikchr.c"
25822584
break;
25832585
case 31: /* attribute ::= dashproperty */
2584
-#line 613 "pikchr.y"
2586
+#line 615 "pikchr.y"
25852587
{ pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2586
-#line 2611 "pikchr.c"
2588
+#line 2613 "pikchr.c"
25872589
break;
25882590
case 32: /* attribute ::= colorproperty rvalue */
2589
-#line 614 "pikchr.y"
2591
+#line 616 "pikchr.y"
25902592
{ pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy153); }
2591
-#line 2616 "pikchr.c"
2593
+#line 2618 "pikchr.c"
25922594
break;
25932595
case 33: /* attribute ::= go direction optrelexpr */
2594
-#line 615 "pikchr.y"
2596
+#line 617 "pikchr.y"
25952597
{ pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy10);}
2596
-#line 2621 "pikchr.c"
2598
+#line 2623 "pikchr.c"
25972599
break;
25982600
case 34: /* attribute ::= go direction even position */
2599
-#line 616 "pikchr.y"
2601
+#line 618 "pikchr.y"
26002602
{pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy79);}
2601
-#line 2626 "pikchr.c"
2603
+#line 2628 "pikchr.c"
26022604
break;
26032605
case 35: /* attribute ::= CLOSE */
2604
-#line 617 "pikchr.y"
2606
+#line 619 "pikchr.y"
26052607
{ pik_close_path(p,&yymsp[0].minor.yy0); }
2606
-#line 2631 "pikchr.c"
2608
+#line 2633 "pikchr.c"
26072609
break;
26082610
case 36: /* attribute ::= CHOP */
2609
-#line 618 "pikchr.y"
2611
+#line 620 "pikchr.y"
26102612
{ p->cur->bChop = 1; }
2611
-#line 2636 "pikchr.c"
2613
+#line 2638 "pikchr.c"
26122614
break;
26132615
case 37: /* attribute ::= FROM position */
2614
-#line 619 "pikchr.y"
2616
+#line 621 "pikchr.y"
26152617
{ pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy79); }
2616
-#line 2641 "pikchr.c"
2618
+#line 2643 "pikchr.c"
26172619
break;
26182620
case 38: /* attribute ::= TO position */
2619
-#line 620 "pikchr.y"
2621
+#line 622 "pikchr.y"
26202622
{ pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy79); }
2621
-#line 2646 "pikchr.c"
2623
+#line 2648 "pikchr.c"
26222624
break;
26232625
case 39: /* attribute ::= THEN */
2624
-#line 621 "pikchr.y"
2626
+#line 623 "pikchr.y"
26252627
{ pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2626
-#line 2651 "pikchr.c"
2628
+#line 2653 "pikchr.c"
26272629
break;
26282630
case 40: /* attribute ::= THEN optrelexpr HEADING expr */
26292631
case 42: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==42);
2630
-#line 623 "pikchr.y"
2632
+#line 625 "pikchr.y"
26312633
{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"
2634
+#line 2659 "pikchr.c"
26332635
break;
26342636
case 41: /* attribute ::= THEN optrelexpr EDGEPT */
26352637
case 43: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==43);
2636
-#line 624 "pikchr.y"
2638
+#line 626 "pikchr.y"
26372639
{pik_move_hdg(p,&yymsp[-1].minor.yy10,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2638
-#line 2663 "pikchr.c"
2640
+#line 2665 "pikchr.c"
26392641
break;
26402642
case 44: /* attribute ::= AT position */
2641
-#line 629 "pikchr.y"
2643
+#line 631 "pikchr.y"
26422644
{ pik_set_at(p,0,&yymsp[0].minor.yy79,&yymsp[-1].minor.yy0); }
2643
-#line 2668 "pikchr.c"
2645
+#line 2670 "pikchr.c"
26442646
break;
26452647
case 45: /* attribute ::= SAME */
2646
-#line 631 "pikchr.y"
2648
+#line 633 "pikchr.y"
26472649
{pik_same(p,0,&yymsp[0].minor.yy0);}
2648
-#line 2673 "pikchr.c"
2650
+#line 2675 "pikchr.c"
26492651
break;
26502652
case 46: /* attribute ::= SAME AS object */
2651
-#line 632 "pikchr.y"
2653
+#line 634 "pikchr.y"
26522654
{pik_same(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2653
-#line 2678 "pikchr.c"
2655
+#line 2680 "pikchr.c"
26542656
break;
26552657
case 47: /* attribute ::= STRING textposition */
2656
-#line 633 "pikchr.y"
2658
+#line 635 "pikchr.y"
26572659
{pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy164);}
2658
-#line 2683 "pikchr.c"
2660
+#line 2685 "pikchr.c"
26592661
break;
26602662
case 48: /* attribute ::= FIT */
2661
-#line 634 "pikchr.y"
2663
+#line 636 "pikchr.y"
26622664
{pik_size_to_fit(p,&yymsp[0].minor.yy0,3); }
2663
-#line 2688 "pikchr.c"
2665
+#line 2690 "pikchr.c"
26642666
break;
26652667
case 49: /* attribute ::= BEHIND object */
2666
-#line 635 "pikchr.y"
2668
+#line 637 "pikchr.y"
26672669
{pik_behind(p,yymsp[0].minor.yy36);}
2668
-#line 2693 "pikchr.c"
2670
+#line 2695 "pikchr.c"
26692671
break;
26702672
case 50: /* withclause ::= DOT_E edge AT position */
26712673
case 51: /* withclause ::= edge AT position */ yytestcase(yyruleno==51);
2672
-#line 643 "pikchr.y"
2674
+#line 645 "pikchr.y"
26732675
{ pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy79,&yymsp[-1].minor.yy0); }
2674
-#line 2699 "pikchr.c"
2676
+#line 2701 "pikchr.c"
26752677
break;
26762678
case 52: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2677
-#line 647 "pikchr.y"
2679
+#line 649 "pikchr.y"
26782680
{yylhsminor.yy0 = yymsp[0].minor.yy0;}
2679
-#line 2704 "pikchr.c"
2681
+#line 2706 "pikchr.c"
26802682
yymsp[0].minor.yy0 = yylhsminor.yy0;
26812683
break;
26822684
case 53: /* boolproperty ::= CW */
2683
-#line 658 "pikchr.y"
2685
+#line 660 "pikchr.y"
26842686
{p->cur->cw = 1;}
2685
-#line 2710 "pikchr.c"
2687
+#line 2712 "pikchr.c"
26862688
break;
26872689
case 54: /* boolproperty ::= CCW */
2688
-#line 659 "pikchr.y"
2690
+#line 661 "pikchr.y"
26892691
{p->cur->cw = 0;}
2690
-#line 2715 "pikchr.c"
2692
+#line 2717 "pikchr.c"
26912693
break;
26922694
case 55: /* boolproperty ::= LARROW */
2693
-#line 660 "pikchr.y"
2695
+#line 662 "pikchr.y"
26942696
{p->cur->larrow=1; p->cur->rarrow=0; }
2695
-#line 2720 "pikchr.c"
2697
+#line 2722 "pikchr.c"
26962698
break;
26972699
case 56: /* boolproperty ::= RARROW */
2698
-#line 661 "pikchr.y"
2700
+#line 663 "pikchr.y"
26992701
{p->cur->larrow=0; p->cur->rarrow=1; }
2700
-#line 2725 "pikchr.c"
2702
+#line 2727 "pikchr.c"
27012703
break;
27022704
case 57: /* boolproperty ::= LRARROW */
2703
-#line 662 "pikchr.y"
2705
+#line 664 "pikchr.y"
27042706
{p->cur->larrow=1; p->cur->rarrow=1; }
2705
-#line 2730 "pikchr.c"
2707
+#line 2732 "pikchr.c"
27062708
break;
27072709
case 58: /* boolproperty ::= INVIS */
2708
-#line 663 "pikchr.y"
2710
+#line 665 "pikchr.y"
27092711
{p->cur->sw = 0.0;}
2710
-#line 2735 "pikchr.c"
2712
+#line 2737 "pikchr.c"
27112713
break;
27122714
case 59: /* boolproperty ::= THICK */
2713
-#line 664 "pikchr.y"
2715
+#line 666 "pikchr.y"
27142716
{p->cur->sw *= 1.5;}
2715
-#line 2740 "pikchr.c"
2717
+#line 2742 "pikchr.c"
27162718
break;
27172719
case 60: /* boolproperty ::= THIN */
2718
-#line 665 "pikchr.y"
2720
+#line 667 "pikchr.y"
27192721
{p->cur->sw *= 0.67;}
2720
-#line 2745 "pikchr.c"
2722
+#line 2747 "pikchr.c"
27212723
break;
27222724
case 61: /* boolproperty ::= SOLID */
2723
-#line 666 "pikchr.y"
2725
+#line 668 "pikchr.y"
27242726
{p->cur->sw = pik_value(p,"thickness",9,0);
27252727
p->cur->dotted = p->cur->dashed = 0.0;}
2726
-#line 2751 "pikchr.c"
2728
+#line 2753 "pikchr.c"
27272729
break;
27282730
case 62: /* textposition ::= */
2729
-#line 669 "pikchr.y"
2731
+#line 671 "pikchr.y"
27302732
{yymsp[1].minor.yy164 = 0;}
2731
-#line 2756 "pikchr.c"
2733
+#line 2758 "pikchr.c"
27322734
break;
27332735
case 63: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2734
-#line 672 "pikchr.y"
2736
+#line 674 "pikchr.y"
27352737
{yylhsminor.yy164 = (short int)pik_text_position(yymsp[-1].minor.yy164,&yymsp[0].minor.yy0);}
2736
-#line 2761 "pikchr.c"
2738
+#line 2763 "pikchr.c"
27372739
yymsp[-1].minor.yy164 = yylhsminor.yy164;
27382740
break;
27392741
case 64: /* position ::= expr COMMA expr */
2740
-#line 675 "pikchr.y"
2742
+#line 677 "pikchr.y"
27412743
{yylhsminor.yy79.x=yymsp[-2].minor.yy153; yylhsminor.yy79.y=yymsp[0].minor.yy153;}
2742
-#line 2767 "pikchr.c"
2744
+#line 2769 "pikchr.c"
27432745
yymsp[-2].minor.yy79 = yylhsminor.yy79;
27442746
break;
27452747
case 65: /* position ::= place PLUS expr COMMA expr */
2746
-#line 677 "pikchr.y"
2748
+#line 679 "pikchr.y"
27472749
{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"
2750
+#line 2775 "pikchr.c"
27492751
yymsp[-4].minor.yy79 = yylhsminor.yy79;
27502752
break;
27512753
case 66: /* position ::= place MINUS expr COMMA expr */
2752
-#line 678 "pikchr.y"
2754
+#line 680 "pikchr.y"
27532755
{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"
2756
+#line 2781 "pikchr.c"
27552757
yymsp[-4].minor.yy79 = yylhsminor.yy79;
27562758
break;
27572759
case 67: /* position ::= place PLUS LP expr COMMA expr RP */
2758
-#line 680 "pikchr.y"
2760
+#line 682 "pikchr.y"
27592761
{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"
2762
+#line 2787 "pikchr.c"
27612763
yymsp[-6].minor.yy79 = yylhsminor.yy79;
27622764
break;
27632765
case 68: /* position ::= place MINUS LP expr COMMA expr RP */
2764
-#line 682 "pikchr.y"
2766
+#line 684 "pikchr.y"
27652767
{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"
2768
+#line 2793 "pikchr.c"
27672769
yymsp[-6].minor.yy79 = yylhsminor.yy79;
27682770
break;
27692771
case 69: /* position ::= LP position COMMA position RP */
2770
-#line 683 "pikchr.y"
2772
+#line 685 "pikchr.y"
27712773
{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"
2774
+#line 2799 "pikchr.c"
27732775
break;
27742776
case 70: /* position ::= LP position RP */
2775
-#line 684 "pikchr.y"
2777
+#line 686 "pikchr.y"
27762778
{yymsp[-2].minor.yy79=yymsp[-1].minor.yy79;}
2777
-#line 2802 "pikchr.c"
2779
+#line 2804 "pikchr.c"
27782780
break;
27792781
case 71: /* position ::= expr between position AND position */
2780
-#line 686 "pikchr.y"
2782
+#line 688 "pikchr.y"
27812783
{yylhsminor.yy79 = pik_position_between(yymsp[-4].minor.yy153,yymsp[-2].minor.yy79,yymsp[0].minor.yy79);}
2782
-#line 2807 "pikchr.c"
2784
+#line 2809 "pikchr.c"
27832785
yymsp[-4].minor.yy79 = yylhsminor.yy79;
27842786
break;
27852787
case 72: /* position ::= expr LT position COMMA position GT */
2786
-#line 688 "pikchr.y"
2788
+#line 690 "pikchr.y"
27872789
{yylhsminor.yy79 = pik_position_between(yymsp[-5].minor.yy153,yymsp[-3].minor.yy79,yymsp[-1].minor.yy79);}
2788
-#line 2813 "pikchr.c"
2790
+#line 2815 "pikchr.c"
27892791
yymsp[-5].minor.yy79 = yylhsminor.yy79;
27902792
break;
27912793
case 73: /* position ::= expr ABOVE position */
2792
-#line 689 "pikchr.y"
2794
+#line 691 "pikchr.y"
27932795
{yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.y += yymsp[-2].minor.yy153;}
2794
-#line 2819 "pikchr.c"
2796
+#line 2821 "pikchr.c"
27952797
yymsp[-2].minor.yy79 = yylhsminor.yy79;
27962798
break;
27972799
case 74: /* position ::= expr BELOW position */
2798
-#line 690 "pikchr.y"
2800
+#line 692 "pikchr.y"
27992801
{yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.y -= yymsp[-2].minor.yy153;}
2800
-#line 2825 "pikchr.c"
2802
+#line 2827 "pikchr.c"
28012803
yymsp[-2].minor.yy79 = yylhsminor.yy79;
28022804
break;
28032805
case 75: /* position ::= expr LEFT OF position */
2804
-#line 691 "pikchr.y"
2806
+#line 693 "pikchr.y"
28052807
{yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.x -= yymsp[-3].minor.yy153;}
2806
-#line 2831 "pikchr.c"
2808
+#line 2833 "pikchr.c"
28072809
yymsp[-3].minor.yy79 = yylhsminor.yy79;
28082810
break;
28092811
case 76: /* position ::= expr RIGHT OF position */
2810
-#line 692 "pikchr.y"
2812
+#line 694 "pikchr.y"
28112813
{yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.x += yymsp[-3].minor.yy153;}
2812
-#line 2837 "pikchr.c"
2814
+#line 2839 "pikchr.c"
28132815
yymsp[-3].minor.yy79 = yylhsminor.yy79;
28142816
break;
28152817
case 77: /* position ::= expr ON HEADING EDGEPT OF position */
2816
-#line 694 "pikchr.y"
2818
+#line 696 "pikchr.y"
28172819
{yylhsminor.yy79 = pik_position_at_hdg(yymsp[-5].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2818
-#line 2843 "pikchr.c"
2820
+#line 2845 "pikchr.c"
28192821
yymsp[-5].minor.yy79 = yylhsminor.yy79;
28202822
break;
28212823
case 78: /* position ::= expr HEADING EDGEPT OF position */
2822
-#line 696 "pikchr.y"
2824
+#line 698 "pikchr.y"
28232825
{yylhsminor.yy79 = pik_position_at_hdg(yymsp[-4].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2824
-#line 2849 "pikchr.c"
2826
+#line 2851 "pikchr.c"
28252827
yymsp[-4].minor.yy79 = yylhsminor.yy79;
28262828
break;
28272829
case 79: /* position ::= expr EDGEPT OF position */
2828
-#line 698 "pikchr.y"
2830
+#line 700 "pikchr.y"
28292831
{yylhsminor.yy79 = pik_position_at_hdg(yymsp[-3].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2830
-#line 2855 "pikchr.c"
2832
+#line 2857 "pikchr.c"
28312833
yymsp[-3].minor.yy79 = yylhsminor.yy79;
28322834
break;
28332835
case 80: /* position ::= expr ON HEADING expr FROM position */
2834
-#line 700 "pikchr.y"
2836
+#line 702 "pikchr.y"
28352837
{yylhsminor.yy79 = pik_position_at_angle(yymsp[-5].minor.yy153,yymsp[-2].minor.yy153,yymsp[0].minor.yy79);}
2836
-#line 2861 "pikchr.c"
2838
+#line 2863 "pikchr.c"
28372839
yymsp[-5].minor.yy79 = yylhsminor.yy79;
28382840
break;
28392841
case 81: /* position ::= expr HEADING expr FROM position */
2840
-#line 702 "pikchr.y"
2842
+#line 704 "pikchr.y"
28412843
{yylhsminor.yy79 = pik_position_at_angle(yymsp[-4].minor.yy153,yymsp[-2].minor.yy153,yymsp[0].minor.yy79);}
2842
-#line 2867 "pikchr.c"
2844
+#line 2869 "pikchr.c"
28432845
yymsp[-4].minor.yy79 = yylhsminor.yy79;
28442846
break;
28452847
case 82: /* place ::= edge OF object */
2846
-#line 714 "pikchr.y"
2848
+#line 716 "pikchr.y"
28472849
{yylhsminor.yy79 = pik_place_of_elem(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2848
-#line 2873 "pikchr.c"
2850
+#line 2875 "pikchr.c"
28492851
yymsp[-2].minor.yy79 = yylhsminor.yy79;
28502852
break;
28512853
case 83: /* place2 ::= object */
2852
-#line 715 "pikchr.y"
2854
+#line 717 "pikchr.y"
28532855
{yylhsminor.yy79 = pik_place_of_elem(p,yymsp[0].minor.yy36,0);}
2854
-#line 2879 "pikchr.c"
2856
+#line 2881 "pikchr.c"
28552857
yymsp[0].minor.yy79 = yylhsminor.yy79;
28562858
break;
28572859
case 84: /* place2 ::= object DOT_E edge */
2858
-#line 716 "pikchr.y"
2860
+#line 718 "pikchr.y"
28592861
{yylhsminor.yy79 = pik_place_of_elem(p,yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
2860
-#line 2885 "pikchr.c"
2862
+#line 2887 "pikchr.c"
28612863
yymsp[-2].minor.yy79 = yylhsminor.yy79;
28622864
break;
28632865
case 85: /* place2 ::= NTH VERTEX OF object */
2864
-#line 717 "pikchr.y"
2866
+#line 719 "pikchr.y"
28652867
{yylhsminor.yy79 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy36);}
2866
-#line 2891 "pikchr.c"
2868
+#line 2893 "pikchr.c"
28672869
yymsp[-3].minor.yy79 = yylhsminor.yy79;
28682870
break;
28692871
case 86: /* object ::= nth */
2870
-#line 729 "pikchr.y"
2872
+#line 731 "pikchr.y"
28712873
{yylhsminor.yy36 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2872
-#line 2897 "pikchr.c"
2874
+#line 2899 "pikchr.c"
28732875
yymsp[0].minor.yy36 = yylhsminor.yy36;
28742876
break;
28752877
case 87: /* object ::= nth OF|IN object */
2876
-#line 730 "pikchr.y"
2878
+#line 732 "pikchr.y"
28772879
{yylhsminor.yy36 = pik_find_nth(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2878
-#line 2903 "pikchr.c"
2880
+#line 2905 "pikchr.c"
28792881
yymsp[-2].minor.yy36 = yylhsminor.yy36;
28802882
break;
28812883
case 88: /* objectname ::= THIS */
2882
-#line 732 "pikchr.y"
2884
+#line 734 "pikchr.y"
28832885
{yymsp[0].minor.yy36 = p->cur;}
2884
-#line 2909 "pikchr.c"
2886
+#line 2911 "pikchr.c"
28852887
break;
28862888
case 89: /* objectname ::= PLACENAME */
2887
-#line 733 "pikchr.y"
2889
+#line 735 "pikchr.y"
28882890
{yylhsminor.yy36 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2889
-#line 2914 "pikchr.c"
2891
+#line 2916 "pikchr.c"
28902892
yymsp[0].minor.yy36 = yylhsminor.yy36;
28912893
break;
28922894
case 90: /* objectname ::= objectname DOT_U PLACENAME */
2893
-#line 735 "pikchr.y"
2895
+#line 737 "pikchr.y"
28942896
{yylhsminor.yy36 = pik_find_byname(p,yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
2895
-#line 2920 "pikchr.c"
2897
+#line 2922 "pikchr.c"
28962898
yymsp[-2].minor.yy36 = yylhsminor.yy36;
28972899
break;
28982900
case 91: /* nth ::= NTH CLASSNAME */
2899
-#line 737 "pikchr.y"
2901
+#line 739 "pikchr.y"
29002902
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2901
-#line 2926 "pikchr.c"
2903
+#line 2928 "pikchr.c"
29022904
yymsp[-1].minor.yy0 = yylhsminor.yy0;
29032905
break;
29042906
case 92: /* nth ::= NTH LAST CLASSNAME */
2905
-#line 738 "pikchr.y"
2907
+#line 740 "pikchr.y"
29062908
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2907
-#line 2932 "pikchr.c"
2909
+#line 2934 "pikchr.c"
29082910
yymsp[-2].minor.yy0 = yylhsminor.yy0;
29092911
break;
29102912
case 93: /* nth ::= LAST CLASSNAME */
2911
-#line 739 "pikchr.y"
2913
+#line 741 "pikchr.y"
29122914
{yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2913
-#line 2938 "pikchr.c"
2915
+#line 2940 "pikchr.c"
29142916
break;
29152917
case 94: /* nth ::= LAST */
2916
-#line 740 "pikchr.y"
2918
+#line 742 "pikchr.y"
29172919
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2918
-#line 2943 "pikchr.c"
2920
+#line 2945 "pikchr.c"
29192921
yymsp[0].minor.yy0 = yylhsminor.yy0;
29202922
break;
29212923
case 95: /* nth ::= NTH LB RB */
2922
-#line 741 "pikchr.y"
2924
+#line 743 "pikchr.y"
29232925
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2924
-#line 2949 "pikchr.c"
2926
+#line 2951 "pikchr.c"
29252927
yymsp[-2].minor.yy0 = yylhsminor.yy0;
29262928
break;
29272929
case 96: /* nth ::= NTH LAST LB RB */
2928
-#line 742 "pikchr.y"
2930
+#line 744 "pikchr.y"
29292931
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2930
-#line 2955 "pikchr.c"
2932
+#line 2957 "pikchr.c"
29312933
yymsp[-3].minor.yy0 = yylhsminor.yy0;
29322934
break;
29332935
case 97: /* nth ::= LAST LB RB */
2934
-#line 743 "pikchr.y"
2936
+#line 745 "pikchr.y"
29352937
{yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2936
-#line 2961 "pikchr.c"
2938
+#line 2963 "pikchr.c"
29372939
break;
29382940
case 98: /* expr ::= expr PLUS expr */
2939
-#line 745 "pikchr.y"
2941
+#line 747 "pikchr.y"
29402942
{yylhsminor.yy153=yymsp[-2].minor.yy153+yymsp[0].minor.yy153;}
2941
-#line 2966 "pikchr.c"
2943
+#line 2968 "pikchr.c"
29422944
yymsp[-2].minor.yy153 = yylhsminor.yy153;
29432945
break;
29442946
case 99: /* expr ::= expr MINUS expr */
2945
-#line 746 "pikchr.y"
2947
+#line 748 "pikchr.y"
29462948
{yylhsminor.yy153=yymsp[-2].minor.yy153-yymsp[0].minor.yy153;}
2947
-#line 2972 "pikchr.c"
2949
+#line 2974 "pikchr.c"
29482950
yymsp[-2].minor.yy153 = yylhsminor.yy153;
29492951
break;
29502952
case 100: /* expr ::= expr STAR expr */
2951
-#line 747 "pikchr.y"
2953
+#line 749 "pikchr.y"
29522954
{yylhsminor.yy153=yymsp[-2].minor.yy153*yymsp[0].minor.yy153;}
2953
-#line 2978 "pikchr.c"
2955
+#line 2980 "pikchr.c"
29542956
yymsp[-2].minor.yy153 = yylhsminor.yy153;
29552957
break;
29562958
case 101: /* expr ::= expr SLASH expr */
2957
-#line 748 "pikchr.y"
2959
+#line 750 "pikchr.y"
29582960
{
29592961
if( yymsp[0].minor.yy153==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy153 = 0.0; }
29602962
else{ yylhsminor.yy153 = yymsp[-2].minor.yy153/yymsp[0].minor.yy153; }
29612963
}
2962
-#line 2987 "pikchr.c"
2964
+#line 2989 "pikchr.c"
29632965
yymsp[-2].minor.yy153 = yylhsminor.yy153;
29642966
break;
29652967
case 102: /* expr ::= MINUS expr */
2966
-#line 752 "pikchr.y"
2968
+#line 754 "pikchr.y"
29672969
{yymsp[-1].minor.yy153=-yymsp[0].minor.yy153;}
2968
-#line 2993 "pikchr.c"
2970
+#line 2995 "pikchr.c"
29692971
break;
29702972
case 103: /* expr ::= PLUS expr */
2971
-#line 753 "pikchr.y"
2973
+#line 755 "pikchr.y"
29722974
{yymsp[-1].minor.yy153=yymsp[0].minor.yy153;}
2973
-#line 2998 "pikchr.c"
2975
+#line 3000 "pikchr.c"
29742976
break;
29752977
case 104: /* expr ::= LP expr RP */
2976
-#line 754 "pikchr.y"
2978
+#line 756 "pikchr.y"
29772979
{yymsp[-2].minor.yy153=yymsp[-1].minor.yy153;}
2978
-#line 3003 "pikchr.c"
2980
+#line 3005 "pikchr.c"
29792981
break;
29802982
case 105: /* expr ::= LP FILL|COLOR|THICKNESS RP */
2981
-#line 755 "pikchr.y"
2983
+#line 757 "pikchr.y"
29822984
{yymsp[-2].minor.yy153=pik_get_var(p,&yymsp[-1].minor.yy0);}
2983
-#line 3008 "pikchr.c"
2985
+#line 3010 "pikchr.c"
29842986
break;
29852987
case 106: /* expr ::= NUMBER */
2986
-#line 756 "pikchr.y"
2988
+#line 758 "pikchr.y"
29872989
{yylhsminor.yy153=pik_atof(&yymsp[0].minor.yy0);}
2988
-#line 3013 "pikchr.c"
2990
+#line 3015 "pikchr.c"
29892991
yymsp[0].minor.yy153 = yylhsminor.yy153;
29902992
break;
29912993
case 107: /* expr ::= ID */
2992
-#line 757 "pikchr.y"
2994
+#line 759 "pikchr.y"
29932995
{yylhsminor.yy153=pik_get_var(p,&yymsp[0].minor.yy0);}
2994
-#line 3019 "pikchr.c"
2996
+#line 3021 "pikchr.c"
29952997
yymsp[0].minor.yy153 = yylhsminor.yy153;
29962998
break;
29972999
case 108: /* expr ::= FUNC1 LP expr RP */
2998
-#line 758 "pikchr.y"
3000
+#line 760 "pikchr.y"
29993001
{yylhsminor.yy153 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy153,0.0);}
3000
-#line 3025 "pikchr.c"
3002
+#line 3027 "pikchr.c"
30013003
yymsp[-3].minor.yy153 = yylhsminor.yy153;
30023004
break;
30033005
case 109: /* expr ::= FUNC2 LP expr COMMA expr RP */
3004
-#line 759 "pikchr.y"
3006
+#line 761 "pikchr.y"
30053007
{yylhsminor.yy153 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy153,yymsp[-1].minor.yy153);}
3006
-#line 3031 "pikchr.c"
3008
+#line 3033 "pikchr.c"
30073009
yymsp[-5].minor.yy153 = yylhsminor.yy153;
30083010
break;
30093011
case 110: /* expr ::= DIST LP position COMMA position RP */
3010
-#line 760 "pikchr.y"
3012
+#line 762 "pikchr.y"
30113013
{yymsp[-5].minor.yy153 = pik_dist(&yymsp[-3].minor.yy79,&yymsp[-1].minor.yy79);}
3012
-#line 3037 "pikchr.c"
3014
+#line 3039 "pikchr.c"
30133015
break;
30143016
case 111: /* expr ::= place2 DOT_XY X */
3015
-#line 761 "pikchr.y"
3017
+#line 763 "pikchr.y"
30163018
{yylhsminor.yy153 = yymsp[-2].minor.yy79.x;}
3017
-#line 3042 "pikchr.c"
3019
+#line 3044 "pikchr.c"
30183020
yymsp[-2].minor.yy153 = yylhsminor.yy153;
30193021
break;
30203022
case 112: /* expr ::= place2 DOT_XY Y */
3021
-#line 762 "pikchr.y"
3023
+#line 764 "pikchr.y"
30223024
{yylhsminor.yy153 = yymsp[-2].minor.yy79.y;}
3023
-#line 3048 "pikchr.c"
3025
+#line 3050 "pikchr.c"
30243026
yymsp[-2].minor.yy153 = yylhsminor.yy153;
30253027
break;
30263028
case 113: /* expr ::= object DOT_L numproperty */
30273029
case 114: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==114);
30283030
case 115: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==115);
3029
-#line 763 "pikchr.y"
3031
+#line 765 "pikchr.y"
30303032
{yylhsminor.yy153=pik_property_of(yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
3031
-#line 3056 "pikchr.c"
3033
+#line 3058 "pikchr.c"
30323034
yymsp[-2].minor.yy153 = yylhsminor.yy153;
30333035
break;
30343036
default:
30353037
/* (116) lvalue ::= ID */ yytestcase(yyruleno==116);
30363038
/* (117) lvalue ::= FILL */ yytestcase(yyruleno==117);
@@ -3129,19 +3131,19 @@
31293131
){
31303132
pik_parserARG_FETCH
31313133
pik_parserCTX_FETCH
31323134
#define TOKEN yyminor
31333135
/************ Begin %syntax_error code ****************************************/
3134
-#line 523 "pikchr.y"
3136
+#line 525 "pikchr.y"
31353137
31363138
if( TOKEN.z && TOKEN.z[0] ){
31373139
pik_error(p, &TOKEN, "syntax error");
31383140
}else{
31393141
pik_error(p, 0, "syntax error");
31403142
}
31413143
UNUSED_PARAMETER(yymajor);
3142
-#line 3167 "pikchr.c"
3144
+#line 3169 "pikchr.c"
31433145
/************ End %syntax_error code ******************************************/
31443146
pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
31453147
pik_parserCTX_STORE
31463148
}
31473149
@@ -3370,11 +3372,11 @@
33703372
#else
33713373
(void)iToken;
33723374
return 0;
33733375
#endif
33743376
}
3375
-#line 768 "pikchr.y"
3377
+#line 770 "pikchr.y"
33763378
33773379
33783380
33793381
/* Chart of the 148 official CSS color names with their
33803382
** corresponding RGB values thru Color Module Level 4:
@@ -5851,10 +5853,38 @@
58515853
p->mTPath |= 1;
58525854
break;
58535855
}
58545856
pObj->outDir = pDir->eCode;
58555857
}
5858
+
5859
+/* If the last referenced object is centered at point pPt then return
5860
+** a pointer to that object. If there is no prior object reference,
5861
+** or if the points are not the same, return NULL.
5862
+**
5863
+** This is a side-channel hack used to find the objects at which a
5864
+** line begins and ends. For example, in
5865
+**
5866
+** arrow from OBJ1 to OBJ2 chop
5867
+**
5868
+** The arrow object is normally just handed the coordinates of the
5869
+** centers for OBJ1 and OBJ2. But we also want to know the specific
5870
+** object named in case there are multiple objects centered at the
5871
+** same point.
5872
+**
5873
+** See forum post 1d46e3a0bc
5874
+*/
5875
+static PObj *pik_last_ref_object(Pik *p, PPoint *pPt){
5876
+ PObj *pRes = 0;
5877
+ if( p->lastRef==0 ) return 0;
5878
+ if( p->lastRef->ptAt.x==pPt->x
5879
+ && p->lastRef->ptAt.y==pPt->y
5880
+ ){
5881
+ pRes = p->lastRef;
5882
+ }
5883
+ p->lastRef = 0;
5884
+ return pRes;
5885
+}
58565886
58575887
/* Set the "from" of an object
58585888
*/
58595889
static void pik_set_from(Pik *p, PObj *pObj, PToken *pTk, PPoint *pPt){
58605890
if( !pObj->type->isLine ){
@@ -5879,10 +5909,11 @@
58795909
}
58805910
}
58815911
p->aTPath[0] = *pPt;
58825912
p->mTPath = 3;
58835913
pObj->mProp |= A_FROM;
5914
+ pObj->pFrom = pik_last_ref_object(p, pPt);
58845915
}
58855916
58865917
/* Set the "to" of an object
58875918
*/
58885919
static void pik_add_to(Pik *p, PObj *pObj, PToken *pTk, PPoint *pPt){
@@ -5899,10 +5930,11 @@
58995930
if( n==0 || p->mTPath==3 || p->thenFlag ){
59005931
n = pik_next_rpath(p, pTk);
59015932
}
59025933
p->aTPath[n] = *pPt;
59035934
p->mTPath = 3;
5935
+ pObj->pTo = pik_last_ref_object(p, pPt);
59045936
}
59055937
59065938
static void pik_close_path(Pik *p, PToken *pErr){
59075939
PObj *pObj = p->cur;
59085940
if( p->nTPath<3 ){
@@ -6440,10 +6472,11 @@
64406472
}
64416473
/* First look explicitly tagged objects */
64426474
for(i=pList->n-1; i>=0; i--){
64436475
PObj *pObj = pList->a[i];
64446476
if( pObj->zName && pik_token_eq(pName,pObj->zName)==0 ){
6477
+ p->lastRef = pObj;
64456478
return pObj;
64466479
}
64476480
}
64486481
/* If not found, do a second pass looking for any object containing
64496482
** text which exactly matches pName */
@@ -6450,10 +6483,11 @@
64506483
for(i=pList->n-1; i>=0; i--){
64516484
PObj *pObj = pList->a[i];
64526485
for(j=0; j<pObj->nTxt; j++){
64536486
if( pObj->aTxt[j].n==pName->n+2
64546487
&& memcmp(pObj->aTxt[j].z+1,pName->z,pName->n)==0 ){
6488
+ p->lastRef = pObj;
64556489
return pObj;
64566490
}
64576491
}
64586492
}
64596493
pik_error(p, pName, "no such object");
@@ -6678,12 +6712,14 @@
66786712
**
66796713
** If point pTo is the exact enter of a choppable object,
66806714
** then adjust pTo by the appropriate amount in the direction
66816715
** of pFrom.
66826716
*/
6683
-static void pik_autochop(Pik *p, PPoint *pFrom, PPoint *pTo){
6684
- PObj *pObj = pik_find_chopper(p->list, pTo, pFrom);
6717
+static void pik_autochop(Pik *p, PPoint *pFrom, PPoint *pTo, PObj *pObj){
6718
+ if( pObj==0 || pObj->type->xChop==0 ){
6719
+ pObj = pik_find_chopper(p->list, pTo, pFrom);
6720
+ }
66856721
if( pObj ){
66866722
*pTo = pObj->type->xChop(p, pObj, pFrom);
66876723
}
66886724
}
66896725
@@ -6778,12 +6814,12 @@
67786814
** If the line goes to the center of an object with an
67796815
** xChop method, then use the xChop method to trim the line.
67806816
*/
67816817
if( pObj->bChop && pObj->nPath>=2 ){
67826818
int n = pObj->nPath;
6783
- pik_autochop(p, &pObj->aPath[n-2], &pObj->aPath[n-1]);
6784
- pik_autochop(p, &pObj->aPath[1], &pObj->aPath[0]);
6819
+ pik_autochop(p, &pObj->aPath[n-2], &pObj->aPath[n-1], pObj->pTo);
6820
+ pik_autochop(p, &pObj->aPath[1], &pObj->aPath[0], pObj->pFrom);
67856821
}
67866822
67876823
pObj->ptEnter = pObj->aPath[0];
67886824
pObj->ptExit = pObj->aPath[pObj->nPath-1];
67896825
@@ -8041,6 +8077,6 @@
80418077
80428078
80438079
#endif /* PIKCHR_TCL */
80448080
80458081
8046
-#line 8071 "pikchr.c"
8082
+#line 8107 "pikchr.c"
80478083
--- src/pikchr.c
+++ src/pikchr.c
@@ -317,10 +317,11 @@
317 PToken aTxt[5]; /* Text with .eCode holding TP flags */
318 int iLayer; /* Rendering order */
319 int inDir, outDir; /* Entry and exit directions */
320 int nPath; /* Number of path points */
321 PPoint *aPath; /* Array of path points */
 
322 PBox bbox; /* Bounding box */
323 };
324
325 /* A list of graphics objects */
326 struct PList {
@@ -347,10 +348,11 @@
347 unsigned int nOut; /* Bytes written to zOut[] so far */
348 unsigned int nOutAlloc; /* Space allocated to zOut[] */
349 unsigned char eDir; /* Current direction */
350 unsigned int mFlags; /* Flags passed to pikchr() */
351 PObj *cur; /* Object under construction */
 
352 PList *list; /* Object list under construction */
353 PMacro *pMacros; /* List of all defined macros */
354 PVar *pVar; /* Application-defined variables */
355 PBox bbox; /* Bounding box around all statements */
356 /* Cache of layout values. <=0.0 for unknown... */
@@ -477,11 +479,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
@@ -1706,22 +1708,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 }
@@ -1935,14 +1937,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
@@ -2418,619 +2420,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);
@@ -3129,19 +3131,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
@@ -3370,11 +3372,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:
@@ -5851,10 +5853,38 @@
5851 p->mTPath |= 1;
5852 break;
5853 }
5854 pObj->outDir = pDir->eCode;
5855 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5856
5857 /* Set the "from" of an object
5858 */
5859 static void pik_set_from(Pik *p, PObj *pObj, PToken *pTk, PPoint *pPt){
5860 if( !pObj->type->isLine ){
@@ -5879,10 +5909,11 @@
5879 }
5880 }
5881 p->aTPath[0] = *pPt;
5882 p->mTPath = 3;
5883 pObj->mProp |= A_FROM;
 
5884 }
5885
5886 /* Set the "to" of an object
5887 */
5888 static void pik_add_to(Pik *p, PObj *pObj, PToken *pTk, PPoint *pPt){
@@ -5899,10 +5930,11 @@
5899 if( n==0 || p->mTPath==3 || p->thenFlag ){
5900 n = pik_next_rpath(p, pTk);
5901 }
5902 p->aTPath[n] = *pPt;
5903 p->mTPath = 3;
 
5904 }
5905
5906 static void pik_close_path(Pik *p, PToken *pErr){
5907 PObj *pObj = p->cur;
5908 if( p->nTPath<3 ){
@@ -6440,10 +6472,11 @@
6440 }
6441 /* First look explicitly tagged objects */
6442 for(i=pList->n-1; i>=0; i--){
6443 PObj *pObj = pList->a[i];
6444 if( pObj->zName && pik_token_eq(pName,pObj->zName)==0 ){
 
6445 return pObj;
6446 }
6447 }
6448 /* If not found, do a second pass looking for any object containing
6449 ** text which exactly matches pName */
@@ -6450,10 +6483,11 @@
6450 for(i=pList->n-1; i>=0; i--){
6451 PObj *pObj = pList->a[i];
6452 for(j=0; j<pObj->nTxt; j++){
6453 if( pObj->aTxt[j].n==pName->n+2
6454 && memcmp(pObj->aTxt[j].z+1,pName->z,pName->n)==0 ){
 
6455 return pObj;
6456 }
6457 }
6458 }
6459 pik_error(p, pName, "no such object");
@@ -6678,12 +6712,14 @@
6678 **
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
@@ -6778,12 +6814,12 @@
6778 ** If the line goes to the center of an object with an
6779 ** xChop method, then use the xChop method to trim the line.
6780 */
6781 if( pObj->bChop && pObj->nPath>=2 ){
6782 int n = pObj->nPath;
6783 pik_autochop(p, &pObj->aPath[n-2], &pObj->aPath[n-1]);
6784 pik_autochop(p, &pObj->aPath[1], &pObj->aPath[0]);
6785 }
6786
6787 pObj->ptEnter = pObj->aPath[0];
6788 pObj->ptExit = pObj->aPath[pObj->nPath-1];
6789
@@ -8041,6 +8077,6 @@
8041
8042
8043 #endif /* PIKCHR_TCL */
8044
8045
8046 #line 8071 "pikchr.c"
8047
--- src/pikchr.c
+++ src/pikchr.c
@@ -317,10 +317,11 @@
317 PToken aTxt[5]; /* Text with .eCode holding TP flags */
318 int iLayer; /* Rendering order */
319 int inDir, outDir; /* Entry and exit directions */
320 int nPath; /* Number of path points */
321 PPoint *aPath; /* Array of path points */
322 PObj *pFrom, *pTo; /* End-point objects of a path */
323 PBox bbox; /* Bounding box */
324 };
325
326 /* A list of graphics objects */
327 struct PList {
@@ -347,10 +348,11 @@
348 unsigned int nOut; /* Bytes written to zOut[] so far */
349 unsigned int nOutAlloc; /* Space allocated to zOut[] */
350 unsigned char eDir; /* Current direction */
351 unsigned int mFlags; /* Flags passed to pikchr() */
352 PObj *cur; /* Object under construction */
353 PObj *lastRef; /* Last object references by "place" */
354 PList *list; /* Object list under construction */
355 PMacro *pMacros; /* List of all defined macros */
356 PVar *pVar; /* Application-defined variables */
357 PBox bbox; /* Bounding box around all statements */
358 /* Cache of layout values. <=0.0 for unknown... */
@@ -477,11 +479,11 @@
479 static PObj *pik_position_assert(Pik*,PPoint*,PToken*,PPoint*);
480 static PNum pik_dist(PPoint*,PPoint*);
481 static void pik_add_macro(Pik*,PToken *pId,PToken *pCode);
482
483
484 #line 510 "pikchr.c"
485 /**************** End of %include directives **********************************/
486 /* These constants specify the various numeric values for terminal symbols.
487 ***************** Begin token definitions *************************************/
488 #ifndef T_ID
489 #define T_ID 1
@@ -1706,22 +1708,22 @@
1708 ** inside the C code.
1709 */
1710 /********* Begin destructor definitions ***************************************/
1711 case 99: /* statement_list */
1712 {
1713 #line 499 "pikchr.y"
1714 pik_elist_free(p,(yypminor->yy227));
1715 #line 1740 "pikchr.c"
1716 }
1717 break;
1718 case 100: /* statement */
1719 case 101: /* unnamed_statement */
1720 case 102: /* basetype */
1721 {
1722 #line 501 "pikchr.y"
1723 pik_elem_free(p,(yypminor->yy36));
1724 #line 1749 "pikchr.c"
1725 }
1726 break;
1727 /********* End destructor definitions *****************************************/
1728 default: break; /* If no destructor action specified: do nothing */
1729 }
@@ -1935,14 +1937,14 @@
1937 #endif
1938 while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
1939 /* Here code is inserted which will execute if the parser
1940 ** stack every overflows */
1941 /******** Begin %stack_overflow code ******************************************/
1942 #line 533 "pikchr.y"
1943
1944 pik_error(p, 0, "parser stack overflow");
1945 #line 1970 "pikchr.c"
1946 /******** End %stack_overflow code ********************************************/
1947 pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
1948 pik_parserCTX_STORE
1949 }
1950
@@ -2418,619 +2420,619 @@
2420 ** break;
2421 */
2422 /********** Begin reduce actions **********************************************/
2423 YYMINORTYPE yylhsminor;
2424 case 0: /* document ::= statement_list */
2425 #line 537 "pikchr.y"
2426 {pik_render(p,yymsp[0].minor.yy227);}
2427 #line 2452 "pikchr.c"
2428 break;
2429 case 1: /* statement_list ::= statement */
2430 #line 540 "pikchr.y"
2431 { yylhsminor.yy227 = pik_elist_append(p,0,yymsp[0].minor.yy36); }
2432 #line 2457 "pikchr.c"
2433 yymsp[0].minor.yy227 = yylhsminor.yy227;
2434 break;
2435 case 2: /* statement_list ::= statement_list EOL statement */
2436 #line 542 "pikchr.y"
2437 { yylhsminor.yy227 = pik_elist_append(p,yymsp[-2].minor.yy227,yymsp[0].minor.yy36); }
2438 #line 2463 "pikchr.c"
2439 yymsp[-2].minor.yy227 = yylhsminor.yy227;
2440 break;
2441 case 3: /* statement ::= */
2442 #line 545 "pikchr.y"
2443 { yymsp[1].minor.yy36 = 0; }
2444 #line 2469 "pikchr.c"
2445 break;
2446 case 4: /* statement ::= direction */
2447 #line 546 "pikchr.y"
2448 { pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy36=0; }
2449 #line 2474 "pikchr.c"
2450 yymsp[0].minor.yy36 = yylhsminor.yy36;
2451 break;
2452 case 5: /* statement ::= lvalue ASSIGN rvalue */
2453 #line 547 "pikchr.y"
2454 {pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy153,&yymsp[-1].minor.yy0); yylhsminor.yy36=0;}
2455 #line 2480 "pikchr.c"
2456 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2457 break;
2458 case 6: /* statement ::= PLACENAME COLON unnamed_statement */
2459 #line 549 "pikchr.y"
2460 { yylhsminor.yy36 = yymsp[0].minor.yy36; pik_elem_setname(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0); }
2461 #line 2486 "pikchr.c"
2462 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2463 break;
2464 case 7: /* statement ::= PLACENAME COLON position */
2465 #line 551 "pikchr.y"
2466 { yylhsminor.yy36 = pik_elem_new(p,0,0,0);
2467 if(yylhsminor.yy36){ yylhsminor.yy36->ptAt = yymsp[0].minor.yy79; pik_elem_setname(p,yylhsminor.yy36,&yymsp[-2].minor.yy0); }}
2468 #line 2493 "pikchr.c"
2469 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2470 break;
2471 case 8: /* statement ::= unnamed_statement */
2472 #line 553 "pikchr.y"
2473 {yylhsminor.yy36 = yymsp[0].minor.yy36;}
2474 #line 2499 "pikchr.c"
2475 yymsp[0].minor.yy36 = yylhsminor.yy36;
2476 break;
2477 case 9: /* statement ::= print prlist */
2478 #line 554 "pikchr.y"
2479 {pik_append(p,"<br>\n",5); yymsp[-1].minor.yy36=0;}
2480 #line 2505 "pikchr.c"
2481 break;
2482 case 10: /* statement ::= ASSERT LP expr EQ expr RP */
2483 #line 559 "pikchr.y"
2484 {yymsp[-5].minor.yy36=pik_assert(p,yymsp[-3].minor.yy153,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy153);}
2485 #line 2510 "pikchr.c"
2486 break;
2487 case 11: /* statement ::= ASSERT LP position EQ position RP */
2488 #line 561 "pikchr.y"
2489 {yymsp[-5].minor.yy36=pik_position_assert(p,&yymsp[-3].minor.yy79,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy79);}
2490 #line 2515 "pikchr.c"
2491 break;
2492 case 12: /* statement ::= DEFINE ID CODEBLOCK */
2493 #line 562 "pikchr.y"
2494 {yymsp[-2].minor.yy36=0; pik_add_macro(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
2495 #line 2520 "pikchr.c"
2496 break;
2497 case 13: /* rvalue ::= PLACENAME */
2498 #line 573 "pikchr.y"
2499 {yylhsminor.yy153 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2500 #line 2525 "pikchr.c"
2501 yymsp[0].minor.yy153 = yylhsminor.yy153;
2502 break;
2503 case 14: /* pritem ::= FILL */
2504 case 15: /* pritem ::= COLOR */ yytestcase(yyruleno==15);
2505 case 16: /* pritem ::= THICKNESS */ yytestcase(yyruleno==16);
2506 #line 578 "pikchr.y"
2507 {pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2508 #line 2533 "pikchr.c"
2509 break;
2510 case 17: /* pritem ::= rvalue */
2511 #line 581 "pikchr.y"
2512 {pik_append_num(p,"",yymsp[0].minor.yy153);}
2513 #line 2538 "pikchr.c"
2514 break;
2515 case 18: /* pritem ::= STRING */
2516 #line 582 "pikchr.y"
2517 {pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2518 #line 2543 "pikchr.c"
2519 break;
2520 case 19: /* prsep ::= COMMA */
2521 #line 583 "pikchr.y"
2522 {pik_append(p, " ", 1);}
2523 #line 2548 "pikchr.c"
2524 break;
2525 case 20: /* unnamed_statement ::= basetype attribute_list */
2526 #line 586 "pikchr.y"
2527 {yylhsminor.yy36 = yymsp[-1].minor.yy36; pik_after_adding_attributes(p,yylhsminor.yy36);}
2528 #line 2553 "pikchr.c"
2529 yymsp[-1].minor.yy36 = yylhsminor.yy36;
2530 break;
2531 case 21: /* basetype ::= CLASSNAME */
2532 #line 588 "pikchr.y"
2533 {yylhsminor.yy36 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2534 #line 2559 "pikchr.c"
2535 yymsp[0].minor.yy36 = yylhsminor.yy36;
2536 break;
2537 case 22: /* basetype ::= STRING textposition */
2538 #line 590 "pikchr.y"
2539 {yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy164; yylhsminor.yy36 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2540 #line 2565 "pikchr.c"
2541 yymsp[-1].minor.yy36 = yylhsminor.yy36;
2542 break;
2543 case 23: /* basetype ::= LB savelist statement_list RB */
2544 #line 592 "pikchr.y"
2545 { p->list = yymsp[-2].minor.yy227; yymsp[-3].minor.yy36 = pik_elem_new(p,0,0,yymsp[-1].minor.yy227); if(yymsp[-3].minor.yy36) yymsp[-3].minor.yy36->errTok = yymsp[0].minor.yy0; }
2546 #line 2571 "pikchr.c"
2547 break;
2548 case 24: /* savelist ::= */
2549 #line 597 "pikchr.y"
2550 {yymsp[1].minor.yy227 = p->list; p->list = 0;}
2551 #line 2576 "pikchr.c"
2552 break;
2553 case 25: /* relexpr ::= expr */
2554 #line 604 "pikchr.y"
2555 {yylhsminor.yy10.rAbs = yymsp[0].minor.yy153; yylhsminor.yy10.rRel = 0;}
2556 #line 2581 "pikchr.c"
2557 yymsp[0].minor.yy10 = yylhsminor.yy10;
2558 break;
2559 case 26: /* relexpr ::= expr PERCENT */
2560 #line 605 "pikchr.y"
2561 {yylhsminor.yy10.rAbs = 0; yylhsminor.yy10.rRel = yymsp[-1].minor.yy153/100;}
2562 #line 2587 "pikchr.c"
2563 yymsp[-1].minor.yy10 = yylhsminor.yy10;
2564 break;
2565 case 27: /* optrelexpr ::= */
2566 #line 607 "pikchr.y"
2567 {yymsp[1].minor.yy10.rAbs = 0; yymsp[1].minor.yy10.rRel = 1.0;}
2568 #line 2593 "pikchr.c"
2569 break;
2570 case 28: /* attribute_list ::= relexpr alist */
2571 #line 609 "pikchr.y"
2572 {pik_add_direction(p,0,&yymsp[-1].minor.yy10);}
2573 #line 2598 "pikchr.c"
2574 break;
2575 case 29: /* attribute ::= numproperty relexpr */
2576 #line 613 "pikchr.y"
2577 { pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy10); }
2578 #line 2603 "pikchr.c"
2579 break;
2580 case 30: /* attribute ::= dashproperty expr */
2581 #line 614 "pikchr.y"
2582 { pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy153); }
2583 #line 2608 "pikchr.c"
2584 break;
2585 case 31: /* attribute ::= dashproperty */
2586 #line 615 "pikchr.y"
2587 { pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2588 #line 2613 "pikchr.c"
2589 break;
2590 case 32: /* attribute ::= colorproperty rvalue */
2591 #line 616 "pikchr.y"
2592 { pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy153); }
2593 #line 2618 "pikchr.c"
2594 break;
2595 case 33: /* attribute ::= go direction optrelexpr */
2596 #line 617 "pikchr.y"
2597 { pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy10);}
2598 #line 2623 "pikchr.c"
2599 break;
2600 case 34: /* attribute ::= go direction even position */
2601 #line 618 "pikchr.y"
2602 {pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy79);}
2603 #line 2628 "pikchr.c"
2604 break;
2605 case 35: /* attribute ::= CLOSE */
2606 #line 619 "pikchr.y"
2607 { pik_close_path(p,&yymsp[0].minor.yy0); }
2608 #line 2633 "pikchr.c"
2609 break;
2610 case 36: /* attribute ::= CHOP */
2611 #line 620 "pikchr.y"
2612 { p->cur->bChop = 1; }
2613 #line 2638 "pikchr.c"
2614 break;
2615 case 37: /* attribute ::= FROM position */
2616 #line 621 "pikchr.y"
2617 { pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy79); }
2618 #line 2643 "pikchr.c"
2619 break;
2620 case 38: /* attribute ::= TO position */
2621 #line 622 "pikchr.y"
2622 { pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy79); }
2623 #line 2648 "pikchr.c"
2624 break;
2625 case 39: /* attribute ::= THEN */
2626 #line 623 "pikchr.y"
2627 { pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2628 #line 2653 "pikchr.c"
2629 break;
2630 case 40: /* attribute ::= THEN optrelexpr HEADING expr */
2631 case 42: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==42);
2632 #line 625 "pikchr.y"
2633 {pik_move_hdg(p,&yymsp[-2].minor.yy10,&yymsp[-1].minor.yy0,yymsp[0].minor.yy153,0,&yymsp[-3].minor.yy0);}
2634 #line 2659 "pikchr.c"
2635 break;
2636 case 41: /* attribute ::= THEN optrelexpr EDGEPT */
2637 case 43: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==43);
2638 #line 626 "pikchr.y"
2639 {pik_move_hdg(p,&yymsp[-1].minor.yy10,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2640 #line 2665 "pikchr.c"
2641 break;
2642 case 44: /* attribute ::= AT position */
2643 #line 631 "pikchr.y"
2644 { pik_set_at(p,0,&yymsp[0].minor.yy79,&yymsp[-1].minor.yy0); }
2645 #line 2670 "pikchr.c"
2646 break;
2647 case 45: /* attribute ::= SAME */
2648 #line 633 "pikchr.y"
2649 {pik_same(p,0,&yymsp[0].minor.yy0);}
2650 #line 2675 "pikchr.c"
2651 break;
2652 case 46: /* attribute ::= SAME AS object */
2653 #line 634 "pikchr.y"
2654 {pik_same(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2655 #line 2680 "pikchr.c"
2656 break;
2657 case 47: /* attribute ::= STRING textposition */
2658 #line 635 "pikchr.y"
2659 {pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy164);}
2660 #line 2685 "pikchr.c"
2661 break;
2662 case 48: /* attribute ::= FIT */
2663 #line 636 "pikchr.y"
2664 {pik_size_to_fit(p,&yymsp[0].minor.yy0,3); }
2665 #line 2690 "pikchr.c"
2666 break;
2667 case 49: /* attribute ::= BEHIND object */
2668 #line 637 "pikchr.y"
2669 {pik_behind(p,yymsp[0].minor.yy36);}
2670 #line 2695 "pikchr.c"
2671 break;
2672 case 50: /* withclause ::= DOT_E edge AT position */
2673 case 51: /* withclause ::= edge AT position */ yytestcase(yyruleno==51);
2674 #line 645 "pikchr.y"
2675 { pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy79,&yymsp[-1].minor.yy0); }
2676 #line 2701 "pikchr.c"
2677 break;
2678 case 52: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2679 #line 649 "pikchr.y"
2680 {yylhsminor.yy0 = yymsp[0].minor.yy0;}
2681 #line 2706 "pikchr.c"
2682 yymsp[0].minor.yy0 = yylhsminor.yy0;
2683 break;
2684 case 53: /* boolproperty ::= CW */
2685 #line 660 "pikchr.y"
2686 {p->cur->cw = 1;}
2687 #line 2712 "pikchr.c"
2688 break;
2689 case 54: /* boolproperty ::= CCW */
2690 #line 661 "pikchr.y"
2691 {p->cur->cw = 0;}
2692 #line 2717 "pikchr.c"
2693 break;
2694 case 55: /* boolproperty ::= LARROW */
2695 #line 662 "pikchr.y"
2696 {p->cur->larrow=1; p->cur->rarrow=0; }
2697 #line 2722 "pikchr.c"
2698 break;
2699 case 56: /* boolproperty ::= RARROW */
2700 #line 663 "pikchr.y"
2701 {p->cur->larrow=0; p->cur->rarrow=1; }
2702 #line 2727 "pikchr.c"
2703 break;
2704 case 57: /* boolproperty ::= LRARROW */
2705 #line 664 "pikchr.y"
2706 {p->cur->larrow=1; p->cur->rarrow=1; }
2707 #line 2732 "pikchr.c"
2708 break;
2709 case 58: /* boolproperty ::= INVIS */
2710 #line 665 "pikchr.y"
2711 {p->cur->sw = 0.0;}
2712 #line 2737 "pikchr.c"
2713 break;
2714 case 59: /* boolproperty ::= THICK */
2715 #line 666 "pikchr.y"
2716 {p->cur->sw *= 1.5;}
2717 #line 2742 "pikchr.c"
2718 break;
2719 case 60: /* boolproperty ::= THIN */
2720 #line 667 "pikchr.y"
2721 {p->cur->sw *= 0.67;}
2722 #line 2747 "pikchr.c"
2723 break;
2724 case 61: /* boolproperty ::= SOLID */
2725 #line 668 "pikchr.y"
2726 {p->cur->sw = pik_value(p,"thickness",9,0);
2727 p->cur->dotted = p->cur->dashed = 0.0;}
2728 #line 2753 "pikchr.c"
2729 break;
2730 case 62: /* textposition ::= */
2731 #line 671 "pikchr.y"
2732 {yymsp[1].minor.yy164 = 0;}
2733 #line 2758 "pikchr.c"
2734 break;
2735 case 63: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2736 #line 674 "pikchr.y"
2737 {yylhsminor.yy164 = (short int)pik_text_position(yymsp[-1].minor.yy164,&yymsp[0].minor.yy0);}
2738 #line 2763 "pikchr.c"
2739 yymsp[-1].minor.yy164 = yylhsminor.yy164;
2740 break;
2741 case 64: /* position ::= expr COMMA expr */
2742 #line 677 "pikchr.y"
2743 {yylhsminor.yy79.x=yymsp[-2].minor.yy153; yylhsminor.yy79.y=yymsp[0].minor.yy153;}
2744 #line 2769 "pikchr.c"
2745 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2746 break;
2747 case 65: /* position ::= place PLUS expr COMMA expr */
2748 #line 679 "pikchr.y"
2749 {yylhsminor.yy79.x=yymsp[-4].minor.yy79.x+yymsp[-2].minor.yy153; yylhsminor.yy79.y=yymsp[-4].minor.yy79.y+yymsp[0].minor.yy153;}
2750 #line 2775 "pikchr.c"
2751 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2752 break;
2753 case 66: /* position ::= place MINUS expr COMMA expr */
2754 #line 680 "pikchr.y"
2755 {yylhsminor.yy79.x=yymsp[-4].minor.yy79.x-yymsp[-2].minor.yy153; yylhsminor.yy79.y=yymsp[-4].minor.yy79.y-yymsp[0].minor.yy153;}
2756 #line 2781 "pikchr.c"
2757 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2758 break;
2759 case 67: /* position ::= place PLUS LP expr COMMA expr RP */
2760 #line 682 "pikchr.y"
2761 {yylhsminor.yy79.x=yymsp[-6].minor.yy79.x+yymsp[-3].minor.yy153; yylhsminor.yy79.y=yymsp[-6].minor.yy79.y+yymsp[-1].minor.yy153;}
2762 #line 2787 "pikchr.c"
2763 yymsp[-6].minor.yy79 = yylhsminor.yy79;
2764 break;
2765 case 68: /* position ::= place MINUS LP expr COMMA expr RP */
2766 #line 684 "pikchr.y"
2767 {yylhsminor.yy79.x=yymsp[-6].minor.yy79.x-yymsp[-3].minor.yy153; yylhsminor.yy79.y=yymsp[-6].minor.yy79.y-yymsp[-1].minor.yy153;}
2768 #line 2793 "pikchr.c"
2769 yymsp[-6].minor.yy79 = yylhsminor.yy79;
2770 break;
2771 case 69: /* position ::= LP position COMMA position RP */
2772 #line 685 "pikchr.y"
2773 {yymsp[-4].minor.yy79.x=yymsp[-3].minor.yy79.x; yymsp[-4].minor.yy79.y=yymsp[-1].minor.yy79.y;}
2774 #line 2799 "pikchr.c"
2775 break;
2776 case 70: /* position ::= LP position RP */
2777 #line 686 "pikchr.y"
2778 {yymsp[-2].minor.yy79=yymsp[-1].minor.yy79;}
2779 #line 2804 "pikchr.c"
2780 break;
2781 case 71: /* position ::= expr between position AND position */
2782 #line 688 "pikchr.y"
2783 {yylhsminor.yy79 = pik_position_between(yymsp[-4].minor.yy153,yymsp[-2].minor.yy79,yymsp[0].minor.yy79);}
2784 #line 2809 "pikchr.c"
2785 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2786 break;
2787 case 72: /* position ::= expr LT position COMMA position GT */
2788 #line 690 "pikchr.y"
2789 {yylhsminor.yy79 = pik_position_between(yymsp[-5].minor.yy153,yymsp[-3].minor.yy79,yymsp[-1].minor.yy79);}
2790 #line 2815 "pikchr.c"
2791 yymsp[-5].minor.yy79 = yylhsminor.yy79;
2792 break;
2793 case 73: /* position ::= expr ABOVE position */
2794 #line 691 "pikchr.y"
2795 {yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.y += yymsp[-2].minor.yy153;}
2796 #line 2821 "pikchr.c"
2797 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2798 break;
2799 case 74: /* position ::= expr BELOW position */
2800 #line 692 "pikchr.y"
2801 {yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.y -= yymsp[-2].minor.yy153;}
2802 #line 2827 "pikchr.c"
2803 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2804 break;
2805 case 75: /* position ::= expr LEFT OF position */
2806 #line 693 "pikchr.y"
2807 {yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.x -= yymsp[-3].minor.yy153;}
2808 #line 2833 "pikchr.c"
2809 yymsp[-3].minor.yy79 = yylhsminor.yy79;
2810 break;
2811 case 76: /* position ::= expr RIGHT OF position */
2812 #line 694 "pikchr.y"
2813 {yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.x += yymsp[-3].minor.yy153;}
2814 #line 2839 "pikchr.c"
2815 yymsp[-3].minor.yy79 = yylhsminor.yy79;
2816 break;
2817 case 77: /* position ::= expr ON HEADING EDGEPT OF position */
2818 #line 696 "pikchr.y"
2819 {yylhsminor.yy79 = pik_position_at_hdg(yymsp[-5].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2820 #line 2845 "pikchr.c"
2821 yymsp[-5].minor.yy79 = yylhsminor.yy79;
2822 break;
2823 case 78: /* position ::= expr HEADING EDGEPT OF position */
2824 #line 698 "pikchr.y"
2825 {yylhsminor.yy79 = pik_position_at_hdg(yymsp[-4].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2826 #line 2851 "pikchr.c"
2827 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2828 break;
2829 case 79: /* position ::= expr EDGEPT OF position */
2830 #line 700 "pikchr.y"
2831 {yylhsminor.yy79 = pik_position_at_hdg(yymsp[-3].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2832 #line 2857 "pikchr.c"
2833 yymsp[-3].minor.yy79 = yylhsminor.yy79;
2834 break;
2835 case 80: /* position ::= expr ON HEADING expr FROM position */
2836 #line 702 "pikchr.y"
2837 {yylhsminor.yy79 = pik_position_at_angle(yymsp[-5].minor.yy153,yymsp[-2].minor.yy153,yymsp[0].minor.yy79);}
2838 #line 2863 "pikchr.c"
2839 yymsp[-5].minor.yy79 = yylhsminor.yy79;
2840 break;
2841 case 81: /* position ::= expr HEADING expr FROM position */
2842 #line 704 "pikchr.y"
2843 {yylhsminor.yy79 = pik_position_at_angle(yymsp[-4].minor.yy153,yymsp[-2].minor.yy153,yymsp[0].minor.yy79);}
2844 #line 2869 "pikchr.c"
2845 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2846 break;
2847 case 82: /* place ::= edge OF object */
2848 #line 716 "pikchr.y"
2849 {yylhsminor.yy79 = pik_place_of_elem(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2850 #line 2875 "pikchr.c"
2851 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2852 break;
2853 case 83: /* place2 ::= object */
2854 #line 717 "pikchr.y"
2855 {yylhsminor.yy79 = pik_place_of_elem(p,yymsp[0].minor.yy36,0);}
2856 #line 2881 "pikchr.c"
2857 yymsp[0].minor.yy79 = yylhsminor.yy79;
2858 break;
2859 case 84: /* place2 ::= object DOT_E edge */
2860 #line 718 "pikchr.y"
2861 {yylhsminor.yy79 = pik_place_of_elem(p,yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
2862 #line 2887 "pikchr.c"
2863 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2864 break;
2865 case 85: /* place2 ::= NTH VERTEX OF object */
2866 #line 719 "pikchr.y"
2867 {yylhsminor.yy79 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy36);}
2868 #line 2893 "pikchr.c"
2869 yymsp[-3].minor.yy79 = yylhsminor.yy79;
2870 break;
2871 case 86: /* object ::= nth */
2872 #line 731 "pikchr.y"
2873 {yylhsminor.yy36 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2874 #line 2899 "pikchr.c"
2875 yymsp[0].minor.yy36 = yylhsminor.yy36;
2876 break;
2877 case 87: /* object ::= nth OF|IN object */
2878 #line 732 "pikchr.y"
2879 {yylhsminor.yy36 = pik_find_nth(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2880 #line 2905 "pikchr.c"
2881 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2882 break;
2883 case 88: /* objectname ::= THIS */
2884 #line 734 "pikchr.y"
2885 {yymsp[0].minor.yy36 = p->cur;}
2886 #line 2911 "pikchr.c"
2887 break;
2888 case 89: /* objectname ::= PLACENAME */
2889 #line 735 "pikchr.y"
2890 {yylhsminor.yy36 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2891 #line 2916 "pikchr.c"
2892 yymsp[0].minor.yy36 = yylhsminor.yy36;
2893 break;
2894 case 90: /* objectname ::= objectname DOT_U PLACENAME */
2895 #line 737 "pikchr.y"
2896 {yylhsminor.yy36 = pik_find_byname(p,yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
2897 #line 2922 "pikchr.c"
2898 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2899 break;
2900 case 91: /* nth ::= NTH CLASSNAME */
2901 #line 739 "pikchr.y"
2902 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2903 #line 2928 "pikchr.c"
2904 yymsp[-1].minor.yy0 = yylhsminor.yy0;
2905 break;
2906 case 92: /* nth ::= NTH LAST CLASSNAME */
2907 #line 740 "pikchr.y"
2908 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2909 #line 2934 "pikchr.c"
2910 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2911 break;
2912 case 93: /* nth ::= LAST CLASSNAME */
2913 #line 741 "pikchr.y"
2914 {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2915 #line 2940 "pikchr.c"
2916 break;
2917 case 94: /* nth ::= LAST */
2918 #line 742 "pikchr.y"
2919 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2920 #line 2945 "pikchr.c"
2921 yymsp[0].minor.yy0 = yylhsminor.yy0;
2922 break;
2923 case 95: /* nth ::= NTH LB RB */
2924 #line 743 "pikchr.y"
2925 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2926 #line 2951 "pikchr.c"
2927 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2928 break;
2929 case 96: /* nth ::= NTH LAST LB RB */
2930 #line 744 "pikchr.y"
2931 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2932 #line 2957 "pikchr.c"
2933 yymsp[-3].minor.yy0 = yylhsminor.yy0;
2934 break;
2935 case 97: /* nth ::= LAST LB RB */
2936 #line 745 "pikchr.y"
2937 {yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2938 #line 2963 "pikchr.c"
2939 break;
2940 case 98: /* expr ::= expr PLUS expr */
2941 #line 747 "pikchr.y"
2942 {yylhsminor.yy153=yymsp[-2].minor.yy153+yymsp[0].minor.yy153;}
2943 #line 2968 "pikchr.c"
2944 yymsp[-2].minor.yy153 = yylhsminor.yy153;
2945 break;
2946 case 99: /* expr ::= expr MINUS expr */
2947 #line 748 "pikchr.y"
2948 {yylhsminor.yy153=yymsp[-2].minor.yy153-yymsp[0].minor.yy153;}
2949 #line 2974 "pikchr.c"
2950 yymsp[-2].minor.yy153 = yylhsminor.yy153;
2951 break;
2952 case 100: /* expr ::= expr STAR expr */
2953 #line 749 "pikchr.y"
2954 {yylhsminor.yy153=yymsp[-2].minor.yy153*yymsp[0].minor.yy153;}
2955 #line 2980 "pikchr.c"
2956 yymsp[-2].minor.yy153 = yylhsminor.yy153;
2957 break;
2958 case 101: /* expr ::= expr SLASH expr */
2959 #line 750 "pikchr.y"
2960 {
2961 if( yymsp[0].minor.yy153==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy153 = 0.0; }
2962 else{ yylhsminor.yy153 = yymsp[-2].minor.yy153/yymsp[0].minor.yy153; }
2963 }
2964 #line 2989 "pikchr.c"
2965 yymsp[-2].minor.yy153 = yylhsminor.yy153;
2966 break;
2967 case 102: /* expr ::= MINUS expr */
2968 #line 754 "pikchr.y"
2969 {yymsp[-1].minor.yy153=-yymsp[0].minor.yy153;}
2970 #line 2995 "pikchr.c"
2971 break;
2972 case 103: /* expr ::= PLUS expr */
2973 #line 755 "pikchr.y"
2974 {yymsp[-1].minor.yy153=yymsp[0].minor.yy153;}
2975 #line 3000 "pikchr.c"
2976 break;
2977 case 104: /* expr ::= LP expr RP */
2978 #line 756 "pikchr.y"
2979 {yymsp[-2].minor.yy153=yymsp[-1].minor.yy153;}
2980 #line 3005 "pikchr.c"
2981 break;
2982 case 105: /* expr ::= LP FILL|COLOR|THICKNESS RP */
2983 #line 757 "pikchr.y"
2984 {yymsp[-2].minor.yy153=pik_get_var(p,&yymsp[-1].minor.yy0);}
2985 #line 3010 "pikchr.c"
2986 break;
2987 case 106: /* expr ::= NUMBER */
2988 #line 758 "pikchr.y"
2989 {yylhsminor.yy153=pik_atof(&yymsp[0].minor.yy0);}
2990 #line 3015 "pikchr.c"
2991 yymsp[0].minor.yy153 = yylhsminor.yy153;
2992 break;
2993 case 107: /* expr ::= ID */
2994 #line 759 "pikchr.y"
2995 {yylhsminor.yy153=pik_get_var(p,&yymsp[0].minor.yy0);}
2996 #line 3021 "pikchr.c"
2997 yymsp[0].minor.yy153 = yylhsminor.yy153;
2998 break;
2999 case 108: /* expr ::= FUNC1 LP expr RP */
3000 #line 760 "pikchr.y"
3001 {yylhsminor.yy153 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy153,0.0);}
3002 #line 3027 "pikchr.c"
3003 yymsp[-3].minor.yy153 = yylhsminor.yy153;
3004 break;
3005 case 109: /* expr ::= FUNC2 LP expr COMMA expr RP */
3006 #line 761 "pikchr.y"
3007 {yylhsminor.yy153 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy153,yymsp[-1].minor.yy153);}
3008 #line 3033 "pikchr.c"
3009 yymsp[-5].minor.yy153 = yylhsminor.yy153;
3010 break;
3011 case 110: /* expr ::= DIST LP position COMMA position RP */
3012 #line 762 "pikchr.y"
3013 {yymsp[-5].minor.yy153 = pik_dist(&yymsp[-3].minor.yy79,&yymsp[-1].minor.yy79);}
3014 #line 3039 "pikchr.c"
3015 break;
3016 case 111: /* expr ::= place2 DOT_XY X */
3017 #line 763 "pikchr.y"
3018 {yylhsminor.yy153 = yymsp[-2].minor.yy79.x;}
3019 #line 3044 "pikchr.c"
3020 yymsp[-2].minor.yy153 = yylhsminor.yy153;
3021 break;
3022 case 112: /* expr ::= place2 DOT_XY Y */
3023 #line 764 "pikchr.y"
3024 {yylhsminor.yy153 = yymsp[-2].minor.yy79.y;}
3025 #line 3050 "pikchr.c"
3026 yymsp[-2].minor.yy153 = yylhsminor.yy153;
3027 break;
3028 case 113: /* expr ::= object DOT_L numproperty */
3029 case 114: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==114);
3030 case 115: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==115);
3031 #line 765 "pikchr.y"
3032 {yylhsminor.yy153=pik_property_of(yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
3033 #line 3058 "pikchr.c"
3034 yymsp[-2].minor.yy153 = yylhsminor.yy153;
3035 break;
3036 default:
3037 /* (116) lvalue ::= ID */ yytestcase(yyruleno==116);
3038 /* (117) lvalue ::= FILL */ yytestcase(yyruleno==117);
@@ -3129,19 +3131,19 @@
3131 ){
3132 pik_parserARG_FETCH
3133 pik_parserCTX_FETCH
3134 #define TOKEN yyminor
3135 /************ Begin %syntax_error code ****************************************/
3136 #line 525 "pikchr.y"
3137
3138 if( TOKEN.z && TOKEN.z[0] ){
3139 pik_error(p, &TOKEN, "syntax error");
3140 }else{
3141 pik_error(p, 0, "syntax error");
3142 }
3143 UNUSED_PARAMETER(yymajor);
3144 #line 3169 "pikchr.c"
3145 /************ End %syntax_error code ******************************************/
3146 pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
3147 pik_parserCTX_STORE
3148 }
3149
@@ -3370,11 +3372,11 @@
3372 #else
3373 (void)iToken;
3374 return 0;
3375 #endif
3376 }
3377 #line 770 "pikchr.y"
3378
3379
3380
3381 /* Chart of the 148 official CSS color names with their
3382 ** corresponding RGB values thru Color Module Level 4:
@@ -5851,10 +5853,38 @@
5853 p->mTPath |= 1;
5854 break;
5855 }
5856 pObj->outDir = pDir->eCode;
5857 }
5858
5859 /* If the last referenced object is centered at point pPt then return
5860 ** a pointer to that object. If there is no prior object reference,
5861 ** or if the points are not the same, return NULL.
5862 **
5863 ** This is a side-channel hack used to find the objects at which a
5864 ** line begins and ends. For example, in
5865 **
5866 ** arrow from OBJ1 to OBJ2 chop
5867 **
5868 ** The arrow object is normally just handed the coordinates of the
5869 ** centers for OBJ1 and OBJ2. But we also want to know the specific
5870 ** object named in case there are multiple objects centered at the
5871 ** same point.
5872 **
5873 ** See forum post 1d46e3a0bc
5874 */
5875 static PObj *pik_last_ref_object(Pik *p, PPoint *pPt){
5876 PObj *pRes = 0;
5877 if( p->lastRef==0 ) return 0;
5878 if( p->lastRef->ptAt.x==pPt->x
5879 && p->lastRef->ptAt.y==pPt->y
5880 ){
5881 pRes = p->lastRef;
5882 }
5883 p->lastRef = 0;
5884 return pRes;
5885 }
5886
5887 /* Set the "from" of an object
5888 */
5889 static void pik_set_from(Pik *p, PObj *pObj, PToken *pTk, PPoint *pPt){
5890 if( !pObj->type->isLine ){
@@ -5879,10 +5909,11 @@
5909 }
5910 }
5911 p->aTPath[0] = *pPt;
5912 p->mTPath = 3;
5913 pObj->mProp |= A_FROM;
5914 pObj->pFrom = pik_last_ref_object(p, pPt);
5915 }
5916
5917 /* Set the "to" of an object
5918 */
5919 static void pik_add_to(Pik *p, PObj *pObj, PToken *pTk, PPoint *pPt){
@@ -5899,10 +5930,11 @@
5930 if( n==0 || p->mTPath==3 || p->thenFlag ){
5931 n = pik_next_rpath(p, pTk);
5932 }
5933 p->aTPath[n] = *pPt;
5934 p->mTPath = 3;
5935 pObj->pTo = pik_last_ref_object(p, pPt);
5936 }
5937
5938 static void pik_close_path(Pik *p, PToken *pErr){
5939 PObj *pObj = p->cur;
5940 if( p->nTPath<3 ){
@@ -6440,10 +6472,11 @@
6472 }
6473 /* First look explicitly tagged objects */
6474 for(i=pList->n-1; i>=0; i--){
6475 PObj *pObj = pList->a[i];
6476 if( pObj->zName && pik_token_eq(pName,pObj->zName)==0 ){
6477 p->lastRef = pObj;
6478 return pObj;
6479 }
6480 }
6481 /* If not found, do a second pass looking for any object containing
6482 ** text which exactly matches pName */
@@ -6450,10 +6483,11 @@
6483 for(i=pList->n-1; i>=0; i--){
6484 PObj *pObj = pList->a[i];
6485 for(j=0; j<pObj->nTxt; j++){
6486 if( pObj->aTxt[j].n==pName->n+2
6487 && memcmp(pObj->aTxt[j].z+1,pName->z,pName->n)==0 ){
6488 p->lastRef = pObj;
6489 return pObj;
6490 }
6491 }
6492 }
6493 pik_error(p, pName, "no such object");
@@ -6678,12 +6712,14 @@
6712 **
6713 ** If point pTo is the exact enter of a choppable object,
6714 ** then adjust pTo by the appropriate amount in the direction
6715 ** of pFrom.
6716 */
6717 static void pik_autochop(Pik *p, PPoint *pFrom, PPoint *pTo, PObj *pObj){
6718 if( pObj==0 || pObj->type->xChop==0 ){
6719 pObj = pik_find_chopper(p->list, pTo, pFrom);
6720 }
6721 if( pObj ){
6722 *pTo = pObj->type->xChop(p, pObj, pFrom);
6723 }
6724 }
6725
@@ -6778,12 +6814,12 @@
6814 ** If the line goes to the center of an object with an
6815 ** xChop method, then use the xChop method to trim the line.
6816 */
6817 if( pObj->bChop && pObj->nPath>=2 ){
6818 int n = pObj->nPath;
6819 pik_autochop(p, &pObj->aPath[n-2], &pObj->aPath[n-1], pObj->pTo);
6820 pik_autochop(p, &pObj->aPath[1], &pObj->aPath[0], pObj->pFrom);
6821 }
6822
6823 pObj->ptEnter = pObj->aPath[0];
6824 pObj->ptExit = pObj->aPath[pObj->nPath-1];
6825
@@ -8041,6 +8077,6 @@
8077
8078
8079 #endif /* PIKCHR_TCL */
8080
8081
8082 #line 8107 "pikchr.c"
8083

Keyboard Shortcuts

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