Fossil SCM

The "pikchr-foreground" color is applied directly and is not translated into dark-mode even if the "white-foreground" boolean is true.

drh 2020-11-10 14:14 trunk
Commit 569a99322754f1d6ef453e0627a61f81a3e0463b91415db1537616939a98189b
2 files changed +1 -1 +242 -229
--- src/markdown_html.c
+++ src/markdown_html.c
@@ -376,11 +376,11 @@
376376
if( skin_detail_boolean("white-foreground") ){
377377
pikFlags |= 0x02; /* PIKCHR_DARK_MODE */
378378
}
379379
zFgColor = skin_detail("pikchr-foreground");
380380
if( zFgColor && zFgColor[0] ){
381
- blob_appendf(&bSrc, "color = %s\n", zFgColor);
381
+ blob_appendf(&bSrc, "fgcolor = %s\n", zFgColor);
382382
}
383383
blob_append(&bSrc, zSrc, nSrc)
384384
/*have to dup input to ensure a NUL-terminated source string */;
385385
pikchr_process(blob_str(&bSrc), pikFlags, 0, ob);
386386
blob_reset(&bSrc);
387387
--- src/markdown_html.c
+++ src/markdown_html.c
@@ -376,11 +376,11 @@
376 if( skin_detail_boolean("white-foreground") ){
377 pikFlags |= 0x02; /* PIKCHR_DARK_MODE */
378 }
379 zFgColor = skin_detail("pikchr-foreground");
380 if( zFgColor && zFgColor[0] ){
381 blob_appendf(&bSrc, "color = %s\n", zFgColor);
382 }
383 blob_append(&bSrc, zSrc, nSrc)
384 /*have to dup input to ensure a NUL-terminated source string */;
385 pikchr_process(blob_str(&bSrc), pikFlags, 0, ob);
386 blob_reset(&bSrc);
387
--- src/markdown_html.c
+++ src/markdown_html.c
@@ -376,11 +376,11 @@
376 if( skin_detail_boolean("white-foreground") ){
377 pikFlags |= 0x02; /* PIKCHR_DARK_MODE */
378 }
379 zFgColor = skin_detail("pikchr-foreground");
380 if( zFgColor && zFgColor[0] ){
381 blob_appendf(&bSrc, "fgcolor = %s\n", zFgColor);
382 }
383 blob_append(&bSrc, zSrc, nSrc)
384 /*have to dup input to ensure a NUL-terminated source string */;
385 pikchr_process(blob_str(&bSrc), pikFlags, 0, ob);
386 blob_reset(&bSrc);
387
+242 -229
--- src/pikchr.c
+++ src/pikchr.c
@@ -363,10 +363,11 @@
363363
char bLayoutVars; /* True if cache is valid */
364364
char thenFlag; /* True if "then" seen */
365365
char samePath; /* aTPath copied by "same" */
366366
const char *zClass; /* Class name for the <svg> */
367367
int wSVG, hSVG; /* Width and height of the <svg> */
368
+ int fgcolor; /* fgcolor value, or -1 for none */
368369
/* Paths for lines are constructed here first, then transferred into
369370
** the PObj object at the end: */
370371
int nTPath; /* Number of entries on aTPath[] */
371372
int mTPath; /* For last entry, 1: x set, 2: y set */
372373
PPoint aTPath[1000]; /* Path under construction */
@@ -472,11 +473,11 @@
472473
static PObj *pik_position_assert(Pik*,PPoint*,PToken*,PPoint*);
473474
static PNum pik_dist(PPoint*,PPoint*);
474475
static void pik_add_macro(Pik*,PToken *pId,PToken *pCode);
475476
476477
477
-#line 503 "pikchr.c"
478
+#line 504 "pikchr.c"
478479
/**************** End of %include directives **********************************/
479480
/* These constants specify the various numeric values for terminal symbols.
480481
***************** Begin token definitions *************************************/
481482
#ifndef T_ID
482483
#define T_ID 1
@@ -1689,22 +1690,22 @@
16891690
** inside the C code.
16901691
*/
16911692
/********* Begin destructor definitions ***************************************/
16921693
case 98: /* statement_list */
16931694
{
1694
-#line 492 "pikchr.y"
1695
+#line 493 "pikchr.y"
16951696
pik_elist_free(p,(yypminor->yy119));
1696
-#line 1721 "pikchr.c"
1697
+#line 1722 "pikchr.c"
16971698
}
16981699
break;
16991700
case 99: /* statement */
17001701
case 100: /* unnamed_statement */
17011702
case 101: /* basetype */
17021703
{
1703
-#line 494 "pikchr.y"
1704
+#line 495 "pikchr.y"
17041705
pik_elem_free(p,(yypminor->yy38));
1705
-#line 1730 "pikchr.c"
1706
+#line 1731 "pikchr.c"
17061707
}
17071708
break;
17081709
/********* End destructor definitions *****************************************/
17091710
default: break; /* If no destructor action specified: do nothing */
17101711
}
@@ -1918,14 +1919,14 @@
19181919
#endif
19191920
while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
19201921
/* Here code is inserted which will execute if the parser
19211922
** stack every overflows */
19221923
/******** Begin %stack_overflow code ******************************************/
1923
-#line 526 "pikchr.y"
1924
+#line 527 "pikchr.y"
19241925
19251926
pik_error(p, 0, "parser stack overflow");
1926
-#line 1951 "pikchr.c"
1927
+#line 1952 "pikchr.c"
19271928
/******** End %stack_overflow code ********************************************/
19281929
pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
19291930
pik_parserCTX_STORE
19301931
}
19311932
@@ -2399,614 +2400,614 @@
23992400
** break;
24002401
*/
24012402
/********** Begin reduce actions **********************************************/
24022403
YYMINORTYPE yylhsminor;
24032404
case 0: /* document ::= statement_list */
2404
-#line 530 "pikchr.y"
2405
+#line 531 "pikchr.y"
24052406
{pik_render(p,yymsp[0].minor.yy119);}
2406
-#line 2431 "pikchr.c"
2407
+#line 2432 "pikchr.c"
24072408
break;
24082409
case 1: /* statement_list ::= statement */
2409
-#line 533 "pikchr.y"
2410
+#line 534 "pikchr.y"
24102411
{ yylhsminor.yy119 = pik_elist_append(p,0,yymsp[0].minor.yy38); }
2411
-#line 2436 "pikchr.c"
2412
+#line 2437 "pikchr.c"
24122413
yymsp[0].minor.yy119 = yylhsminor.yy119;
24132414
break;
24142415
case 2: /* statement_list ::= statement_list EOL statement */
2415
-#line 535 "pikchr.y"
2416
+#line 536 "pikchr.y"
24162417
{ yylhsminor.yy119 = pik_elist_append(p,yymsp[-2].minor.yy119,yymsp[0].minor.yy38); }
2417
-#line 2442 "pikchr.c"
2418
+#line 2443 "pikchr.c"
24182419
yymsp[-2].minor.yy119 = yylhsminor.yy119;
24192420
break;
24202421
case 3: /* statement ::= */
2421
-#line 538 "pikchr.y"
2422
+#line 539 "pikchr.y"
24222423
{ yymsp[1].minor.yy38 = 0; }
2423
-#line 2448 "pikchr.c"
2424
+#line 2449 "pikchr.c"
24242425
break;
24252426
case 4: /* statement ::= direction */
2426
-#line 539 "pikchr.y"
2427
+#line 540 "pikchr.y"
24272428
{ pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy38=0; }
2428
-#line 2453 "pikchr.c"
2429
+#line 2454 "pikchr.c"
24292430
yymsp[0].minor.yy38 = yylhsminor.yy38;
24302431
break;
24312432
case 5: /* statement ::= lvalue ASSIGN rvalue */
2432
-#line 540 "pikchr.y"
2433
+#line 541 "pikchr.y"
24332434
{pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy265,&yymsp[-1].minor.yy0); yylhsminor.yy38=0;}
2434
-#line 2459 "pikchr.c"
2435
+#line 2460 "pikchr.c"
24352436
yymsp[-2].minor.yy38 = yylhsminor.yy38;
24362437
break;
24372438
case 6: /* statement ::= PLACENAME COLON unnamed_statement */
2438
-#line 542 "pikchr.y"
2439
+#line 543 "pikchr.y"
24392440
{ yylhsminor.yy38 = yymsp[0].minor.yy38; pik_elem_setname(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0); }
2440
-#line 2465 "pikchr.c"
2441
+#line 2466 "pikchr.c"
24412442
yymsp[-2].minor.yy38 = yylhsminor.yy38;
24422443
break;
24432444
case 7: /* statement ::= PLACENAME COLON position */
2444
-#line 544 "pikchr.y"
2445
+#line 545 "pikchr.y"
24452446
{ yylhsminor.yy38 = pik_elem_new(p,0,0,0);
24462447
if(yylhsminor.yy38){ yylhsminor.yy38->ptAt = yymsp[0].minor.yy43; pik_elem_setname(p,yylhsminor.yy38,&yymsp[-2].minor.yy0); }}
2447
-#line 2472 "pikchr.c"
2448
+#line 2473 "pikchr.c"
24482449
yymsp[-2].minor.yy38 = yylhsminor.yy38;
24492450
break;
24502451
case 8: /* statement ::= unnamed_statement */
2451
-#line 546 "pikchr.y"
2452
+#line 547 "pikchr.y"
24522453
{yylhsminor.yy38 = yymsp[0].minor.yy38;}
2453
-#line 2478 "pikchr.c"
2454
+#line 2479 "pikchr.c"
24542455
yymsp[0].minor.yy38 = yylhsminor.yy38;
24552456
break;
24562457
case 9: /* statement ::= print prlist */
2457
-#line 547 "pikchr.y"
2458
+#line 548 "pikchr.y"
24582459
{pik_append(p,"<br>\n",5); yymsp[-1].minor.yy38=0;}
2459
-#line 2484 "pikchr.c"
2460
+#line 2485 "pikchr.c"
24602461
break;
24612462
case 10: /* statement ::= ASSERT LP expr EQ expr RP */
2462
-#line 552 "pikchr.y"
2463
+#line 553 "pikchr.y"
24632464
{yymsp[-5].minor.yy38=pik_assert(p,yymsp[-3].minor.yy265,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy265);}
2464
-#line 2489 "pikchr.c"
2465
+#line 2490 "pikchr.c"
24652466
break;
24662467
case 11: /* statement ::= ASSERT LP position EQ position RP */
2467
-#line 554 "pikchr.y"
2468
+#line 555 "pikchr.y"
24682469
{yymsp[-5].minor.yy38=pik_position_assert(p,&yymsp[-3].minor.yy43,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy43);}
2469
-#line 2494 "pikchr.c"
2470
+#line 2495 "pikchr.c"
24702471
break;
24712472
case 12: /* statement ::= DEFINE ID CODEBLOCK */
2472
-#line 555 "pikchr.y"
2473
+#line 556 "pikchr.y"
24732474
{yymsp[-2].minor.yy38=0; pik_add_macro(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
2474
-#line 2499 "pikchr.c"
2475
+#line 2500 "pikchr.c"
24752476
break;
24762477
case 13: /* rvalue ::= PLACENAME */
2477
-#line 566 "pikchr.y"
2478
+#line 567 "pikchr.y"
24782479
{yylhsminor.yy265 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2479
-#line 2504 "pikchr.c"
2480
+#line 2505 "pikchr.c"
24802481
yymsp[0].minor.yy265 = yylhsminor.yy265;
24812482
break;
24822483
case 14: /* pritem ::= FILL */
24832484
case 15: /* pritem ::= COLOR */ yytestcase(yyruleno==15);
24842485
case 16: /* pritem ::= THICKNESS */ yytestcase(yyruleno==16);
2485
-#line 571 "pikchr.y"
2486
+#line 572 "pikchr.y"
24862487
{pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2487
-#line 2512 "pikchr.c"
2488
+#line 2513 "pikchr.c"
24882489
break;
24892490
case 17: /* pritem ::= rvalue */
2490
-#line 574 "pikchr.y"
2491
+#line 575 "pikchr.y"
24912492
{pik_append_num(p,"",yymsp[0].minor.yy265);}
2492
-#line 2517 "pikchr.c"
2493
+#line 2518 "pikchr.c"
24932494
break;
24942495
case 18: /* pritem ::= STRING */
2495
-#line 575 "pikchr.y"
2496
+#line 576 "pikchr.y"
24962497
{pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2497
-#line 2522 "pikchr.c"
2498
+#line 2523 "pikchr.c"
24982499
break;
24992500
case 19: /* prsep ::= COMMA */
2500
-#line 576 "pikchr.y"
2501
+#line 577 "pikchr.y"
25012502
{pik_append(p, " ", 1);}
2502
-#line 2527 "pikchr.c"
2503
+#line 2528 "pikchr.c"
25032504
break;
25042505
case 20: /* unnamed_statement ::= basetype attribute_list */
2505
-#line 579 "pikchr.y"
2506
+#line 580 "pikchr.y"
25062507
{yylhsminor.yy38 = yymsp[-1].minor.yy38; pik_after_adding_attributes(p,yylhsminor.yy38);}
2507
-#line 2532 "pikchr.c"
2508
+#line 2533 "pikchr.c"
25082509
yymsp[-1].minor.yy38 = yylhsminor.yy38;
25092510
break;
25102511
case 21: /* basetype ::= CLASSNAME */
2511
-#line 581 "pikchr.y"
2512
+#line 582 "pikchr.y"
25122513
{yylhsminor.yy38 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2513
-#line 2538 "pikchr.c"
2514
+#line 2539 "pikchr.c"
25142515
yymsp[0].minor.yy38 = yylhsminor.yy38;
25152516
break;
25162517
case 22: /* basetype ::= STRING textposition */
2517
-#line 583 "pikchr.y"
2518
+#line 584 "pikchr.y"
25182519
{yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy196; yylhsminor.yy38 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2519
-#line 2544 "pikchr.c"
2520
+#line 2545 "pikchr.c"
25202521
yymsp[-1].minor.yy38 = yylhsminor.yy38;
25212522
break;
25222523
case 23: /* basetype ::= LB savelist statement_list RB */
2523
-#line 585 "pikchr.y"
2524
+#line 586 "pikchr.y"
25242525
{ p->list = yymsp[-2].minor.yy119; yymsp[-3].minor.yy38 = pik_elem_new(p,0,0,yymsp[-1].minor.yy119); if(yymsp[-3].minor.yy38) yymsp[-3].minor.yy38->errTok = yymsp[0].minor.yy0; }
2525
-#line 2550 "pikchr.c"
2526
+#line 2551 "pikchr.c"
25262527
break;
25272528
case 24: /* savelist ::= */
2528
-#line 590 "pikchr.y"
2529
+#line 591 "pikchr.y"
25292530
{yymsp[1].minor.yy119 = p->list; p->list = 0;}
2530
-#line 2555 "pikchr.c"
2531
+#line 2556 "pikchr.c"
25312532
break;
25322533
case 25: /* relexpr ::= expr */
2533
-#line 597 "pikchr.y"
2534
+#line 598 "pikchr.y"
25342535
{yylhsminor.yy200.rAbs = yymsp[0].minor.yy265; yylhsminor.yy200.rRel = 0;}
2535
-#line 2560 "pikchr.c"
2536
+#line 2561 "pikchr.c"
25362537
yymsp[0].minor.yy200 = yylhsminor.yy200;
25372538
break;
25382539
case 26: /* relexpr ::= expr PERCENT */
2539
-#line 598 "pikchr.y"
2540
+#line 599 "pikchr.y"
25402541
{yylhsminor.yy200.rAbs = 0; yylhsminor.yy200.rRel = yymsp[-1].minor.yy265/100;}
2541
-#line 2566 "pikchr.c"
2542
+#line 2567 "pikchr.c"
25422543
yymsp[-1].minor.yy200 = yylhsminor.yy200;
25432544
break;
25442545
case 27: /* optrelexpr ::= */
2545
-#line 600 "pikchr.y"
2546
+#line 601 "pikchr.y"
25462547
{yymsp[1].minor.yy200.rAbs = 0; yymsp[1].minor.yy200.rRel = 1.0;}
2547
-#line 2572 "pikchr.c"
2548
+#line 2573 "pikchr.c"
25482549
break;
25492550
case 28: /* attribute_list ::= relexpr alist */
2550
-#line 602 "pikchr.y"
2551
+#line 603 "pikchr.y"
25512552
{pik_add_direction(p,0,&yymsp[-1].minor.yy200);}
2552
-#line 2577 "pikchr.c"
2553
+#line 2578 "pikchr.c"
25532554
break;
25542555
case 29: /* attribute ::= numproperty relexpr */
2555
-#line 606 "pikchr.y"
2556
+#line 607 "pikchr.y"
25562557
{ pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy200); }
2557
-#line 2582 "pikchr.c"
2558
+#line 2583 "pikchr.c"
25582559
break;
25592560
case 30: /* attribute ::= dashproperty expr */
2560
-#line 607 "pikchr.y"
2561
+#line 608 "pikchr.y"
25612562
{ pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy265); }
2562
-#line 2587 "pikchr.c"
2563
+#line 2588 "pikchr.c"
25632564
break;
25642565
case 31: /* attribute ::= dashproperty */
2565
-#line 608 "pikchr.y"
2566
+#line 609 "pikchr.y"
25662567
{ pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2567
-#line 2592 "pikchr.c"
2568
+#line 2593 "pikchr.c"
25682569
break;
25692570
case 32: /* attribute ::= colorproperty rvalue */
2570
-#line 609 "pikchr.y"
2571
+#line 610 "pikchr.y"
25712572
{ pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy265); }
2572
-#line 2597 "pikchr.c"
2573
+#line 2598 "pikchr.c"
25732574
break;
25742575
case 33: /* attribute ::= go direction optrelexpr */
2575
-#line 610 "pikchr.y"
2576
+#line 611 "pikchr.y"
25762577
{ pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy200);}
2577
-#line 2602 "pikchr.c"
2578
+#line 2603 "pikchr.c"
25782579
break;
25792580
case 34: /* attribute ::= go direction even position */
2580
-#line 611 "pikchr.y"
2581
+#line 612 "pikchr.y"
25812582
{pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy43);}
2582
-#line 2607 "pikchr.c"
2583
+#line 2608 "pikchr.c"
25832584
break;
25842585
case 35: /* attribute ::= CLOSE */
2585
-#line 612 "pikchr.y"
2586
+#line 613 "pikchr.y"
25862587
{ pik_close_path(p,&yymsp[0].minor.yy0); }
2587
-#line 2612 "pikchr.c"
2588
+#line 2613 "pikchr.c"
25882589
break;
25892590
case 36: /* attribute ::= CHOP */
2590
-#line 613 "pikchr.y"
2591
+#line 614 "pikchr.y"
25912592
{ p->cur->bChop = 1; }
2592
-#line 2617 "pikchr.c"
2593
+#line 2618 "pikchr.c"
25932594
break;
25942595
case 37: /* attribute ::= FROM position */
2595
-#line 614 "pikchr.y"
2596
+#line 615 "pikchr.y"
25962597
{ pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy43); }
2597
-#line 2622 "pikchr.c"
2598
+#line 2623 "pikchr.c"
25982599
break;
25992600
case 38: /* attribute ::= TO position */
2600
-#line 615 "pikchr.y"
2601
+#line 616 "pikchr.y"
26012602
{ pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy43); }
2602
-#line 2627 "pikchr.c"
2603
+#line 2628 "pikchr.c"
26032604
break;
26042605
case 39: /* attribute ::= THEN */
2605
-#line 616 "pikchr.y"
2606
+#line 617 "pikchr.y"
26062607
{ pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2607
-#line 2632 "pikchr.c"
2608
+#line 2633 "pikchr.c"
26082609
break;
26092610
case 40: /* attribute ::= THEN optrelexpr HEADING expr */
26102611
case 42: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==42);
2611
-#line 618 "pikchr.y"
2612
+#line 619 "pikchr.y"
26122613
{pik_move_hdg(p,&yymsp[-2].minor.yy200,&yymsp[-1].minor.yy0,yymsp[0].minor.yy265,0,&yymsp[-3].minor.yy0);}
2613
-#line 2638 "pikchr.c"
2614
+#line 2639 "pikchr.c"
26142615
break;
26152616
case 41: /* attribute ::= THEN optrelexpr EDGEPT */
26162617
case 43: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==43);
2617
-#line 619 "pikchr.y"
2618
+#line 620 "pikchr.y"
26182619
{pik_move_hdg(p,&yymsp[-1].minor.yy200,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2619
-#line 2644 "pikchr.c"
2620
+#line 2645 "pikchr.c"
26202621
break;
26212622
case 44: /* attribute ::= AT position */
2622
-#line 624 "pikchr.y"
2623
+#line 625 "pikchr.y"
26232624
{ pik_set_at(p,0,&yymsp[0].minor.yy43,&yymsp[-1].minor.yy0); }
2624
-#line 2649 "pikchr.c"
2625
+#line 2650 "pikchr.c"
26252626
break;
26262627
case 45: /* attribute ::= SAME */
2627
-#line 626 "pikchr.y"
2628
+#line 627 "pikchr.y"
26282629
{pik_same(p,0,&yymsp[0].minor.yy0);}
2629
-#line 2654 "pikchr.c"
2630
+#line 2655 "pikchr.c"
26302631
break;
26312632
case 46: /* attribute ::= SAME AS object */
2632
-#line 627 "pikchr.y"
2633
+#line 628 "pikchr.y"
26332634
{pik_same(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2634
-#line 2659 "pikchr.c"
2635
+#line 2660 "pikchr.c"
26352636
break;
26362637
case 47: /* attribute ::= STRING textposition */
2637
-#line 628 "pikchr.y"
2638
+#line 629 "pikchr.y"
26382639
{pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy196);}
2639
-#line 2664 "pikchr.c"
2640
+#line 2665 "pikchr.c"
26402641
break;
26412642
case 48: /* attribute ::= FIT */
2642
-#line 629 "pikchr.y"
2643
+#line 630 "pikchr.y"
26432644
{pik_size_to_fit(p,&yymsp[0].minor.yy0,3); }
2644
-#line 2669 "pikchr.c"
2645
+#line 2670 "pikchr.c"
26452646
break;
26462647
case 49: /* attribute ::= BEHIND object */
2647
-#line 630 "pikchr.y"
2648
+#line 631 "pikchr.y"
26482649
{pik_behind(p,yymsp[0].minor.yy38);}
2649
-#line 2674 "pikchr.c"
2650
+#line 2675 "pikchr.c"
26502651
break;
26512652
case 50: /* withclause ::= DOT_E edge AT position */
26522653
case 51: /* withclause ::= edge AT position */ yytestcase(yyruleno==51);
2653
-#line 638 "pikchr.y"
2654
+#line 639 "pikchr.y"
26542655
{ pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy43,&yymsp[-1].minor.yy0); }
2655
-#line 2680 "pikchr.c"
2656
+#line 2681 "pikchr.c"
26562657
break;
26572658
case 52: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2658
-#line 642 "pikchr.y"
2659
+#line 643 "pikchr.y"
26592660
{yylhsminor.yy0 = yymsp[0].minor.yy0;}
2660
-#line 2685 "pikchr.c"
2661
+#line 2686 "pikchr.c"
26612662
yymsp[0].minor.yy0 = yylhsminor.yy0;
26622663
break;
26632664
case 53: /* boolproperty ::= CW */
2664
-#line 653 "pikchr.y"
2665
+#line 654 "pikchr.y"
26652666
{p->cur->cw = 1;}
2666
-#line 2691 "pikchr.c"
2667
+#line 2692 "pikchr.c"
26672668
break;
26682669
case 54: /* boolproperty ::= CCW */
2669
-#line 654 "pikchr.y"
2670
+#line 655 "pikchr.y"
26702671
{p->cur->cw = 0;}
2671
-#line 2696 "pikchr.c"
2672
+#line 2697 "pikchr.c"
26722673
break;
26732674
case 55: /* boolproperty ::= LARROW */
2674
-#line 655 "pikchr.y"
2675
+#line 656 "pikchr.y"
26752676
{p->cur->larrow=1; p->cur->rarrow=0; }
2676
-#line 2701 "pikchr.c"
2677
+#line 2702 "pikchr.c"
26772678
break;
26782679
case 56: /* boolproperty ::= RARROW */
2679
-#line 656 "pikchr.y"
2680
+#line 657 "pikchr.y"
26802681
{p->cur->larrow=0; p->cur->rarrow=1; }
2681
-#line 2706 "pikchr.c"
2682
+#line 2707 "pikchr.c"
26822683
break;
26832684
case 57: /* boolproperty ::= LRARROW */
2684
-#line 657 "pikchr.y"
2685
+#line 658 "pikchr.y"
26852686
{p->cur->larrow=1; p->cur->rarrow=1; }
2686
-#line 2711 "pikchr.c"
2687
+#line 2712 "pikchr.c"
26872688
break;
26882689
case 58: /* boolproperty ::= INVIS */
2689
-#line 658 "pikchr.y"
2690
+#line 659 "pikchr.y"
26902691
{p->cur->sw = 0.0;}
2691
-#line 2716 "pikchr.c"
2692
+#line 2717 "pikchr.c"
26922693
break;
26932694
case 59: /* boolproperty ::= THICK */
2694
-#line 659 "pikchr.y"
2695
+#line 660 "pikchr.y"
26952696
{p->cur->sw *= 1.5;}
2696
-#line 2721 "pikchr.c"
2697
+#line 2722 "pikchr.c"
26972698
break;
26982699
case 60: /* boolproperty ::= THIN */
2699
-#line 660 "pikchr.y"
2700
+#line 661 "pikchr.y"
27002701
{p->cur->sw *= 0.67;}
2701
-#line 2726 "pikchr.c"
2702
+#line 2727 "pikchr.c"
27022703
break;
27032704
case 61: /* boolproperty ::= SOLID */
2704
-#line 661 "pikchr.y"
2705
+#line 662 "pikchr.y"
27052706
{p->cur->sw = pik_value(p,"thickness",9,0);
27062707
p->cur->dotted = p->cur->dashed = 0.0;}
2707
-#line 2732 "pikchr.c"
2708
+#line 2733 "pikchr.c"
27082709
break;
27092710
case 62: /* textposition ::= */
2710
-#line 664 "pikchr.y"
2711
+#line 665 "pikchr.y"
27112712
{yymsp[1].minor.yy196 = 0;}
2712
-#line 2737 "pikchr.c"
2713
+#line 2738 "pikchr.c"
27132714
break;
27142715
case 63: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2715
-#line 667 "pikchr.y"
2716
+#line 668 "pikchr.y"
27162717
{yylhsminor.yy196 = pik_text_position(yymsp[-1].minor.yy196,&yymsp[0].minor.yy0);}
2717
-#line 2742 "pikchr.c"
2718
+#line 2743 "pikchr.c"
27182719
yymsp[-1].minor.yy196 = yylhsminor.yy196;
27192720
break;
27202721
case 64: /* position ::= expr COMMA expr */
2721
-#line 670 "pikchr.y"
2722
+#line 671 "pikchr.y"
27222723
{yylhsminor.yy43.x=yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[0].minor.yy265;}
2723
-#line 2748 "pikchr.c"
2724
+#line 2749 "pikchr.c"
27242725
yymsp[-2].minor.yy43 = yylhsminor.yy43;
27252726
break;
27262727
case 65: /* position ::= place PLUS expr COMMA expr */
2727
-#line 672 "pikchr.y"
2728
+#line 673 "pikchr.y"
27282729
{yylhsminor.yy43.x=yymsp[-4].minor.yy43.x+yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[-4].minor.yy43.y+yymsp[0].minor.yy265;}
2729
-#line 2754 "pikchr.c"
2730
+#line 2755 "pikchr.c"
27302731
yymsp[-4].minor.yy43 = yylhsminor.yy43;
27312732
break;
27322733
case 66: /* position ::= place MINUS expr COMMA expr */
2733
-#line 673 "pikchr.y"
2734
+#line 674 "pikchr.y"
27342735
{yylhsminor.yy43.x=yymsp[-4].minor.yy43.x-yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[-4].minor.yy43.y-yymsp[0].minor.yy265;}
2735
-#line 2760 "pikchr.c"
2736
+#line 2761 "pikchr.c"
27362737
yymsp[-4].minor.yy43 = yylhsminor.yy43;
27372738
break;
27382739
case 67: /* position ::= place PLUS LP expr COMMA expr RP */
2739
-#line 675 "pikchr.y"
2740
+#line 676 "pikchr.y"
27402741
{yylhsminor.yy43.x=yymsp[-6].minor.yy43.x+yymsp[-3].minor.yy265; yylhsminor.yy43.y=yymsp[-6].minor.yy43.y+yymsp[-1].minor.yy265;}
2741
-#line 2766 "pikchr.c"
2742
+#line 2767 "pikchr.c"
27422743
yymsp[-6].minor.yy43 = yylhsminor.yy43;
27432744
break;
27442745
case 68: /* position ::= place MINUS LP expr COMMA expr RP */
2745
-#line 677 "pikchr.y"
2746
+#line 678 "pikchr.y"
27462747
{yylhsminor.yy43.x=yymsp[-6].minor.yy43.x-yymsp[-3].minor.yy265; yylhsminor.yy43.y=yymsp[-6].minor.yy43.y-yymsp[-1].minor.yy265;}
2747
-#line 2772 "pikchr.c"
2748
+#line 2773 "pikchr.c"
27482749
yymsp[-6].minor.yy43 = yylhsminor.yy43;
27492750
break;
27502751
case 69: /* position ::= LP position COMMA position RP */
2751
-#line 678 "pikchr.y"
2752
+#line 679 "pikchr.y"
27522753
{yymsp[-4].minor.yy43.x=yymsp[-3].minor.yy43.x; yymsp[-4].minor.yy43.y=yymsp[-1].minor.yy43.y;}
2753
-#line 2778 "pikchr.c"
2754
+#line 2779 "pikchr.c"
27542755
break;
27552756
case 70: /* position ::= LP position RP */
2756
-#line 679 "pikchr.y"
2757
+#line 680 "pikchr.y"
27572758
{yymsp[-2].minor.yy43=yymsp[-1].minor.yy43;}
2758
-#line 2783 "pikchr.c"
2759
+#line 2784 "pikchr.c"
27592760
break;
27602761
case 71: /* position ::= expr between position AND position */
2761
-#line 681 "pikchr.y"
2762
+#line 682 "pikchr.y"
27622763
{yylhsminor.yy43 = pik_position_between(yymsp[-4].minor.yy265,yymsp[-2].minor.yy43,yymsp[0].minor.yy43);}
2763
-#line 2788 "pikchr.c"
2764
+#line 2789 "pikchr.c"
27642765
yymsp[-4].minor.yy43 = yylhsminor.yy43;
27652766
break;
27662767
case 72: /* position ::= expr LT position COMMA position GT */
2767
-#line 683 "pikchr.y"
2768
+#line 684 "pikchr.y"
27682769
{yylhsminor.yy43 = pik_position_between(yymsp[-5].minor.yy265,yymsp[-3].minor.yy43,yymsp[-1].minor.yy43);}
2769
-#line 2794 "pikchr.c"
2770
+#line 2795 "pikchr.c"
27702771
yymsp[-5].minor.yy43 = yylhsminor.yy43;
27712772
break;
27722773
case 73: /* position ::= expr ABOVE position */
2773
-#line 684 "pikchr.y"
2774
+#line 685 "pikchr.y"
27742775
{yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.y += yymsp[-2].minor.yy265;}
2775
-#line 2800 "pikchr.c"
2776
+#line 2801 "pikchr.c"
27762777
yymsp[-2].minor.yy43 = yylhsminor.yy43;
27772778
break;
27782779
case 74: /* position ::= expr BELOW position */
2779
-#line 685 "pikchr.y"
2780
+#line 686 "pikchr.y"
27802781
{yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.y -= yymsp[-2].minor.yy265;}
2781
-#line 2806 "pikchr.c"
2782
+#line 2807 "pikchr.c"
27822783
yymsp[-2].minor.yy43 = yylhsminor.yy43;
27832784
break;
27842785
case 75: /* position ::= expr LEFT OF position */
2785
-#line 686 "pikchr.y"
2786
+#line 687 "pikchr.y"
27862787
{yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.x -= yymsp[-3].minor.yy265;}
2787
-#line 2812 "pikchr.c"
2788
+#line 2813 "pikchr.c"
27882789
yymsp[-3].minor.yy43 = yylhsminor.yy43;
27892790
break;
27902791
case 76: /* position ::= expr RIGHT OF position */
2791
-#line 687 "pikchr.y"
2792
+#line 688 "pikchr.y"
27922793
{yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.x += yymsp[-3].minor.yy265;}
2793
-#line 2818 "pikchr.c"
2794
+#line 2819 "pikchr.c"
27942795
yymsp[-3].minor.yy43 = yylhsminor.yy43;
27952796
break;
27962797
case 77: /* position ::= expr ON HEADING EDGEPT OF position */
2797
-#line 689 "pikchr.y"
2798
+#line 690 "pikchr.y"
27982799
{yylhsminor.yy43 = pik_position_at_hdg(yymsp[-5].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2799
-#line 2824 "pikchr.c"
2800
+#line 2825 "pikchr.c"
28002801
yymsp[-5].minor.yy43 = yylhsminor.yy43;
28012802
break;
28022803
case 78: /* position ::= expr HEADING EDGEPT OF position */
2803
-#line 691 "pikchr.y"
2804
+#line 692 "pikchr.y"
28042805
{yylhsminor.yy43 = pik_position_at_hdg(yymsp[-4].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2805
-#line 2830 "pikchr.c"
2806
+#line 2831 "pikchr.c"
28062807
yymsp[-4].minor.yy43 = yylhsminor.yy43;
28072808
break;
28082809
case 79: /* position ::= expr EDGEPT OF position */
2809
-#line 693 "pikchr.y"
2810
+#line 694 "pikchr.y"
28102811
{yylhsminor.yy43 = pik_position_at_hdg(yymsp[-3].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2811
-#line 2836 "pikchr.c"
2812
+#line 2837 "pikchr.c"
28122813
yymsp[-3].minor.yy43 = yylhsminor.yy43;
28132814
break;
28142815
case 80: /* position ::= expr ON HEADING expr FROM position */
2815
-#line 695 "pikchr.y"
2816
+#line 696 "pikchr.y"
28162817
{yylhsminor.yy43 = pik_position_at_angle(yymsp[-5].minor.yy265,yymsp[-2].minor.yy265,yymsp[0].minor.yy43);}
2817
-#line 2842 "pikchr.c"
2818
+#line 2843 "pikchr.c"
28182819
yymsp[-5].minor.yy43 = yylhsminor.yy43;
28192820
break;
28202821
case 81: /* position ::= expr HEADING expr FROM position */
2821
-#line 697 "pikchr.y"
2822
+#line 698 "pikchr.y"
28222823
{yylhsminor.yy43 = pik_position_at_angle(yymsp[-4].minor.yy265,yymsp[-2].minor.yy265,yymsp[0].minor.yy43);}
2823
-#line 2848 "pikchr.c"
2824
+#line 2849 "pikchr.c"
28242825
yymsp[-4].minor.yy43 = yylhsminor.yy43;
28252826
break;
28262827
case 82: /* place ::= edge OF object */
2827
-#line 709 "pikchr.y"
2828
+#line 710 "pikchr.y"
28282829
{yylhsminor.yy43 = pik_place_of_elem(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2829
-#line 2854 "pikchr.c"
2830
+#line 2855 "pikchr.c"
28302831
yymsp[-2].minor.yy43 = yylhsminor.yy43;
28312832
break;
28322833
case 83: /* place2 ::= object */
2833
-#line 710 "pikchr.y"
2834
+#line 711 "pikchr.y"
28342835
{yylhsminor.yy43 = pik_place_of_elem(p,yymsp[0].minor.yy38,0);}
2835
-#line 2860 "pikchr.c"
2836
+#line 2861 "pikchr.c"
28362837
yymsp[0].minor.yy43 = yylhsminor.yy43;
28372838
break;
28382839
case 84: /* place2 ::= object DOT_E edge */
2839
-#line 711 "pikchr.y"
2840
+#line 712 "pikchr.y"
28402841
{yylhsminor.yy43 = pik_place_of_elem(p,yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
2841
-#line 2866 "pikchr.c"
2842
+#line 2867 "pikchr.c"
28422843
yymsp[-2].minor.yy43 = yylhsminor.yy43;
28432844
break;
28442845
case 85: /* place2 ::= NTH VERTEX OF object */
2845
-#line 712 "pikchr.y"
2846
+#line 713 "pikchr.y"
28462847
{yylhsminor.yy43 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy38);}
2847
-#line 2872 "pikchr.c"
2848
+#line 2873 "pikchr.c"
28482849
yymsp[-3].minor.yy43 = yylhsminor.yy43;
28492850
break;
28502851
case 86: /* object ::= nth */
2851
-#line 724 "pikchr.y"
2852
+#line 725 "pikchr.y"
28522853
{yylhsminor.yy38 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2853
-#line 2878 "pikchr.c"
2854
+#line 2879 "pikchr.c"
28542855
yymsp[0].minor.yy38 = yylhsminor.yy38;
28552856
break;
28562857
case 87: /* object ::= nth OF|IN object */
2857
-#line 725 "pikchr.y"
2858
+#line 726 "pikchr.y"
28582859
{yylhsminor.yy38 = pik_find_nth(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2859
-#line 2884 "pikchr.c"
2860
+#line 2885 "pikchr.c"
28602861
yymsp[-2].minor.yy38 = yylhsminor.yy38;
28612862
break;
28622863
case 88: /* objectname ::= PLACENAME */
2863
-#line 727 "pikchr.y"
2864
+#line 728 "pikchr.y"
28642865
{yylhsminor.yy38 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2865
-#line 2890 "pikchr.c"
2866
+#line 2891 "pikchr.c"
28662867
yymsp[0].minor.yy38 = yylhsminor.yy38;
28672868
break;
28682869
case 89: /* objectname ::= objectname DOT_U PLACENAME */
2869
-#line 729 "pikchr.y"
2870
+#line 730 "pikchr.y"
28702871
{yylhsminor.yy38 = pik_find_byname(p,yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
2871
-#line 2896 "pikchr.c"
2872
+#line 2897 "pikchr.c"
28722873
yymsp[-2].minor.yy38 = yylhsminor.yy38;
28732874
break;
28742875
case 90: /* nth ::= NTH CLASSNAME */
2875
-#line 731 "pikchr.y"
2876
+#line 732 "pikchr.y"
28762877
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2877
-#line 2902 "pikchr.c"
2878
+#line 2903 "pikchr.c"
28782879
yymsp[-1].minor.yy0 = yylhsminor.yy0;
28792880
break;
28802881
case 91: /* nth ::= NTH LAST CLASSNAME */
2881
-#line 732 "pikchr.y"
2882
+#line 733 "pikchr.y"
28822883
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2883
-#line 2908 "pikchr.c"
2884
+#line 2909 "pikchr.c"
28842885
yymsp[-2].minor.yy0 = yylhsminor.yy0;
28852886
break;
28862887
case 92: /* nth ::= LAST CLASSNAME */
2887
-#line 733 "pikchr.y"
2888
+#line 734 "pikchr.y"
28882889
{yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2889
-#line 2914 "pikchr.c"
2890
+#line 2915 "pikchr.c"
28902891
break;
28912892
case 93: /* nth ::= LAST */
2892
-#line 734 "pikchr.y"
2893
+#line 735 "pikchr.y"
28932894
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2894
-#line 2919 "pikchr.c"
2895
+#line 2920 "pikchr.c"
28952896
yymsp[0].minor.yy0 = yylhsminor.yy0;
28962897
break;
28972898
case 94: /* nth ::= NTH LB RB */
2898
-#line 735 "pikchr.y"
2899
+#line 736 "pikchr.y"
28992900
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2900
-#line 2925 "pikchr.c"
2901
+#line 2926 "pikchr.c"
29012902
yymsp[-2].minor.yy0 = yylhsminor.yy0;
29022903
break;
29032904
case 95: /* nth ::= NTH LAST LB RB */
2904
-#line 736 "pikchr.y"
2905
+#line 737 "pikchr.y"
29052906
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2906
-#line 2931 "pikchr.c"
2907
+#line 2932 "pikchr.c"
29072908
yymsp[-3].minor.yy0 = yylhsminor.yy0;
29082909
break;
29092910
case 96: /* nth ::= LAST LB RB */
2910
-#line 737 "pikchr.y"
2911
+#line 738 "pikchr.y"
29112912
{yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2912
-#line 2937 "pikchr.c"
2913
+#line 2938 "pikchr.c"
29132914
break;
29142915
case 97: /* expr ::= expr PLUS expr */
2915
-#line 739 "pikchr.y"
2916
+#line 740 "pikchr.y"
29162917
{yylhsminor.yy265=yymsp[-2].minor.yy265+yymsp[0].minor.yy265;}
2917
-#line 2942 "pikchr.c"
2918
+#line 2943 "pikchr.c"
29182919
yymsp[-2].minor.yy265 = yylhsminor.yy265;
29192920
break;
29202921
case 98: /* expr ::= expr MINUS expr */
2921
-#line 740 "pikchr.y"
2922
+#line 741 "pikchr.y"
29222923
{yylhsminor.yy265=yymsp[-2].minor.yy265-yymsp[0].minor.yy265;}
2923
-#line 2948 "pikchr.c"
2924
+#line 2949 "pikchr.c"
29242925
yymsp[-2].minor.yy265 = yylhsminor.yy265;
29252926
break;
29262927
case 99: /* expr ::= expr STAR expr */
2927
-#line 741 "pikchr.y"
2928
+#line 742 "pikchr.y"
29282929
{yylhsminor.yy265=yymsp[-2].minor.yy265*yymsp[0].minor.yy265;}
2929
-#line 2954 "pikchr.c"
2930
+#line 2955 "pikchr.c"
29302931
yymsp[-2].minor.yy265 = yylhsminor.yy265;
29312932
break;
29322933
case 100: /* expr ::= expr SLASH expr */
2933
-#line 742 "pikchr.y"
2934
+#line 743 "pikchr.y"
29342935
{
29352936
if( yymsp[0].minor.yy265==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy265 = 0.0; }
29362937
else{ yylhsminor.yy265 = yymsp[-2].minor.yy265/yymsp[0].minor.yy265; }
29372938
}
2938
-#line 2963 "pikchr.c"
2939
+#line 2964 "pikchr.c"
29392940
yymsp[-2].minor.yy265 = yylhsminor.yy265;
29402941
break;
29412942
case 101: /* expr ::= MINUS expr */
2942
-#line 746 "pikchr.y"
2943
+#line 747 "pikchr.y"
29432944
{yymsp[-1].minor.yy265=-yymsp[0].minor.yy265;}
2944
-#line 2969 "pikchr.c"
2945
+#line 2970 "pikchr.c"
29452946
break;
29462947
case 102: /* expr ::= PLUS expr */
2947
-#line 747 "pikchr.y"
2948
+#line 748 "pikchr.y"
29482949
{yymsp[-1].minor.yy265=yymsp[0].minor.yy265;}
2949
-#line 2974 "pikchr.c"
2950
+#line 2975 "pikchr.c"
29502951
break;
29512952
case 103: /* expr ::= LP expr RP */
2952
-#line 748 "pikchr.y"
2953
+#line 749 "pikchr.y"
29532954
{yymsp[-2].minor.yy265=yymsp[-1].minor.yy265;}
2954
-#line 2979 "pikchr.c"
2955
+#line 2980 "pikchr.c"
29552956
break;
29562957
case 104: /* expr ::= LP FILL|COLOR|THICKNESS RP */
2957
-#line 749 "pikchr.y"
2958
+#line 750 "pikchr.y"
29582959
{yymsp[-2].minor.yy265=pik_get_var(p,&yymsp[-1].minor.yy0);}
2959
-#line 2984 "pikchr.c"
2960
+#line 2985 "pikchr.c"
29602961
break;
29612962
case 105: /* expr ::= NUMBER */
2962
-#line 750 "pikchr.y"
2963
+#line 751 "pikchr.y"
29632964
{yylhsminor.yy265=pik_atof(&yymsp[0].minor.yy0);}
2964
-#line 2989 "pikchr.c"
2965
+#line 2990 "pikchr.c"
29652966
yymsp[0].minor.yy265 = yylhsminor.yy265;
29662967
break;
29672968
case 106: /* expr ::= ID */
2968
-#line 751 "pikchr.y"
2969
+#line 752 "pikchr.y"
29692970
{yylhsminor.yy265=pik_get_var(p,&yymsp[0].minor.yy0);}
2970
-#line 2995 "pikchr.c"
2971
+#line 2996 "pikchr.c"
29712972
yymsp[0].minor.yy265 = yylhsminor.yy265;
29722973
break;
29732974
case 107: /* expr ::= FUNC1 LP expr RP */
2974
-#line 752 "pikchr.y"
2975
+#line 753 "pikchr.y"
29752976
{yylhsminor.yy265 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy265,0.0);}
2976
-#line 3001 "pikchr.c"
2977
+#line 3002 "pikchr.c"
29772978
yymsp[-3].minor.yy265 = yylhsminor.yy265;
29782979
break;
29792980
case 108: /* expr ::= FUNC2 LP expr COMMA expr RP */
2980
-#line 753 "pikchr.y"
2981
+#line 754 "pikchr.y"
29812982
{yylhsminor.yy265 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy265,yymsp[-1].minor.yy265);}
2982
-#line 3007 "pikchr.c"
2983
+#line 3008 "pikchr.c"
29832984
yymsp[-5].minor.yy265 = yylhsminor.yy265;
29842985
break;
29852986
case 109: /* expr ::= DIST LP position COMMA position RP */
2986
-#line 754 "pikchr.y"
2987
+#line 755 "pikchr.y"
29872988
{yymsp[-5].minor.yy265 = pik_dist(&yymsp[-3].minor.yy43,&yymsp[-1].minor.yy43);}
2988
-#line 3013 "pikchr.c"
2989
+#line 3014 "pikchr.c"
29892990
break;
29902991
case 110: /* expr ::= place2 DOT_XY X */
2991
-#line 755 "pikchr.y"
2992
+#line 756 "pikchr.y"
29922993
{yylhsminor.yy265 = yymsp[-2].minor.yy43.x;}
2993
-#line 3018 "pikchr.c"
2994
+#line 3019 "pikchr.c"
29942995
yymsp[-2].minor.yy265 = yylhsminor.yy265;
29952996
break;
29962997
case 111: /* expr ::= place2 DOT_XY Y */
2997
-#line 756 "pikchr.y"
2998
+#line 757 "pikchr.y"
29982999
{yylhsminor.yy265 = yymsp[-2].minor.yy43.y;}
2999
-#line 3024 "pikchr.c"
3000
+#line 3025 "pikchr.c"
30003001
yymsp[-2].minor.yy265 = yylhsminor.yy265;
30013002
break;
30023003
case 112: /* expr ::= object DOT_L numproperty */
30033004
case 113: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==113);
30043005
case 114: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==114);
3005
-#line 757 "pikchr.y"
3006
+#line 758 "pikchr.y"
30063007
{yylhsminor.yy265=pik_property_of(yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
3007
-#line 3032 "pikchr.c"
3008
+#line 3033 "pikchr.c"
30083009
yymsp[-2].minor.yy265 = yylhsminor.yy265;
30093010
break;
30103011
default:
30113012
/* (115) lvalue ::= ID */ yytestcase(yyruleno==115);
30123013
/* (116) lvalue ::= FILL */ yytestcase(yyruleno==116);
@@ -3105,19 +3106,19 @@
31053106
){
31063107
pik_parserARG_FETCH
31073108
pik_parserCTX_FETCH
31083109
#define TOKEN yyminor
31093110
/************ Begin %syntax_error code ****************************************/
3110
-#line 518 "pikchr.y"
3111
+#line 519 "pikchr.y"
31113112
31123113
if( TOKEN.z && TOKEN.z[0] ){
31133114
pik_error(p, &TOKEN, "syntax error");
31143115
}else{
31153116
pik_error(p, 0, "syntax error");
31163117
}
31173118
UNUSED_PARAMETER(yymajor);
3118
-#line 3143 "pikchr.c"
3119
+#line 3144 "pikchr.c"
31193120
/************ End %syntax_error code ******************************************/
31203121
pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
31213122
pik_parserCTX_STORE
31223123
}
31233124
@@ -3346,11 +3347,11 @@
33463347
#else
33473348
(void)iToken;
33483349
return 0;
33493350
#endif
33503351
}
3351
-#line 762 "pikchr.y"
3352
+#line 763 "pikchr.y"
33523353
33533354
33543355
33553356
/* Chart of the 148 official CSS color names with their
33563357
** corresponding RGB values thru Color Module Level 4:
@@ -4592,11 +4593,11 @@
45924593
r = (127*r)/mx;
45934594
g = (127*g)/mx;
45944595
b = (127*b)/mx;
45954596
}
45964597
}else{
4597
- if( mn<128 ){
4598
+ if( mn<128 && mx>mn ){
45984599
r = 127 + ((r-mn)*128)/(mx-mn);
45994600
g = 127 + ((g-mn)*128)/(mx-mn);
46004601
b = 127 + ((b-mn)*128)/(mx-mn);
46014602
}
46024603
}
@@ -4637,11 +4638,15 @@
46374638
}
46384639
static void pik_append_clr(Pik *p,const char *z1,PNum v,const char *z2,int bg){
46394640
char buf[200];
46404641
int x = (int)v;
46414642
int r, g, b;
4642
- if( p->mFlags & PIKCHR_DARK_MODE ) x = pik_color_to_dark_mode(x,bg);
4643
+ if( x==0 && p->fgcolor>0 && !bg ){
4644
+ x = p->fgcolor;
4645
+ }else if( p->mFlags & PIKCHR_DARK_MODE ){
4646
+ x = pik_color_to_dark_mode(x,bg);
4647
+ }
46434648
r = (x>>16) & 0xff;
46444649
g = (x>>8) & 0xff;
46454650
b = x & 0xff;
46464651
snprintf(buf, sizeof(buf)-1, "%srgb(%d,%d,%d)%s", z1, r, g, b, z2);
46474652
buf[sizeof(buf)-1] = 0;
@@ -6877,18 +6882,26 @@
68776882
PNum thickness; /* Stroke width */
68786883
PNum margin; /* Extra bounding box margin */
68796884
PNum w, h; /* Drawing width and height */
68806885
PNum wArrow;
68816886
PNum pikScale; /* Value of the "scale" variable */
6887
+ int miss = 0;
68826888
68836889
/* Set up rendering parameters */
68846890
pik_compute_layout_settings(p);
68856891
thickness = pik_value(p,"thickness",9,0);
68866892
if( thickness<=0.01 ) thickness = 0.01;
68876893
margin = pik_value(p,"margin",6,0);
68886894
margin += thickness;
68896895
wArrow = p->wArrow*thickness;
6896
+ p->fgcolor = (int)pik_value(p,"fgcolor",7,&miss);
6897
+ if( miss ){
6898
+ PToken t;
6899
+ t.z = "fgcolor";
6900
+ t.n = 7;
6901
+ p->fgcolor = (int)pik_lookup_color(0, &t);
6902
+ }
68906903
68916904
/* Compute a bounding box over all objects so that we can know
68926905
** how big to declare the SVG canvas */
68936906
pik_bbox_init(&p->bbox);
68946907
pik_bbox_add_elist(p, pList, wArrow);
@@ -7839,6 +7852,6 @@
78397852
78407853
78417854
#endif /* PIKCHR_TCL */
78427855
78437856
7844
-#line 7869 "pikchr.c"
7857
+#line 7882 "pikchr.c"
78457858
--- src/pikchr.c
+++ src/pikchr.c
@@ -363,10 +363,11 @@
363 char bLayoutVars; /* True if cache is valid */
364 char thenFlag; /* True if "then" seen */
365 char samePath; /* aTPath copied by "same" */
366 const char *zClass; /* Class name for the <svg> */
367 int wSVG, hSVG; /* Width and height of the <svg> */
 
368 /* Paths for lines are constructed here first, then transferred into
369 ** the PObj object at the end: */
370 int nTPath; /* Number of entries on aTPath[] */
371 int mTPath; /* For last entry, 1: x set, 2: y set */
372 PPoint aTPath[1000]; /* Path under construction */
@@ -472,11 +473,11 @@
472 static PObj *pik_position_assert(Pik*,PPoint*,PToken*,PPoint*);
473 static PNum pik_dist(PPoint*,PPoint*);
474 static void pik_add_macro(Pik*,PToken *pId,PToken *pCode);
475
476
477 #line 503 "pikchr.c"
478 /**************** End of %include directives **********************************/
479 /* These constants specify the various numeric values for terminal symbols.
480 ***************** Begin token definitions *************************************/
481 #ifndef T_ID
482 #define T_ID 1
@@ -1689,22 +1690,22 @@
1689 ** inside the C code.
1690 */
1691 /********* Begin destructor definitions ***************************************/
1692 case 98: /* statement_list */
1693 {
1694 #line 492 "pikchr.y"
1695 pik_elist_free(p,(yypminor->yy119));
1696 #line 1721 "pikchr.c"
1697 }
1698 break;
1699 case 99: /* statement */
1700 case 100: /* unnamed_statement */
1701 case 101: /* basetype */
1702 {
1703 #line 494 "pikchr.y"
1704 pik_elem_free(p,(yypminor->yy38));
1705 #line 1730 "pikchr.c"
1706 }
1707 break;
1708 /********* End destructor definitions *****************************************/
1709 default: break; /* If no destructor action specified: do nothing */
1710 }
@@ -1918,14 +1919,14 @@
1918 #endif
1919 while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
1920 /* Here code is inserted which will execute if the parser
1921 ** stack every overflows */
1922 /******** Begin %stack_overflow code ******************************************/
1923 #line 526 "pikchr.y"
1924
1925 pik_error(p, 0, "parser stack overflow");
1926 #line 1951 "pikchr.c"
1927 /******** End %stack_overflow code ********************************************/
1928 pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
1929 pik_parserCTX_STORE
1930 }
1931
@@ -2399,614 +2400,614 @@
2399 ** break;
2400 */
2401 /********** Begin reduce actions **********************************************/
2402 YYMINORTYPE yylhsminor;
2403 case 0: /* document ::= statement_list */
2404 #line 530 "pikchr.y"
2405 {pik_render(p,yymsp[0].minor.yy119);}
2406 #line 2431 "pikchr.c"
2407 break;
2408 case 1: /* statement_list ::= statement */
2409 #line 533 "pikchr.y"
2410 { yylhsminor.yy119 = pik_elist_append(p,0,yymsp[0].minor.yy38); }
2411 #line 2436 "pikchr.c"
2412 yymsp[0].minor.yy119 = yylhsminor.yy119;
2413 break;
2414 case 2: /* statement_list ::= statement_list EOL statement */
2415 #line 535 "pikchr.y"
2416 { yylhsminor.yy119 = pik_elist_append(p,yymsp[-2].minor.yy119,yymsp[0].minor.yy38); }
2417 #line 2442 "pikchr.c"
2418 yymsp[-2].minor.yy119 = yylhsminor.yy119;
2419 break;
2420 case 3: /* statement ::= */
2421 #line 538 "pikchr.y"
2422 { yymsp[1].minor.yy38 = 0; }
2423 #line 2448 "pikchr.c"
2424 break;
2425 case 4: /* statement ::= direction */
2426 #line 539 "pikchr.y"
2427 { pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy38=0; }
2428 #line 2453 "pikchr.c"
2429 yymsp[0].minor.yy38 = yylhsminor.yy38;
2430 break;
2431 case 5: /* statement ::= lvalue ASSIGN rvalue */
2432 #line 540 "pikchr.y"
2433 {pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy265,&yymsp[-1].minor.yy0); yylhsminor.yy38=0;}
2434 #line 2459 "pikchr.c"
2435 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2436 break;
2437 case 6: /* statement ::= PLACENAME COLON unnamed_statement */
2438 #line 542 "pikchr.y"
2439 { yylhsminor.yy38 = yymsp[0].minor.yy38; pik_elem_setname(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0); }
2440 #line 2465 "pikchr.c"
2441 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2442 break;
2443 case 7: /* statement ::= PLACENAME COLON position */
2444 #line 544 "pikchr.y"
2445 { yylhsminor.yy38 = pik_elem_new(p,0,0,0);
2446 if(yylhsminor.yy38){ yylhsminor.yy38->ptAt = yymsp[0].minor.yy43; pik_elem_setname(p,yylhsminor.yy38,&yymsp[-2].minor.yy0); }}
2447 #line 2472 "pikchr.c"
2448 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2449 break;
2450 case 8: /* statement ::= unnamed_statement */
2451 #line 546 "pikchr.y"
2452 {yylhsminor.yy38 = yymsp[0].minor.yy38;}
2453 #line 2478 "pikchr.c"
2454 yymsp[0].minor.yy38 = yylhsminor.yy38;
2455 break;
2456 case 9: /* statement ::= print prlist */
2457 #line 547 "pikchr.y"
2458 {pik_append(p,"<br>\n",5); yymsp[-1].minor.yy38=0;}
2459 #line 2484 "pikchr.c"
2460 break;
2461 case 10: /* statement ::= ASSERT LP expr EQ expr RP */
2462 #line 552 "pikchr.y"
2463 {yymsp[-5].minor.yy38=pik_assert(p,yymsp[-3].minor.yy265,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy265);}
2464 #line 2489 "pikchr.c"
2465 break;
2466 case 11: /* statement ::= ASSERT LP position EQ position RP */
2467 #line 554 "pikchr.y"
2468 {yymsp[-5].minor.yy38=pik_position_assert(p,&yymsp[-3].minor.yy43,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy43);}
2469 #line 2494 "pikchr.c"
2470 break;
2471 case 12: /* statement ::= DEFINE ID CODEBLOCK */
2472 #line 555 "pikchr.y"
2473 {yymsp[-2].minor.yy38=0; pik_add_macro(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
2474 #line 2499 "pikchr.c"
2475 break;
2476 case 13: /* rvalue ::= PLACENAME */
2477 #line 566 "pikchr.y"
2478 {yylhsminor.yy265 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2479 #line 2504 "pikchr.c"
2480 yymsp[0].minor.yy265 = yylhsminor.yy265;
2481 break;
2482 case 14: /* pritem ::= FILL */
2483 case 15: /* pritem ::= COLOR */ yytestcase(yyruleno==15);
2484 case 16: /* pritem ::= THICKNESS */ yytestcase(yyruleno==16);
2485 #line 571 "pikchr.y"
2486 {pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2487 #line 2512 "pikchr.c"
2488 break;
2489 case 17: /* pritem ::= rvalue */
2490 #line 574 "pikchr.y"
2491 {pik_append_num(p,"",yymsp[0].minor.yy265);}
2492 #line 2517 "pikchr.c"
2493 break;
2494 case 18: /* pritem ::= STRING */
2495 #line 575 "pikchr.y"
2496 {pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2497 #line 2522 "pikchr.c"
2498 break;
2499 case 19: /* prsep ::= COMMA */
2500 #line 576 "pikchr.y"
2501 {pik_append(p, " ", 1);}
2502 #line 2527 "pikchr.c"
2503 break;
2504 case 20: /* unnamed_statement ::= basetype attribute_list */
2505 #line 579 "pikchr.y"
2506 {yylhsminor.yy38 = yymsp[-1].minor.yy38; pik_after_adding_attributes(p,yylhsminor.yy38);}
2507 #line 2532 "pikchr.c"
2508 yymsp[-1].minor.yy38 = yylhsminor.yy38;
2509 break;
2510 case 21: /* basetype ::= CLASSNAME */
2511 #line 581 "pikchr.y"
2512 {yylhsminor.yy38 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2513 #line 2538 "pikchr.c"
2514 yymsp[0].minor.yy38 = yylhsminor.yy38;
2515 break;
2516 case 22: /* basetype ::= STRING textposition */
2517 #line 583 "pikchr.y"
2518 {yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy196; yylhsminor.yy38 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2519 #line 2544 "pikchr.c"
2520 yymsp[-1].minor.yy38 = yylhsminor.yy38;
2521 break;
2522 case 23: /* basetype ::= LB savelist statement_list RB */
2523 #line 585 "pikchr.y"
2524 { p->list = yymsp[-2].minor.yy119; yymsp[-3].minor.yy38 = pik_elem_new(p,0,0,yymsp[-1].minor.yy119); if(yymsp[-3].minor.yy38) yymsp[-3].minor.yy38->errTok = yymsp[0].minor.yy0; }
2525 #line 2550 "pikchr.c"
2526 break;
2527 case 24: /* savelist ::= */
2528 #line 590 "pikchr.y"
2529 {yymsp[1].minor.yy119 = p->list; p->list = 0;}
2530 #line 2555 "pikchr.c"
2531 break;
2532 case 25: /* relexpr ::= expr */
2533 #line 597 "pikchr.y"
2534 {yylhsminor.yy200.rAbs = yymsp[0].minor.yy265; yylhsminor.yy200.rRel = 0;}
2535 #line 2560 "pikchr.c"
2536 yymsp[0].minor.yy200 = yylhsminor.yy200;
2537 break;
2538 case 26: /* relexpr ::= expr PERCENT */
2539 #line 598 "pikchr.y"
2540 {yylhsminor.yy200.rAbs = 0; yylhsminor.yy200.rRel = yymsp[-1].minor.yy265/100;}
2541 #line 2566 "pikchr.c"
2542 yymsp[-1].minor.yy200 = yylhsminor.yy200;
2543 break;
2544 case 27: /* optrelexpr ::= */
2545 #line 600 "pikchr.y"
2546 {yymsp[1].minor.yy200.rAbs = 0; yymsp[1].minor.yy200.rRel = 1.0;}
2547 #line 2572 "pikchr.c"
2548 break;
2549 case 28: /* attribute_list ::= relexpr alist */
2550 #line 602 "pikchr.y"
2551 {pik_add_direction(p,0,&yymsp[-1].minor.yy200);}
2552 #line 2577 "pikchr.c"
2553 break;
2554 case 29: /* attribute ::= numproperty relexpr */
2555 #line 606 "pikchr.y"
2556 { pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy200); }
2557 #line 2582 "pikchr.c"
2558 break;
2559 case 30: /* attribute ::= dashproperty expr */
2560 #line 607 "pikchr.y"
2561 { pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy265); }
2562 #line 2587 "pikchr.c"
2563 break;
2564 case 31: /* attribute ::= dashproperty */
2565 #line 608 "pikchr.y"
2566 { pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2567 #line 2592 "pikchr.c"
2568 break;
2569 case 32: /* attribute ::= colorproperty rvalue */
2570 #line 609 "pikchr.y"
2571 { pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy265); }
2572 #line 2597 "pikchr.c"
2573 break;
2574 case 33: /* attribute ::= go direction optrelexpr */
2575 #line 610 "pikchr.y"
2576 { pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy200);}
2577 #line 2602 "pikchr.c"
2578 break;
2579 case 34: /* attribute ::= go direction even position */
2580 #line 611 "pikchr.y"
2581 {pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy43);}
2582 #line 2607 "pikchr.c"
2583 break;
2584 case 35: /* attribute ::= CLOSE */
2585 #line 612 "pikchr.y"
2586 { pik_close_path(p,&yymsp[0].minor.yy0); }
2587 #line 2612 "pikchr.c"
2588 break;
2589 case 36: /* attribute ::= CHOP */
2590 #line 613 "pikchr.y"
2591 { p->cur->bChop = 1; }
2592 #line 2617 "pikchr.c"
2593 break;
2594 case 37: /* attribute ::= FROM position */
2595 #line 614 "pikchr.y"
2596 { pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy43); }
2597 #line 2622 "pikchr.c"
2598 break;
2599 case 38: /* attribute ::= TO position */
2600 #line 615 "pikchr.y"
2601 { pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy43); }
2602 #line 2627 "pikchr.c"
2603 break;
2604 case 39: /* attribute ::= THEN */
2605 #line 616 "pikchr.y"
2606 { pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2607 #line 2632 "pikchr.c"
2608 break;
2609 case 40: /* attribute ::= THEN optrelexpr HEADING expr */
2610 case 42: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==42);
2611 #line 618 "pikchr.y"
2612 {pik_move_hdg(p,&yymsp[-2].minor.yy200,&yymsp[-1].minor.yy0,yymsp[0].minor.yy265,0,&yymsp[-3].minor.yy0);}
2613 #line 2638 "pikchr.c"
2614 break;
2615 case 41: /* attribute ::= THEN optrelexpr EDGEPT */
2616 case 43: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==43);
2617 #line 619 "pikchr.y"
2618 {pik_move_hdg(p,&yymsp[-1].minor.yy200,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2619 #line 2644 "pikchr.c"
2620 break;
2621 case 44: /* attribute ::= AT position */
2622 #line 624 "pikchr.y"
2623 { pik_set_at(p,0,&yymsp[0].minor.yy43,&yymsp[-1].minor.yy0); }
2624 #line 2649 "pikchr.c"
2625 break;
2626 case 45: /* attribute ::= SAME */
2627 #line 626 "pikchr.y"
2628 {pik_same(p,0,&yymsp[0].minor.yy0);}
2629 #line 2654 "pikchr.c"
2630 break;
2631 case 46: /* attribute ::= SAME AS object */
2632 #line 627 "pikchr.y"
2633 {pik_same(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2634 #line 2659 "pikchr.c"
2635 break;
2636 case 47: /* attribute ::= STRING textposition */
2637 #line 628 "pikchr.y"
2638 {pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy196);}
2639 #line 2664 "pikchr.c"
2640 break;
2641 case 48: /* attribute ::= FIT */
2642 #line 629 "pikchr.y"
2643 {pik_size_to_fit(p,&yymsp[0].minor.yy0,3); }
2644 #line 2669 "pikchr.c"
2645 break;
2646 case 49: /* attribute ::= BEHIND object */
2647 #line 630 "pikchr.y"
2648 {pik_behind(p,yymsp[0].minor.yy38);}
2649 #line 2674 "pikchr.c"
2650 break;
2651 case 50: /* withclause ::= DOT_E edge AT position */
2652 case 51: /* withclause ::= edge AT position */ yytestcase(yyruleno==51);
2653 #line 638 "pikchr.y"
2654 { pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy43,&yymsp[-1].minor.yy0); }
2655 #line 2680 "pikchr.c"
2656 break;
2657 case 52: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2658 #line 642 "pikchr.y"
2659 {yylhsminor.yy0 = yymsp[0].minor.yy0;}
2660 #line 2685 "pikchr.c"
2661 yymsp[0].minor.yy0 = yylhsminor.yy0;
2662 break;
2663 case 53: /* boolproperty ::= CW */
2664 #line 653 "pikchr.y"
2665 {p->cur->cw = 1;}
2666 #line 2691 "pikchr.c"
2667 break;
2668 case 54: /* boolproperty ::= CCW */
2669 #line 654 "pikchr.y"
2670 {p->cur->cw = 0;}
2671 #line 2696 "pikchr.c"
2672 break;
2673 case 55: /* boolproperty ::= LARROW */
2674 #line 655 "pikchr.y"
2675 {p->cur->larrow=1; p->cur->rarrow=0; }
2676 #line 2701 "pikchr.c"
2677 break;
2678 case 56: /* boolproperty ::= RARROW */
2679 #line 656 "pikchr.y"
2680 {p->cur->larrow=0; p->cur->rarrow=1; }
2681 #line 2706 "pikchr.c"
2682 break;
2683 case 57: /* boolproperty ::= LRARROW */
2684 #line 657 "pikchr.y"
2685 {p->cur->larrow=1; p->cur->rarrow=1; }
2686 #line 2711 "pikchr.c"
2687 break;
2688 case 58: /* boolproperty ::= INVIS */
2689 #line 658 "pikchr.y"
2690 {p->cur->sw = 0.0;}
2691 #line 2716 "pikchr.c"
2692 break;
2693 case 59: /* boolproperty ::= THICK */
2694 #line 659 "pikchr.y"
2695 {p->cur->sw *= 1.5;}
2696 #line 2721 "pikchr.c"
2697 break;
2698 case 60: /* boolproperty ::= THIN */
2699 #line 660 "pikchr.y"
2700 {p->cur->sw *= 0.67;}
2701 #line 2726 "pikchr.c"
2702 break;
2703 case 61: /* boolproperty ::= SOLID */
2704 #line 661 "pikchr.y"
2705 {p->cur->sw = pik_value(p,"thickness",9,0);
2706 p->cur->dotted = p->cur->dashed = 0.0;}
2707 #line 2732 "pikchr.c"
2708 break;
2709 case 62: /* textposition ::= */
2710 #line 664 "pikchr.y"
2711 {yymsp[1].minor.yy196 = 0;}
2712 #line 2737 "pikchr.c"
2713 break;
2714 case 63: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2715 #line 667 "pikchr.y"
2716 {yylhsminor.yy196 = pik_text_position(yymsp[-1].minor.yy196,&yymsp[0].minor.yy0);}
2717 #line 2742 "pikchr.c"
2718 yymsp[-1].minor.yy196 = yylhsminor.yy196;
2719 break;
2720 case 64: /* position ::= expr COMMA expr */
2721 #line 670 "pikchr.y"
2722 {yylhsminor.yy43.x=yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[0].minor.yy265;}
2723 #line 2748 "pikchr.c"
2724 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2725 break;
2726 case 65: /* position ::= place PLUS expr COMMA expr */
2727 #line 672 "pikchr.y"
2728 {yylhsminor.yy43.x=yymsp[-4].minor.yy43.x+yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[-4].minor.yy43.y+yymsp[0].minor.yy265;}
2729 #line 2754 "pikchr.c"
2730 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2731 break;
2732 case 66: /* position ::= place MINUS expr COMMA expr */
2733 #line 673 "pikchr.y"
2734 {yylhsminor.yy43.x=yymsp[-4].minor.yy43.x-yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[-4].minor.yy43.y-yymsp[0].minor.yy265;}
2735 #line 2760 "pikchr.c"
2736 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2737 break;
2738 case 67: /* position ::= place PLUS LP expr COMMA expr RP */
2739 #line 675 "pikchr.y"
2740 {yylhsminor.yy43.x=yymsp[-6].minor.yy43.x+yymsp[-3].minor.yy265; yylhsminor.yy43.y=yymsp[-6].minor.yy43.y+yymsp[-1].minor.yy265;}
2741 #line 2766 "pikchr.c"
2742 yymsp[-6].minor.yy43 = yylhsminor.yy43;
2743 break;
2744 case 68: /* position ::= place MINUS LP expr COMMA expr RP */
2745 #line 677 "pikchr.y"
2746 {yylhsminor.yy43.x=yymsp[-6].minor.yy43.x-yymsp[-3].minor.yy265; yylhsminor.yy43.y=yymsp[-6].minor.yy43.y-yymsp[-1].minor.yy265;}
2747 #line 2772 "pikchr.c"
2748 yymsp[-6].minor.yy43 = yylhsminor.yy43;
2749 break;
2750 case 69: /* position ::= LP position COMMA position RP */
2751 #line 678 "pikchr.y"
2752 {yymsp[-4].minor.yy43.x=yymsp[-3].minor.yy43.x; yymsp[-4].minor.yy43.y=yymsp[-1].minor.yy43.y;}
2753 #line 2778 "pikchr.c"
2754 break;
2755 case 70: /* position ::= LP position RP */
2756 #line 679 "pikchr.y"
2757 {yymsp[-2].minor.yy43=yymsp[-1].minor.yy43;}
2758 #line 2783 "pikchr.c"
2759 break;
2760 case 71: /* position ::= expr between position AND position */
2761 #line 681 "pikchr.y"
2762 {yylhsminor.yy43 = pik_position_between(yymsp[-4].minor.yy265,yymsp[-2].minor.yy43,yymsp[0].minor.yy43);}
2763 #line 2788 "pikchr.c"
2764 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2765 break;
2766 case 72: /* position ::= expr LT position COMMA position GT */
2767 #line 683 "pikchr.y"
2768 {yylhsminor.yy43 = pik_position_between(yymsp[-5].minor.yy265,yymsp[-3].minor.yy43,yymsp[-1].minor.yy43);}
2769 #line 2794 "pikchr.c"
2770 yymsp[-5].minor.yy43 = yylhsminor.yy43;
2771 break;
2772 case 73: /* position ::= expr ABOVE position */
2773 #line 684 "pikchr.y"
2774 {yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.y += yymsp[-2].minor.yy265;}
2775 #line 2800 "pikchr.c"
2776 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2777 break;
2778 case 74: /* position ::= expr BELOW position */
2779 #line 685 "pikchr.y"
2780 {yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.y -= yymsp[-2].minor.yy265;}
2781 #line 2806 "pikchr.c"
2782 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2783 break;
2784 case 75: /* position ::= expr LEFT OF position */
2785 #line 686 "pikchr.y"
2786 {yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.x -= yymsp[-3].minor.yy265;}
2787 #line 2812 "pikchr.c"
2788 yymsp[-3].minor.yy43 = yylhsminor.yy43;
2789 break;
2790 case 76: /* position ::= expr RIGHT OF position */
2791 #line 687 "pikchr.y"
2792 {yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.x += yymsp[-3].minor.yy265;}
2793 #line 2818 "pikchr.c"
2794 yymsp[-3].minor.yy43 = yylhsminor.yy43;
2795 break;
2796 case 77: /* position ::= expr ON HEADING EDGEPT OF position */
2797 #line 689 "pikchr.y"
2798 {yylhsminor.yy43 = pik_position_at_hdg(yymsp[-5].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2799 #line 2824 "pikchr.c"
2800 yymsp[-5].minor.yy43 = yylhsminor.yy43;
2801 break;
2802 case 78: /* position ::= expr HEADING EDGEPT OF position */
2803 #line 691 "pikchr.y"
2804 {yylhsminor.yy43 = pik_position_at_hdg(yymsp[-4].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2805 #line 2830 "pikchr.c"
2806 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2807 break;
2808 case 79: /* position ::= expr EDGEPT OF position */
2809 #line 693 "pikchr.y"
2810 {yylhsminor.yy43 = pik_position_at_hdg(yymsp[-3].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2811 #line 2836 "pikchr.c"
2812 yymsp[-3].minor.yy43 = yylhsminor.yy43;
2813 break;
2814 case 80: /* position ::= expr ON HEADING expr FROM position */
2815 #line 695 "pikchr.y"
2816 {yylhsminor.yy43 = pik_position_at_angle(yymsp[-5].minor.yy265,yymsp[-2].minor.yy265,yymsp[0].minor.yy43);}
2817 #line 2842 "pikchr.c"
2818 yymsp[-5].minor.yy43 = yylhsminor.yy43;
2819 break;
2820 case 81: /* position ::= expr HEADING expr FROM position */
2821 #line 697 "pikchr.y"
2822 {yylhsminor.yy43 = pik_position_at_angle(yymsp[-4].minor.yy265,yymsp[-2].minor.yy265,yymsp[0].minor.yy43);}
2823 #line 2848 "pikchr.c"
2824 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2825 break;
2826 case 82: /* place ::= edge OF object */
2827 #line 709 "pikchr.y"
2828 {yylhsminor.yy43 = pik_place_of_elem(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2829 #line 2854 "pikchr.c"
2830 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2831 break;
2832 case 83: /* place2 ::= object */
2833 #line 710 "pikchr.y"
2834 {yylhsminor.yy43 = pik_place_of_elem(p,yymsp[0].minor.yy38,0);}
2835 #line 2860 "pikchr.c"
2836 yymsp[0].minor.yy43 = yylhsminor.yy43;
2837 break;
2838 case 84: /* place2 ::= object DOT_E edge */
2839 #line 711 "pikchr.y"
2840 {yylhsminor.yy43 = pik_place_of_elem(p,yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
2841 #line 2866 "pikchr.c"
2842 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2843 break;
2844 case 85: /* place2 ::= NTH VERTEX OF object */
2845 #line 712 "pikchr.y"
2846 {yylhsminor.yy43 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy38);}
2847 #line 2872 "pikchr.c"
2848 yymsp[-3].minor.yy43 = yylhsminor.yy43;
2849 break;
2850 case 86: /* object ::= nth */
2851 #line 724 "pikchr.y"
2852 {yylhsminor.yy38 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2853 #line 2878 "pikchr.c"
2854 yymsp[0].minor.yy38 = yylhsminor.yy38;
2855 break;
2856 case 87: /* object ::= nth OF|IN object */
2857 #line 725 "pikchr.y"
2858 {yylhsminor.yy38 = pik_find_nth(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2859 #line 2884 "pikchr.c"
2860 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2861 break;
2862 case 88: /* objectname ::= PLACENAME */
2863 #line 727 "pikchr.y"
2864 {yylhsminor.yy38 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2865 #line 2890 "pikchr.c"
2866 yymsp[0].minor.yy38 = yylhsminor.yy38;
2867 break;
2868 case 89: /* objectname ::= objectname DOT_U PLACENAME */
2869 #line 729 "pikchr.y"
2870 {yylhsminor.yy38 = pik_find_byname(p,yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
2871 #line 2896 "pikchr.c"
2872 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2873 break;
2874 case 90: /* nth ::= NTH CLASSNAME */
2875 #line 731 "pikchr.y"
2876 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2877 #line 2902 "pikchr.c"
2878 yymsp[-1].minor.yy0 = yylhsminor.yy0;
2879 break;
2880 case 91: /* nth ::= NTH LAST CLASSNAME */
2881 #line 732 "pikchr.y"
2882 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2883 #line 2908 "pikchr.c"
2884 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2885 break;
2886 case 92: /* nth ::= LAST CLASSNAME */
2887 #line 733 "pikchr.y"
2888 {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2889 #line 2914 "pikchr.c"
2890 break;
2891 case 93: /* nth ::= LAST */
2892 #line 734 "pikchr.y"
2893 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2894 #line 2919 "pikchr.c"
2895 yymsp[0].minor.yy0 = yylhsminor.yy0;
2896 break;
2897 case 94: /* nth ::= NTH LB RB */
2898 #line 735 "pikchr.y"
2899 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2900 #line 2925 "pikchr.c"
2901 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2902 break;
2903 case 95: /* nth ::= NTH LAST LB RB */
2904 #line 736 "pikchr.y"
2905 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2906 #line 2931 "pikchr.c"
2907 yymsp[-3].minor.yy0 = yylhsminor.yy0;
2908 break;
2909 case 96: /* nth ::= LAST LB RB */
2910 #line 737 "pikchr.y"
2911 {yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2912 #line 2937 "pikchr.c"
2913 break;
2914 case 97: /* expr ::= expr PLUS expr */
2915 #line 739 "pikchr.y"
2916 {yylhsminor.yy265=yymsp[-2].minor.yy265+yymsp[0].minor.yy265;}
2917 #line 2942 "pikchr.c"
2918 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2919 break;
2920 case 98: /* expr ::= expr MINUS expr */
2921 #line 740 "pikchr.y"
2922 {yylhsminor.yy265=yymsp[-2].minor.yy265-yymsp[0].minor.yy265;}
2923 #line 2948 "pikchr.c"
2924 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2925 break;
2926 case 99: /* expr ::= expr STAR expr */
2927 #line 741 "pikchr.y"
2928 {yylhsminor.yy265=yymsp[-2].minor.yy265*yymsp[0].minor.yy265;}
2929 #line 2954 "pikchr.c"
2930 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2931 break;
2932 case 100: /* expr ::= expr SLASH expr */
2933 #line 742 "pikchr.y"
2934 {
2935 if( yymsp[0].minor.yy265==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy265 = 0.0; }
2936 else{ yylhsminor.yy265 = yymsp[-2].minor.yy265/yymsp[0].minor.yy265; }
2937 }
2938 #line 2963 "pikchr.c"
2939 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2940 break;
2941 case 101: /* expr ::= MINUS expr */
2942 #line 746 "pikchr.y"
2943 {yymsp[-1].minor.yy265=-yymsp[0].minor.yy265;}
2944 #line 2969 "pikchr.c"
2945 break;
2946 case 102: /* expr ::= PLUS expr */
2947 #line 747 "pikchr.y"
2948 {yymsp[-1].minor.yy265=yymsp[0].minor.yy265;}
2949 #line 2974 "pikchr.c"
2950 break;
2951 case 103: /* expr ::= LP expr RP */
2952 #line 748 "pikchr.y"
2953 {yymsp[-2].minor.yy265=yymsp[-1].minor.yy265;}
2954 #line 2979 "pikchr.c"
2955 break;
2956 case 104: /* expr ::= LP FILL|COLOR|THICKNESS RP */
2957 #line 749 "pikchr.y"
2958 {yymsp[-2].minor.yy265=pik_get_var(p,&yymsp[-1].minor.yy0);}
2959 #line 2984 "pikchr.c"
2960 break;
2961 case 105: /* expr ::= NUMBER */
2962 #line 750 "pikchr.y"
2963 {yylhsminor.yy265=pik_atof(&yymsp[0].minor.yy0);}
2964 #line 2989 "pikchr.c"
2965 yymsp[0].minor.yy265 = yylhsminor.yy265;
2966 break;
2967 case 106: /* expr ::= ID */
2968 #line 751 "pikchr.y"
2969 {yylhsminor.yy265=pik_get_var(p,&yymsp[0].minor.yy0);}
2970 #line 2995 "pikchr.c"
2971 yymsp[0].minor.yy265 = yylhsminor.yy265;
2972 break;
2973 case 107: /* expr ::= FUNC1 LP expr RP */
2974 #line 752 "pikchr.y"
2975 {yylhsminor.yy265 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy265,0.0);}
2976 #line 3001 "pikchr.c"
2977 yymsp[-3].minor.yy265 = yylhsminor.yy265;
2978 break;
2979 case 108: /* expr ::= FUNC2 LP expr COMMA expr RP */
2980 #line 753 "pikchr.y"
2981 {yylhsminor.yy265 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy265,yymsp[-1].minor.yy265);}
2982 #line 3007 "pikchr.c"
2983 yymsp[-5].minor.yy265 = yylhsminor.yy265;
2984 break;
2985 case 109: /* expr ::= DIST LP position COMMA position RP */
2986 #line 754 "pikchr.y"
2987 {yymsp[-5].minor.yy265 = pik_dist(&yymsp[-3].minor.yy43,&yymsp[-1].minor.yy43);}
2988 #line 3013 "pikchr.c"
2989 break;
2990 case 110: /* expr ::= place2 DOT_XY X */
2991 #line 755 "pikchr.y"
2992 {yylhsminor.yy265 = yymsp[-2].minor.yy43.x;}
2993 #line 3018 "pikchr.c"
2994 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2995 break;
2996 case 111: /* expr ::= place2 DOT_XY Y */
2997 #line 756 "pikchr.y"
2998 {yylhsminor.yy265 = yymsp[-2].minor.yy43.y;}
2999 #line 3024 "pikchr.c"
3000 yymsp[-2].minor.yy265 = yylhsminor.yy265;
3001 break;
3002 case 112: /* expr ::= object DOT_L numproperty */
3003 case 113: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==113);
3004 case 114: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==114);
3005 #line 757 "pikchr.y"
3006 {yylhsminor.yy265=pik_property_of(yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
3007 #line 3032 "pikchr.c"
3008 yymsp[-2].minor.yy265 = yylhsminor.yy265;
3009 break;
3010 default:
3011 /* (115) lvalue ::= ID */ yytestcase(yyruleno==115);
3012 /* (116) lvalue ::= FILL */ yytestcase(yyruleno==116);
@@ -3105,19 +3106,19 @@
3105 ){
3106 pik_parserARG_FETCH
3107 pik_parserCTX_FETCH
3108 #define TOKEN yyminor
3109 /************ Begin %syntax_error code ****************************************/
3110 #line 518 "pikchr.y"
3111
3112 if( TOKEN.z && TOKEN.z[0] ){
3113 pik_error(p, &TOKEN, "syntax error");
3114 }else{
3115 pik_error(p, 0, "syntax error");
3116 }
3117 UNUSED_PARAMETER(yymajor);
3118 #line 3143 "pikchr.c"
3119 /************ End %syntax_error code ******************************************/
3120 pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
3121 pik_parserCTX_STORE
3122 }
3123
@@ -3346,11 +3347,11 @@
3346 #else
3347 (void)iToken;
3348 return 0;
3349 #endif
3350 }
3351 #line 762 "pikchr.y"
3352
3353
3354
3355 /* Chart of the 148 official CSS color names with their
3356 ** corresponding RGB values thru Color Module Level 4:
@@ -4592,11 +4593,11 @@
4592 r = (127*r)/mx;
4593 g = (127*g)/mx;
4594 b = (127*b)/mx;
4595 }
4596 }else{
4597 if( mn<128 ){
4598 r = 127 + ((r-mn)*128)/(mx-mn);
4599 g = 127 + ((g-mn)*128)/(mx-mn);
4600 b = 127 + ((b-mn)*128)/(mx-mn);
4601 }
4602 }
@@ -4637,11 +4638,15 @@
4637 }
4638 static void pik_append_clr(Pik *p,const char *z1,PNum v,const char *z2,int bg){
4639 char buf[200];
4640 int x = (int)v;
4641 int r, g, b;
4642 if( p->mFlags & PIKCHR_DARK_MODE ) x = pik_color_to_dark_mode(x,bg);
 
 
 
 
4643 r = (x>>16) & 0xff;
4644 g = (x>>8) & 0xff;
4645 b = x & 0xff;
4646 snprintf(buf, sizeof(buf)-1, "%srgb(%d,%d,%d)%s", z1, r, g, b, z2);
4647 buf[sizeof(buf)-1] = 0;
@@ -6877,18 +6882,26 @@
6877 PNum thickness; /* Stroke width */
6878 PNum margin; /* Extra bounding box margin */
6879 PNum w, h; /* Drawing width and height */
6880 PNum wArrow;
6881 PNum pikScale; /* Value of the "scale" variable */
 
6882
6883 /* Set up rendering parameters */
6884 pik_compute_layout_settings(p);
6885 thickness = pik_value(p,"thickness",9,0);
6886 if( thickness<=0.01 ) thickness = 0.01;
6887 margin = pik_value(p,"margin",6,0);
6888 margin += thickness;
6889 wArrow = p->wArrow*thickness;
 
 
 
 
 
 
 
6890
6891 /* Compute a bounding box over all objects so that we can know
6892 ** how big to declare the SVG canvas */
6893 pik_bbox_init(&p->bbox);
6894 pik_bbox_add_elist(p, pList, wArrow);
@@ -7839,6 +7852,6 @@
7839
7840
7841 #endif /* PIKCHR_TCL */
7842
7843
7844 #line 7869 "pikchr.c"
7845
--- src/pikchr.c
+++ src/pikchr.c
@@ -363,10 +363,11 @@
363 char bLayoutVars; /* True if cache is valid */
364 char thenFlag; /* True if "then" seen */
365 char samePath; /* aTPath copied by "same" */
366 const char *zClass; /* Class name for the <svg> */
367 int wSVG, hSVG; /* Width and height of the <svg> */
368 int fgcolor; /* fgcolor value, or -1 for none */
369 /* Paths for lines are constructed here first, then transferred into
370 ** the PObj object at the end: */
371 int nTPath; /* Number of entries on aTPath[] */
372 int mTPath; /* For last entry, 1: x set, 2: y set */
373 PPoint aTPath[1000]; /* Path under construction */
@@ -472,11 +473,11 @@
473 static PObj *pik_position_assert(Pik*,PPoint*,PToken*,PPoint*);
474 static PNum pik_dist(PPoint*,PPoint*);
475 static void pik_add_macro(Pik*,PToken *pId,PToken *pCode);
476
477
478 #line 504 "pikchr.c"
479 /**************** End of %include directives **********************************/
480 /* These constants specify the various numeric values for terminal symbols.
481 ***************** Begin token definitions *************************************/
482 #ifndef T_ID
483 #define T_ID 1
@@ -1689,22 +1690,22 @@
1690 ** inside the C code.
1691 */
1692 /********* Begin destructor definitions ***************************************/
1693 case 98: /* statement_list */
1694 {
1695 #line 493 "pikchr.y"
1696 pik_elist_free(p,(yypminor->yy119));
1697 #line 1722 "pikchr.c"
1698 }
1699 break;
1700 case 99: /* statement */
1701 case 100: /* unnamed_statement */
1702 case 101: /* basetype */
1703 {
1704 #line 495 "pikchr.y"
1705 pik_elem_free(p,(yypminor->yy38));
1706 #line 1731 "pikchr.c"
1707 }
1708 break;
1709 /********* End destructor definitions *****************************************/
1710 default: break; /* If no destructor action specified: do nothing */
1711 }
@@ -1918,14 +1919,14 @@
1919 #endif
1920 while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
1921 /* Here code is inserted which will execute if the parser
1922 ** stack every overflows */
1923 /******** Begin %stack_overflow code ******************************************/
1924 #line 527 "pikchr.y"
1925
1926 pik_error(p, 0, "parser stack overflow");
1927 #line 1952 "pikchr.c"
1928 /******** End %stack_overflow code ********************************************/
1929 pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
1930 pik_parserCTX_STORE
1931 }
1932
@@ -2399,614 +2400,614 @@
2400 ** break;
2401 */
2402 /********** Begin reduce actions **********************************************/
2403 YYMINORTYPE yylhsminor;
2404 case 0: /* document ::= statement_list */
2405 #line 531 "pikchr.y"
2406 {pik_render(p,yymsp[0].minor.yy119);}
2407 #line 2432 "pikchr.c"
2408 break;
2409 case 1: /* statement_list ::= statement */
2410 #line 534 "pikchr.y"
2411 { yylhsminor.yy119 = pik_elist_append(p,0,yymsp[0].minor.yy38); }
2412 #line 2437 "pikchr.c"
2413 yymsp[0].minor.yy119 = yylhsminor.yy119;
2414 break;
2415 case 2: /* statement_list ::= statement_list EOL statement */
2416 #line 536 "pikchr.y"
2417 { yylhsminor.yy119 = pik_elist_append(p,yymsp[-2].minor.yy119,yymsp[0].minor.yy38); }
2418 #line 2443 "pikchr.c"
2419 yymsp[-2].minor.yy119 = yylhsminor.yy119;
2420 break;
2421 case 3: /* statement ::= */
2422 #line 539 "pikchr.y"
2423 { yymsp[1].minor.yy38 = 0; }
2424 #line 2449 "pikchr.c"
2425 break;
2426 case 4: /* statement ::= direction */
2427 #line 540 "pikchr.y"
2428 { pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy38=0; }
2429 #line 2454 "pikchr.c"
2430 yymsp[0].minor.yy38 = yylhsminor.yy38;
2431 break;
2432 case 5: /* statement ::= lvalue ASSIGN rvalue */
2433 #line 541 "pikchr.y"
2434 {pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy265,&yymsp[-1].minor.yy0); yylhsminor.yy38=0;}
2435 #line 2460 "pikchr.c"
2436 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2437 break;
2438 case 6: /* statement ::= PLACENAME COLON unnamed_statement */
2439 #line 543 "pikchr.y"
2440 { yylhsminor.yy38 = yymsp[0].minor.yy38; pik_elem_setname(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0); }
2441 #line 2466 "pikchr.c"
2442 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2443 break;
2444 case 7: /* statement ::= PLACENAME COLON position */
2445 #line 545 "pikchr.y"
2446 { yylhsminor.yy38 = pik_elem_new(p,0,0,0);
2447 if(yylhsminor.yy38){ yylhsminor.yy38->ptAt = yymsp[0].minor.yy43; pik_elem_setname(p,yylhsminor.yy38,&yymsp[-2].minor.yy0); }}
2448 #line 2473 "pikchr.c"
2449 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2450 break;
2451 case 8: /* statement ::= unnamed_statement */
2452 #line 547 "pikchr.y"
2453 {yylhsminor.yy38 = yymsp[0].minor.yy38;}
2454 #line 2479 "pikchr.c"
2455 yymsp[0].minor.yy38 = yylhsminor.yy38;
2456 break;
2457 case 9: /* statement ::= print prlist */
2458 #line 548 "pikchr.y"
2459 {pik_append(p,"<br>\n",5); yymsp[-1].minor.yy38=0;}
2460 #line 2485 "pikchr.c"
2461 break;
2462 case 10: /* statement ::= ASSERT LP expr EQ expr RP */
2463 #line 553 "pikchr.y"
2464 {yymsp[-5].minor.yy38=pik_assert(p,yymsp[-3].minor.yy265,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy265);}
2465 #line 2490 "pikchr.c"
2466 break;
2467 case 11: /* statement ::= ASSERT LP position EQ position RP */
2468 #line 555 "pikchr.y"
2469 {yymsp[-5].minor.yy38=pik_position_assert(p,&yymsp[-3].minor.yy43,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy43);}
2470 #line 2495 "pikchr.c"
2471 break;
2472 case 12: /* statement ::= DEFINE ID CODEBLOCK */
2473 #line 556 "pikchr.y"
2474 {yymsp[-2].minor.yy38=0; pik_add_macro(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
2475 #line 2500 "pikchr.c"
2476 break;
2477 case 13: /* rvalue ::= PLACENAME */
2478 #line 567 "pikchr.y"
2479 {yylhsminor.yy265 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2480 #line 2505 "pikchr.c"
2481 yymsp[0].minor.yy265 = yylhsminor.yy265;
2482 break;
2483 case 14: /* pritem ::= FILL */
2484 case 15: /* pritem ::= COLOR */ yytestcase(yyruleno==15);
2485 case 16: /* pritem ::= THICKNESS */ yytestcase(yyruleno==16);
2486 #line 572 "pikchr.y"
2487 {pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2488 #line 2513 "pikchr.c"
2489 break;
2490 case 17: /* pritem ::= rvalue */
2491 #line 575 "pikchr.y"
2492 {pik_append_num(p,"",yymsp[0].minor.yy265);}
2493 #line 2518 "pikchr.c"
2494 break;
2495 case 18: /* pritem ::= STRING */
2496 #line 576 "pikchr.y"
2497 {pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2498 #line 2523 "pikchr.c"
2499 break;
2500 case 19: /* prsep ::= COMMA */
2501 #line 577 "pikchr.y"
2502 {pik_append(p, " ", 1);}
2503 #line 2528 "pikchr.c"
2504 break;
2505 case 20: /* unnamed_statement ::= basetype attribute_list */
2506 #line 580 "pikchr.y"
2507 {yylhsminor.yy38 = yymsp[-1].minor.yy38; pik_after_adding_attributes(p,yylhsminor.yy38);}
2508 #line 2533 "pikchr.c"
2509 yymsp[-1].minor.yy38 = yylhsminor.yy38;
2510 break;
2511 case 21: /* basetype ::= CLASSNAME */
2512 #line 582 "pikchr.y"
2513 {yylhsminor.yy38 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2514 #line 2539 "pikchr.c"
2515 yymsp[0].minor.yy38 = yylhsminor.yy38;
2516 break;
2517 case 22: /* basetype ::= STRING textposition */
2518 #line 584 "pikchr.y"
2519 {yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy196; yylhsminor.yy38 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2520 #line 2545 "pikchr.c"
2521 yymsp[-1].minor.yy38 = yylhsminor.yy38;
2522 break;
2523 case 23: /* basetype ::= LB savelist statement_list RB */
2524 #line 586 "pikchr.y"
2525 { p->list = yymsp[-2].minor.yy119; yymsp[-3].minor.yy38 = pik_elem_new(p,0,0,yymsp[-1].minor.yy119); if(yymsp[-3].minor.yy38) yymsp[-3].minor.yy38->errTok = yymsp[0].minor.yy0; }
2526 #line 2551 "pikchr.c"
2527 break;
2528 case 24: /* savelist ::= */
2529 #line 591 "pikchr.y"
2530 {yymsp[1].minor.yy119 = p->list; p->list = 0;}
2531 #line 2556 "pikchr.c"
2532 break;
2533 case 25: /* relexpr ::= expr */
2534 #line 598 "pikchr.y"
2535 {yylhsminor.yy200.rAbs = yymsp[0].minor.yy265; yylhsminor.yy200.rRel = 0;}
2536 #line 2561 "pikchr.c"
2537 yymsp[0].minor.yy200 = yylhsminor.yy200;
2538 break;
2539 case 26: /* relexpr ::= expr PERCENT */
2540 #line 599 "pikchr.y"
2541 {yylhsminor.yy200.rAbs = 0; yylhsminor.yy200.rRel = yymsp[-1].minor.yy265/100;}
2542 #line 2567 "pikchr.c"
2543 yymsp[-1].minor.yy200 = yylhsminor.yy200;
2544 break;
2545 case 27: /* optrelexpr ::= */
2546 #line 601 "pikchr.y"
2547 {yymsp[1].minor.yy200.rAbs = 0; yymsp[1].minor.yy200.rRel = 1.0;}
2548 #line 2573 "pikchr.c"
2549 break;
2550 case 28: /* attribute_list ::= relexpr alist */
2551 #line 603 "pikchr.y"
2552 {pik_add_direction(p,0,&yymsp[-1].minor.yy200);}
2553 #line 2578 "pikchr.c"
2554 break;
2555 case 29: /* attribute ::= numproperty relexpr */
2556 #line 607 "pikchr.y"
2557 { pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy200); }
2558 #line 2583 "pikchr.c"
2559 break;
2560 case 30: /* attribute ::= dashproperty expr */
2561 #line 608 "pikchr.y"
2562 { pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy265); }
2563 #line 2588 "pikchr.c"
2564 break;
2565 case 31: /* attribute ::= dashproperty */
2566 #line 609 "pikchr.y"
2567 { pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2568 #line 2593 "pikchr.c"
2569 break;
2570 case 32: /* attribute ::= colorproperty rvalue */
2571 #line 610 "pikchr.y"
2572 { pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy265); }
2573 #line 2598 "pikchr.c"
2574 break;
2575 case 33: /* attribute ::= go direction optrelexpr */
2576 #line 611 "pikchr.y"
2577 { pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy200);}
2578 #line 2603 "pikchr.c"
2579 break;
2580 case 34: /* attribute ::= go direction even position */
2581 #line 612 "pikchr.y"
2582 {pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy43);}
2583 #line 2608 "pikchr.c"
2584 break;
2585 case 35: /* attribute ::= CLOSE */
2586 #line 613 "pikchr.y"
2587 { pik_close_path(p,&yymsp[0].minor.yy0); }
2588 #line 2613 "pikchr.c"
2589 break;
2590 case 36: /* attribute ::= CHOP */
2591 #line 614 "pikchr.y"
2592 { p->cur->bChop = 1; }
2593 #line 2618 "pikchr.c"
2594 break;
2595 case 37: /* attribute ::= FROM position */
2596 #line 615 "pikchr.y"
2597 { pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy43); }
2598 #line 2623 "pikchr.c"
2599 break;
2600 case 38: /* attribute ::= TO position */
2601 #line 616 "pikchr.y"
2602 { pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy43); }
2603 #line 2628 "pikchr.c"
2604 break;
2605 case 39: /* attribute ::= THEN */
2606 #line 617 "pikchr.y"
2607 { pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2608 #line 2633 "pikchr.c"
2609 break;
2610 case 40: /* attribute ::= THEN optrelexpr HEADING expr */
2611 case 42: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==42);
2612 #line 619 "pikchr.y"
2613 {pik_move_hdg(p,&yymsp[-2].minor.yy200,&yymsp[-1].minor.yy0,yymsp[0].minor.yy265,0,&yymsp[-3].minor.yy0);}
2614 #line 2639 "pikchr.c"
2615 break;
2616 case 41: /* attribute ::= THEN optrelexpr EDGEPT */
2617 case 43: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==43);
2618 #line 620 "pikchr.y"
2619 {pik_move_hdg(p,&yymsp[-1].minor.yy200,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2620 #line 2645 "pikchr.c"
2621 break;
2622 case 44: /* attribute ::= AT position */
2623 #line 625 "pikchr.y"
2624 { pik_set_at(p,0,&yymsp[0].minor.yy43,&yymsp[-1].minor.yy0); }
2625 #line 2650 "pikchr.c"
2626 break;
2627 case 45: /* attribute ::= SAME */
2628 #line 627 "pikchr.y"
2629 {pik_same(p,0,&yymsp[0].minor.yy0);}
2630 #line 2655 "pikchr.c"
2631 break;
2632 case 46: /* attribute ::= SAME AS object */
2633 #line 628 "pikchr.y"
2634 {pik_same(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2635 #line 2660 "pikchr.c"
2636 break;
2637 case 47: /* attribute ::= STRING textposition */
2638 #line 629 "pikchr.y"
2639 {pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy196);}
2640 #line 2665 "pikchr.c"
2641 break;
2642 case 48: /* attribute ::= FIT */
2643 #line 630 "pikchr.y"
2644 {pik_size_to_fit(p,&yymsp[0].minor.yy0,3); }
2645 #line 2670 "pikchr.c"
2646 break;
2647 case 49: /* attribute ::= BEHIND object */
2648 #line 631 "pikchr.y"
2649 {pik_behind(p,yymsp[0].minor.yy38);}
2650 #line 2675 "pikchr.c"
2651 break;
2652 case 50: /* withclause ::= DOT_E edge AT position */
2653 case 51: /* withclause ::= edge AT position */ yytestcase(yyruleno==51);
2654 #line 639 "pikchr.y"
2655 { pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy43,&yymsp[-1].minor.yy0); }
2656 #line 2681 "pikchr.c"
2657 break;
2658 case 52: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2659 #line 643 "pikchr.y"
2660 {yylhsminor.yy0 = yymsp[0].minor.yy0;}
2661 #line 2686 "pikchr.c"
2662 yymsp[0].minor.yy0 = yylhsminor.yy0;
2663 break;
2664 case 53: /* boolproperty ::= CW */
2665 #line 654 "pikchr.y"
2666 {p->cur->cw = 1;}
2667 #line 2692 "pikchr.c"
2668 break;
2669 case 54: /* boolproperty ::= CCW */
2670 #line 655 "pikchr.y"
2671 {p->cur->cw = 0;}
2672 #line 2697 "pikchr.c"
2673 break;
2674 case 55: /* boolproperty ::= LARROW */
2675 #line 656 "pikchr.y"
2676 {p->cur->larrow=1; p->cur->rarrow=0; }
2677 #line 2702 "pikchr.c"
2678 break;
2679 case 56: /* boolproperty ::= RARROW */
2680 #line 657 "pikchr.y"
2681 {p->cur->larrow=0; p->cur->rarrow=1; }
2682 #line 2707 "pikchr.c"
2683 break;
2684 case 57: /* boolproperty ::= LRARROW */
2685 #line 658 "pikchr.y"
2686 {p->cur->larrow=1; p->cur->rarrow=1; }
2687 #line 2712 "pikchr.c"
2688 break;
2689 case 58: /* boolproperty ::= INVIS */
2690 #line 659 "pikchr.y"
2691 {p->cur->sw = 0.0;}
2692 #line 2717 "pikchr.c"
2693 break;
2694 case 59: /* boolproperty ::= THICK */
2695 #line 660 "pikchr.y"
2696 {p->cur->sw *= 1.5;}
2697 #line 2722 "pikchr.c"
2698 break;
2699 case 60: /* boolproperty ::= THIN */
2700 #line 661 "pikchr.y"
2701 {p->cur->sw *= 0.67;}
2702 #line 2727 "pikchr.c"
2703 break;
2704 case 61: /* boolproperty ::= SOLID */
2705 #line 662 "pikchr.y"
2706 {p->cur->sw = pik_value(p,"thickness",9,0);
2707 p->cur->dotted = p->cur->dashed = 0.0;}
2708 #line 2733 "pikchr.c"
2709 break;
2710 case 62: /* textposition ::= */
2711 #line 665 "pikchr.y"
2712 {yymsp[1].minor.yy196 = 0;}
2713 #line 2738 "pikchr.c"
2714 break;
2715 case 63: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2716 #line 668 "pikchr.y"
2717 {yylhsminor.yy196 = pik_text_position(yymsp[-1].minor.yy196,&yymsp[0].minor.yy0);}
2718 #line 2743 "pikchr.c"
2719 yymsp[-1].minor.yy196 = yylhsminor.yy196;
2720 break;
2721 case 64: /* position ::= expr COMMA expr */
2722 #line 671 "pikchr.y"
2723 {yylhsminor.yy43.x=yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[0].minor.yy265;}
2724 #line 2749 "pikchr.c"
2725 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2726 break;
2727 case 65: /* position ::= place PLUS expr COMMA expr */
2728 #line 673 "pikchr.y"
2729 {yylhsminor.yy43.x=yymsp[-4].minor.yy43.x+yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[-4].minor.yy43.y+yymsp[0].minor.yy265;}
2730 #line 2755 "pikchr.c"
2731 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2732 break;
2733 case 66: /* position ::= place MINUS expr COMMA expr */
2734 #line 674 "pikchr.y"
2735 {yylhsminor.yy43.x=yymsp[-4].minor.yy43.x-yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[-4].minor.yy43.y-yymsp[0].minor.yy265;}
2736 #line 2761 "pikchr.c"
2737 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2738 break;
2739 case 67: /* position ::= place PLUS LP expr COMMA expr RP */
2740 #line 676 "pikchr.y"
2741 {yylhsminor.yy43.x=yymsp[-6].minor.yy43.x+yymsp[-3].minor.yy265; yylhsminor.yy43.y=yymsp[-6].minor.yy43.y+yymsp[-1].minor.yy265;}
2742 #line 2767 "pikchr.c"
2743 yymsp[-6].minor.yy43 = yylhsminor.yy43;
2744 break;
2745 case 68: /* position ::= place MINUS LP expr COMMA expr RP */
2746 #line 678 "pikchr.y"
2747 {yylhsminor.yy43.x=yymsp[-6].minor.yy43.x-yymsp[-3].minor.yy265; yylhsminor.yy43.y=yymsp[-6].minor.yy43.y-yymsp[-1].minor.yy265;}
2748 #line 2773 "pikchr.c"
2749 yymsp[-6].minor.yy43 = yylhsminor.yy43;
2750 break;
2751 case 69: /* position ::= LP position COMMA position RP */
2752 #line 679 "pikchr.y"
2753 {yymsp[-4].minor.yy43.x=yymsp[-3].minor.yy43.x; yymsp[-4].minor.yy43.y=yymsp[-1].minor.yy43.y;}
2754 #line 2779 "pikchr.c"
2755 break;
2756 case 70: /* position ::= LP position RP */
2757 #line 680 "pikchr.y"
2758 {yymsp[-2].minor.yy43=yymsp[-1].minor.yy43;}
2759 #line 2784 "pikchr.c"
2760 break;
2761 case 71: /* position ::= expr between position AND position */
2762 #line 682 "pikchr.y"
2763 {yylhsminor.yy43 = pik_position_between(yymsp[-4].minor.yy265,yymsp[-2].minor.yy43,yymsp[0].minor.yy43);}
2764 #line 2789 "pikchr.c"
2765 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2766 break;
2767 case 72: /* position ::= expr LT position COMMA position GT */
2768 #line 684 "pikchr.y"
2769 {yylhsminor.yy43 = pik_position_between(yymsp[-5].minor.yy265,yymsp[-3].minor.yy43,yymsp[-1].minor.yy43);}
2770 #line 2795 "pikchr.c"
2771 yymsp[-5].minor.yy43 = yylhsminor.yy43;
2772 break;
2773 case 73: /* position ::= expr ABOVE position */
2774 #line 685 "pikchr.y"
2775 {yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.y += yymsp[-2].minor.yy265;}
2776 #line 2801 "pikchr.c"
2777 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2778 break;
2779 case 74: /* position ::= expr BELOW position */
2780 #line 686 "pikchr.y"
2781 {yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.y -= yymsp[-2].minor.yy265;}
2782 #line 2807 "pikchr.c"
2783 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2784 break;
2785 case 75: /* position ::= expr LEFT OF position */
2786 #line 687 "pikchr.y"
2787 {yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.x -= yymsp[-3].minor.yy265;}
2788 #line 2813 "pikchr.c"
2789 yymsp[-3].minor.yy43 = yylhsminor.yy43;
2790 break;
2791 case 76: /* position ::= expr RIGHT OF position */
2792 #line 688 "pikchr.y"
2793 {yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.x += yymsp[-3].minor.yy265;}
2794 #line 2819 "pikchr.c"
2795 yymsp[-3].minor.yy43 = yylhsminor.yy43;
2796 break;
2797 case 77: /* position ::= expr ON HEADING EDGEPT OF position */
2798 #line 690 "pikchr.y"
2799 {yylhsminor.yy43 = pik_position_at_hdg(yymsp[-5].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2800 #line 2825 "pikchr.c"
2801 yymsp[-5].minor.yy43 = yylhsminor.yy43;
2802 break;
2803 case 78: /* position ::= expr HEADING EDGEPT OF position */
2804 #line 692 "pikchr.y"
2805 {yylhsminor.yy43 = pik_position_at_hdg(yymsp[-4].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2806 #line 2831 "pikchr.c"
2807 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2808 break;
2809 case 79: /* position ::= expr EDGEPT OF position */
2810 #line 694 "pikchr.y"
2811 {yylhsminor.yy43 = pik_position_at_hdg(yymsp[-3].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2812 #line 2837 "pikchr.c"
2813 yymsp[-3].minor.yy43 = yylhsminor.yy43;
2814 break;
2815 case 80: /* position ::= expr ON HEADING expr FROM position */
2816 #line 696 "pikchr.y"
2817 {yylhsminor.yy43 = pik_position_at_angle(yymsp[-5].minor.yy265,yymsp[-2].minor.yy265,yymsp[0].minor.yy43);}
2818 #line 2843 "pikchr.c"
2819 yymsp[-5].minor.yy43 = yylhsminor.yy43;
2820 break;
2821 case 81: /* position ::= expr HEADING expr FROM position */
2822 #line 698 "pikchr.y"
2823 {yylhsminor.yy43 = pik_position_at_angle(yymsp[-4].minor.yy265,yymsp[-2].minor.yy265,yymsp[0].minor.yy43);}
2824 #line 2849 "pikchr.c"
2825 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2826 break;
2827 case 82: /* place ::= edge OF object */
2828 #line 710 "pikchr.y"
2829 {yylhsminor.yy43 = pik_place_of_elem(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2830 #line 2855 "pikchr.c"
2831 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2832 break;
2833 case 83: /* place2 ::= object */
2834 #line 711 "pikchr.y"
2835 {yylhsminor.yy43 = pik_place_of_elem(p,yymsp[0].minor.yy38,0);}
2836 #line 2861 "pikchr.c"
2837 yymsp[0].minor.yy43 = yylhsminor.yy43;
2838 break;
2839 case 84: /* place2 ::= object DOT_E edge */
2840 #line 712 "pikchr.y"
2841 {yylhsminor.yy43 = pik_place_of_elem(p,yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
2842 #line 2867 "pikchr.c"
2843 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2844 break;
2845 case 85: /* place2 ::= NTH VERTEX OF object */
2846 #line 713 "pikchr.y"
2847 {yylhsminor.yy43 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy38);}
2848 #line 2873 "pikchr.c"
2849 yymsp[-3].minor.yy43 = yylhsminor.yy43;
2850 break;
2851 case 86: /* object ::= nth */
2852 #line 725 "pikchr.y"
2853 {yylhsminor.yy38 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2854 #line 2879 "pikchr.c"
2855 yymsp[0].minor.yy38 = yylhsminor.yy38;
2856 break;
2857 case 87: /* object ::= nth OF|IN object */
2858 #line 726 "pikchr.y"
2859 {yylhsminor.yy38 = pik_find_nth(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2860 #line 2885 "pikchr.c"
2861 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2862 break;
2863 case 88: /* objectname ::= PLACENAME */
2864 #line 728 "pikchr.y"
2865 {yylhsminor.yy38 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2866 #line 2891 "pikchr.c"
2867 yymsp[0].minor.yy38 = yylhsminor.yy38;
2868 break;
2869 case 89: /* objectname ::= objectname DOT_U PLACENAME */
2870 #line 730 "pikchr.y"
2871 {yylhsminor.yy38 = pik_find_byname(p,yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
2872 #line 2897 "pikchr.c"
2873 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2874 break;
2875 case 90: /* nth ::= NTH CLASSNAME */
2876 #line 732 "pikchr.y"
2877 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2878 #line 2903 "pikchr.c"
2879 yymsp[-1].minor.yy0 = yylhsminor.yy0;
2880 break;
2881 case 91: /* nth ::= NTH LAST CLASSNAME */
2882 #line 733 "pikchr.y"
2883 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2884 #line 2909 "pikchr.c"
2885 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2886 break;
2887 case 92: /* nth ::= LAST CLASSNAME */
2888 #line 734 "pikchr.y"
2889 {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2890 #line 2915 "pikchr.c"
2891 break;
2892 case 93: /* nth ::= LAST */
2893 #line 735 "pikchr.y"
2894 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2895 #line 2920 "pikchr.c"
2896 yymsp[0].minor.yy0 = yylhsminor.yy0;
2897 break;
2898 case 94: /* nth ::= NTH LB RB */
2899 #line 736 "pikchr.y"
2900 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2901 #line 2926 "pikchr.c"
2902 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2903 break;
2904 case 95: /* nth ::= NTH LAST LB RB */
2905 #line 737 "pikchr.y"
2906 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2907 #line 2932 "pikchr.c"
2908 yymsp[-3].minor.yy0 = yylhsminor.yy0;
2909 break;
2910 case 96: /* nth ::= LAST LB RB */
2911 #line 738 "pikchr.y"
2912 {yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2913 #line 2938 "pikchr.c"
2914 break;
2915 case 97: /* expr ::= expr PLUS expr */
2916 #line 740 "pikchr.y"
2917 {yylhsminor.yy265=yymsp[-2].minor.yy265+yymsp[0].minor.yy265;}
2918 #line 2943 "pikchr.c"
2919 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2920 break;
2921 case 98: /* expr ::= expr MINUS expr */
2922 #line 741 "pikchr.y"
2923 {yylhsminor.yy265=yymsp[-2].minor.yy265-yymsp[0].minor.yy265;}
2924 #line 2949 "pikchr.c"
2925 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2926 break;
2927 case 99: /* expr ::= expr STAR expr */
2928 #line 742 "pikchr.y"
2929 {yylhsminor.yy265=yymsp[-2].minor.yy265*yymsp[0].minor.yy265;}
2930 #line 2955 "pikchr.c"
2931 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2932 break;
2933 case 100: /* expr ::= expr SLASH expr */
2934 #line 743 "pikchr.y"
2935 {
2936 if( yymsp[0].minor.yy265==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy265 = 0.0; }
2937 else{ yylhsminor.yy265 = yymsp[-2].minor.yy265/yymsp[0].minor.yy265; }
2938 }
2939 #line 2964 "pikchr.c"
2940 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2941 break;
2942 case 101: /* expr ::= MINUS expr */
2943 #line 747 "pikchr.y"
2944 {yymsp[-1].minor.yy265=-yymsp[0].minor.yy265;}
2945 #line 2970 "pikchr.c"
2946 break;
2947 case 102: /* expr ::= PLUS expr */
2948 #line 748 "pikchr.y"
2949 {yymsp[-1].minor.yy265=yymsp[0].minor.yy265;}
2950 #line 2975 "pikchr.c"
2951 break;
2952 case 103: /* expr ::= LP expr RP */
2953 #line 749 "pikchr.y"
2954 {yymsp[-2].minor.yy265=yymsp[-1].minor.yy265;}
2955 #line 2980 "pikchr.c"
2956 break;
2957 case 104: /* expr ::= LP FILL|COLOR|THICKNESS RP */
2958 #line 750 "pikchr.y"
2959 {yymsp[-2].minor.yy265=pik_get_var(p,&yymsp[-1].minor.yy0);}
2960 #line 2985 "pikchr.c"
2961 break;
2962 case 105: /* expr ::= NUMBER */
2963 #line 751 "pikchr.y"
2964 {yylhsminor.yy265=pik_atof(&yymsp[0].minor.yy0);}
2965 #line 2990 "pikchr.c"
2966 yymsp[0].minor.yy265 = yylhsminor.yy265;
2967 break;
2968 case 106: /* expr ::= ID */
2969 #line 752 "pikchr.y"
2970 {yylhsminor.yy265=pik_get_var(p,&yymsp[0].minor.yy0);}
2971 #line 2996 "pikchr.c"
2972 yymsp[0].minor.yy265 = yylhsminor.yy265;
2973 break;
2974 case 107: /* expr ::= FUNC1 LP expr RP */
2975 #line 753 "pikchr.y"
2976 {yylhsminor.yy265 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy265,0.0);}
2977 #line 3002 "pikchr.c"
2978 yymsp[-3].minor.yy265 = yylhsminor.yy265;
2979 break;
2980 case 108: /* expr ::= FUNC2 LP expr COMMA expr RP */
2981 #line 754 "pikchr.y"
2982 {yylhsminor.yy265 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy265,yymsp[-1].minor.yy265);}
2983 #line 3008 "pikchr.c"
2984 yymsp[-5].minor.yy265 = yylhsminor.yy265;
2985 break;
2986 case 109: /* expr ::= DIST LP position COMMA position RP */
2987 #line 755 "pikchr.y"
2988 {yymsp[-5].minor.yy265 = pik_dist(&yymsp[-3].minor.yy43,&yymsp[-1].minor.yy43);}
2989 #line 3014 "pikchr.c"
2990 break;
2991 case 110: /* expr ::= place2 DOT_XY X */
2992 #line 756 "pikchr.y"
2993 {yylhsminor.yy265 = yymsp[-2].minor.yy43.x;}
2994 #line 3019 "pikchr.c"
2995 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2996 break;
2997 case 111: /* expr ::= place2 DOT_XY Y */
2998 #line 757 "pikchr.y"
2999 {yylhsminor.yy265 = yymsp[-2].minor.yy43.y;}
3000 #line 3025 "pikchr.c"
3001 yymsp[-2].minor.yy265 = yylhsminor.yy265;
3002 break;
3003 case 112: /* expr ::= object DOT_L numproperty */
3004 case 113: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==113);
3005 case 114: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==114);
3006 #line 758 "pikchr.y"
3007 {yylhsminor.yy265=pik_property_of(yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
3008 #line 3033 "pikchr.c"
3009 yymsp[-2].minor.yy265 = yylhsminor.yy265;
3010 break;
3011 default:
3012 /* (115) lvalue ::= ID */ yytestcase(yyruleno==115);
3013 /* (116) lvalue ::= FILL */ yytestcase(yyruleno==116);
@@ -3105,19 +3106,19 @@
3106 ){
3107 pik_parserARG_FETCH
3108 pik_parserCTX_FETCH
3109 #define TOKEN yyminor
3110 /************ Begin %syntax_error code ****************************************/
3111 #line 519 "pikchr.y"
3112
3113 if( TOKEN.z && TOKEN.z[0] ){
3114 pik_error(p, &TOKEN, "syntax error");
3115 }else{
3116 pik_error(p, 0, "syntax error");
3117 }
3118 UNUSED_PARAMETER(yymajor);
3119 #line 3144 "pikchr.c"
3120 /************ End %syntax_error code ******************************************/
3121 pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
3122 pik_parserCTX_STORE
3123 }
3124
@@ -3346,11 +3347,11 @@
3347 #else
3348 (void)iToken;
3349 return 0;
3350 #endif
3351 }
3352 #line 763 "pikchr.y"
3353
3354
3355
3356 /* Chart of the 148 official CSS color names with their
3357 ** corresponding RGB values thru Color Module Level 4:
@@ -4592,11 +4593,11 @@
4593 r = (127*r)/mx;
4594 g = (127*g)/mx;
4595 b = (127*b)/mx;
4596 }
4597 }else{
4598 if( mn<128 && mx>mn ){
4599 r = 127 + ((r-mn)*128)/(mx-mn);
4600 g = 127 + ((g-mn)*128)/(mx-mn);
4601 b = 127 + ((b-mn)*128)/(mx-mn);
4602 }
4603 }
@@ -4637,11 +4638,15 @@
4638 }
4639 static void pik_append_clr(Pik *p,const char *z1,PNum v,const char *z2,int bg){
4640 char buf[200];
4641 int x = (int)v;
4642 int r, g, b;
4643 if( x==0 && p->fgcolor>0 && !bg ){
4644 x = p->fgcolor;
4645 }else if( p->mFlags & PIKCHR_DARK_MODE ){
4646 x = pik_color_to_dark_mode(x,bg);
4647 }
4648 r = (x>>16) & 0xff;
4649 g = (x>>8) & 0xff;
4650 b = x & 0xff;
4651 snprintf(buf, sizeof(buf)-1, "%srgb(%d,%d,%d)%s", z1, r, g, b, z2);
4652 buf[sizeof(buf)-1] = 0;
@@ -6877,18 +6882,26 @@
6882 PNum thickness; /* Stroke width */
6883 PNum margin; /* Extra bounding box margin */
6884 PNum w, h; /* Drawing width and height */
6885 PNum wArrow;
6886 PNum pikScale; /* Value of the "scale" variable */
6887 int miss = 0;
6888
6889 /* Set up rendering parameters */
6890 pik_compute_layout_settings(p);
6891 thickness = pik_value(p,"thickness",9,0);
6892 if( thickness<=0.01 ) thickness = 0.01;
6893 margin = pik_value(p,"margin",6,0);
6894 margin += thickness;
6895 wArrow = p->wArrow*thickness;
6896 p->fgcolor = (int)pik_value(p,"fgcolor",7,&miss);
6897 if( miss ){
6898 PToken t;
6899 t.z = "fgcolor";
6900 t.n = 7;
6901 p->fgcolor = (int)pik_lookup_color(0, &t);
6902 }
6903
6904 /* Compute a bounding box over all objects so that we can know
6905 ** how big to declare the SVG canvas */
6906 pik_bbox_init(&p->bbox);
6907 pik_bbox_add_elist(p, pList, wArrow);
@@ -7839,6 +7852,6 @@
7852
7853
7854 #endif /* PIKCHR_TCL */
7855
7856
7857 #line 7882 "pikchr.c"
7858

Keyboard Shortcuts

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