Fossil SCM

Update the built-in Pikchr to the latest trunk version.

drh 2021-07-12 18:14 trunk
Commit 3fa951bb45c506eaefba0d195ec8d44c3333df69a6ed948e598426de81b2e6bf
1 file changed +256 -247
+256 -247
--- src/pikchr.c
+++ src/pikchr.c
@@ -426,10 +426,11 @@
426426
static void pik_render(Pik*,PList*);
427427
static PList *pik_elist_append(Pik*,PList*,PObj*);
428428
static PObj *pik_elem_new(Pik*,PToken*,PToken*,PList*);
429429
static void pik_set_direction(Pik*,int);
430430
static void pik_elem_setname(Pik*,PObj*,PToken*);
431
+static int pik_round(PNum);
431432
static void pik_set_var(Pik*,PToken*,PNum,PToken*);
432433
static PNum pik_value(Pik*,const char*,int,int*);
433434
static int pik_value_int(Pik*,const char*,int,int*);
434435
static PNum pik_lookup_color(Pik*,PToken*);
435436
static PNum pik_get_var(Pik*,PToken*);
@@ -475,11 +476,11 @@
475476
static PObj *pik_position_assert(Pik*,PPoint*,PToken*,PPoint*);
476477
static PNum pik_dist(PPoint*,PPoint*);
477478
static void pik_add_macro(Pik*,PToken *pId,PToken *pCode);
478479
479480
480
-#line 506 "pikchr.c"
481
+#line 507 "pikchr.c"
481482
/**************** End of %include directives **********************************/
482483
/* These constants specify the various numeric values for terminal symbols.
483484
***************** Begin token definitions *************************************/
484485
#ifndef T_ID
485486
#define T_ID 1
@@ -1704,22 +1705,22 @@
17041705
** inside the C code.
17051706
*/
17061707
/********* Begin destructor definitions ***************************************/
17071708
case 99: /* statement_list */
17081709
{
1709
-#line 495 "pikchr.y"
1710
+#line 496 "pikchr.y"
17101711
pik_elist_free(p,(yypminor->yy227));
1711
-#line 1736 "pikchr.c"
1712
+#line 1737 "pikchr.c"
17121713
}
17131714
break;
17141715
case 100: /* statement */
17151716
case 101: /* unnamed_statement */
17161717
case 102: /* basetype */
17171718
{
1718
-#line 497 "pikchr.y"
1719
+#line 498 "pikchr.y"
17191720
pik_elem_free(p,(yypminor->yy36));
1720
-#line 1745 "pikchr.c"
1721
+#line 1746 "pikchr.c"
17211722
}
17221723
break;
17231724
/********* End destructor definitions *****************************************/
17241725
default: break; /* If no destructor action specified: do nothing */
17251726
}
@@ -1933,14 +1934,14 @@
19331934
#endif
19341935
while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
19351936
/* Here code is inserted which will execute if the parser
19361937
** stack every overflows */
19371938
/******** Begin %stack_overflow code ******************************************/
1938
-#line 529 "pikchr.y"
1939
+#line 530 "pikchr.y"
19391940
19401941
pik_error(p, 0, "parser stack overflow");
1941
-#line 1966 "pikchr.c"
1942
+#line 1967 "pikchr.c"
19421943
/******** End %stack_overflow code ********************************************/
19431944
pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
19441945
pik_parserCTX_STORE
19451946
}
19461947
@@ -2416,619 +2417,619 @@
24162417
** break;
24172418
*/
24182419
/********** Begin reduce actions **********************************************/
24192420
YYMINORTYPE yylhsminor;
24202421
case 0: /* document ::= statement_list */
2421
-#line 533 "pikchr.y"
2422
+#line 534 "pikchr.y"
24222423
{pik_render(p,yymsp[0].minor.yy227);}
2423
-#line 2448 "pikchr.c"
2424
+#line 2449 "pikchr.c"
24242425
break;
24252426
case 1: /* statement_list ::= statement */
2426
-#line 536 "pikchr.y"
2427
+#line 537 "pikchr.y"
24272428
{ yylhsminor.yy227 = pik_elist_append(p,0,yymsp[0].minor.yy36); }
2428
-#line 2453 "pikchr.c"
2429
+#line 2454 "pikchr.c"
24292430
yymsp[0].minor.yy227 = yylhsminor.yy227;
24302431
break;
24312432
case 2: /* statement_list ::= statement_list EOL statement */
2432
-#line 538 "pikchr.y"
2433
+#line 539 "pikchr.y"
24332434
{ yylhsminor.yy227 = pik_elist_append(p,yymsp[-2].minor.yy227,yymsp[0].minor.yy36); }
2434
-#line 2459 "pikchr.c"
2435
+#line 2460 "pikchr.c"
24352436
yymsp[-2].minor.yy227 = yylhsminor.yy227;
24362437
break;
24372438
case 3: /* statement ::= */
2438
-#line 541 "pikchr.y"
2439
+#line 542 "pikchr.y"
24392440
{ yymsp[1].minor.yy36 = 0; }
2440
-#line 2465 "pikchr.c"
2441
+#line 2466 "pikchr.c"
24412442
break;
24422443
case 4: /* statement ::= direction */
2443
-#line 542 "pikchr.y"
2444
+#line 543 "pikchr.y"
24442445
{ pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy36=0; }
2445
-#line 2470 "pikchr.c"
2446
+#line 2471 "pikchr.c"
24462447
yymsp[0].minor.yy36 = yylhsminor.yy36;
24472448
break;
24482449
case 5: /* statement ::= lvalue ASSIGN rvalue */
2449
-#line 543 "pikchr.y"
2450
+#line 544 "pikchr.y"
24502451
{pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy153,&yymsp[-1].minor.yy0); yylhsminor.yy36=0;}
2451
-#line 2476 "pikchr.c"
2452
+#line 2477 "pikchr.c"
24522453
yymsp[-2].minor.yy36 = yylhsminor.yy36;
24532454
break;
24542455
case 6: /* statement ::= PLACENAME COLON unnamed_statement */
2455
-#line 545 "pikchr.y"
2456
+#line 546 "pikchr.y"
24562457
{ yylhsminor.yy36 = yymsp[0].minor.yy36; pik_elem_setname(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0); }
2457
-#line 2482 "pikchr.c"
2458
+#line 2483 "pikchr.c"
24582459
yymsp[-2].minor.yy36 = yylhsminor.yy36;
24592460
break;
24602461
case 7: /* statement ::= PLACENAME COLON position */
2461
-#line 547 "pikchr.y"
2462
+#line 548 "pikchr.y"
24622463
{ yylhsminor.yy36 = pik_elem_new(p,0,0,0);
24632464
if(yylhsminor.yy36){ yylhsminor.yy36->ptAt = yymsp[0].minor.yy79; pik_elem_setname(p,yylhsminor.yy36,&yymsp[-2].minor.yy0); }}
2464
-#line 2489 "pikchr.c"
2465
+#line 2490 "pikchr.c"
24652466
yymsp[-2].minor.yy36 = yylhsminor.yy36;
24662467
break;
24672468
case 8: /* statement ::= unnamed_statement */
2468
-#line 549 "pikchr.y"
2469
+#line 550 "pikchr.y"
24692470
{yylhsminor.yy36 = yymsp[0].minor.yy36;}
2470
-#line 2495 "pikchr.c"
2471
+#line 2496 "pikchr.c"
24712472
yymsp[0].minor.yy36 = yylhsminor.yy36;
24722473
break;
24732474
case 9: /* statement ::= print prlist */
2474
-#line 550 "pikchr.y"
2475
+#line 551 "pikchr.y"
24752476
{pik_append(p,"<br>\n",5); yymsp[-1].minor.yy36=0;}
2476
-#line 2501 "pikchr.c"
2477
+#line 2502 "pikchr.c"
24772478
break;
24782479
case 10: /* statement ::= ASSERT LP expr EQ expr RP */
2479
-#line 555 "pikchr.y"
2480
+#line 556 "pikchr.y"
24802481
{yymsp[-5].minor.yy36=pik_assert(p,yymsp[-3].minor.yy153,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy153);}
2481
-#line 2506 "pikchr.c"
2482
+#line 2507 "pikchr.c"
24822483
break;
24832484
case 11: /* statement ::= ASSERT LP position EQ position RP */
2484
-#line 557 "pikchr.y"
2485
+#line 558 "pikchr.y"
24852486
{yymsp[-5].minor.yy36=pik_position_assert(p,&yymsp[-3].minor.yy79,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy79);}
2486
-#line 2511 "pikchr.c"
2487
+#line 2512 "pikchr.c"
24872488
break;
24882489
case 12: /* statement ::= DEFINE ID CODEBLOCK */
2489
-#line 558 "pikchr.y"
2490
+#line 559 "pikchr.y"
24902491
{yymsp[-2].minor.yy36=0; pik_add_macro(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
2491
-#line 2516 "pikchr.c"
2492
+#line 2517 "pikchr.c"
24922493
break;
24932494
case 13: /* rvalue ::= PLACENAME */
2494
-#line 569 "pikchr.y"
2495
+#line 570 "pikchr.y"
24952496
{yylhsminor.yy153 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2496
-#line 2521 "pikchr.c"
2497
+#line 2522 "pikchr.c"
24972498
yymsp[0].minor.yy153 = yylhsminor.yy153;
24982499
break;
24992500
case 14: /* pritem ::= FILL */
25002501
case 15: /* pritem ::= COLOR */ yytestcase(yyruleno==15);
25012502
case 16: /* pritem ::= THICKNESS */ yytestcase(yyruleno==16);
2502
-#line 574 "pikchr.y"
2503
+#line 575 "pikchr.y"
25032504
{pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2504
-#line 2529 "pikchr.c"
2505
+#line 2530 "pikchr.c"
25052506
break;
25062507
case 17: /* pritem ::= rvalue */
2507
-#line 577 "pikchr.y"
2508
+#line 578 "pikchr.y"
25082509
{pik_append_num(p,"",yymsp[0].minor.yy153);}
2509
-#line 2534 "pikchr.c"
2510
+#line 2535 "pikchr.c"
25102511
break;
25112512
case 18: /* pritem ::= STRING */
2512
-#line 578 "pikchr.y"
2513
+#line 579 "pikchr.y"
25132514
{pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2514
-#line 2539 "pikchr.c"
2515
+#line 2540 "pikchr.c"
25152516
break;
25162517
case 19: /* prsep ::= COMMA */
2517
-#line 579 "pikchr.y"
2518
+#line 580 "pikchr.y"
25182519
{pik_append(p, " ", 1);}
2519
-#line 2544 "pikchr.c"
2520
+#line 2545 "pikchr.c"
25202521
break;
25212522
case 20: /* unnamed_statement ::= basetype attribute_list */
2522
-#line 582 "pikchr.y"
2523
+#line 583 "pikchr.y"
25232524
{yylhsminor.yy36 = yymsp[-1].minor.yy36; pik_after_adding_attributes(p,yylhsminor.yy36);}
2524
-#line 2549 "pikchr.c"
2525
+#line 2550 "pikchr.c"
25252526
yymsp[-1].minor.yy36 = yylhsminor.yy36;
25262527
break;
25272528
case 21: /* basetype ::= CLASSNAME */
2528
-#line 584 "pikchr.y"
2529
+#line 585 "pikchr.y"
25292530
{yylhsminor.yy36 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2530
-#line 2555 "pikchr.c"
2531
+#line 2556 "pikchr.c"
25312532
yymsp[0].minor.yy36 = yylhsminor.yy36;
25322533
break;
25332534
case 22: /* basetype ::= STRING textposition */
2534
-#line 586 "pikchr.y"
2535
+#line 587 "pikchr.y"
25352536
{yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy164; yylhsminor.yy36 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2536
-#line 2561 "pikchr.c"
2537
+#line 2562 "pikchr.c"
25372538
yymsp[-1].minor.yy36 = yylhsminor.yy36;
25382539
break;
25392540
case 23: /* basetype ::= LB savelist statement_list RB */
2540
-#line 588 "pikchr.y"
2541
+#line 589 "pikchr.y"
25412542
{ 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; }
2542
-#line 2567 "pikchr.c"
2543
+#line 2568 "pikchr.c"
25432544
break;
25442545
case 24: /* savelist ::= */
2545
-#line 593 "pikchr.y"
2546
+#line 594 "pikchr.y"
25462547
{yymsp[1].minor.yy227 = p->list; p->list = 0;}
2547
-#line 2572 "pikchr.c"
2548
+#line 2573 "pikchr.c"
25482549
break;
25492550
case 25: /* relexpr ::= expr */
2550
-#line 600 "pikchr.y"
2551
+#line 601 "pikchr.y"
25512552
{yylhsminor.yy10.rAbs = yymsp[0].minor.yy153; yylhsminor.yy10.rRel = 0;}
2552
-#line 2577 "pikchr.c"
2553
+#line 2578 "pikchr.c"
25532554
yymsp[0].minor.yy10 = yylhsminor.yy10;
25542555
break;
25552556
case 26: /* relexpr ::= expr PERCENT */
2556
-#line 601 "pikchr.y"
2557
+#line 602 "pikchr.y"
25572558
{yylhsminor.yy10.rAbs = 0; yylhsminor.yy10.rRel = yymsp[-1].minor.yy153/100;}
2558
-#line 2583 "pikchr.c"
2559
+#line 2584 "pikchr.c"
25592560
yymsp[-1].minor.yy10 = yylhsminor.yy10;
25602561
break;
25612562
case 27: /* optrelexpr ::= */
2562
-#line 603 "pikchr.y"
2563
+#line 604 "pikchr.y"
25632564
{yymsp[1].minor.yy10.rAbs = 0; yymsp[1].minor.yy10.rRel = 1.0;}
2564
-#line 2589 "pikchr.c"
2565
+#line 2590 "pikchr.c"
25652566
break;
25662567
case 28: /* attribute_list ::= relexpr alist */
2567
-#line 605 "pikchr.y"
2568
+#line 606 "pikchr.y"
25682569
{pik_add_direction(p,0,&yymsp[-1].minor.yy10);}
2569
-#line 2594 "pikchr.c"
2570
+#line 2595 "pikchr.c"
25702571
break;
25712572
case 29: /* attribute ::= numproperty relexpr */
2572
-#line 609 "pikchr.y"
2573
+#line 610 "pikchr.y"
25732574
{ pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy10); }
2574
-#line 2599 "pikchr.c"
2575
+#line 2600 "pikchr.c"
25752576
break;
25762577
case 30: /* attribute ::= dashproperty expr */
2577
-#line 610 "pikchr.y"
2578
+#line 611 "pikchr.y"
25782579
{ pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy153); }
2579
-#line 2604 "pikchr.c"
2580
+#line 2605 "pikchr.c"
25802581
break;
25812582
case 31: /* attribute ::= dashproperty */
2582
-#line 611 "pikchr.y"
2583
+#line 612 "pikchr.y"
25832584
{ pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2584
-#line 2609 "pikchr.c"
2585
+#line 2610 "pikchr.c"
25852586
break;
25862587
case 32: /* attribute ::= colorproperty rvalue */
2587
-#line 612 "pikchr.y"
2588
+#line 613 "pikchr.y"
25882589
{ pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy153); }
2589
-#line 2614 "pikchr.c"
2590
+#line 2615 "pikchr.c"
25902591
break;
25912592
case 33: /* attribute ::= go direction optrelexpr */
2592
-#line 613 "pikchr.y"
2593
+#line 614 "pikchr.y"
25932594
{ pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy10);}
2594
-#line 2619 "pikchr.c"
2595
+#line 2620 "pikchr.c"
25952596
break;
25962597
case 34: /* attribute ::= go direction even position */
2597
-#line 614 "pikchr.y"
2598
+#line 615 "pikchr.y"
25982599
{pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy79);}
2599
-#line 2624 "pikchr.c"
2600
+#line 2625 "pikchr.c"
26002601
break;
26012602
case 35: /* attribute ::= CLOSE */
2602
-#line 615 "pikchr.y"
2603
+#line 616 "pikchr.y"
26032604
{ pik_close_path(p,&yymsp[0].minor.yy0); }
2604
-#line 2629 "pikchr.c"
2605
+#line 2630 "pikchr.c"
26052606
break;
26062607
case 36: /* attribute ::= CHOP */
2607
-#line 616 "pikchr.y"
2608
+#line 617 "pikchr.y"
26082609
{ p->cur->bChop = 1; }
2609
-#line 2634 "pikchr.c"
2610
+#line 2635 "pikchr.c"
26102611
break;
26112612
case 37: /* attribute ::= FROM position */
2612
-#line 617 "pikchr.y"
2613
+#line 618 "pikchr.y"
26132614
{ pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy79); }
2614
-#line 2639 "pikchr.c"
2615
+#line 2640 "pikchr.c"
26152616
break;
26162617
case 38: /* attribute ::= TO position */
2617
-#line 618 "pikchr.y"
2618
+#line 619 "pikchr.y"
26182619
{ pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy79); }
2619
-#line 2644 "pikchr.c"
2620
+#line 2645 "pikchr.c"
26202621
break;
26212622
case 39: /* attribute ::= THEN */
2622
-#line 619 "pikchr.y"
2623
+#line 620 "pikchr.y"
26232624
{ pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2624
-#line 2649 "pikchr.c"
2625
+#line 2650 "pikchr.c"
26252626
break;
26262627
case 40: /* attribute ::= THEN optrelexpr HEADING expr */
26272628
case 42: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==42);
2628
-#line 621 "pikchr.y"
2629
+#line 622 "pikchr.y"
26292630
{pik_move_hdg(p,&yymsp[-2].minor.yy10,&yymsp[-1].minor.yy0,yymsp[0].minor.yy153,0,&yymsp[-3].minor.yy0);}
2630
-#line 2655 "pikchr.c"
2631
+#line 2656 "pikchr.c"
26312632
break;
26322633
case 41: /* attribute ::= THEN optrelexpr EDGEPT */
26332634
case 43: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==43);
2634
-#line 622 "pikchr.y"
2635
+#line 623 "pikchr.y"
26352636
{pik_move_hdg(p,&yymsp[-1].minor.yy10,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2636
-#line 2661 "pikchr.c"
2637
+#line 2662 "pikchr.c"
26372638
break;
26382639
case 44: /* attribute ::= AT position */
2639
-#line 627 "pikchr.y"
2640
+#line 628 "pikchr.y"
26402641
{ pik_set_at(p,0,&yymsp[0].minor.yy79,&yymsp[-1].minor.yy0); }
2641
-#line 2666 "pikchr.c"
2642
+#line 2667 "pikchr.c"
26422643
break;
26432644
case 45: /* attribute ::= SAME */
2644
-#line 629 "pikchr.y"
2645
+#line 630 "pikchr.y"
26452646
{pik_same(p,0,&yymsp[0].minor.yy0);}
2646
-#line 2671 "pikchr.c"
2647
+#line 2672 "pikchr.c"
26472648
break;
26482649
case 46: /* attribute ::= SAME AS object */
2649
-#line 630 "pikchr.y"
2650
+#line 631 "pikchr.y"
26502651
{pik_same(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2651
-#line 2676 "pikchr.c"
2652
+#line 2677 "pikchr.c"
26522653
break;
26532654
case 47: /* attribute ::= STRING textposition */
2654
-#line 631 "pikchr.y"
2655
+#line 632 "pikchr.y"
26552656
{pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy164);}
2656
-#line 2681 "pikchr.c"
2657
+#line 2682 "pikchr.c"
26572658
break;
26582659
case 48: /* attribute ::= FIT */
2659
-#line 632 "pikchr.y"
2660
+#line 633 "pikchr.y"
26602661
{pik_size_to_fit(p,&yymsp[0].minor.yy0,3); }
2661
-#line 2686 "pikchr.c"
2662
+#line 2687 "pikchr.c"
26622663
break;
26632664
case 49: /* attribute ::= BEHIND object */
2664
-#line 633 "pikchr.y"
2665
+#line 634 "pikchr.y"
26652666
{pik_behind(p,yymsp[0].minor.yy36);}
2666
-#line 2691 "pikchr.c"
2667
+#line 2692 "pikchr.c"
26672668
break;
26682669
case 50: /* withclause ::= DOT_E edge AT position */
26692670
case 51: /* withclause ::= edge AT position */ yytestcase(yyruleno==51);
2670
-#line 641 "pikchr.y"
2671
+#line 642 "pikchr.y"
26712672
{ pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy79,&yymsp[-1].minor.yy0); }
2672
-#line 2697 "pikchr.c"
2673
+#line 2698 "pikchr.c"
26732674
break;
26742675
case 52: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2675
-#line 645 "pikchr.y"
2676
+#line 646 "pikchr.y"
26762677
{yylhsminor.yy0 = yymsp[0].minor.yy0;}
2677
-#line 2702 "pikchr.c"
2678
+#line 2703 "pikchr.c"
26782679
yymsp[0].minor.yy0 = yylhsminor.yy0;
26792680
break;
26802681
case 53: /* boolproperty ::= CW */
2681
-#line 656 "pikchr.y"
2682
+#line 657 "pikchr.y"
26822683
{p->cur->cw = 1;}
2683
-#line 2708 "pikchr.c"
2684
+#line 2709 "pikchr.c"
26842685
break;
26852686
case 54: /* boolproperty ::= CCW */
2686
-#line 657 "pikchr.y"
2687
+#line 658 "pikchr.y"
26872688
{p->cur->cw = 0;}
2688
-#line 2713 "pikchr.c"
2689
+#line 2714 "pikchr.c"
26892690
break;
26902691
case 55: /* boolproperty ::= LARROW */
2691
-#line 658 "pikchr.y"
2692
+#line 659 "pikchr.y"
26922693
{p->cur->larrow=1; p->cur->rarrow=0; }
2693
-#line 2718 "pikchr.c"
2694
+#line 2719 "pikchr.c"
26942695
break;
26952696
case 56: /* boolproperty ::= RARROW */
2696
-#line 659 "pikchr.y"
2697
+#line 660 "pikchr.y"
26972698
{p->cur->larrow=0; p->cur->rarrow=1; }
2698
-#line 2723 "pikchr.c"
2699
+#line 2724 "pikchr.c"
26992700
break;
27002701
case 57: /* boolproperty ::= LRARROW */
2701
-#line 660 "pikchr.y"
2702
+#line 661 "pikchr.y"
27022703
{p->cur->larrow=1; p->cur->rarrow=1; }
2703
-#line 2728 "pikchr.c"
2704
+#line 2729 "pikchr.c"
27042705
break;
27052706
case 58: /* boolproperty ::= INVIS */
2706
-#line 661 "pikchr.y"
2707
+#line 662 "pikchr.y"
27072708
{p->cur->sw = 0.0;}
2708
-#line 2733 "pikchr.c"
2709
+#line 2734 "pikchr.c"
27092710
break;
27102711
case 59: /* boolproperty ::= THICK */
2711
-#line 662 "pikchr.y"
2712
+#line 663 "pikchr.y"
27122713
{p->cur->sw *= 1.5;}
2713
-#line 2738 "pikchr.c"
2714
+#line 2739 "pikchr.c"
27142715
break;
27152716
case 60: /* boolproperty ::= THIN */
2716
-#line 663 "pikchr.y"
2717
+#line 664 "pikchr.y"
27172718
{p->cur->sw *= 0.67;}
2718
-#line 2743 "pikchr.c"
2719
+#line 2744 "pikchr.c"
27192720
break;
27202721
case 61: /* boolproperty ::= SOLID */
2721
-#line 664 "pikchr.y"
2722
+#line 665 "pikchr.y"
27222723
{p->cur->sw = pik_value(p,"thickness",9,0);
27232724
p->cur->dotted = p->cur->dashed = 0.0;}
2724
-#line 2749 "pikchr.c"
2725
+#line 2750 "pikchr.c"
27252726
break;
27262727
case 62: /* textposition ::= */
2727
-#line 667 "pikchr.y"
2728
+#line 668 "pikchr.y"
27282729
{yymsp[1].minor.yy164 = 0;}
2729
-#line 2754 "pikchr.c"
2730
+#line 2755 "pikchr.c"
27302731
break;
27312732
case 63: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2732
-#line 670 "pikchr.y"
2733
+#line 671 "pikchr.y"
27332734
{yylhsminor.yy164 = (short int)pik_text_position(yymsp[-1].minor.yy164,&yymsp[0].minor.yy0);}
2734
-#line 2759 "pikchr.c"
2735
+#line 2760 "pikchr.c"
27352736
yymsp[-1].minor.yy164 = yylhsminor.yy164;
27362737
break;
27372738
case 64: /* position ::= expr COMMA expr */
2738
-#line 673 "pikchr.y"
2739
+#line 674 "pikchr.y"
27392740
{yylhsminor.yy79.x=yymsp[-2].minor.yy153; yylhsminor.yy79.y=yymsp[0].minor.yy153;}
2740
-#line 2765 "pikchr.c"
2741
+#line 2766 "pikchr.c"
27412742
yymsp[-2].minor.yy79 = yylhsminor.yy79;
27422743
break;
27432744
case 65: /* position ::= place PLUS expr COMMA expr */
2744
-#line 675 "pikchr.y"
2745
+#line 676 "pikchr.y"
27452746
{yylhsminor.yy79.x=yymsp[-4].minor.yy79.x+yymsp[-2].minor.yy153; yylhsminor.yy79.y=yymsp[-4].minor.yy79.y+yymsp[0].minor.yy153;}
2746
-#line 2771 "pikchr.c"
2747
+#line 2772 "pikchr.c"
27472748
yymsp[-4].minor.yy79 = yylhsminor.yy79;
27482749
break;
27492750
case 66: /* position ::= place MINUS expr COMMA expr */
2750
-#line 676 "pikchr.y"
2751
+#line 677 "pikchr.y"
27512752
{yylhsminor.yy79.x=yymsp[-4].minor.yy79.x-yymsp[-2].minor.yy153; yylhsminor.yy79.y=yymsp[-4].minor.yy79.y-yymsp[0].minor.yy153;}
2752
-#line 2777 "pikchr.c"
2753
+#line 2778 "pikchr.c"
27532754
yymsp[-4].minor.yy79 = yylhsminor.yy79;
27542755
break;
27552756
case 67: /* position ::= place PLUS LP expr COMMA expr RP */
2756
-#line 678 "pikchr.y"
2757
+#line 679 "pikchr.y"
27572758
{yylhsminor.yy79.x=yymsp[-6].minor.yy79.x+yymsp[-3].minor.yy153; yylhsminor.yy79.y=yymsp[-6].minor.yy79.y+yymsp[-1].minor.yy153;}
2758
-#line 2783 "pikchr.c"
2759
+#line 2784 "pikchr.c"
27592760
yymsp[-6].minor.yy79 = yylhsminor.yy79;
27602761
break;
27612762
case 68: /* position ::= place MINUS LP expr COMMA expr RP */
2762
-#line 680 "pikchr.y"
2763
+#line 681 "pikchr.y"
27632764
{yylhsminor.yy79.x=yymsp[-6].minor.yy79.x-yymsp[-3].minor.yy153; yylhsminor.yy79.y=yymsp[-6].minor.yy79.y-yymsp[-1].minor.yy153;}
2764
-#line 2789 "pikchr.c"
2765
+#line 2790 "pikchr.c"
27652766
yymsp[-6].minor.yy79 = yylhsminor.yy79;
27662767
break;
27672768
case 69: /* position ::= LP position COMMA position RP */
2768
-#line 681 "pikchr.y"
2769
+#line 682 "pikchr.y"
27692770
{yymsp[-4].minor.yy79.x=yymsp[-3].minor.yy79.x; yymsp[-4].minor.yy79.y=yymsp[-1].minor.yy79.y;}
2770
-#line 2795 "pikchr.c"
2771
+#line 2796 "pikchr.c"
27712772
break;
27722773
case 70: /* position ::= LP position RP */
2773
-#line 682 "pikchr.y"
2774
+#line 683 "pikchr.y"
27742775
{yymsp[-2].minor.yy79=yymsp[-1].minor.yy79;}
2775
-#line 2800 "pikchr.c"
2776
+#line 2801 "pikchr.c"
27762777
break;
27772778
case 71: /* position ::= expr between position AND position */
2778
-#line 684 "pikchr.y"
2779
+#line 685 "pikchr.y"
27792780
{yylhsminor.yy79 = pik_position_between(yymsp[-4].minor.yy153,yymsp[-2].minor.yy79,yymsp[0].minor.yy79);}
2780
-#line 2805 "pikchr.c"
2781
+#line 2806 "pikchr.c"
27812782
yymsp[-4].minor.yy79 = yylhsminor.yy79;
27822783
break;
27832784
case 72: /* position ::= expr LT position COMMA position GT */
2784
-#line 686 "pikchr.y"
2785
+#line 687 "pikchr.y"
27852786
{yylhsminor.yy79 = pik_position_between(yymsp[-5].minor.yy153,yymsp[-3].minor.yy79,yymsp[-1].minor.yy79);}
2786
-#line 2811 "pikchr.c"
2787
+#line 2812 "pikchr.c"
27872788
yymsp[-5].minor.yy79 = yylhsminor.yy79;
27882789
break;
27892790
case 73: /* position ::= expr ABOVE position */
2790
-#line 687 "pikchr.y"
2791
+#line 688 "pikchr.y"
27912792
{yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.y += yymsp[-2].minor.yy153;}
2792
-#line 2817 "pikchr.c"
2793
+#line 2818 "pikchr.c"
27932794
yymsp[-2].minor.yy79 = yylhsminor.yy79;
27942795
break;
27952796
case 74: /* position ::= expr BELOW position */
2796
-#line 688 "pikchr.y"
2797
+#line 689 "pikchr.y"
27972798
{yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.y -= yymsp[-2].minor.yy153;}
2798
-#line 2823 "pikchr.c"
2799
+#line 2824 "pikchr.c"
27992800
yymsp[-2].minor.yy79 = yylhsminor.yy79;
28002801
break;
28012802
case 75: /* position ::= expr LEFT OF position */
2802
-#line 689 "pikchr.y"
2803
+#line 690 "pikchr.y"
28032804
{yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.x -= yymsp[-3].minor.yy153;}
2804
-#line 2829 "pikchr.c"
2805
+#line 2830 "pikchr.c"
28052806
yymsp[-3].minor.yy79 = yylhsminor.yy79;
28062807
break;
28072808
case 76: /* position ::= expr RIGHT OF position */
2808
-#line 690 "pikchr.y"
2809
+#line 691 "pikchr.y"
28092810
{yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.x += yymsp[-3].minor.yy153;}
2810
-#line 2835 "pikchr.c"
2811
+#line 2836 "pikchr.c"
28112812
yymsp[-3].minor.yy79 = yylhsminor.yy79;
28122813
break;
28132814
case 77: /* position ::= expr ON HEADING EDGEPT OF position */
2814
-#line 692 "pikchr.y"
2815
+#line 693 "pikchr.y"
28152816
{yylhsminor.yy79 = pik_position_at_hdg(yymsp[-5].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2816
-#line 2841 "pikchr.c"
2817
+#line 2842 "pikchr.c"
28172818
yymsp[-5].minor.yy79 = yylhsminor.yy79;
28182819
break;
28192820
case 78: /* position ::= expr HEADING EDGEPT OF position */
2820
-#line 694 "pikchr.y"
2821
+#line 695 "pikchr.y"
28212822
{yylhsminor.yy79 = pik_position_at_hdg(yymsp[-4].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2822
-#line 2847 "pikchr.c"
2823
+#line 2848 "pikchr.c"
28232824
yymsp[-4].minor.yy79 = yylhsminor.yy79;
28242825
break;
28252826
case 79: /* position ::= expr EDGEPT OF position */
2826
-#line 696 "pikchr.y"
2827
+#line 697 "pikchr.y"
28272828
{yylhsminor.yy79 = pik_position_at_hdg(yymsp[-3].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2828
-#line 2853 "pikchr.c"
2829
+#line 2854 "pikchr.c"
28292830
yymsp[-3].minor.yy79 = yylhsminor.yy79;
28302831
break;
28312832
case 80: /* position ::= expr ON HEADING expr FROM position */
2832
-#line 698 "pikchr.y"
2833
+#line 699 "pikchr.y"
28332834
{yylhsminor.yy79 = pik_position_at_angle(yymsp[-5].minor.yy153,yymsp[-2].minor.yy153,yymsp[0].minor.yy79);}
2834
-#line 2859 "pikchr.c"
2835
+#line 2860 "pikchr.c"
28352836
yymsp[-5].minor.yy79 = yylhsminor.yy79;
28362837
break;
28372838
case 81: /* position ::= expr HEADING expr FROM position */
2838
-#line 700 "pikchr.y"
2839
+#line 701 "pikchr.y"
28392840
{yylhsminor.yy79 = pik_position_at_angle(yymsp[-4].minor.yy153,yymsp[-2].minor.yy153,yymsp[0].minor.yy79);}
2840
-#line 2865 "pikchr.c"
2841
+#line 2866 "pikchr.c"
28412842
yymsp[-4].minor.yy79 = yylhsminor.yy79;
28422843
break;
28432844
case 82: /* place ::= edge OF object */
2844
-#line 712 "pikchr.y"
2845
+#line 713 "pikchr.y"
28452846
{yylhsminor.yy79 = pik_place_of_elem(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2846
-#line 2871 "pikchr.c"
2847
+#line 2872 "pikchr.c"
28472848
yymsp[-2].minor.yy79 = yylhsminor.yy79;
28482849
break;
28492850
case 83: /* place2 ::= object */
2850
-#line 713 "pikchr.y"
2851
+#line 714 "pikchr.y"
28512852
{yylhsminor.yy79 = pik_place_of_elem(p,yymsp[0].minor.yy36,0);}
2852
-#line 2877 "pikchr.c"
2853
+#line 2878 "pikchr.c"
28532854
yymsp[0].minor.yy79 = yylhsminor.yy79;
28542855
break;
28552856
case 84: /* place2 ::= object DOT_E edge */
2856
-#line 714 "pikchr.y"
2857
+#line 715 "pikchr.y"
28572858
{yylhsminor.yy79 = pik_place_of_elem(p,yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
2858
-#line 2883 "pikchr.c"
2859
+#line 2884 "pikchr.c"
28592860
yymsp[-2].minor.yy79 = yylhsminor.yy79;
28602861
break;
28612862
case 85: /* place2 ::= NTH VERTEX OF object */
2862
-#line 715 "pikchr.y"
2863
+#line 716 "pikchr.y"
28632864
{yylhsminor.yy79 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy36);}
2864
-#line 2889 "pikchr.c"
2865
+#line 2890 "pikchr.c"
28652866
yymsp[-3].minor.yy79 = yylhsminor.yy79;
28662867
break;
28672868
case 86: /* object ::= nth */
2868
-#line 727 "pikchr.y"
2869
+#line 728 "pikchr.y"
28692870
{yylhsminor.yy36 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2870
-#line 2895 "pikchr.c"
2871
+#line 2896 "pikchr.c"
28712872
yymsp[0].minor.yy36 = yylhsminor.yy36;
28722873
break;
28732874
case 87: /* object ::= nth OF|IN object */
2874
-#line 728 "pikchr.y"
2875
+#line 729 "pikchr.y"
28752876
{yylhsminor.yy36 = pik_find_nth(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2876
-#line 2901 "pikchr.c"
2877
+#line 2902 "pikchr.c"
28772878
yymsp[-2].minor.yy36 = yylhsminor.yy36;
28782879
break;
28792880
case 88: /* objectname ::= THIS */
2880
-#line 730 "pikchr.y"
2881
+#line 731 "pikchr.y"
28812882
{yymsp[0].minor.yy36 = p->cur;}
2882
-#line 2907 "pikchr.c"
2883
+#line 2908 "pikchr.c"
28832884
break;
28842885
case 89: /* objectname ::= PLACENAME */
2885
-#line 731 "pikchr.y"
2886
+#line 732 "pikchr.y"
28862887
{yylhsminor.yy36 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2887
-#line 2912 "pikchr.c"
2888
+#line 2913 "pikchr.c"
28882889
yymsp[0].minor.yy36 = yylhsminor.yy36;
28892890
break;
28902891
case 90: /* objectname ::= objectname DOT_U PLACENAME */
2891
-#line 733 "pikchr.y"
2892
+#line 734 "pikchr.y"
28922893
{yylhsminor.yy36 = pik_find_byname(p,yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
2893
-#line 2918 "pikchr.c"
2894
+#line 2919 "pikchr.c"
28942895
yymsp[-2].minor.yy36 = yylhsminor.yy36;
28952896
break;
28962897
case 91: /* nth ::= NTH CLASSNAME */
2897
-#line 735 "pikchr.y"
2898
+#line 736 "pikchr.y"
28982899
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2899
-#line 2924 "pikchr.c"
2900
+#line 2925 "pikchr.c"
29002901
yymsp[-1].minor.yy0 = yylhsminor.yy0;
29012902
break;
29022903
case 92: /* nth ::= NTH LAST CLASSNAME */
2903
-#line 736 "pikchr.y"
2904
+#line 737 "pikchr.y"
29042905
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2905
-#line 2930 "pikchr.c"
2906
+#line 2931 "pikchr.c"
29062907
yymsp[-2].minor.yy0 = yylhsminor.yy0;
29072908
break;
29082909
case 93: /* nth ::= LAST CLASSNAME */
2909
-#line 737 "pikchr.y"
2910
+#line 738 "pikchr.y"
29102911
{yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2911
-#line 2936 "pikchr.c"
2912
+#line 2937 "pikchr.c"
29122913
break;
29132914
case 94: /* nth ::= LAST */
2914
-#line 738 "pikchr.y"
2915
+#line 739 "pikchr.y"
29152916
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2916
-#line 2941 "pikchr.c"
2917
+#line 2942 "pikchr.c"
29172918
yymsp[0].minor.yy0 = yylhsminor.yy0;
29182919
break;
29192920
case 95: /* nth ::= NTH LB RB */
2920
-#line 739 "pikchr.y"
2921
+#line 740 "pikchr.y"
29212922
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2922
-#line 2947 "pikchr.c"
2923
+#line 2948 "pikchr.c"
29232924
yymsp[-2].minor.yy0 = yylhsminor.yy0;
29242925
break;
29252926
case 96: /* nth ::= NTH LAST LB RB */
2926
-#line 740 "pikchr.y"
2927
+#line 741 "pikchr.y"
29272928
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2928
-#line 2953 "pikchr.c"
2929
+#line 2954 "pikchr.c"
29292930
yymsp[-3].minor.yy0 = yylhsminor.yy0;
29302931
break;
29312932
case 97: /* nth ::= LAST LB RB */
2932
-#line 741 "pikchr.y"
2933
+#line 742 "pikchr.y"
29332934
{yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2934
-#line 2959 "pikchr.c"
2935
+#line 2960 "pikchr.c"
29352936
break;
29362937
case 98: /* expr ::= expr PLUS expr */
2937
-#line 743 "pikchr.y"
2938
+#line 744 "pikchr.y"
29382939
{yylhsminor.yy153=yymsp[-2].minor.yy153+yymsp[0].minor.yy153;}
2939
-#line 2964 "pikchr.c"
2940
+#line 2965 "pikchr.c"
29402941
yymsp[-2].minor.yy153 = yylhsminor.yy153;
29412942
break;
29422943
case 99: /* expr ::= expr MINUS expr */
2943
-#line 744 "pikchr.y"
2944
+#line 745 "pikchr.y"
29442945
{yylhsminor.yy153=yymsp[-2].minor.yy153-yymsp[0].minor.yy153;}
2945
-#line 2970 "pikchr.c"
2946
+#line 2971 "pikchr.c"
29462947
yymsp[-2].minor.yy153 = yylhsminor.yy153;
29472948
break;
29482949
case 100: /* expr ::= expr STAR expr */
2949
-#line 745 "pikchr.y"
2950
+#line 746 "pikchr.y"
29502951
{yylhsminor.yy153=yymsp[-2].minor.yy153*yymsp[0].minor.yy153;}
2951
-#line 2976 "pikchr.c"
2952
+#line 2977 "pikchr.c"
29522953
yymsp[-2].minor.yy153 = yylhsminor.yy153;
29532954
break;
29542955
case 101: /* expr ::= expr SLASH expr */
2955
-#line 746 "pikchr.y"
2956
+#line 747 "pikchr.y"
29562957
{
29572958
if( yymsp[0].minor.yy153==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy153 = 0.0; }
29582959
else{ yylhsminor.yy153 = yymsp[-2].minor.yy153/yymsp[0].minor.yy153; }
29592960
}
2960
-#line 2985 "pikchr.c"
2961
+#line 2986 "pikchr.c"
29612962
yymsp[-2].minor.yy153 = yylhsminor.yy153;
29622963
break;
29632964
case 102: /* expr ::= MINUS expr */
2964
-#line 750 "pikchr.y"
2965
+#line 751 "pikchr.y"
29652966
{yymsp[-1].minor.yy153=-yymsp[0].minor.yy153;}
2966
-#line 2991 "pikchr.c"
2967
+#line 2992 "pikchr.c"
29672968
break;
29682969
case 103: /* expr ::= PLUS expr */
2969
-#line 751 "pikchr.y"
2970
+#line 752 "pikchr.y"
29702971
{yymsp[-1].minor.yy153=yymsp[0].minor.yy153;}
2971
-#line 2996 "pikchr.c"
2972
+#line 2997 "pikchr.c"
29722973
break;
29732974
case 104: /* expr ::= LP expr RP */
2974
-#line 752 "pikchr.y"
2975
+#line 753 "pikchr.y"
29752976
{yymsp[-2].minor.yy153=yymsp[-1].minor.yy153;}
2976
-#line 3001 "pikchr.c"
2977
+#line 3002 "pikchr.c"
29772978
break;
29782979
case 105: /* expr ::= LP FILL|COLOR|THICKNESS RP */
2979
-#line 753 "pikchr.y"
2980
+#line 754 "pikchr.y"
29802981
{yymsp[-2].minor.yy153=pik_get_var(p,&yymsp[-1].minor.yy0);}
2981
-#line 3006 "pikchr.c"
2982
+#line 3007 "pikchr.c"
29822983
break;
29832984
case 106: /* expr ::= NUMBER */
2984
-#line 754 "pikchr.y"
2985
+#line 755 "pikchr.y"
29852986
{yylhsminor.yy153=pik_atof(&yymsp[0].minor.yy0);}
2986
-#line 3011 "pikchr.c"
2987
+#line 3012 "pikchr.c"
29872988
yymsp[0].minor.yy153 = yylhsminor.yy153;
29882989
break;
29892990
case 107: /* expr ::= ID */
2990
-#line 755 "pikchr.y"
2991
+#line 756 "pikchr.y"
29912992
{yylhsminor.yy153=pik_get_var(p,&yymsp[0].minor.yy0);}
2992
-#line 3017 "pikchr.c"
2993
+#line 3018 "pikchr.c"
29932994
yymsp[0].minor.yy153 = yylhsminor.yy153;
29942995
break;
29952996
case 108: /* expr ::= FUNC1 LP expr RP */
2996
-#line 756 "pikchr.y"
2997
+#line 757 "pikchr.y"
29972998
{yylhsminor.yy153 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy153,0.0);}
2998
-#line 3023 "pikchr.c"
2999
+#line 3024 "pikchr.c"
29993000
yymsp[-3].minor.yy153 = yylhsminor.yy153;
30003001
break;
30013002
case 109: /* expr ::= FUNC2 LP expr COMMA expr RP */
3002
-#line 757 "pikchr.y"
3003
+#line 758 "pikchr.y"
30033004
{yylhsminor.yy153 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy153,yymsp[-1].minor.yy153);}
3004
-#line 3029 "pikchr.c"
3005
+#line 3030 "pikchr.c"
30053006
yymsp[-5].minor.yy153 = yylhsminor.yy153;
30063007
break;
30073008
case 110: /* expr ::= DIST LP position COMMA position RP */
3008
-#line 758 "pikchr.y"
3009
+#line 759 "pikchr.y"
30093010
{yymsp[-5].minor.yy153 = pik_dist(&yymsp[-3].minor.yy79,&yymsp[-1].minor.yy79);}
3010
-#line 3035 "pikchr.c"
3011
+#line 3036 "pikchr.c"
30113012
break;
30123013
case 111: /* expr ::= place2 DOT_XY X */
3013
-#line 759 "pikchr.y"
3014
+#line 760 "pikchr.y"
30143015
{yylhsminor.yy153 = yymsp[-2].minor.yy79.x;}
3015
-#line 3040 "pikchr.c"
3016
+#line 3041 "pikchr.c"
30163017
yymsp[-2].minor.yy153 = yylhsminor.yy153;
30173018
break;
30183019
case 112: /* expr ::= place2 DOT_XY Y */
3019
-#line 760 "pikchr.y"
3020
+#line 761 "pikchr.y"
30203021
{yylhsminor.yy153 = yymsp[-2].minor.yy79.y;}
3021
-#line 3046 "pikchr.c"
3022
+#line 3047 "pikchr.c"
30223023
yymsp[-2].minor.yy153 = yylhsminor.yy153;
30233024
break;
30243025
case 113: /* expr ::= object DOT_L numproperty */
30253026
case 114: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==114);
30263027
case 115: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==115);
3027
-#line 761 "pikchr.y"
3028
+#line 762 "pikchr.y"
30283029
{yylhsminor.yy153=pik_property_of(yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
3029
-#line 3054 "pikchr.c"
3030
+#line 3055 "pikchr.c"
30303031
yymsp[-2].minor.yy153 = yylhsminor.yy153;
30313032
break;
30323033
default:
30333034
/* (116) lvalue ::= ID */ yytestcase(yyruleno==116);
30343035
/* (117) lvalue ::= FILL */ yytestcase(yyruleno==117);
@@ -3127,19 +3128,19 @@
31273128
){
31283129
pik_parserARG_FETCH
31293130
pik_parserCTX_FETCH
31303131
#define TOKEN yyminor
31313132
/************ Begin %syntax_error code ****************************************/
3132
-#line 521 "pikchr.y"
3133
+#line 522 "pikchr.y"
31333134
31343135
if( TOKEN.z && TOKEN.z[0] ){
31353136
pik_error(p, &TOKEN, "syntax error");
31363137
}else{
31373138
pik_error(p, 0, "syntax error");
31383139
}
31393140
UNUSED_PARAMETER(yymajor);
3140
-#line 3165 "pikchr.c"
3141
+#line 3166 "pikchr.c"
31413142
/************ End %syntax_error code ******************************************/
31423143
pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
31433144
pik_parserCTX_STORE
31443145
}
31453146
@@ -3368,11 +3369,11 @@
33683369
#else
33693370
(void)iToken;
33703371
return 0;
33713372
#endif
33723373
}
3373
-#line 766 "pikchr.y"
3374
+#line 767 "pikchr.y"
33743375
33753376
33763377
33773378
/* Chart of the 148 official CSS color names with their
33783379
** corresponding RGB values thru Color Module Level 4:
@@ -4511,11 +4512,11 @@
45114512
if( z==0 ){
45124513
pik_error(p, 0, 0);
45134514
return;
45144515
}
45154516
p->zOut = z;
4516
- p->nOutAlloc = n;
4517
+ p->nOutAlloc = nNew;
45174518
}
45184519
memcpy(p->zOut+p->nOut, zText, n);
45194520
p->nOut += n;
45204521
p->zOut[p->nOut] = 0;
45214522
}
@@ -4637,27 +4638,27 @@
46374638
** on the value.
46384639
*/
46394640
static void pik_append_x(Pik *p, const char *z1, PNum v, const char *z2){
46404641
char buf[200];
46414642
v -= p->bbox.sw.x;
4642
- snprintf(buf, sizeof(buf)-1, "%s%d%s", z1, (int)(p->rScale*v), z2);
4643
+ snprintf(buf, sizeof(buf)-1, "%s%d%s", z1, pik_round(p->rScale*v), z2);
46434644
buf[sizeof(buf)-1] = 0;
46444645
pik_append(p, buf, -1);
46454646
}
46464647
static void pik_append_y(Pik *p, const char *z1, PNum v, const char *z2){
46474648
char buf[200];
46484649
v = p->bbox.ne.y - v;
4649
- snprintf(buf, sizeof(buf)-1, "%s%d%s", z1, (int)(p->rScale*v), z2);
4650
+ snprintf(buf, sizeof(buf)-1, "%s%d%s", z1, pik_round(p->rScale*v), z2);
46504651
buf[sizeof(buf)-1] = 0;
46514652
pik_append(p, buf, -1);
46524653
}
46534654
static void pik_append_xy(Pik *p, const char *z1, PNum x, PNum y){
46544655
char buf[200];
46554656
x = x - p->bbox.sw.x;
46564657
y = p->bbox.ne.y - y;
46574658
snprintf(buf, sizeof(buf)-1, "%s%d,%d", z1,
4658
- (int)(p->rScale*x), (int)(p->rScale*y));
4659
+ pik_round(p->rScale*x), pik_round(p->rScale*y));
46594660
buf[sizeof(buf)-1] = 0;
46604661
pik_append(p, buf, -1);
46614662
}
46624663
static void pik_append_dis(Pik *p, const char *z1, PNum v, const char *z2){
46634664
char buf[200];
@@ -4673,11 +4674,11 @@
46734674
** foreground color if false. The distinction only matters for color
46744675
** inversions in PIKCHR_DARK_MODE.
46754676
*/
46764677
static void pik_append_clr(Pik *p,const char *z1,PNum v,const char *z2,int bg){
46774678
char buf[200];
4678
- int x = (int)v;
4679
+ int x = pik_round(v);
46794680
int r, g, b;
46804681
if( x==0 && p->fgcolor>0 && !bg ){
46814682
x = p->fgcolor;
46824683
}else if( bg && x>=0xffffff && p->bgcolor>0 ){
46834684
x = p->bgcolor;
@@ -4699,12 +4700,12 @@
46994700
static void pik_append_arc(Pik *p, PNum r1, PNum r2, PNum x, PNum y){
47004701
char buf[200];
47014702
x = x - p->bbox.sw.x;
47024703
y = p->bbox.ne.y - y;
47034704
snprintf(buf, sizeof(buf)-1, "A%d %d 0 0 0 %d %d",
4704
- (int)(p->rScale*r1), (int)(p->rScale*r2),
4705
- (int)(p->rScale*x), (int)(p->rScale*y));
4705
+ pik_round(p->rScale*r1), pik_round(p->rScale*r2),
4706
+ pik_round(p->rScale*x), pik_round(p->rScale*y));
47064707
buf[sizeof(buf)-1] = 0;
47074708
pik_append(p, buf, -1);
47084709
}
47094710
47104711
/* Append a style="..." text. But, leave the quote unterminated, in case
@@ -6221,10 +6222,20 @@
62216222
break;
62226223
default: pVar->val = val; break;
62236224
}
62246225
p->bLayoutVars = 0; /* Clear the layout setting cache */
62256226
}
6227
+
6228
+/*
6229
+** Round a PNum into the nearest integer
6230
+*/
6231
+static int pik_round(PNum v){
6232
+ if( isnan(v) ) return 0;
6233
+ if( v < -2147483647 ) return -2147483648;
6234
+ if( v >= 2147483647 ) return 2147483647;
6235
+ return (int)v;
6236
+}
62266237
62276238
/*
62286239
** Search for the variable named z[0..n-1] in:
62296240
**
62306241
** * Application defined variables
@@ -6261,14 +6272,11 @@
62616272
}
62626273
if( pMiss ) *pMiss = 1;
62636274
return 0.0;
62646275
}
62656276
static int pik_value_int(Pik *p, const char *z, int n, int *pMiss){
6266
- PNum v = pik_value(p,z,n,pMiss);
6267
- if( v <= -2147483648 ) return -2147483648;
6268
- if( v >= 2147483647 ) return 2147483647;
6269
- return (int)v;
6277
+ return pik_round(pik_value(p,z,n,pMiss));
62706278
}
62716279
62726280
/*
62736281
** Look up a color-name. Unlike other names in this program, the
62746282
** color-names are not case sensitive. So "DarkBlue" and "darkblue"
@@ -6974,19 +6982,19 @@
69746982
p->fgcolor = pik_value_int(p,"fgcolor",7,&miss);
69756983
if( miss ){
69766984
PToken t;
69776985
t.z = "fgcolor";
69786986
t.n = 7;
6979
- p->fgcolor = (int)pik_lookup_color(0, &t);
6987
+ p->fgcolor = pik_round(pik_lookup_color(0, &t));
69806988
}
69816989
miss = 0;
69826990
p->bgcolor = pik_value_int(p,"bgcolor",7,&miss);
69836991
if( miss ){
69846992
PToken t;
69856993
t.z = "bgcolor";
69866994
t.n = 7;
6987
- p->bgcolor = (int)pik_lookup_color(0, &t);
6995
+ p->bgcolor = pik_round(pik_lookup_color(0, &t));
69886996
}
69896997
69906998
/* Compute a bounding box over all objects so that we can know
69916999
** how big to declare the SVG canvas */
69927000
pik_bbox_init(&p->bbox);
@@ -7006,18 +7014,18 @@
70067014
pik_append(p, p->zClass, -1);
70077015
pik_append(p, "\"", 1);
70087016
}
70097017
w = p->bbox.ne.x - p->bbox.sw.x;
70107018
h = p->bbox.ne.y - p->bbox.sw.y;
7011
- p->wSVG = (int)(p->rScale*w);
7012
- p->hSVG = (int)(p->rScale*h);
7019
+ p->wSVG = pik_round(p->rScale*w);
7020
+ p->hSVG = pik_round(p->rScale*h);
70137021
pikScale = pik_value(p,"scale",5,0);
70147022
if( pikScale>=0.001 && pikScale<=1000.0
70157023
&& (pikScale<0.99 || pikScale>1.01)
70167024
){
7017
- p->wSVG = (int)(p->wSVG*pikScale);
7018
- p->hSVG = (int)(p->hSVG*pikScale);
7025
+ p->wSVG = pik_round(p->wSVG*pikScale);
7026
+ p->hSVG = pik_round(p->hSVG*pikScale);
70197027
pik_append_num(p, " width=\"", p->wSVG);
70207028
pik_append_num(p, "\" height=\"", p->hSVG);
70217029
pik_append(p, "\"", 1);
70227030
}
70237031
pik_append_dis(p, " viewBox=\"0 0 ",w,"");
@@ -7758,15 +7766,16 @@
77587766
#if defined(PIKCHR_FUZZ)
77597767
#include <stdint.h>
77607768
int LLVMFuzzerTestOneInput(const uint8_t *aData, size_t nByte){
77617769
int w,h;
77627770
char *zIn, *zOut;
7771
+ unsigned int mFlags = nByte & 3;
77637772
zIn = malloc( nByte + 1 );
77647773
if( zIn==0 ) return 0;
77657774
memcpy(zIn, aData, nByte);
77667775
zIn[nByte] = 0;
7767
- zOut = pikchr(zIn, "pikchr", 0, &w, &h);
7776
+ zOut = pikchr(zIn, "pikchr", mFlags, &w, &h);
77687777
free(zIn);
77697778
free(zOut);
77707779
return 0;
77717780
}
77727781
#endif /* PIKCHR_FUZZ */
@@ -8017,6 +8026,6 @@
80178026
80188027
80198028
#endif /* PIKCHR_TCL */
80208029
80218030
8022
-#line 8047 "pikchr.c"
8031
+#line 8056 "pikchr.c"
80238032
--- src/pikchr.c
+++ src/pikchr.c
@@ -426,10 +426,11 @@
426 static void pik_render(Pik*,PList*);
427 static PList *pik_elist_append(Pik*,PList*,PObj*);
428 static PObj *pik_elem_new(Pik*,PToken*,PToken*,PList*);
429 static void pik_set_direction(Pik*,int);
430 static void pik_elem_setname(Pik*,PObj*,PToken*);
 
431 static void pik_set_var(Pik*,PToken*,PNum,PToken*);
432 static PNum pik_value(Pik*,const char*,int,int*);
433 static int pik_value_int(Pik*,const char*,int,int*);
434 static PNum pik_lookup_color(Pik*,PToken*);
435 static PNum pik_get_var(Pik*,PToken*);
@@ -475,11 +476,11 @@
475 static PObj *pik_position_assert(Pik*,PPoint*,PToken*,PPoint*);
476 static PNum pik_dist(PPoint*,PPoint*);
477 static void pik_add_macro(Pik*,PToken *pId,PToken *pCode);
478
479
480 #line 506 "pikchr.c"
481 /**************** End of %include directives **********************************/
482 /* These constants specify the various numeric values for terminal symbols.
483 ***************** Begin token definitions *************************************/
484 #ifndef T_ID
485 #define T_ID 1
@@ -1704,22 +1705,22 @@
1704 ** inside the C code.
1705 */
1706 /********* Begin destructor definitions ***************************************/
1707 case 99: /* statement_list */
1708 {
1709 #line 495 "pikchr.y"
1710 pik_elist_free(p,(yypminor->yy227));
1711 #line 1736 "pikchr.c"
1712 }
1713 break;
1714 case 100: /* statement */
1715 case 101: /* unnamed_statement */
1716 case 102: /* basetype */
1717 {
1718 #line 497 "pikchr.y"
1719 pik_elem_free(p,(yypminor->yy36));
1720 #line 1745 "pikchr.c"
1721 }
1722 break;
1723 /********* End destructor definitions *****************************************/
1724 default: break; /* If no destructor action specified: do nothing */
1725 }
@@ -1933,14 +1934,14 @@
1933 #endif
1934 while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
1935 /* Here code is inserted which will execute if the parser
1936 ** stack every overflows */
1937 /******** Begin %stack_overflow code ******************************************/
1938 #line 529 "pikchr.y"
1939
1940 pik_error(p, 0, "parser stack overflow");
1941 #line 1966 "pikchr.c"
1942 /******** End %stack_overflow code ********************************************/
1943 pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
1944 pik_parserCTX_STORE
1945 }
1946
@@ -2416,619 +2417,619 @@
2416 ** break;
2417 */
2418 /********** Begin reduce actions **********************************************/
2419 YYMINORTYPE yylhsminor;
2420 case 0: /* document ::= statement_list */
2421 #line 533 "pikchr.y"
2422 {pik_render(p,yymsp[0].minor.yy227);}
2423 #line 2448 "pikchr.c"
2424 break;
2425 case 1: /* statement_list ::= statement */
2426 #line 536 "pikchr.y"
2427 { yylhsminor.yy227 = pik_elist_append(p,0,yymsp[0].minor.yy36); }
2428 #line 2453 "pikchr.c"
2429 yymsp[0].minor.yy227 = yylhsminor.yy227;
2430 break;
2431 case 2: /* statement_list ::= statement_list EOL statement */
2432 #line 538 "pikchr.y"
2433 { yylhsminor.yy227 = pik_elist_append(p,yymsp[-2].minor.yy227,yymsp[0].minor.yy36); }
2434 #line 2459 "pikchr.c"
2435 yymsp[-2].minor.yy227 = yylhsminor.yy227;
2436 break;
2437 case 3: /* statement ::= */
2438 #line 541 "pikchr.y"
2439 { yymsp[1].minor.yy36 = 0; }
2440 #line 2465 "pikchr.c"
2441 break;
2442 case 4: /* statement ::= direction */
2443 #line 542 "pikchr.y"
2444 { pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy36=0; }
2445 #line 2470 "pikchr.c"
2446 yymsp[0].minor.yy36 = yylhsminor.yy36;
2447 break;
2448 case 5: /* statement ::= lvalue ASSIGN rvalue */
2449 #line 543 "pikchr.y"
2450 {pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy153,&yymsp[-1].minor.yy0); yylhsminor.yy36=0;}
2451 #line 2476 "pikchr.c"
2452 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2453 break;
2454 case 6: /* statement ::= PLACENAME COLON unnamed_statement */
2455 #line 545 "pikchr.y"
2456 { yylhsminor.yy36 = yymsp[0].minor.yy36; pik_elem_setname(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0); }
2457 #line 2482 "pikchr.c"
2458 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2459 break;
2460 case 7: /* statement ::= PLACENAME COLON position */
2461 #line 547 "pikchr.y"
2462 { yylhsminor.yy36 = pik_elem_new(p,0,0,0);
2463 if(yylhsminor.yy36){ yylhsminor.yy36->ptAt = yymsp[0].minor.yy79; pik_elem_setname(p,yylhsminor.yy36,&yymsp[-2].minor.yy0); }}
2464 #line 2489 "pikchr.c"
2465 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2466 break;
2467 case 8: /* statement ::= unnamed_statement */
2468 #line 549 "pikchr.y"
2469 {yylhsminor.yy36 = yymsp[0].minor.yy36;}
2470 #line 2495 "pikchr.c"
2471 yymsp[0].minor.yy36 = yylhsminor.yy36;
2472 break;
2473 case 9: /* statement ::= print prlist */
2474 #line 550 "pikchr.y"
2475 {pik_append(p,"<br>\n",5); yymsp[-1].minor.yy36=0;}
2476 #line 2501 "pikchr.c"
2477 break;
2478 case 10: /* statement ::= ASSERT LP expr EQ expr RP */
2479 #line 555 "pikchr.y"
2480 {yymsp[-5].minor.yy36=pik_assert(p,yymsp[-3].minor.yy153,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy153);}
2481 #line 2506 "pikchr.c"
2482 break;
2483 case 11: /* statement ::= ASSERT LP position EQ position RP */
2484 #line 557 "pikchr.y"
2485 {yymsp[-5].minor.yy36=pik_position_assert(p,&yymsp[-3].minor.yy79,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy79);}
2486 #line 2511 "pikchr.c"
2487 break;
2488 case 12: /* statement ::= DEFINE ID CODEBLOCK */
2489 #line 558 "pikchr.y"
2490 {yymsp[-2].minor.yy36=0; pik_add_macro(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
2491 #line 2516 "pikchr.c"
2492 break;
2493 case 13: /* rvalue ::= PLACENAME */
2494 #line 569 "pikchr.y"
2495 {yylhsminor.yy153 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2496 #line 2521 "pikchr.c"
2497 yymsp[0].minor.yy153 = yylhsminor.yy153;
2498 break;
2499 case 14: /* pritem ::= FILL */
2500 case 15: /* pritem ::= COLOR */ yytestcase(yyruleno==15);
2501 case 16: /* pritem ::= THICKNESS */ yytestcase(yyruleno==16);
2502 #line 574 "pikchr.y"
2503 {pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2504 #line 2529 "pikchr.c"
2505 break;
2506 case 17: /* pritem ::= rvalue */
2507 #line 577 "pikchr.y"
2508 {pik_append_num(p,"",yymsp[0].minor.yy153);}
2509 #line 2534 "pikchr.c"
2510 break;
2511 case 18: /* pritem ::= STRING */
2512 #line 578 "pikchr.y"
2513 {pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2514 #line 2539 "pikchr.c"
2515 break;
2516 case 19: /* prsep ::= COMMA */
2517 #line 579 "pikchr.y"
2518 {pik_append(p, " ", 1);}
2519 #line 2544 "pikchr.c"
2520 break;
2521 case 20: /* unnamed_statement ::= basetype attribute_list */
2522 #line 582 "pikchr.y"
2523 {yylhsminor.yy36 = yymsp[-1].minor.yy36; pik_after_adding_attributes(p,yylhsminor.yy36);}
2524 #line 2549 "pikchr.c"
2525 yymsp[-1].minor.yy36 = yylhsminor.yy36;
2526 break;
2527 case 21: /* basetype ::= CLASSNAME */
2528 #line 584 "pikchr.y"
2529 {yylhsminor.yy36 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2530 #line 2555 "pikchr.c"
2531 yymsp[0].minor.yy36 = yylhsminor.yy36;
2532 break;
2533 case 22: /* basetype ::= STRING textposition */
2534 #line 586 "pikchr.y"
2535 {yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy164; yylhsminor.yy36 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2536 #line 2561 "pikchr.c"
2537 yymsp[-1].minor.yy36 = yylhsminor.yy36;
2538 break;
2539 case 23: /* basetype ::= LB savelist statement_list RB */
2540 #line 588 "pikchr.y"
2541 { 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; }
2542 #line 2567 "pikchr.c"
2543 break;
2544 case 24: /* savelist ::= */
2545 #line 593 "pikchr.y"
2546 {yymsp[1].minor.yy227 = p->list; p->list = 0;}
2547 #line 2572 "pikchr.c"
2548 break;
2549 case 25: /* relexpr ::= expr */
2550 #line 600 "pikchr.y"
2551 {yylhsminor.yy10.rAbs = yymsp[0].minor.yy153; yylhsminor.yy10.rRel = 0;}
2552 #line 2577 "pikchr.c"
2553 yymsp[0].minor.yy10 = yylhsminor.yy10;
2554 break;
2555 case 26: /* relexpr ::= expr PERCENT */
2556 #line 601 "pikchr.y"
2557 {yylhsminor.yy10.rAbs = 0; yylhsminor.yy10.rRel = yymsp[-1].minor.yy153/100;}
2558 #line 2583 "pikchr.c"
2559 yymsp[-1].minor.yy10 = yylhsminor.yy10;
2560 break;
2561 case 27: /* optrelexpr ::= */
2562 #line 603 "pikchr.y"
2563 {yymsp[1].minor.yy10.rAbs = 0; yymsp[1].minor.yy10.rRel = 1.0;}
2564 #line 2589 "pikchr.c"
2565 break;
2566 case 28: /* attribute_list ::= relexpr alist */
2567 #line 605 "pikchr.y"
2568 {pik_add_direction(p,0,&yymsp[-1].minor.yy10);}
2569 #line 2594 "pikchr.c"
2570 break;
2571 case 29: /* attribute ::= numproperty relexpr */
2572 #line 609 "pikchr.y"
2573 { pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy10); }
2574 #line 2599 "pikchr.c"
2575 break;
2576 case 30: /* attribute ::= dashproperty expr */
2577 #line 610 "pikchr.y"
2578 { pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy153); }
2579 #line 2604 "pikchr.c"
2580 break;
2581 case 31: /* attribute ::= dashproperty */
2582 #line 611 "pikchr.y"
2583 { pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2584 #line 2609 "pikchr.c"
2585 break;
2586 case 32: /* attribute ::= colorproperty rvalue */
2587 #line 612 "pikchr.y"
2588 { pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy153); }
2589 #line 2614 "pikchr.c"
2590 break;
2591 case 33: /* attribute ::= go direction optrelexpr */
2592 #line 613 "pikchr.y"
2593 { pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy10);}
2594 #line 2619 "pikchr.c"
2595 break;
2596 case 34: /* attribute ::= go direction even position */
2597 #line 614 "pikchr.y"
2598 {pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy79);}
2599 #line 2624 "pikchr.c"
2600 break;
2601 case 35: /* attribute ::= CLOSE */
2602 #line 615 "pikchr.y"
2603 { pik_close_path(p,&yymsp[0].minor.yy0); }
2604 #line 2629 "pikchr.c"
2605 break;
2606 case 36: /* attribute ::= CHOP */
2607 #line 616 "pikchr.y"
2608 { p->cur->bChop = 1; }
2609 #line 2634 "pikchr.c"
2610 break;
2611 case 37: /* attribute ::= FROM position */
2612 #line 617 "pikchr.y"
2613 { pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy79); }
2614 #line 2639 "pikchr.c"
2615 break;
2616 case 38: /* attribute ::= TO position */
2617 #line 618 "pikchr.y"
2618 { pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy79); }
2619 #line 2644 "pikchr.c"
2620 break;
2621 case 39: /* attribute ::= THEN */
2622 #line 619 "pikchr.y"
2623 { pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2624 #line 2649 "pikchr.c"
2625 break;
2626 case 40: /* attribute ::= THEN optrelexpr HEADING expr */
2627 case 42: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==42);
2628 #line 621 "pikchr.y"
2629 {pik_move_hdg(p,&yymsp[-2].minor.yy10,&yymsp[-1].minor.yy0,yymsp[0].minor.yy153,0,&yymsp[-3].minor.yy0);}
2630 #line 2655 "pikchr.c"
2631 break;
2632 case 41: /* attribute ::= THEN optrelexpr EDGEPT */
2633 case 43: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==43);
2634 #line 622 "pikchr.y"
2635 {pik_move_hdg(p,&yymsp[-1].minor.yy10,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2636 #line 2661 "pikchr.c"
2637 break;
2638 case 44: /* attribute ::= AT position */
2639 #line 627 "pikchr.y"
2640 { pik_set_at(p,0,&yymsp[0].minor.yy79,&yymsp[-1].minor.yy0); }
2641 #line 2666 "pikchr.c"
2642 break;
2643 case 45: /* attribute ::= SAME */
2644 #line 629 "pikchr.y"
2645 {pik_same(p,0,&yymsp[0].minor.yy0);}
2646 #line 2671 "pikchr.c"
2647 break;
2648 case 46: /* attribute ::= SAME AS object */
2649 #line 630 "pikchr.y"
2650 {pik_same(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2651 #line 2676 "pikchr.c"
2652 break;
2653 case 47: /* attribute ::= STRING textposition */
2654 #line 631 "pikchr.y"
2655 {pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy164);}
2656 #line 2681 "pikchr.c"
2657 break;
2658 case 48: /* attribute ::= FIT */
2659 #line 632 "pikchr.y"
2660 {pik_size_to_fit(p,&yymsp[0].minor.yy0,3); }
2661 #line 2686 "pikchr.c"
2662 break;
2663 case 49: /* attribute ::= BEHIND object */
2664 #line 633 "pikchr.y"
2665 {pik_behind(p,yymsp[0].minor.yy36);}
2666 #line 2691 "pikchr.c"
2667 break;
2668 case 50: /* withclause ::= DOT_E edge AT position */
2669 case 51: /* withclause ::= edge AT position */ yytestcase(yyruleno==51);
2670 #line 641 "pikchr.y"
2671 { pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy79,&yymsp[-1].minor.yy0); }
2672 #line 2697 "pikchr.c"
2673 break;
2674 case 52: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2675 #line 645 "pikchr.y"
2676 {yylhsminor.yy0 = yymsp[0].minor.yy0;}
2677 #line 2702 "pikchr.c"
2678 yymsp[0].minor.yy0 = yylhsminor.yy0;
2679 break;
2680 case 53: /* boolproperty ::= CW */
2681 #line 656 "pikchr.y"
2682 {p->cur->cw = 1;}
2683 #line 2708 "pikchr.c"
2684 break;
2685 case 54: /* boolproperty ::= CCW */
2686 #line 657 "pikchr.y"
2687 {p->cur->cw = 0;}
2688 #line 2713 "pikchr.c"
2689 break;
2690 case 55: /* boolproperty ::= LARROW */
2691 #line 658 "pikchr.y"
2692 {p->cur->larrow=1; p->cur->rarrow=0; }
2693 #line 2718 "pikchr.c"
2694 break;
2695 case 56: /* boolproperty ::= RARROW */
2696 #line 659 "pikchr.y"
2697 {p->cur->larrow=0; p->cur->rarrow=1; }
2698 #line 2723 "pikchr.c"
2699 break;
2700 case 57: /* boolproperty ::= LRARROW */
2701 #line 660 "pikchr.y"
2702 {p->cur->larrow=1; p->cur->rarrow=1; }
2703 #line 2728 "pikchr.c"
2704 break;
2705 case 58: /* boolproperty ::= INVIS */
2706 #line 661 "pikchr.y"
2707 {p->cur->sw = 0.0;}
2708 #line 2733 "pikchr.c"
2709 break;
2710 case 59: /* boolproperty ::= THICK */
2711 #line 662 "pikchr.y"
2712 {p->cur->sw *= 1.5;}
2713 #line 2738 "pikchr.c"
2714 break;
2715 case 60: /* boolproperty ::= THIN */
2716 #line 663 "pikchr.y"
2717 {p->cur->sw *= 0.67;}
2718 #line 2743 "pikchr.c"
2719 break;
2720 case 61: /* boolproperty ::= SOLID */
2721 #line 664 "pikchr.y"
2722 {p->cur->sw = pik_value(p,"thickness",9,0);
2723 p->cur->dotted = p->cur->dashed = 0.0;}
2724 #line 2749 "pikchr.c"
2725 break;
2726 case 62: /* textposition ::= */
2727 #line 667 "pikchr.y"
2728 {yymsp[1].minor.yy164 = 0;}
2729 #line 2754 "pikchr.c"
2730 break;
2731 case 63: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2732 #line 670 "pikchr.y"
2733 {yylhsminor.yy164 = (short int)pik_text_position(yymsp[-1].minor.yy164,&yymsp[0].minor.yy0);}
2734 #line 2759 "pikchr.c"
2735 yymsp[-1].minor.yy164 = yylhsminor.yy164;
2736 break;
2737 case 64: /* position ::= expr COMMA expr */
2738 #line 673 "pikchr.y"
2739 {yylhsminor.yy79.x=yymsp[-2].minor.yy153; yylhsminor.yy79.y=yymsp[0].minor.yy153;}
2740 #line 2765 "pikchr.c"
2741 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2742 break;
2743 case 65: /* position ::= place PLUS expr COMMA expr */
2744 #line 675 "pikchr.y"
2745 {yylhsminor.yy79.x=yymsp[-4].minor.yy79.x+yymsp[-2].minor.yy153; yylhsminor.yy79.y=yymsp[-4].minor.yy79.y+yymsp[0].minor.yy153;}
2746 #line 2771 "pikchr.c"
2747 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2748 break;
2749 case 66: /* position ::= place MINUS expr COMMA expr */
2750 #line 676 "pikchr.y"
2751 {yylhsminor.yy79.x=yymsp[-4].minor.yy79.x-yymsp[-2].minor.yy153; yylhsminor.yy79.y=yymsp[-4].minor.yy79.y-yymsp[0].minor.yy153;}
2752 #line 2777 "pikchr.c"
2753 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2754 break;
2755 case 67: /* position ::= place PLUS LP expr COMMA expr RP */
2756 #line 678 "pikchr.y"
2757 {yylhsminor.yy79.x=yymsp[-6].minor.yy79.x+yymsp[-3].minor.yy153; yylhsminor.yy79.y=yymsp[-6].minor.yy79.y+yymsp[-1].minor.yy153;}
2758 #line 2783 "pikchr.c"
2759 yymsp[-6].minor.yy79 = yylhsminor.yy79;
2760 break;
2761 case 68: /* position ::= place MINUS LP expr COMMA expr RP */
2762 #line 680 "pikchr.y"
2763 {yylhsminor.yy79.x=yymsp[-6].minor.yy79.x-yymsp[-3].minor.yy153; yylhsminor.yy79.y=yymsp[-6].minor.yy79.y-yymsp[-1].minor.yy153;}
2764 #line 2789 "pikchr.c"
2765 yymsp[-6].minor.yy79 = yylhsminor.yy79;
2766 break;
2767 case 69: /* position ::= LP position COMMA position RP */
2768 #line 681 "pikchr.y"
2769 {yymsp[-4].minor.yy79.x=yymsp[-3].minor.yy79.x; yymsp[-4].minor.yy79.y=yymsp[-1].minor.yy79.y;}
2770 #line 2795 "pikchr.c"
2771 break;
2772 case 70: /* position ::= LP position RP */
2773 #line 682 "pikchr.y"
2774 {yymsp[-2].minor.yy79=yymsp[-1].minor.yy79;}
2775 #line 2800 "pikchr.c"
2776 break;
2777 case 71: /* position ::= expr between position AND position */
2778 #line 684 "pikchr.y"
2779 {yylhsminor.yy79 = pik_position_between(yymsp[-4].minor.yy153,yymsp[-2].minor.yy79,yymsp[0].minor.yy79);}
2780 #line 2805 "pikchr.c"
2781 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2782 break;
2783 case 72: /* position ::= expr LT position COMMA position GT */
2784 #line 686 "pikchr.y"
2785 {yylhsminor.yy79 = pik_position_between(yymsp[-5].minor.yy153,yymsp[-3].minor.yy79,yymsp[-1].minor.yy79);}
2786 #line 2811 "pikchr.c"
2787 yymsp[-5].minor.yy79 = yylhsminor.yy79;
2788 break;
2789 case 73: /* position ::= expr ABOVE position */
2790 #line 687 "pikchr.y"
2791 {yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.y += yymsp[-2].minor.yy153;}
2792 #line 2817 "pikchr.c"
2793 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2794 break;
2795 case 74: /* position ::= expr BELOW position */
2796 #line 688 "pikchr.y"
2797 {yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.y -= yymsp[-2].minor.yy153;}
2798 #line 2823 "pikchr.c"
2799 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2800 break;
2801 case 75: /* position ::= expr LEFT OF position */
2802 #line 689 "pikchr.y"
2803 {yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.x -= yymsp[-3].minor.yy153;}
2804 #line 2829 "pikchr.c"
2805 yymsp[-3].minor.yy79 = yylhsminor.yy79;
2806 break;
2807 case 76: /* position ::= expr RIGHT OF position */
2808 #line 690 "pikchr.y"
2809 {yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.x += yymsp[-3].minor.yy153;}
2810 #line 2835 "pikchr.c"
2811 yymsp[-3].minor.yy79 = yylhsminor.yy79;
2812 break;
2813 case 77: /* position ::= expr ON HEADING EDGEPT OF position */
2814 #line 692 "pikchr.y"
2815 {yylhsminor.yy79 = pik_position_at_hdg(yymsp[-5].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2816 #line 2841 "pikchr.c"
2817 yymsp[-5].minor.yy79 = yylhsminor.yy79;
2818 break;
2819 case 78: /* position ::= expr HEADING EDGEPT OF position */
2820 #line 694 "pikchr.y"
2821 {yylhsminor.yy79 = pik_position_at_hdg(yymsp[-4].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2822 #line 2847 "pikchr.c"
2823 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2824 break;
2825 case 79: /* position ::= expr EDGEPT OF position */
2826 #line 696 "pikchr.y"
2827 {yylhsminor.yy79 = pik_position_at_hdg(yymsp[-3].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2828 #line 2853 "pikchr.c"
2829 yymsp[-3].minor.yy79 = yylhsminor.yy79;
2830 break;
2831 case 80: /* position ::= expr ON HEADING expr FROM position */
2832 #line 698 "pikchr.y"
2833 {yylhsminor.yy79 = pik_position_at_angle(yymsp[-5].minor.yy153,yymsp[-2].minor.yy153,yymsp[0].minor.yy79);}
2834 #line 2859 "pikchr.c"
2835 yymsp[-5].minor.yy79 = yylhsminor.yy79;
2836 break;
2837 case 81: /* position ::= expr HEADING expr FROM position */
2838 #line 700 "pikchr.y"
2839 {yylhsminor.yy79 = pik_position_at_angle(yymsp[-4].minor.yy153,yymsp[-2].minor.yy153,yymsp[0].minor.yy79);}
2840 #line 2865 "pikchr.c"
2841 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2842 break;
2843 case 82: /* place ::= edge OF object */
2844 #line 712 "pikchr.y"
2845 {yylhsminor.yy79 = pik_place_of_elem(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2846 #line 2871 "pikchr.c"
2847 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2848 break;
2849 case 83: /* place2 ::= object */
2850 #line 713 "pikchr.y"
2851 {yylhsminor.yy79 = pik_place_of_elem(p,yymsp[0].minor.yy36,0);}
2852 #line 2877 "pikchr.c"
2853 yymsp[0].minor.yy79 = yylhsminor.yy79;
2854 break;
2855 case 84: /* place2 ::= object DOT_E edge */
2856 #line 714 "pikchr.y"
2857 {yylhsminor.yy79 = pik_place_of_elem(p,yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
2858 #line 2883 "pikchr.c"
2859 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2860 break;
2861 case 85: /* place2 ::= NTH VERTEX OF object */
2862 #line 715 "pikchr.y"
2863 {yylhsminor.yy79 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy36);}
2864 #line 2889 "pikchr.c"
2865 yymsp[-3].minor.yy79 = yylhsminor.yy79;
2866 break;
2867 case 86: /* object ::= nth */
2868 #line 727 "pikchr.y"
2869 {yylhsminor.yy36 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2870 #line 2895 "pikchr.c"
2871 yymsp[0].minor.yy36 = yylhsminor.yy36;
2872 break;
2873 case 87: /* object ::= nth OF|IN object */
2874 #line 728 "pikchr.y"
2875 {yylhsminor.yy36 = pik_find_nth(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2876 #line 2901 "pikchr.c"
2877 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2878 break;
2879 case 88: /* objectname ::= THIS */
2880 #line 730 "pikchr.y"
2881 {yymsp[0].minor.yy36 = p->cur;}
2882 #line 2907 "pikchr.c"
2883 break;
2884 case 89: /* objectname ::= PLACENAME */
2885 #line 731 "pikchr.y"
2886 {yylhsminor.yy36 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2887 #line 2912 "pikchr.c"
2888 yymsp[0].minor.yy36 = yylhsminor.yy36;
2889 break;
2890 case 90: /* objectname ::= objectname DOT_U PLACENAME */
2891 #line 733 "pikchr.y"
2892 {yylhsminor.yy36 = pik_find_byname(p,yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
2893 #line 2918 "pikchr.c"
2894 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2895 break;
2896 case 91: /* nth ::= NTH CLASSNAME */
2897 #line 735 "pikchr.y"
2898 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2899 #line 2924 "pikchr.c"
2900 yymsp[-1].minor.yy0 = yylhsminor.yy0;
2901 break;
2902 case 92: /* nth ::= NTH LAST CLASSNAME */
2903 #line 736 "pikchr.y"
2904 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2905 #line 2930 "pikchr.c"
2906 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2907 break;
2908 case 93: /* nth ::= LAST CLASSNAME */
2909 #line 737 "pikchr.y"
2910 {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2911 #line 2936 "pikchr.c"
2912 break;
2913 case 94: /* nth ::= LAST */
2914 #line 738 "pikchr.y"
2915 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2916 #line 2941 "pikchr.c"
2917 yymsp[0].minor.yy0 = yylhsminor.yy0;
2918 break;
2919 case 95: /* nth ::= NTH LB RB */
2920 #line 739 "pikchr.y"
2921 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2922 #line 2947 "pikchr.c"
2923 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2924 break;
2925 case 96: /* nth ::= NTH LAST LB RB */
2926 #line 740 "pikchr.y"
2927 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2928 #line 2953 "pikchr.c"
2929 yymsp[-3].minor.yy0 = yylhsminor.yy0;
2930 break;
2931 case 97: /* nth ::= LAST LB RB */
2932 #line 741 "pikchr.y"
2933 {yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2934 #line 2959 "pikchr.c"
2935 break;
2936 case 98: /* expr ::= expr PLUS expr */
2937 #line 743 "pikchr.y"
2938 {yylhsminor.yy153=yymsp[-2].minor.yy153+yymsp[0].minor.yy153;}
2939 #line 2964 "pikchr.c"
2940 yymsp[-2].minor.yy153 = yylhsminor.yy153;
2941 break;
2942 case 99: /* expr ::= expr MINUS expr */
2943 #line 744 "pikchr.y"
2944 {yylhsminor.yy153=yymsp[-2].minor.yy153-yymsp[0].minor.yy153;}
2945 #line 2970 "pikchr.c"
2946 yymsp[-2].minor.yy153 = yylhsminor.yy153;
2947 break;
2948 case 100: /* expr ::= expr STAR expr */
2949 #line 745 "pikchr.y"
2950 {yylhsminor.yy153=yymsp[-2].minor.yy153*yymsp[0].minor.yy153;}
2951 #line 2976 "pikchr.c"
2952 yymsp[-2].minor.yy153 = yylhsminor.yy153;
2953 break;
2954 case 101: /* expr ::= expr SLASH expr */
2955 #line 746 "pikchr.y"
2956 {
2957 if( yymsp[0].minor.yy153==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy153 = 0.0; }
2958 else{ yylhsminor.yy153 = yymsp[-2].minor.yy153/yymsp[0].minor.yy153; }
2959 }
2960 #line 2985 "pikchr.c"
2961 yymsp[-2].minor.yy153 = yylhsminor.yy153;
2962 break;
2963 case 102: /* expr ::= MINUS expr */
2964 #line 750 "pikchr.y"
2965 {yymsp[-1].minor.yy153=-yymsp[0].minor.yy153;}
2966 #line 2991 "pikchr.c"
2967 break;
2968 case 103: /* expr ::= PLUS expr */
2969 #line 751 "pikchr.y"
2970 {yymsp[-1].minor.yy153=yymsp[0].minor.yy153;}
2971 #line 2996 "pikchr.c"
2972 break;
2973 case 104: /* expr ::= LP expr RP */
2974 #line 752 "pikchr.y"
2975 {yymsp[-2].minor.yy153=yymsp[-1].minor.yy153;}
2976 #line 3001 "pikchr.c"
2977 break;
2978 case 105: /* expr ::= LP FILL|COLOR|THICKNESS RP */
2979 #line 753 "pikchr.y"
2980 {yymsp[-2].minor.yy153=pik_get_var(p,&yymsp[-1].minor.yy0);}
2981 #line 3006 "pikchr.c"
2982 break;
2983 case 106: /* expr ::= NUMBER */
2984 #line 754 "pikchr.y"
2985 {yylhsminor.yy153=pik_atof(&yymsp[0].minor.yy0);}
2986 #line 3011 "pikchr.c"
2987 yymsp[0].minor.yy153 = yylhsminor.yy153;
2988 break;
2989 case 107: /* expr ::= ID */
2990 #line 755 "pikchr.y"
2991 {yylhsminor.yy153=pik_get_var(p,&yymsp[0].minor.yy0);}
2992 #line 3017 "pikchr.c"
2993 yymsp[0].minor.yy153 = yylhsminor.yy153;
2994 break;
2995 case 108: /* expr ::= FUNC1 LP expr RP */
2996 #line 756 "pikchr.y"
2997 {yylhsminor.yy153 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy153,0.0);}
2998 #line 3023 "pikchr.c"
2999 yymsp[-3].minor.yy153 = yylhsminor.yy153;
3000 break;
3001 case 109: /* expr ::= FUNC2 LP expr COMMA expr RP */
3002 #line 757 "pikchr.y"
3003 {yylhsminor.yy153 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy153,yymsp[-1].minor.yy153);}
3004 #line 3029 "pikchr.c"
3005 yymsp[-5].minor.yy153 = yylhsminor.yy153;
3006 break;
3007 case 110: /* expr ::= DIST LP position COMMA position RP */
3008 #line 758 "pikchr.y"
3009 {yymsp[-5].minor.yy153 = pik_dist(&yymsp[-3].minor.yy79,&yymsp[-1].minor.yy79);}
3010 #line 3035 "pikchr.c"
3011 break;
3012 case 111: /* expr ::= place2 DOT_XY X */
3013 #line 759 "pikchr.y"
3014 {yylhsminor.yy153 = yymsp[-2].minor.yy79.x;}
3015 #line 3040 "pikchr.c"
3016 yymsp[-2].minor.yy153 = yylhsminor.yy153;
3017 break;
3018 case 112: /* expr ::= place2 DOT_XY Y */
3019 #line 760 "pikchr.y"
3020 {yylhsminor.yy153 = yymsp[-2].minor.yy79.y;}
3021 #line 3046 "pikchr.c"
3022 yymsp[-2].minor.yy153 = yylhsminor.yy153;
3023 break;
3024 case 113: /* expr ::= object DOT_L numproperty */
3025 case 114: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==114);
3026 case 115: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==115);
3027 #line 761 "pikchr.y"
3028 {yylhsminor.yy153=pik_property_of(yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
3029 #line 3054 "pikchr.c"
3030 yymsp[-2].minor.yy153 = yylhsminor.yy153;
3031 break;
3032 default:
3033 /* (116) lvalue ::= ID */ yytestcase(yyruleno==116);
3034 /* (117) lvalue ::= FILL */ yytestcase(yyruleno==117);
@@ -3127,19 +3128,19 @@
3127 ){
3128 pik_parserARG_FETCH
3129 pik_parserCTX_FETCH
3130 #define TOKEN yyminor
3131 /************ Begin %syntax_error code ****************************************/
3132 #line 521 "pikchr.y"
3133
3134 if( TOKEN.z && TOKEN.z[0] ){
3135 pik_error(p, &TOKEN, "syntax error");
3136 }else{
3137 pik_error(p, 0, "syntax error");
3138 }
3139 UNUSED_PARAMETER(yymajor);
3140 #line 3165 "pikchr.c"
3141 /************ End %syntax_error code ******************************************/
3142 pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
3143 pik_parserCTX_STORE
3144 }
3145
@@ -3368,11 +3369,11 @@
3368 #else
3369 (void)iToken;
3370 return 0;
3371 #endif
3372 }
3373 #line 766 "pikchr.y"
3374
3375
3376
3377 /* Chart of the 148 official CSS color names with their
3378 ** corresponding RGB values thru Color Module Level 4:
@@ -4511,11 +4512,11 @@
4511 if( z==0 ){
4512 pik_error(p, 0, 0);
4513 return;
4514 }
4515 p->zOut = z;
4516 p->nOutAlloc = n;
4517 }
4518 memcpy(p->zOut+p->nOut, zText, n);
4519 p->nOut += n;
4520 p->zOut[p->nOut] = 0;
4521 }
@@ -4637,27 +4638,27 @@
4637 ** on the value.
4638 */
4639 static void pik_append_x(Pik *p, const char *z1, PNum v, const char *z2){
4640 char buf[200];
4641 v -= p->bbox.sw.x;
4642 snprintf(buf, sizeof(buf)-1, "%s%d%s", z1, (int)(p->rScale*v), z2);
4643 buf[sizeof(buf)-1] = 0;
4644 pik_append(p, buf, -1);
4645 }
4646 static void pik_append_y(Pik *p, const char *z1, PNum v, const char *z2){
4647 char buf[200];
4648 v = p->bbox.ne.y - v;
4649 snprintf(buf, sizeof(buf)-1, "%s%d%s", z1, (int)(p->rScale*v), z2);
4650 buf[sizeof(buf)-1] = 0;
4651 pik_append(p, buf, -1);
4652 }
4653 static void pik_append_xy(Pik *p, const char *z1, PNum x, PNum y){
4654 char buf[200];
4655 x = x - p->bbox.sw.x;
4656 y = p->bbox.ne.y - y;
4657 snprintf(buf, sizeof(buf)-1, "%s%d,%d", z1,
4658 (int)(p->rScale*x), (int)(p->rScale*y));
4659 buf[sizeof(buf)-1] = 0;
4660 pik_append(p, buf, -1);
4661 }
4662 static void pik_append_dis(Pik *p, const char *z1, PNum v, const char *z2){
4663 char buf[200];
@@ -4673,11 +4674,11 @@
4673 ** foreground color if false. The distinction only matters for color
4674 ** inversions in PIKCHR_DARK_MODE.
4675 */
4676 static void pik_append_clr(Pik *p,const char *z1,PNum v,const char *z2,int bg){
4677 char buf[200];
4678 int x = (int)v;
4679 int r, g, b;
4680 if( x==0 && p->fgcolor>0 && !bg ){
4681 x = p->fgcolor;
4682 }else if( bg && x>=0xffffff && p->bgcolor>0 ){
4683 x = p->bgcolor;
@@ -4699,12 +4700,12 @@
4699 static void pik_append_arc(Pik *p, PNum r1, PNum r2, PNum x, PNum y){
4700 char buf[200];
4701 x = x - p->bbox.sw.x;
4702 y = p->bbox.ne.y - y;
4703 snprintf(buf, sizeof(buf)-1, "A%d %d 0 0 0 %d %d",
4704 (int)(p->rScale*r1), (int)(p->rScale*r2),
4705 (int)(p->rScale*x), (int)(p->rScale*y));
4706 buf[sizeof(buf)-1] = 0;
4707 pik_append(p, buf, -1);
4708 }
4709
4710 /* Append a style="..." text. But, leave the quote unterminated, in case
@@ -6221,10 +6222,20 @@
6221 break;
6222 default: pVar->val = val; break;
6223 }
6224 p->bLayoutVars = 0; /* Clear the layout setting cache */
6225 }
 
 
 
 
 
 
 
 
 
 
6226
6227 /*
6228 ** Search for the variable named z[0..n-1] in:
6229 **
6230 ** * Application defined variables
@@ -6261,14 +6272,11 @@
6261 }
6262 if( pMiss ) *pMiss = 1;
6263 return 0.0;
6264 }
6265 static int pik_value_int(Pik *p, const char *z, int n, int *pMiss){
6266 PNum v = pik_value(p,z,n,pMiss);
6267 if( v <= -2147483648 ) return -2147483648;
6268 if( v >= 2147483647 ) return 2147483647;
6269 return (int)v;
6270 }
6271
6272 /*
6273 ** Look up a color-name. Unlike other names in this program, the
6274 ** color-names are not case sensitive. So "DarkBlue" and "darkblue"
@@ -6974,19 +6982,19 @@
6974 p->fgcolor = pik_value_int(p,"fgcolor",7,&miss);
6975 if( miss ){
6976 PToken t;
6977 t.z = "fgcolor";
6978 t.n = 7;
6979 p->fgcolor = (int)pik_lookup_color(0, &t);
6980 }
6981 miss = 0;
6982 p->bgcolor = pik_value_int(p,"bgcolor",7,&miss);
6983 if( miss ){
6984 PToken t;
6985 t.z = "bgcolor";
6986 t.n = 7;
6987 p->bgcolor = (int)pik_lookup_color(0, &t);
6988 }
6989
6990 /* Compute a bounding box over all objects so that we can know
6991 ** how big to declare the SVG canvas */
6992 pik_bbox_init(&p->bbox);
@@ -7006,18 +7014,18 @@
7006 pik_append(p, p->zClass, -1);
7007 pik_append(p, "\"", 1);
7008 }
7009 w = p->bbox.ne.x - p->bbox.sw.x;
7010 h = p->bbox.ne.y - p->bbox.sw.y;
7011 p->wSVG = (int)(p->rScale*w);
7012 p->hSVG = (int)(p->rScale*h);
7013 pikScale = pik_value(p,"scale",5,0);
7014 if( pikScale>=0.001 && pikScale<=1000.0
7015 && (pikScale<0.99 || pikScale>1.01)
7016 ){
7017 p->wSVG = (int)(p->wSVG*pikScale);
7018 p->hSVG = (int)(p->hSVG*pikScale);
7019 pik_append_num(p, " width=\"", p->wSVG);
7020 pik_append_num(p, "\" height=\"", p->hSVG);
7021 pik_append(p, "\"", 1);
7022 }
7023 pik_append_dis(p, " viewBox=\"0 0 ",w,"");
@@ -7758,15 +7766,16 @@
7758 #if defined(PIKCHR_FUZZ)
7759 #include <stdint.h>
7760 int LLVMFuzzerTestOneInput(const uint8_t *aData, size_t nByte){
7761 int w,h;
7762 char *zIn, *zOut;
 
7763 zIn = malloc( nByte + 1 );
7764 if( zIn==0 ) return 0;
7765 memcpy(zIn, aData, nByte);
7766 zIn[nByte] = 0;
7767 zOut = pikchr(zIn, "pikchr", 0, &w, &h);
7768 free(zIn);
7769 free(zOut);
7770 return 0;
7771 }
7772 #endif /* PIKCHR_FUZZ */
@@ -8017,6 +8026,6 @@
8017
8018
8019 #endif /* PIKCHR_TCL */
8020
8021
8022 #line 8047 "pikchr.c"
8023
--- src/pikchr.c
+++ src/pikchr.c
@@ -426,10 +426,11 @@
426 static void pik_render(Pik*,PList*);
427 static PList *pik_elist_append(Pik*,PList*,PObj*);
428 static PObj *pik_elem_new(Pik*,PToken*,PToken*,PList*);
429 static void pik_set_direction(Pik*,int);
430 static void pik_elem_setname(Pik*,PObj*,PToken*);
431 static int pik_round(PNum);
432 static void pik_set_var(Pik*,PToken*,PNum,PToken*);
433 static PNum pik_value(Pik*,const char*,int,int*);
434 static int pik_value_int(Pik*,const char*,int,int*);
435 static PNum pik_lookup_color(Pik*,PToken*);
436 static PNum pik_get_var(Pik*,PToken*);
@@ -475,11 +476,11 @@
476 static PObj *pik_position_assert(Pik*,PPoint*,PToken*,PPoint*);
477 static PNum pik_dist(PPoint*,PPoint*);
478 static void pik_add_macro(Pik*,PToken *pId,PToken *pCode);
479
480
481 #line 507 "pikchr.c"
482 /**************** End of %include directives **********************************/
483 /* These constants specify the various numeric values for terminal symbols.
484 ***************** Begin token definitions *************************************/
485 #ifndef T_ID
486 #define T_ID 1
@@ -1704,22 +1705,22 @@
1705 ** inside the C code.
1706 */
1707 /********* Begin destructor definitions ***************************************/
1708 case 99: /* statement_list */
1709 {
1710 #line 496 "pikchr.y"
1711 pik_elist_free(p,(yypminor->yy227));
1712 #line 1737 "pikchr.c"
1713 }
1714 break;
1715 case 100: /* statement */
1716 case 101: /* unnamed_statement */
1717 case 102: /* basetype */
1718 {
1719 #line 498 "pikchr.y"
1720 pik_elem_free(p,(yypminor->yy36));
1721 #line 1746 "pikchr.c"
1722 }
1723 break;
1724 /********* End destructor definitions *****************************************/
1725 default: break; /* If no destructor action specified: do nothing */
1726 }
@@ -1933,14 +1934,14 @@
1934 #endif
1935 while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
1936 /* Here code is inserted which will execute if the parser
1937 ** stack every overflows */
1938 /******** Begin %stack_overflow code ******************************************/
1939 #line 530 "pikchr.y"
1940
1941 pik_error(p, 0, "parser stack overflow");
1942 #line 1967 "pikchr.c"
1943 /******** End %stack_overflow code ********************************************/
1944 pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
1945 pik_parserCTX_STORE
1946 }
1947
@@ -2416,619 +2417,619 @@
2417 ** break;
2418 */
2419 /********** Begin reduce actions **********************************************/
2420 YYMINORTYPE yylhsminor;
2421 case 0: /* document ::= statement_list */
2422 #line 534 "pikchr.y"
2423 {pik_render(p,yymsp[0].minor.yy227);}
2424 #line 2449 "pikchr.c"
2425 break;
2426 case 1: /* statement_list ::= statement */
2427 #line 537 "pikchr.y"
2428 { yylhsminor.yy227 = pik_elist_append(p,0,yymsp[0].minor.yy36); }
2429 #line 2454 "pikchr.c"
2430 yymsp[0].minor.yy227 = yylhsminor.yy227;
2431 break;
2432 case 2: /* statement_list ::= statement_list EOL statement */
2433 #line 539 "pikchr.y"
2434 { yylhsminor.yy227 = pik_elist_append(p,yymsp[-2].minor.yy227,yymsp[0].minor.yy36); }
2435 #line 2460 "pikchr.c"
2436 yymsp[-2].minor.yy227 = yylhsminor.yy227;
2437 break;
2438 case 3: /* statement ::= */
2439 #line 542 "pikchr.y"
2440 { yymsp[1].minor.yy36 = 0; }
2441 #line 2466 "pikchr.c"
2442 break;
2443 case 4: /* statement ::= direction */
2444 #line 543 "pikchr.y"
2445 { pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy36=0; }
2446 #line 2471 "pikchr.c"
2447 yymsp[0].minor.yy36 = yylhsminor.yy36;
2448 break;
2449 case 5: /* statement ::= lvalue ASSIGN rvalue */
2450 #line 544 "pikchr.y"
2451 {pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy153,&yymsp[-1].minor.yy0); yylhsminor.yy36=0;}
2452 #line 2477 "pikchr.c"
2453 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2454 break;
2455 case 6: /* statement ::= PLACENAME COLON unnamed_statement */
2456 #line 546 "pikchr.y"
2457 { yylhsminor.yy36 = yymsp[0].minor.yy36; pik_elem_setname(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0); }
2458 #line 2483 "pikchr.c"
2459 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2460 break;
2461 case 7: /* statement ::= PLACENAME COLON position */
2462 #line 548 "pikchr.y"
2463 { yylhsminor.yy36 = pik_elem_new(p,0,0,0);
2464 if(yylhsminor.yy36){ yylhsminor.yy36->ptAt = yymsp[0].minor.yy79; pik_elem_setname(p,yylhsminor.yy36,&yymsp[-2].minor.yy0); }}
2465 #line 2490 "pikchr.c"
2466 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2467 break;
2468 case 8: /* statement ::= unnamed_statement */
2469 #line 550 "pikchr.y"
2470 {yylhsminor.yy36 = yymsp[0].minor.yy36;}
2471 #line 2496 "pikchr.c"
2472 yymsp[0].minor.yy36 = yylhsminor.yy36;
2473 break;
2474 case 9: /* statement ::= print prlist */
2475 #line 551 "pikchr.y"
2476 {pik_append(p,"<br>\n",5); yymsp[-1].minor.yy36=0;}
2477 #line 2502 "pikchr.c"
2478 break;
2479 case 10: /* statement ::= ASSERT LP expr EQ expr RP */
2480 #line 556 "pikchr.y"
2481 {yymsp[-5].minor.yy36=pik_assert(p,yymsp[-3].minor.yy153,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy153);}
2482 #line 2507 "pikchr.c"
2483 break;
2484 case 11: /* statement ::= ASSERT LP position EQ position RP */
2485 #line 558 "pikchr.y"
2486 {yymsp[-5].minor.yy36=pik_position_assert(p,&yymsp[-3].minor.yy79,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy79);}
2487 #line 2512 "pikchr.c"
2488 break;
2489 case 12: /* statement ::= DEFINE ID CODEBLOCK */
2490 #line 559 "pikchr.y"
2491 {yymsp[-2].minor.yy36=0; pik_add_macro(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
2492 #line 2517 "pikchr.c"
2493 break;
2494 case 13: /* rvalue ::= PLACENAME */
2495 #line 570 "pikchr.y"
2496 {yylhsminor.yy153 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2497 #line 2522 "pikchr.c"
2498 yymsp[0].minor.yy153 = yylhsminor.yy153;
2499 break;
2500 case 14: /* pritem ::= FILL */
2501 case 15: /* pritem ::= COLOR */ yytestcase(yyruleno==15);
2502 case 16: /* pritem ::= THICKNESS */ yytestcase(yyruleno==16);
2503 #line 575 "pikchr.y"
2504 {pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2505 #line 2530 "pikchr.c"
2506 break;
2507 case 17: /* pritem ::= rvalue */
2508 #line 578 "pikchr.y"
2509 {pik_append_num(p,"",yymsp[0].minor.yy153);}
2510 #line 2535 "pikchr.c"
2511 break;
2512 case 18: /* pritem ::= STRING */
2513 #line 579 "pikchr.y"
2514 {pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2515 #line 2540 "pikchr.c"
2516 break;
2517 case 19: /* prsep ::= COMMA */
2518 #line 580 "pikchr.y"
2519 {pik_append(p, " ", 1);}
2520 #line 2545 "pikchr.c"
2521 break;
2522 case 20: /* unnamed_statement ::= basetype attribute_list */
2523 #line 583 "pikchr.y"
2524 {yylhsminor.yy36 = yymsp[-1].minor.yy36; pik_after_adding_attributes(p,yylhsminor.yy36);}
2525 #line 2550 "pikchr.c"
2526 yymsp[-1].minor.yy36 = yylhsminor.yy36;
2527 break;
2528 case 21: /* basetype ::= CLASSNAME */
2529 #line 585 "pikchr.y"
2530 {yylhsminor.yy36 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2531 #line 2556 "pikchr.c"
2532 yymsp[0].minor.yy36 = yylhsminor.yy36;
2533 break;
2534 case 22: /* basetype ::= STRING textposition */
2535 #line 587 "pikchr.y"
2536 {yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy164; yylhsminor.yy36 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2537 #line 2562 "pikchr.c"
2538 yymsp[-1].minor.yy36 = yylhsminor.yy36;
2539 break;
2540 case 23: /* basetype ::= LB savelist statement_list RB */
2541 #line 589 "pikchr.y"
2542 { p->list = yymsp[-2].minor.yy227; yymsp[-3].minor.yy36 = pik_elem_new(p,0,0,yymsp[-1].minor.yy227); if(yymsp[-3].minor.yy36) yymsp[-3].minor.yy36->errTok = yymsp[0].minor.yy0; }
2543 #line 2568 "pikchr.c"
2544 break;
2545 case 24: /* savelist ::= */
2546 #line 594 "pikchr.y"
2547 {yymsp[1].minor.yy227 = p->list; p->list = 0;}
2548 #line 2573 "pikchr.c"
2549 break;
2550 case 25: /* relexpr ::= expr */
2551 #line 601 "pikchr.y"
2552 {yylhsminor.yy10.rAbs = yymsp[0].minor.yy153; yylhsminor.yy10.rRel = 0;}
2553 #line 2578 "pikchr.c"
2554 yymsp[0].minor.yy10 = yylhsminor.yy10;
2555 break;
2556 case 26: /* relexpr ::= expr PERCENT */
2557 #line 602 "pikchr.y"
2558 {yylhsminor.yy10.rAbs = 0; yylhsminor.yy10.rRel = yymsp[-1].minor.yy153/100;}
2559 #line 2584 "pikchr.c"
2560 yymsp[-1].minor.yy10 = yylhsminor.yy10;
2561 break;
2562 case 27: /* optrelexpr ::= */
2563 #line 604 "pikchr.y"
2564 {yymsp[1].minor.yy10.rAbs = 0; yymsp[1].minor.yy10.rRel = 1.0;}
2565 #line 2590 "pikchr.c"
2566 break;
2567 case 28: /* attribute_list ::= relexpr alist */
2568 #line 606 "pikchr.y"
2569 {pik_add_direction(p,0,&yymsp[-1].minor.yy10);}
2570 #line 2595 "pikchr.c"
2571 break;
2572 case 29: /* attribute ::= numproperty relexpr */
2573 #line 610 "pikchr.y"
2574 { pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy10); }
2575 #line 2600 "pikchr.c"
2576 break;
2577 case 30: /* attribute ::= dashproperty expr */
2578 #line 611 "pikchr.y"
2579 { pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy153); }
2580 #line 2605 "pikchr.c"
2581 break;
2582 case 31: /* attribute ::= dashproperty */
2583 #line 612 "pikchr.y"
2584 { pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2585 #line 2610 "pikchr.c"
2586 break;
2587 case 32: /* attribute ::= colorproperty rvalue */
2588 #line 613 "pikchr.y"
2589 { pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy153); }
2590 #line 2615 "pikchr.c"
2591 break;
2592 case 33: /* attribute ::= go direction optrelexpr */
2593 #line 614 "pikchr.y"
2594 { pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy10);}
2595 #line 2620 "pikchr.c"
2596 break;
2597 case 34: /* attribute ::= go direction even position */
2598 #line 615 "pikchr.y"
2599 {pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy79);}
2600 #line 2625 "pikchr.c"
2601 break;
2602 case 35: /* attribute ::= CLOSE */
2603 #line 616 "pikchr.y"
2604 { pik_close_path(p,&yymsp[0].minor.yy0); }
2605 #line 2630 "pikchr.c"
2606 break;
2607 case 36: /* attribute ::= CHOP */
2608 #line 617 "pikchr.y"
2609 { p->cur->bChop = 1; }
2610 #line 2635 "pikchr.c"
2611 break;
2612 case 37: /* attribute ::= FROM position */
2613 #line 618 "pikchr.y"
2614 { pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy79); }
2615 #line 2640 "pikchr.c"
2616 break;
2617 case 38: /* attribute ::= TO position */
2618 #line 619 "pikchr.y"
2619 { pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy79); }
2620 #line 2645 "pikchr.c"
2621 break;
2622 case 39: /* attribute ::= THEN */
2623 #line 620 "pikchr.y"
2624 { pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2625 #line 2650 "pikchr.c"
2626 break;
2627 case 40: /* attribute ::= THEN optrelexpr HEADING expr */
2628 case 42: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==42);
2629 #line 622 "pikchr.y"
2630 {pik_move_hdg(p,&yymsp[-2].minor.yy10,&yymsp[-1].minor.yy0,yymsp[0].minor.yy153,0,&yymsp[-3].minor.yy0);}
2631 #line 2656 "pikchr.c"
2632 break;
2633 case 41: /* attribute ::= THEN optrelexpr EDGEPT */
2634 case 43: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==43);
2635 #line 623 "pikchr.y"
2636 {pik_move_hdg(p,&yymsp[-1].minor.yy10,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2637 #line 2662 "pikchr.c"
2638 break;
2639 case 44: /* attribute ::= AT position */
2640 #line 628 "pikchr.y"
2641 { pik_set_at(p,0,&yymsp[0].minor.yy79,&yymsp[-1].minor.yy0); }
2642 #line 2667 "pikchr.c"
2643 break;
2644 case 45: /* attribute ::= SAME */
2645 #line 630 "pikchr.y"
2646 {pik_same(p,0,&yymsp[0].minor.yy0);}
2647 #line 2672 "pikchr.c"
2648 break;
2649 case 46: /* attribute ::= SAME AS object */
2650 #line 631 "pikchr.y"
2651 {pik_same(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2652 #line 2677 "pikchr.c"
2653 break;
2654 case 47: /* attribute ::= STRING textposition */
2655 #line 632 "pikchr.y"
2656 {pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy164);}
2657 #line 2682 "pikchr.c"
2658 break;
2659 case 48: /* attribute ::= FIT */
2660 #line 633 "pikchr.y"
2661 {pik_size_to_fit(p,&yymsp[0].minor.yy0,3); }
2662 #line 2687 "pikchr.c"
2663 break;
2664 case 49: /* attribute ::= BEHIND object */
2665 #line 634 "pikchr.y"
2666 {pik_behind(p,yymsp[0].minor.yy36);}
2667 #line 2692 "pikchr.c"
2668 break;
2669 case 50: /* withclause ::= DOT_E edge AT position */
2670 case 51: /* withclause ::= edge AT position */ yytestcase(yyruleno==51);
2671 #line 642 "pikchr.y"
2672 { pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy79,&yymsp[-1].minor.yy0); }
2673 #line 2698 "pikchr.c"
2674 break;
2675 case 52: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2676 #line 646 "pikchr.y"
2677 {yylhsminor.yy0 = yymsp[0].minor.yy0;}
2678 #line 2703 "pikchr.c"
2679 yymsp[0].minor.yy0 = yylhsminor.yy0;
2680 break;
2681 case 53: /* boolproperty ::= CW */
2682 #line 657 "pikchr.y"
2683 {p->cur->cw = 1;}
2684 #line 2709 "pikchr.c"
2685 break;
2686 case 54: /* boolproperty ::= CCW */
2687 #line 658 "pikchr.y"
2688 {p->cur->cw = 0;}
2689 #line 2714 "pikchr.c"
2690 break;
2691 case 55: /* boolproperty ::= LARROW */
2692 #line 659 "pikchr.y"
2693 {p->cur->larrow=1; p->cur->rarrow=0; }
2694 #line 2719 "pikchr.c"
2695 break;
2696 case 56: /* boolproperty ::= RARROW */
2697 #line 660 "pikchr.y"
2698 {p->cur->larrow=0; p->cur->rarrow=1; }
2699 #line 2724 "pikchr.c"
2700 break;
2701 case 57: /* boolproperty ::= LRARROW */
2702 #line 661 "pikchr.y"
2703 {p->cur->larrow=1; p->cur->rarrow=1; }
2704 #line 2729 "pikchr.c"
2705 break;
2706 case 58: /* boolproperty ::= INVIS */
2707 #line 662 "pikchr.y"
2708 {p->cur->sw = 0.0;}
2709 #line 2734 "pikchr.c"
2710 break;
2711 case 59: /* boolproperty ::= THICK */
2712 #line 663 "pikchr.y"
2713 {p->cur->sw *= 1.5;}
2714 #line 2739 "pikchr.c"
2715 break;
2716 case 60: /* boolproperty ::= THIN */
2717 #line 664 "pikchr.y"
2718 {p->cur->sw *= 0.67;}
2719 #line 2744 "pikchr.c"
2720 break;
2721 case 61: /* boolproperty ::= SOLID */
2722 #line 665 "pikchr.y"
2723 {p->cur->sw = pik_value(p,"thickness",9,0);
2724 p->cur->dotted = p->cur->dashed = 0.0;}
2725 #line 2750 "pikchr.c"
2726 break;
2727 case 62: /* textposition ::= */
2728 #line 668 "pikchr.y"
2729 {yymsp[1].minor.yy164 = 0;}
2730 #line 2755 "pikchr.c"
2731 break;
2732 case 63: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2733 #line 671 "pikchr.y"
2734 {yylhsminor.yy164 = (short int)pik_text_position(yymsp[-1].minor.yy164,&yymsp[0].minor.yy0);}
2735 #line 2760 "pikchr.c"
2736 yymsp[-1].minor.yy164 = yylhsminor.yy164;
2737 break;
2738 case 64: /* position ::= expr COMMA expr */
2739 #line 674 "pikchr.y"
2740 {yylhsminor.yy79.x=yymsp[-2].minor.yy153; yylhsminor.yy79.y=yymsp[0].minor.yy153;}
2741 #line 2766 "pikchr.c"
2742 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2743 break;
2744 case 65: /* position ::= place PLUS expr COMMA expr */
2745 #line 676 "pikchr.y"
2746 {yylhsminor.yy79.x=yymsp[-4].minor.yy79.x+yymsp[-2].minor.yy153; yylhsminor.yy79.y=yymsp[-4].minor.yy79.y+yymsp[0].minor.yy153;}
2747 #line 2772 "pikchr.c"
2748 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2749 break;
2750 case 66: /* position ::= place MINUS expr COMMA expr */
2751 #line 677 "pikchr.y"
2752 {yylhsminor.yy79.x=yymsp[-4].minor.yy79.x-yymsp[-2].minor.yy153; yylhsminor.yy79.y=yymsp[-4].minor.yy79.y-yymsp[0].minor.yy153;}
2753 #line 2778 "pikchr.c"
2754 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2755 break;
2756 case 67: /* position ::= place PLUS LP expr COMMA expr RP */
2757 #line 679 "pikchr.y"
2758 {yylhsminor.yy79.x=yymsp[-6].minor.yy79.x+yymsp[-3].minor.yy153; yylhsminor.yy79.y=yymsp[-6].minor.yy79.y+yymsp[-1].minor.yy153;}
2759 #line 2784 "pikchr.c"
2760 yymsp[-6].minor.yy79 = yylhsminor.yy79;
2761 break;
2762 case 68: /* position ::= place MINUS LP expr COMMA expr RP */
2763 #line 681 "pikchr.y"
2764 {yylhsminor.yy79.x=yymsp[-6].minor.yy79.x-yymsp[-3].minor.yy153; yylhsminor.yy79.y=yymsp[-6].minor.yy79.y-yymsp[-1].minor.yy153;}
2765 #line 2790 "pikchr.c"
2766 yymsp[-6].minor.yy79 = yylhsminor.yy79;
2767 break;
2768 case 69: /* position ::= LP position COMMA position RP */
2769 #line 682 "pikchr.y"
2770 {yymsp[-4].minor.yy79.x=yymsp[-3].minor.yy79.x; yymsp[-4].minor.yy79.y=yymsp[-1].minor.yy79.y;}
2771 #line 2796 "pikchr.c"
2772 break;
2773 case 70: /* position ::= LP position RP */
2774 #line 683 "pikchr.y"
2775 {yymsp[-2].minor.yy79=yymsp[-1].minor.yy79;}
2776 #line 2801 "pikchr.c"
2777 break;
2778 case 71: /* position ::= expr between position AND position */
2779 #line 685 "pikchr.y"
2780 {yylhsminor.yy79 = pik_position_between(yymsp[-4].minor.yy153,yymsp[-2].minor.yy79,yymsp[0].minor.yy79);}
2781 #line 2806 "pikchr.c"
2782 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2783 break;
2784 case 72: /* position ::= expr LT position COMMA position GT */
2785 #line 687 "pikchr.y"
2786 {yylhsminor.yy79 = pik_position_between(yymsp[-5].minor.yy153,yymsp[-3].minor.yy79,yymsp[-1].minor.yy79);}
2787 #line 2812 "pikchr.c"
2788 yymsp[-5].minor.yy79 = yylhsminor.yy79;
2789 break;
2790 case 73: /* position ::= expr ABOVE position */
2791 #line 688 "pikchr.y"
2792 {yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.y += yymsp[-2].minor.yy153;}
2793 #line 2818 "pikchr.c"
2794 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2795 break;
2796 case 74: /* position ::= expr BELOW position */
2797 #line 689 "pikchr.y"
2798 {yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.y -= yymsp[-2].minor.yy153;}
2799 #line 2824 "pikchr.c"
2800 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2801 break;
2802 case 75: /* position ::= expr LEFT OF position */
2803 #line 690 "pikchr.y"
2804 {yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.x -= yymsp[-3].minor.yy153;}
2805 #line 2830 "pikchr.c"
2806 yymsp[-3].minor.yy79 = yylhsminor.yy79;
2807 break;
2808 case 76: /* position ::= expr RIGHT OF position */
2809 #line 691 "pikchr.y"
2810 {yylhsminor.yy79=yymsp[0].minor.yy79; yylhsminor.yy79.x += yymsp[-3].minor.yy153;}
2811 #line 2836 "pikchr.c"
2812 yymsp[-3].minor.yy79 = yylhsminor.yy79;
2813 break;
2814 case 77: /* position ::= expr ON HEADING EDGEPT OF position */
2815 #line 693 "pikchr.y"
2816 {yylhsminor.yy79 = pik_position_at_hdg(yymsp[-5].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2817 #line 2842 "pikchr.c"
2818 yymsp[-5].minor.yy79 = yylhsminor.yy79;
2819 break;
2820 case 78: /* position ::= expr HEADING EDGEPT OF position */
2821 #line 695 "pikchr.y"
2822 {yylhsminor.yy79 = pik_position_at_hdg(yymsp[-4].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2823 #line 2848 "pikchr.c"
2824 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2825 break;
2826 case 79: /* position ::= expr EDGEPT OF position */
2827 #line 697 "pikchr.y"
2828 {yylhsminor.yy79 = pik_position_at_hdg(yymsp[-3].minor.yy153,&yymsp[-2].minor.yy0,yymsp[0].minor.yy79);}
2829 #line 2854 "pikchr.c"
2830 yymsp[-3].minor.yy79 = yylhsminor.yy79;
2831 break;
2832 case 80: /* position ::= expr ON HEADING expr FROM position */
2833 #line 699 "pikchr.y"
2834 {yylhsminor.yy79 = pik_position_at_angle(yymsp[-5].minor.yy153,yymsp[-2].minor.yy153,yymsp[0].minor.yy79);}
2835 #line 2860 "pikchr.c"
2836 yymsp[-5].minor.yy79 = yylhsminor.yy79;
2837 break;
2838 case 81: /* position ::= expr HEADING expr FROM position */
2839 #line 701 "pikchr.y"
2840 {yylhsminor.yy79 = pik_position_at_angle(yymsp[-4].minor.yy153,yymsp[-2].minor.yy153,yymsp[0].minor.yy79);}
2841 #line 2866 "pikchr.c"
2842 yymsp[-4].minor.yy79 = yylhsminor.yy79;
2843 break;
2844 case 82: /* place ::= edge OF object */
2845 #line 713 "pikchr.y"
2846 {yylhsminor.yy79 = pik_place_of_elem(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2847 #line 2872 "pikchr.c"
2848 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2849 break;
2850 case 83: /* place2 ::= object */
2851 #line 714 "pikchr.y"
2852 {yylhsminor.yy79 = pik_place_of_elem(p,yymsp[0].minor.yy36,0);}
2853 #line 2878 "pikchr.c"
2854 yymsp[0].minor.yy79 = yylhsminor.yy79;
2855 break;
2856 case 84: /* place2 ::= object DOT_E edge */
2857 #line 715 "pikchr.y"
2858 {yylhsminor.yy79 = pik_place_of_elem(p,yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
2859 #line 2884 "pikchr.c"
2860 yymsp[-2].minor.yy79 = yylhsminor.yy79;
2861 break;
2862 case 85: /* place2 ::= NTH VERTEX OF object */
2863 #line 716 "pikchr.y"
2864 {yylhsminor.yy79 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy36);}
2865 #line 2890 "pikchr.c"
2866 yymsp[-3].minor.yy79 = yylhsminor.yy79;
2867 break;
2868 case 86: /* object ::= nth */
2869 #line 728 "pikchr.y"
2870 {yylhsminor.yy36 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2871 #line 2896 "pikchr.c"
2872 yymsp[0].minor.yy36 = yylhsminor.yy36;
2873 break;
2874 case 87: /* object ::= nth OF|IN object */
2875 #line 729 "pikchr.y"
2876 {yylhsminor.yy36 = pik_find_nth(p,yymsp[0].minor.yy36,&yymsp[-2].minor.yy0);}
2877 #line 2902 "pikchr.c"
2878 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2879 break;
2880 case 88: /* objectname ::= THIS */
2881 #line 731 "pikchr.y"
2882 {yymsp[0].minor.yy36 = p->cur;}
2883 #line 2908 "pikchr.c"
2884 break;
2885 case 89: /* objectname ::= PLACENAME */
2886 #line 732 "pikchr.y"
2887 {yylhsminor.yy36 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2888 #line 2913 "pikchr.c"
2889 yymsp[0].minor.yy36 = yylhsminor.yy36;
2890 break;
2891 case 90: /* objectname ::= objectname DOT_U PLACENAME */
2892 #line 734 "pikchr.y"
2893 {yylhsminor.yy36 = pik_find_byname(p,yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
2894 #line 2919 "pikchr.c"
2895 yymsp[-2].minor.yy36 = yylhsminor.yy36;
2896 break;
2897 case 91: /* nth ::= NTH CLASSNAME */
2898 #line 736 "pikchr.y"
2899 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2900 #line 2925 "pikchr.c"
2901 yymsp[-1].minor.yy0 = yylhsminor.yy0;
2902 break;
2903 case 92: /* nth ::= NTH LAST CLASSNAME */
2904 #line 737 "pikchr.y"
2905 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2906 #line 2931 "pikchr.c"
2907 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2908 break;
2909 case 93: /* nth ::= LAST CLASSNAME */
2910 #line 738 "pikchr.y"
2911 {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2912 #line 2937 "pikchr.c"
2913 break;
2914 case 94: /* nth ::= LAST */
2915 #line 739 "pikchr.y"
2916 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2917 #line 2942 "pikchr.c"
2918 yymsp[0].minor.yy0 = yylhsminor.yy0;
2919 break;
2920 case 95: /* nth ::= NTH LB RB */
2921 #line 740 "pikchr.y"
2922 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2923 #line 2948 "pikchr.c"
2924 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2925 break;
2926 case 96: /* nth ::= NTH LAST LB RB */
2927 #line 741 "pikchr.y"
2928 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2929 #line 2954 "pikchr.c"
2930 yymsp[-3].minor.yy0 = yylhsminor.yy0;
2931 break;
2932 case 97: /* nth ::= LAST LB RB */
2933 #line 742 "pikchr.y"
2934 {yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2935 #line 2960 "pikchr.c"
2936 break;
2937 case 98: /* expr ::= expr PLUS expr */
2938 #line 744 "pikchr.y"
2939 {yylhsminor.yy153=yymsp[-2].minor.yy153+yymsp[0].minor.yy153;}
2940 #line 2965 "pikchr.c"
2941 yymsp[-2].minor.yy153 = yylhsminor.yy153;
2942 break;
2943 case 99: /* expr ::= expr MINUS expr */
2944 #line 745 "pikchr.y"
2945 {yylhsminor.yy153=yymsp[-2].minor.yy153-yymsp[0].minor.yy153;}
2946 #line 2971 "pikchr.c"
2947 yymsp[-2].minor.yy153 = yylhsminor.yy153;
2948 break;
2949 case 100: /* expr ::= expr STAR expr */
2950 #line 746 "pikchr.y"
2951 {yylhsminor.yy153=yymsp[-2].minor.yy153*yymsp[0].minor.yy153;}
2952 #line 2977 "pikchr.c"
2953 yymsp[-2].minor.yy153 = yylhsminor.yy153;
2954 break;
2955 case 101: /* expr ::= expr SLASH expr */
2956 #line 747 "pikchr.y"
2957 {
2958 if( yymsp[0].minor.yy153==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy153 = 0.0; }
2959 else{ yylhsminor.yy153 = yymsp[-2].minor.yy153/yymsp[0].minor.yy153; }
2960 }
2961 #line 2986 "pikchr.c"
2962 yymsp[-2].minor.yy153 = yylhsminor.yy153;
2963 break;
2964 case 102: /* expr ::= MINUS expr */
2965 #line 751 "pikchr.y"
2966 {yymsp[-1].minor.yy153=-yymsp[0].minor.yy153;}
2967 #line 2992 "pikchr.c"
2968 break;
2969 case 103: /* expr ::= PLUS expr */
2970 #line 752 "pikchr.y"
2971 {yymsp[-1].minor.yy153=yymsp[0].minor.yy153;}
2972 #line 2997 "pikchr.c"
2973 break;
2974 case 104: /* expr ::= LP expr RP */
2975 #line 753 "pikchr.y"
2976 {yymsp[-2].minor.yy153=yymsp[-1].minor.yy153;}
2977 #line 3002 "pikchr.c"
2978 break;
2979 case 105: /* expr ::= LP FILL|COLOR|THICKNESS RP */
2980 #line 754 "pikchr.y"
2981 {yymsp[-2].minor.yy153=pik_get_var(p,&yymsp[-1].minor.yy0);}
2982 #line 3007 "pikchr.c"
2983 break;
2984 case 106: /* expr ::= NUMBER */
2985 #line 755 "pikchr.y"
2986 {yylhsminor.yy153=pik_atof(&yymsp[0].minor.yy0);}
2987 #line 3012 "pikchr.c"
2988 yymsp[0].minor.yy153 = yylhsminor.yy153;
2989 break;
2990 case 107: /* expr ::= ID */
2991 #line 756 "pikchr.y"
2992 {yylhsminor.yy153=pik_get_var(p,&yymsp[0].minor.yy0);}
2993 #line 3018 "pikchr.c"
2994 yymsp[0].minor.yy153 = yylhsminor.yy153;
2995 break;
2996 case 108: /* expr ::= FUNC1 LP expr RP */
2997 #line 757 "pikchr.y"
2998 {yylhsminor.yy153 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy153,0.0);}
2999 #line 3024 "pikchr.c"
3000 yymsp[-3].minor.yy153 = yylhsminor.yy153;
3001 break;
3002 case 109: /* expr ::= FUNC2 LP expr COMMA expr RP */
3003 #line 758 "pikchr.y"
3004 {yylhsminor.yy153 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy153,yymsp[-1].minor.yy153);}
3005 #line 3030 "pikchr.c"
3006 yymsp[-5].minor.yy153 = yylhsminor.yy153;
3007 break;
3008 case 110: /* expr ::= DIST LP position COMMA position RP */
3009 #line 759 "pikchr.y"
3010 {yymsp[-5].minor.yy153 = pik_dist(&yymsp[-3].minor.yy79,&yymsp[-1].minor.yy79);}
3011 #line 3036 "pikchr.c"
3012 break;
3013 case 111: /* expr ::= place2 DOT_XY X */
3014 #line 760 "pikchr.y"
3015 {yylhsminor.yy153 = yymsp[-2].minor.yy79.x;}
3016 #line 3041 "pikchr.c"
3017 yymsp[-2].minor.yy153 = yylhsminor.yy153;
3018 break;
3019 case 112: /* expr ::= place2 DOT_XY Y */
3020 #line 761 "pikchr.y"
3021 {yylhsminor.yy153 = yymsp[-2].minor.yy79.y;}
3022 #line 3047 "pikchr.c"
3023 yymsp[-2].minor.yy153 = yylhsminor.yy153;
3024 break;
3025 case 113: /* expr ::= object DOT_L numproperty */
3026 case 114: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==114);
3027 case 115: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==115);
3028 #line 762 "pikchr.y"
3029 {yylhsminor.yy153=pik_property_of(yymsp[-2].minor.yy36,&yymsp[0].minor.yy0);}
3030 #line 3055 "pikchr.c"
3031 yymsp[-2].minor.yy153 = yylhsminor.yy153;
3032 break;
3033 default:
3034 /* (116) lvalue ::= ID */ yytestcase(yyruleno==116);
3035 /* (117) lvalue ::= FILL */ yytestcase(yyruleno==117);
@@ -3127,19 +3128,19 @@
3128 ){
3129 pik_parserARG_FETCH
3130 pik_parserCTX_FETCH
3131 #define TOKEN yyminor
3132 /************ Begin %syntax_error code ****************************************/
3133 #line 522 "pikchr.y"
3134
3135 if( TOKEN.z && TOKEN.z[0] ){
3136 pik_error(p, &TOKEN, "syntax error");
3137 }else{
3138 pik_error(p, 0, "syntax error");
3139 }
3140 UNUSED_PARAMETER(yymajor);
3141 #line 3166 "pikchr.c"
3142 /************ End %syntax_error code ******************************************/
3143 pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
3144 pik_parserCTX_STORE
3145 }
3146
@@ -3368,11 +3369,11 @@
3369 #else
3370 (void)iToken;
3371 return 0;
3372 #endif
3373 }
3374 #line 767 "pikchr.y"
3375
3376
3377
3378 /* Chart of the 148 official CSS color names with their
3379 ** corresponding RGB values thru Color Module Level 4:
@@ -4511,11 +4512,11 @@
4512 if( z==0 ){
4513 pik_error(p, 0, 0);
4514 return;
4515 }
4516 p->zOut = z;
4517 p->nOutAlloc = nNew;
4518 }
4519 memcpy(p->zOut+p->nOut, zText, n);
4520 p->nOut += n;
4521 p->zOut[p->nOut] = 0;
4522 }
@@ -4637,27 +4638,27 @@
4638 ** on the value.
4639 */
4640 static void pik_append_x(Pik *p, const char *z1, PNum v, const char *z2){
4641 char buf[200];
4642 v -= p->bbox.sw.x;
4643 snprintf(buf, sizeof(buf)-1, "%s%d%s", z1, pik_round(p->rScale*v), z2);
4644 buf[sizeof(buf)-1] = 0;
4645 pik_append(p, buf, -1);
4646 }
4647 static void pik_append_y(Pik *p, const char *z1, PNum v, const char *z2){
4648 char buf[200];
4649 v = p->bbox.ne.y - v;
4650 snprintf(buf, sizeof(buf)-1, "%s%d%s", z1, pik_round(p->rScale*v), z2);
4651 buf[sizeof(buf)-1] = 0;
4652 pik_append(p, buf, -1);
4653 }
4654 static void pik_append_xy(Pik *p, const char *z1, PNum x, PNum y){
4655 char buf[200];
4656 x = x - p->bbox.sw.x;
4657 y = p->bbox.ne.y - y;
4658 snprintf(buf, sizeof(buf)-1, "%s%d,%d", z1,
4659 pik_round(p->rScale*x), pik_round(p->rScale*y));
4660 buf[sizeof(buf)-1] = 0;
4661 pik_append(p, buf, -1);
4662 }
4663 static void pik_append_dis(Pik *p, const char *z1, PNum v, const char *z2){
4664 char buf[200];
@@ -4673,11 +4674,11 @@
4674 ** foreground color if false. The distinction only matters for color
4675 ** inversions in PIKCHR_DARK_MODE.
4676 */
4677 static void pik_append_clr(Pik *p,const char *z1,PNum v,const char *z2,int bg){
4678 char buf[200];
4679 int x = pik_round(v);
4680 int r, g, b;
4681 if( x==0 && p->fgcolor>0 && !bg ){
4682 x = p->fgcolor;
4683 }else if( bg && x>=0xffffff && p->bgcolor>0 ){
4684 x = p->bgcolor;
@@ -4699,12 +4700,12 @@
4700 static void pik_append_arc(Pik *p, PNum r1, PNum r2, PNum x, PNum y){
4701 char buf[200];
4702 x = x - p->bbox.sw.x;
4703 y = p->bbox.ne.y - y;
4704 snprintf(buf, sizeof(buf)-1, "A%d %d 0 0 0 %d %d",
4705 pik_round(p->rScale*r1), pik_round(p->rScale*r2),
4706 pik_round(p->rScale*x), pik_round(p->rScale*y));
4707 buf[sizeof(buf)-1] = 0;
4708 pik_append(p, buf, -1);
4709 }
4710
4711 /* Append a style="..." text. But, leave the quote unterminated, in case
@@ -6221,10 +6222,20 @@
6222 break;
6223 default: pVar->val = val; break;
6224 }
6225 p->bLayoutVars = 0; /* Clear the layout setting cache */
6226 }
6227
6228 /*
6229 ** Round a PNum into the nearest integer
6230 */
6231 static int pik_round(PNum v){
6232 if( isnan(v) ) return 0;
6233 if( v < -2147483647 ) return -2147483648;
6234 if( v >= 2147483647 ) return 2147483647;
6235 return (int)v;
6236 }
6237
6238 /*
6239 ** Search for the variable named z[0..n-1] in:
6240 **
6241 ** * Application defined variables
@@ -6261,14 +6272,11 @@
6272 }
6273 if( pMiss ) *pMiss = 1;
6274 return 0.0;
6275 }
6276 static int pik_value_int(Pik *p, const char *z, int n, int *pMiss){
6277 return pik_round(pik_value(p,z,n,pMiss));
 
 
 
6278 }
6279
6280 /*
6281 ** Look up a color-name. Unlike other names in this program, the
6282 ** color-names are not case sensitive. So "DarkBlue" and "darkblue"
@@ -6974,19 +6982,19 @@
6982 p->fgcolor = pik_value_int(p,"fgcolor",7,&miss);
6983 if( miss ){
6984 PToken t;
6985 t.z = "fgcolor";
6986 t.n = 7;
6987 p->fgcolor = pik_round(pik_lookup_color(0, &t));
6988 }
6989 miss = 0;
6990 p->bgcolor = pik_value_int(p,"bgcolor",7,&miss);
6991 if( miss ){
6992 PToken t;
6993 t.z = "bgcolor";
6994 t.n = 7;
6995 p->bgcolor = pik_round(pik_lookup_color(0, &t));
6996 }
6997
6998 /* Compute a bounding box over all objects so that we can know
6999 ** how big to declare the SVG canvas */
7000 pik_bbox_init(&p->bbox);
@@ -7006,18 +7014,18 @@
7014 pik_append(p, p->zClass, -1);
7015 pik_append(p, "\"", 1);
7016 }
7017 w = p->bbox.ne.x - p->bbox.sw.x;
7018 h = p->bbox.ne.y - p->bbox.sw.y;
7019 p->wSVG = pik_round(p->rScale*w);
7020 p->hSVG = pik_round(p->rScale*h);
7021 pikScale = pik_value(p,"scale",5,0);
7022 if( pikScale>=0.001 && pikScale<=1000.0
7023 && (pikScale<0.99 || pikScale>1.01)
7024 ){
7025 p->wSVG = pik_round(p->wSVG*pikScale);
7026 p->hSVG = pik_round(p->hSVG*pikScale);
7027 pik_append_num(p, " width=\"", p->wSVG);
7028 pik_append_num(p, "\" height=\"", p->hSVG);
7029 pik_append(p, "\"", 1);
7030 }
7031 pik_append_dis(p, " viewBox=\"0 0 ",w,"");
@@ -7758,15 +7766,16 @@
7766 #if defined(PIKCHR_FUZZ)
7767 #include <stdint.h>
7768 int LLVMFuzzerTestOneInput(const uint8_t *aData, size_t nByte){
7769 int w,h;
7770 char *zIn, *zOut;
7771 unsigned int mFlags = nByte & 3;
7772 zIn = malloc( nByte + 1 );
7773 if( zIn==0 ) return 0;
7774 memcpy(zIn, aData, nByte);
7775 zIn[nByte] = 0;
7776 zOut = pikchr(zIn, "pikchr", mFlags, &w, &h);
7777 free(zIn);
7778 free(zOut);
7779 return 0;
7780 }
7781 #endif /* PIKCHR_FUZZ */
@@ -8017,6 +8026,6 @@
8026
8027
8028 #endif /* PIKCHR_TCL */
8029
8030
8031 #line 8056 "pikchr.c"
8032

Keyboard Shortcuts

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