Fossil SCM

Add support for the "pikchr-background" detail.txt skin setting used to specify an alternative background color value for Pikchr diagrams. Set this value appropriately for the eagle and ardoise skins.

drh 2021-01-25 20:19 trunk
Commit 557f51b34bc6cdde6b8cc5d1669e070ea2f1bfdef62beba2874297d772007029
--- skins/ardoise/details.txt
+++ skins/ardoise/details.txt
@@ -1,4 +1,5 @@
11
timeline-arrowheads: 0
22
timeline-circle-nodes: 1
33
timeline-color-graph-lines: 1
44
white-foreground: 1
5
+pikchr-background: 0x1d2021
56
--- skins/ardoise/details.txt
+++ skins/ardoise/details.txt
@@ -1,4 +1,5 @@
1 timeline-arrowheads: 0
2 timeline-circle-nodes: 1
3 timeline-color-graph-lines: 1
4 white-foreground: 1
 
5
--- skins/ardoise/details.txt
+++ skins/ardoise/details.txt
@@ -1,4 +1,5 @@
1 timeline-arrowheads: 0
2 timeline-circle-nodes: 1
3 timeline-color-graph-lines: 1
4 white-foreground: 1
5 pikchr-background: 0x1d2021
6
--- skins/eagle/details.txt
+++ skins/eagle/details.txt
@@ -1,4 +1,5 @@
11
timeline-arrowheads: 1
22
timeline-circle-nodes: 0
33
timeline-color-graph-lines: 0
44
white-foreground: 1
5
+pikchr-background: 0x485d7b
56
--- skins/eagle/details.txt
+++ skins/eagle/details.txt
@@ -1,4 +1,5 @@
1 timeline-arrowheads: 1
2 timeline-circle-nodes: 0
3 timeline-color-graph-lines: 0
4 white-foreground: 1
 
5
--- skins/eagle/details.txt
+++ skins/eagle/details.txt
@@ -1,4 +1,5 @@
1 timeline-arrowheads: 1
2 timeline-circle-nodes: 0
3 timeline-color-graph-lines: 0
4 white-foreground: 1
5 pikchr-background: 0x485d7b
6
--- src/markdown_html.c
+++ src/markdown_html.c
@@ -379,10 +379,14 @@
379379
}
380380
zPikVar = skin_detail("pikchr-foreground");
381381
if( zPikVar && zPikVar[0] ){
382382
blob_appendf(&bSrc, "fgcolor = %s\n", zPikVar);
383383
}
384
+ zPikVar = skin_detail("pikchr-background");
385
+ if( zPikVar && zPikVar[0] ){
386
+ blob_appendf(&bSrc, "bgcolor = %s\n", zPikVar);
387
+ }
384388
zPikVar = skin_detail("pikchr-scale");
385389
if( zPikVar
386390
&& (rPikVar = atof(zPikVar))>=0.1
387391
&& rPikVar<10.0
388392
){
389393
--- src/markdown_html.c
+++ src/markdown_html.c
@@ -379,10 +379,14 @@
379 }
380 zPikVar = skin_detail("pikchr-foreground");
381 if( zPikVar && zPikVar[0] ){
382 blob_appendf(&bSrc, "fgcolor = %s\n", zPikVar);
383 }
 
 
 
 
384 zPikVar = skin_detail("pikchr-scale");
385 if( zPikVar
386 && (rPikVar = atof(zPikVar))>=0.1
387 && rPikVar<10.0
388 ){
389
--- src/markdown_html.c
+++ src/markdown_html.c
@@ -379,10 +379,14 @@
379 }
380 zPikVar = skin_detail("pikchr-foreground");
381 if( zPikVar && zPikVar[0] ){
382 blob_appendf(&bSrc, "fgcolor = %s\n", zPikVar);
383 }
384 zPikVar = skin_detail("pikchr-background");
385 if( zPikVar && zPikVar[0] ){
386 blob_appendf(&bSrc, "bgcolor = %s\n", zPikVar);
387 }
388 zPikVar = skin_detail("pikchr-scale");
389 if( zPikVar
390 && (rPikVar = atof(zPikVar))>=0.1
391 && rPikVar<10.0
392 ){
393
+318 -276
--- src/pikchr.c
+++ src/pikchr.c
@@ -363,11 +363,12 @@
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 */
368
+ int fgcolor; /* foreground color value, or -1 for none */
369
+ int bgcolor; /* background color value, or -1 for none */
369370
/* Paths for lines are constructed here first, then transferred into
370371
** the PObj object at the end: */
371372
int nTPath; /* Number of entries on aTPath[] */
372373
int mTPath; /* For last entry, 1: x set, 2: y set */
373374
PPoint aTPath[1000]; /* Path under construction */
@@ -473,11 +474,11 @@
473474
static PObj *pik_position_assert(Pik*,PPoint*,PToken*,PPoint*);
474475
static PNum pik_dist(PPoint*,PPoint*);
475476
static void pik_add_macro(Pik*,PToken *pId,PToken *pCode);
476477
477478
478
-#line 504 "pikchr.c"
479
+#line 505 "pikchr.c"
479480
/**************** End of %include directives **********************************/
480481
/* These constants specify the various numeric values for terminal symbols.
481482
***************** Begin token definitions *************************************/
482483
#ifndef T_ID
483484
#define T_ID 1
@@ -642,12 +643,12 @@
642643
typedef union {
643644
int yyinit;
644645
pik_parserTOKENTYPE yy0;
645646
PObj* yy38;
646647
PPoint yy43;
648
+ short int yy44;
647649
PList* yy119;
648
- int yy196;
649650
PRel yy200;
650651
PNum yy265;
651652
} YYMINORTYPE;
652653
#ifndef YYSTACKDEPTH
653654
#define YYSTACKDEPTH 100
@@ -1690,22 +1691,22 @@
16901691
** inside the C code.
16911692
*/
16921693
/********* Begin destructor definitions ***************************************/
16931694
case 98: /* statement_list */
16941695
{
1695
-#line 493 "pikchr.y"
1696
+#line 494 "pikchr.y"
16961697
pik_elist_free(p,(yypminor->yy119));
1697
-#line 1722 "pikchr.c"
1698
+#line 1723 "pikchr.c"
16981699
}
16991700
break;
17001701
case 99: /* statement */
17011702
case 100: /* unnamed_statement */
17021703
case 101: /* basetype */
17031704
{
1704
-#line 495 "pikchr.y"
1705
+#line 496 "pikchr.y"
17051706
pik_elem_free(p,(yypminor->yy38));
1706
-#line 1731 "pikchr.c"
1707
+#line 1732 "pikchr.c"
17071708
}
17081709
break;
17091710
/********* End destructor definitions *****************************************/
17101711
default: break; /* If no destructor action specified: do nothing */
17111712
}
@@ -1919,14 +1920,14 @@
19191920
#endif
19201921
while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
19211922
/* Here code is inserted which will execute if the parser
19221923
** stack every overflows */
19231924
/******** Begin %stack_overflow code ******************************************/
1924
-#line 527 "pikchr.y"
1925
+#line 528 "pikchr.y"
19251926
19261927
pik_error(p, 0, "parser stack overflow");
1927
-#line 1952 "pikchr.c"
1928
+#line 1953 "pikchr.c"
19281929
/******** End %stack_overflow code ********************************************/
19291930
pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
19301931
pik_parserCTX_STORE
19311932
}
19321933
@@ -2400,614 +2401,614 @@
24002401
** break;
24012402
*/
24022403
/********** Begin reduce actions **********************************************/
24032404
YYMINORTYPE yylhsminor;
24042405
case 0: /* document ::= statement_list */
2405
-#line 531 "pikchr.y"
2406
+#line 532 "pikchr.y"
24062407
{pik_render(p,yymsp[0].minor.yy119);}
2407
-#line 2432 "pikchr.c"
2408
+#line 2433 "pikchr.c"
24082409
break;
24092410
case 1: /* statement_list ::= statement */
2410
-#line 534 "pikchr.y"
2411
+#line 535 "pikchr.y"
24112412
{ yylhsminor.yy119 = pik_elist_append(p,0,yymsp[0].minor.yy38); }
2412
-#line 2437 "pikchr.c"
2413
+#line 2438 "pikchr.c"
24132414
yymsp[0].minor.yy119 = yylhsminor.yy119;
24142415
break;
24152416
case 2: /* statement_list ::= statement_list EOL statement */
2416
-#line 536 "pikchr.y"
2417
+#line 537 "pikchr.y"
24172418
{ yylhsminor.yy119 = pik_elist_append(p,yymsp[-2].minor.yy119,yymsp[0].minor.yy38); }
2418
-#line 2443 "pikchr.c"
2419
+#line 2444 "pikchr.c"
24192420
yymsp[-2].minor.yy119 = yylhsminor.yy119;
24202421
break;
24212422
case 3: /* statement ::= */
2422
-#line 539 "pikchr.y"
2423
+#line 540 "pikchr.y"
24232424
{ yymsp[1].minor.yy38 = 0; }
2424
-#line 2449 "pikchr.c"
2425
+#line 2450 "pikchr.c"
24252426
break;
24262427
case 4: /* statement ::= direction */
2427
-#line 540 "pikchr.y"
2428
+#line 541 "pikchr.y"
24282429
{ pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy38=0; }
2429
-#line 2454 "pikchr.c"
2430
+#line 2455 "pikchr.c"
24302431
yymsp[0].minor.yy38 = yylhsminor.yy38;
24312432
break;
24322433
case 5: /* statement ::= lvalue ASSIGN rvalue */
2433
-#line 541 "pikchr.y"
2434
+#line 542 "pikchr.y"
24342435
{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
+#line 2461 "pikchr.c"
24362437
yymsp[-2].minor.yy38 = yylhsminor.yy38;
24372438
break;
24382439
case 6: /* statement ::= PLACENAME COLON unnamed_statement */
2439
-#line 543 "pikchr.y"
2440
+#line 544 "pikchr.y"
24402441
{ yylhsminor.yy38 = yymsp[0].minor.yy38; pik_elem_setname(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0); }
2441
-#line 2466 "pikchr.c"
2442
+#line 2467 "pikchr.c"
24422443
yymsp[-2].minor.yy38 = yylhsminor.yy38;
24432444
break;
24442445
case 7: /* statement ::= PLACENAME COLON position */
2445
-#line 545 "pikchr.y"
2446
+#line 546 "pikchr.y"
24462447
{ yylhsminor.yy38 = pik_elem_new(p,0,0,0);
24472448
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
+#line 2474 "pikchr.c"
24492450
yymsp[-2].minor.yy38 = yylhsminor.yy38;
24502451
break;
24512452
case 8: /* statement ::= unnamed_statement */
2452
-#line 547 "pikchr.y"
2453
+#line 548 "pikchr.y"
24532454
{yylhsminor.yy38 = yymsp[0].minor.yy38;}
2454
-#line 2479 "pikchr.c"
2455
+#line 2480 "pikchr.c"
24552456
yymsp[0].minor.yy38 = yylhsminor.yy38;
24562457
break;
24572458
case 9: /* statement ::= print prlist */
2458
-#line 548 "pikchr.y"
2459
+#line 549 "pikchr.y"
24592460
{pik_append(p,"<br>\n",5); yymsp[-1].minor.yy38=0;}
2460
-#line 2485 "pikchr.c"
2461
+#line 2486 "pikchr.c"
24612462
break;
24622463
case 10: /* statement ::= ASSERT LP expr EQ expr RP */
2463
-#line 553 "pikchr.y"
2464
+#line 554 "pikchr.y"
24642465
{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
+#line 2491 "pikchr.c"
24662467
break;
24672468
case 11: /* statement ::= ASSERT LP position EQ position RP */
2468
-#line 555 "pikchr.y"
2469
+#line 556 "pikchr.y"
24692470
{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
+#line 2496 "pikchr.c"
24712472
break;
24722473
case 12: /* statement ::= DEFINE ID CODEBLOCK */
2473
-#line 556 "pikchr.y"
2474
+#line 557 "pikchr.y"
24742475
{yymsp[-2].minor.yy38=0; pik_add_macro(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
2475
-#line 2500 "pikchr.c"
2476
+#line 2501 "pikchr.c"
24762477
break;
24772478
case 13: /* rvalue ::= PLACENAME */
2478
-#line 567 "pikchr.y"
2479
+#line 568 "pikchr.y"
24792480
{yylhsminor.yy265 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2480
-#line 2505 "pikchr.c"
2481
+#line 2506 "pikchr.c"
24812482
yymsp[0].minor.yy265 = yylhsminor.yy265;
24822483
break;
24832484
case 14: /* pritem ::= FILL */
24842485
case 15: /* pritem ::= COLOR */ yytestcase(yyruleno==15);
24852486
case 16: /* pritem ::= THICKNESS */ yytestcase(yyruleno==16);
2486
-#line 572 "pikchr.y"
2487
+#line 573 "pikchr.y"
24872488
{pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2488
-#line 2513 "pikchr.c"
2489
+#line 2514 "pikchr.c"
24892490
break;
24902491
case 17: /* pritem ::= rvalue */
2491
-#line 575 "pikchr.y"
2492
+#line 576 "pikchr.y"
24922493
{pik_append_num(p,"",yymsp[0].minor.yy265);}
2493
-#line 2518 "pikchr.c"
2494
+#line 2519 "pikchr.c"
24942495
break;
24952496
case 18: /* pritem ::= STRING */
2496
-#line 576 "pikchr.y"
2497
+#line 577 "pikchr.y"
24972498
{pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2498
-#line 2523 "pikchr.c"
2499
+#line 2524 "pikchr.c"
24992500
break;
25002501
case 19: /* prsep ::= COMMA */
2501
-#line 577 "pikchr.y"
2502
+#line 578 "pikchr.y"
25022503
{pik_append(p, " ", 1);}
2503
-#line 2528 "pikchr.c"
2504
+#line 2529 "pikchr.c"
25042505
break;
25052506
case 20: /* unnamed_statement ::= basetype attribute_list */
2506
-#line 580 "pikchr.y"
2507
+#line 581 "pikchr.y"
25072508
{yylhsminor.yy38 = yymsp[-1].minor.yy38; pik_after_adding_attributes(p,yylhsminor.yy38);}
2508
-#line 2533 "pikchr.c"
2509
+#line 2534 "pikchr.c"
25092510
yymsp[-1].minor.yy38 = yylhsminor.yy38;
25102511
break;
25112512
case 21: /* basetype ::= CLASSNAME */
2512
-#line 582 "pikchr.y"
2513
+#line 583 "pikchr.y"
25132514
{yylhsminor.yy38 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2514
-#line 2539 "pikchr.c"
2515
+#line 2540 "pikchr.c"
25152516
yymsp[0].minor.yy38 = yylhsminor.yy38;
25162517
break;
25172518
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"
2519
+#line 585 "pikchr.y"
2520
+{yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy44; yylhsminor.yy38 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2521
+#line 2546 "pikchr.c"
25212522
yymsp[-1].minor.yy38 = yylhsminor.yy38;
25222523
break;
25232524
case 23: /* basetype ::= LB savelist statement_list RB */
2524
-#line 586 "pikchr.y"
2525
+#line 587 "pikchr.y"
25252526
{ 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
+#line 2552 "pikchr.c"
25272528
break;
25282529
case 24: /* savelist ::= */
2529
-#line 591 "pikchr.y"
2530
+#line 592 "pikchr.y"
25302531
{yymsp[1].minor.yy119 = p->list; p->list = 0;}
2531
-#line 2556 "pikchr.c"
2532
+#line 2557 "pikchr.c"
25322533
break;
25332534
case 25: /* relexpr ::= expr */
2534
-#line 598 "pikchr.y"
2535
+#line 599 "pikchr.y"
25352536
{yylhsminor.yy200.rAbs = yymsp[0].minor.yy265; yylhsminor.yy200.rRel = 0;}
2536
-#line 2561 "pikchr.c"
2537
+#line 2562 "pikchr.c"
25372538
yymsp[0].minor.yy200 = yylhsminor.yy200;
25382539
break;
25392540
case 26: /* relexpr ::= expr PERCENT */
2540
-#line 599 "pikchr.y"
2541
+#line 600 "pikchr.y"
25412542
{yylhsminor.yy200.rAbs = 0; yylhsminor.yy200.rRel = yymsp[-1].minor.yy265/100;}
2542
-#line 2567 "pikchr.c"
2543
+#line 2568 "pikchr.c"
25432544
yymsp[-1].minor.yy200 = yylhsminor.yy200;
25442545
break;
25452546
case 27: /* optrelexpr ::= */
2546
-#line 601 "pikchr.y"
2547
+#line 602 "pikchr.y"
25472548
{yymsp[1].minor.yy200.rAbs = 0; yymsp[1].minor.yy200.rRel = 1.0;}
2548
-#line 2573 "pikchr.c"
2549
+#line 2574 "pikchr.c"
25492550
break;
25502551
case 28: /* attribute_list ::= relexpr alist */
2551
-#line 603 "pikchr.y"
2552
+#line 604 "pikchr.y"
25522553
{pik_add_direction(p,0,&yymsp[-1].minor.yy200);}
2553
-#line 2578 "pikchr.c"
2554
+#line 2579 "pikchr.c"
25542555
break;
25552556
case 29: /* attribute ::= numproperty relexpr */
2556
-#line 607 "pikchr.y"
2557
+#line 608 "pikchr.y"
25572558
{ pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy200); }
2558
-#line 2583 "pikchr.c"
2559
+#line 2584 "pikchr.c"
25592560
break;
25602561
case 30: /* attribute ::= dashproperty expr */
2561
-#line 608 "pikchr.y"
2562
+#line 609 "pikchr.y"
25622563
{ pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy265); }
2563
-#line 2588 "pikchr.c"
2564
+#line 2589 "pikchr.c"
25642565
break;
25652566
case 31: /* attribute ::= dashproperty */
2566
-#line 609 "pikchr.y"
2567
+#line 610 "pikchr.y"
25672568
{ pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2568
-#line 2593 "pikchr.c"
2569
+#line 2594 "pikchr.c"
25692570
break;
25702571
case 32: /* attribute ::= colorproperty rvalue */
2571
-#line 610 "pikchr.y"
2572
+#line 611 "pikchr.y"
25722573
{ pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy265); }
2573
-#line 2598 "pikchr.c"
2574
+#line 2599 "pikchr.c"
25742575
break;
25752576
case 33: /* attribute ::= go direction optrelexpr */
2576
-#line 611 "pikchr.y"
2577
+#line 612 "pikchr.y"
25772578
{ pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy200);}
2578
-#line 2603 "pikchr.c"
2579
+#line 2604 "pikchr.c"
25792580
break;
25802581
case 34: /* attribute ::= go direction even position */
2581
-#line 612 "pikchr.y"
2582
+#line 613 "pikchr.y"
25822583
{pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy43);}
2583
-#line 2608 "pikchr.c"
2584
+#line 2609 "pikchr.c"
25842585
break;
25852586
case 35: /* attribute ::= CLOSE */
2586
-#line 613 "pikchr.y"
2587
+#line 614 "pikchr.y"
25872588
{ pik_close_path(p,&yymsp[0].minor.yy0); }
2588
-#line 2613 "pikchr.c"
2589
+#line 2614 "pikchr.c"
25892590
break;
25902591
case 36: /* attribute ::= CHOP */
2591
-#line 614 "pikchr.y"
2592
+#line 615 "pikchr.y"
25922593
{ p->cur->bChop = 1; }
2593
-#line 2618 "pikchr.c"
2594
+#line 2619 "pikchr.c"
25942595
break;
25952596
case 37: /* attribute ::= FROM position */
2596
-#line 615 "pikchr.y"
2597
+#line 616 "pikchr.y"
25972598
{ pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy43); }
2598
-#line 2623 "pikchr.c"
2599
+#line 2624 "pikchr.c"
25992600
break;
26002601
case 38: /* attribute ::= TO position */
2601
-#line 616 "pikchr.y"
2602
+#line 617 "pikchr.y"
26022603
{ pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy43); }
2603
-#line 2628 "pikchr.c"
2604
+#line 2629 "pikchr.c"
26042605
break;
26052606
case 39: /* attribute ::= THEN */
2606
-#line 617 "pikchr.y"
2607
+#line 618 "pikchr.y"
26072608
{ pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2608
-#line 2633 "pikchr.c"
2609
+#line 2634 "pikchr.c"
26092610
break;
26102611
case 40: /* attribute ::= THEN optrelexpr HEADING expr */
26112612
case 42: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==42);
2612
-#line 619 "pikchr.y"
2613
+#line 620 "pikchr.y"
26132614
{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
+#line 2640 "pikchr.c"
26152616
break;
26162617
case 41: /* attribute ::= THEN optrelexpr EDGEPT */
26172618
case 43: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==43);
2618
-#line 620 "pikchr.y"
2619
+#line 621 "pikchr.y"
26192620
{pik_move_hdg(p,&yymsp[-1].minor.yy200,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2620
-#line 2645 "pikchr.c"
2621
+#line 2646 "pikchr.c"
26212622
break;
26222623
case 44: /* attribute ::= AT position */
2623
-#line 625 "pikchr.y"
2624
+#line 626 "pikchr.y"
26242625
{ pik_set_at(p,0,&yymsp[0].minor.yy43,&yymsp[-1].minor.yy0); }
2625
-#line 2650 "pikchr.c"
2626
+#line 2651 "pikchr.c"
26262627
break;
26272628
case 45: /* attribute ::= SAME */
2628
-#line 627 "pikchr.y"
2629
+#line 628 "pikchr.y"
26292630
{pik_same(p,0,&yymsp[0].minor.yy0);}
2630
-#line 2655 "pikchr.c"
2631
+#line 2656 "pikchr.c"
26312632
break;
26322633
case 46: /* attribute ::= SAME AS object */
2633
-#line 628 "pikchr.y"
2634
+#line 629 "pikchr.y"
26342635
{pik_same(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2635
-#line 2660 "pikchr.c"
2636
+#line 2661 "pikchr.c"
26362637
break;
26372638
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"
2639
+#line 630 "pikchr.y"
2640
+{pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy44);}
2641
+#line 2666 "pikchr.c"
26412642
break;
26422643
case 48: /* attribute ::= FIT */
2643
-#line 630 "pikchr.y"
2644
+#line 631 "pikchr.y"
26442645
{pik_size_to_fit(p,&yymsp[0].minor.yy0,3); }
2645
-#line 2670 "pikchr.c"
2646
+#line 2671 "pikchr.c"
26462647
break;
26472648
case 49: /* attribute ::= BEHIND object */
2648
-#line 631 "pikchr.y"
2649
+#line 632 "pikchr.y"
26492650
{pik_behind(p,yymsp[0].minor.yy38);}
2650
-#line 2675 "pikchr.c"
2651
+#line 2676 "pikchr.c"
26512652
break;
26522653
case 50: /* withclause ::= DOT_E edge AT position */
26532654
case 51: /* withclause ::= edge AT position */ yytestcase(yyruleno==51);
2654
-#line 639 "pikchr.y"
2655
+#line 640 "pikchr.y"
26552656
{ pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy43,&yymsp[-1].minor.yy0); }
2656
-#line 2681 "pikchr.c"
2657
+#line 2682 "pikchr.c"
26572658
break;
26582659
case 52: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2659
-#line 643 "pikchr.y"
2660
+#line 644 "pikchr.y"
26602661
{yylhsminor.yy0 = yymsp[0].minor.yy0;}
2661
-#line 2686 "pikchr.c"
2662
+#line 2687 "pikchr.c"
26622663
yymsp[0].minor.yy0 = yylhsminor.yy0;
26632664
break;
26642665
case 53: /* boolproperty ::= CW */
2665
-#line 654 "pikchr.y"
2666
+#line 655 "pikchr.y"
26662667
{p->cur->cw = 1;}
2667
-#line 2692 "pikchr.c"
2668
+#line 2693 "pikchr.c"
26682669
break;
26692670
case 54: /* boolproperty ::= CCW */
2670
-#line 655 "pikchr.y"
2671
+#line 656 "pikchr.y"
26712672
{p->cur->cw = 0;}
2672
-#line 2697 "pikchr.c"
2673
+#line 2698 "pikchr.c"
26732674
break;
26742675
case 55: /* boolproperty ::= LARROW */
2675
-#line 656 "pikchr.y"
2676
+#line 657 "pikchr.y"
26762677
{p->cur->larrow=1; p->cur->rarrow=0; }
2677
-#line 2702 "pikchr.c"
2678
+#line 2703 "pikchr.c"
26782679
break;
26792680
case 56: /* boolproperty ::= RARROW */
2680
-#line 657 "pikchr.y"
2681
+#line 658 "pikchr.y"
26812682
{p->cur->larrow=0; p->cur->rarrow=1; }
2682
-#line 2707 "pikchr.c"
2683
+#line 2708 "pikchr.c"
26832684
break;
26842685
case 57: /* boolproperty ::= LRARROW */
2685
-#line 658 "pikchr.y"
2686
+#line 659 "pikchr.y"
26862687
{p->cur->larrow=1; p->cur->rarrow=1; }
2687
-#line 2712 "pikchr.c"
2688
+#line 2713 "pikchr.c"
26882689
break;
26892690
case 58: /* boolproperty ::= INVIS */
2690
-#line 659 "pikchr.y"
2691
+#line 660 "pikchr.y"
26912692
{p->cur->sw = 0.0;}
2692
-#line 2717 "pikchr.c"
2693
+#line 2718 "pikchr.c"
26932694
break;
26942695
case 59: /* boolproperty ::= THICK */
2695
-#line 660 "pikchr.y"
2696
+#line 661 "pikchr.y"
26962697
{p->cur->sw *= 1.5;}
2697
-#line 2722 "pikchr.c"
2698
+#line 2723 "pikchr.c"
26982699
break;
26992700
case 60: /* boolproperty ::= THIN */
2700
-#line 661 "pikchr.y"
2701
+#line 662 "pikchr.y"
27012702
{p->cur->sw *= 0.67;}
2702
-#line 2727 "pikchr.c"
2703
+#line 2728 "pikchr.c"
27032704
break;
27042705
case 61: /* boolproperty ::= SOLID */
2705
-#line 662 "pikchr.y"
2706
+#line 663 "pikchr.y"
27062707
{p->cur->sw = pik_value(p,"thickness",9,0);
27072708
p->cur->dotted = p->cur->dashed = 0.0;}
2708
-#line 2733 "pikchr.c"
2709
+#line 2734 "pikchr.c"
27092710
break;
27102711
case 62: /* textposition ::= */
2711
-#line 665 "pikchr.y"
2712
-{yymsp[1].minor.yy196 = 0;}
2713
-#line 2738 "pikchr.c"
2712
+#line 666 "pikchr.y"
2713
+{yymsp[1].minor.yy44 = 0;}
2714
+#line 2739 "pikchr.c"
27142715
break;
27152716
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;
2717
+#line 669 "pikchr.y"
2718
+{yylhsminor.yy44 = (short int)pik_text_position(yymsp[-1].minor.yy44,&yymsp[0].minor.yy0);}
2719
+#line 2744 "pikchr.c"
2720
+ yymsp[-1].minor.yy44 = yylhsminor.yy44;
27202721
break;
27212722
case 64: /* position ::= expr COMMA expr */
2722
-#line 671 "pikchr.y"
2723
+#line 672 "pikchr.y"
27232724
{yylhsminor.yy43.x=yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[0].minor.yy265;}
2724
-#line 2749 "pikchr.c"
2725
+#line 2750 "pikchr.c"
27252726
yymsp[-2].minor.yy43 = yylhsminor.yy43;
27262727
break;
27272728
case 65: /* position ::= place PLUS expr COMMA expr */
2728
-#line 673 "pikchr.y"
2729
+#line 674 "pikchr.y"
27292730
{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
+#line 2756 "pikchr.c"
27312732
yymsp[-4].minor.yy43 = yylhsminor.yy43;
27322733
break;
27332734
case 66: /* position ::= place MINUS expr COMMA expr */
2734
-#line 674 "pikchr.y"
2735
+#line 675 "pikchr.y"
27352736
{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
+#line 2762 "pikchr.c"
27372738
yymsp[-4].minor.yy43 = yylhsminor.yy43;
27382739
break;
27392740
case 67: /* position ::= place PLUS LP expr COMMA expr RP */
2740
-#line 676 "pikchr.y"
2741
+#line 677 "pikchr.y"
27412742
{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
+#line 2768 "pikchr.c"
27432744
yymsp[-6].minor.yy43 = yylhsminor.yy43;
27442745
break;
27452746
case 68: /* position ::= place MINUS LP expr COMMA expr RP */
2746
-#line 678 "pikchr.y"
2747
+#line 679 "pikchr.y"
27472748
{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
+#line 2774 "pikchr.c"
27492750
yymsp[-6].minor.yy43 = yylhsminor.yy43;
27502751
break;
27512752
case 69: /* position ::= LP position COMMA position RP */
2752
-#line 679 "pikchr.y"
2753
+#line 680 "pikchr.y"
27532754
{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
+#line 2780 "pikchr.c"
27552756
break;
27562757
case 70: /* position ::= LP position RP */
2757
-#line 680 "pikchr.y"
2758
+#line 681 "pikchr.y"
27582759
{yymsp[-2].minor.yy43=yymsp[-1].minor.yy43;}
2759
-#line 2784 "pikchr.c"
2760
+#line 2785 "pikchr.c"
27602761
break;
27612762
case 71: /* position ::= expr between position AND position */
2762
-#line 682 "pikchr.y"
2763
+#line 683 "pikchr.y"
27632764
{yylhsminor.yy43 = pik_position_between(yymsp[-4].minor.yy265,yymsp[-2].minor.yy43,yymsp[0].minor.yy43);}
2764
-#line 2789 "pikchr.c"
2765
+#line 2790 "pikchr.c"
27652766
yymsp[-4].minor.yy43 = yylhsminor.yy43;
27662767
break;
27672768
case 72: /* position ::= expr LT position COMMA position GT */
2768
-#line 684 "pikchr.y"
2769
+#line 685 "pikchr.y"
27692770
{yylhsminor.yy43 = pik_position_between(yymsp[-5].minor.yy265,yymsp[-3].minor.yy43,yymsp[-1].minor.yy43);}
2770
-#line 2795 "pikchr.c"
2771
+#line 2796 "pikchr.c"
27712772
yymsp[-5].minor.yy43 = yylhsminor.yy43;
27722773
break;
27732774
case 73: /* position ::= expr ABOVE position */
2774
-#line 685 "pikchr.y"
2775
+#line 686 "pikchr.y"
27752776
{yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.y += yymsp[-2].minor.yy265;}
2776
-#line 2801 "pikchr.c"
2777
+#line 2802 "pikchr.c"
27772778
yymsp[-2].minor.yy43 = yylhsminor.yy43;
27782779
break;
27792780
case 74: /* position ::= expr BELOW position */
2780
-#line 686 "pikchr.y"
2781
+#line 687 "pikchr.y"
27812782
{yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.y -= yymsp[-2].minor.yy265;}
2782
-#line 2807 "pikchr.c"
2783
+#line 2808 "pikchr.c"
27832784
yymsp[-2].minor.yy43 = yylhsminor.yy43;
27842785
break;
27852786
case 75: /* position ::= expr LEFT OF position */
2786
-#line 687 "pikchr.y"
2787
+#line 688 "pikchr.y"
27872788
{yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.x -= yymsp[-3].minor.yy265;}
2788
-#line 2813 "pikchr.c"
2789
+#line 2814 "pikchr.c"
27892790
yymsp[-3].minor.yy43 = yylhsminor.yy43;
27902791
break;
27912792
case 76: /* position ::= expr RIGHT OF position */
2792
-#line 688 "pikchr.y"
2793
+#line 689 "pikchr.y"
27932794
{yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.x += yymsp[-3].minor.yy265;}
2794
-#line 2819 "pikchr.c"
2795
+#line 2820 "pikchr.c"
27952796
yymsp[-3].minor.yy43 = yylhsminor.yy43;
27962797
break;
27972798
case 77: /* position ::= expr ON HEADING EDGEPT OF position */
2798
-#line 690 "pikchr.y"
2799
+#line 691 "pikchr.y"
27992800
{yylhsminor.yy43 = pik_position_at_hdg(yymsp[-5].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2800
-#line 2825 "pikchr.c"
2801
+#line 2826 "pikchr.c"
28012802
yymsp[-5].minor.yy43 = yylhsminor.yy43;
28022803
break;
28032804
case 78: /* position ::= expr HEADING EDGEPT OF position */
2804
-#line 692 "pikchr.y"
2805
+#line 693 "pikchr.y"
28052806
{yylhsminor.yy43 = pik_position_at_hdg(yymsp[-4].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2806
-#line 2831 "pikchr.c"
2807
+#line 2832 "pikchr.c"
28072808
yymsp[-4].minor.yy43 = yylhsminor.yy43;
28082809
break;
28092810
case 79: /* position ::= expr EDGEPT OF position */
2810
-#line 694 "pikchr.y"
2811
+#line 695 "pikchr.y"
28112812
{yylhsminor.yy43 = pik_position_at_hdg(yymsp[-3].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2812
-#line 2837 "pikchr.c"
2813
+#line 2838 "pikchr.c"
28132814
yymsp[-3].minor.yy43 = yylhsminor.yy43;
28142815
break;
28152816
case 80: /* position ::= expr ON HEADING expr FROM position */
2816
-#line 696 "pikchr.y"
2817
+#line 697 "pikchr.y"
28172818
{yylhsminor.yy43 = pik_position_at_angle(yymsp[-5].minor.yy265,yymsp[-2].minor.yy265,yymsp[0].minor.yy43);}
2818
-#line 2843 "pikchr.c"
2819
+#line 2844 "pikchr.c"
28192820
yymsp[-5].minor.yy43 = yylhsminor.yy43;
28202821
break;
28212822
case 81: /* position ::= expr HEADING expr FROM position */
2822
-#line 698 "pikchr.y"
2823
+#line 699 "pikchr.y"
28232824
{yylhsminor.yy43 = pik_position_at_angle(yymsp[-4].minor.yy265,yymsp[-2].minor.yy265,yymsp[0].minor.yy43);}
2824
-#line 2849 "pikchr.c"
2825
+#line 2850 "pikchr.c"
28252826
yymsp[-4].minor.yy43 = yylhsminor.yy43;
28262827
break;
28272828
case 82: /* place ::= edge OF object */
2828
-#line 710 "pikchr.y"
2829
+#line 711 "pikchr.y"
28292830
{yylhsminor.yy43 = pik_place_of_elem(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2830
-#line 2855 "pikchr.c"
2831
+#line 2856 "pikchr.c"
28312832
yymsp[-2].minor.yy43 = yylhsminor.yy43;
28322833
break;
28332834
case 83: /* place2 ::= object */
2834
-#line 711 "pikchr.y"
2835
+#line 712 "pikchr.y"
28352836
{yylhsminor.yy43 = pik_place_of_elem(p,yymsp[0].minor.yy38,0);}
2836
-#line 2861 "pikchr.c"
2837
+#line 2862 "pikchr.c"
28372838
yymsp[0].minor.yy43 = yylhsminor.yy43;
28382839
break;
28392840
case 84: /* place2 ::= object DOT_E edge */
2840
-#line 712 "pikchr.y"
2841
+#line 713 "pikchr.y"
28412842
{yylhsminor.yy43 = pik_place_of_elem(p,yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
2842
-#line 2867 "pikchr.c"
2843
+#line 2868 "pikchr.c"
28432844
yymsp[-2].minor.yy43 = yylhsminor.yy43;
28442845
break;
28452846
case 85: /* place2 ::= NTH VERTEX OF object */
2846
-#line 713 "pikchr.y"
2847
+#line 714 "pikchr.y"
28472848
{yylhsminor.yy43 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy38);}
2848
-#line 2873 "pikchr.c"
2849
+#line 2874 "pikchr.c"
28492850
yymsp[-3].minor.yy43 = yylhsminor.yy43;
28502851
break;
28512852
case 86: /* object ::= nth */
2852
-#line 725 "pikchr.y"
2853
+#line 726 "pikchr.y"
28532854
{yylhsminor.yy38 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2854
-#line 2879 "pikchr.c"
2855
+#line 2880 "pikchr.c"
28552856
yymsp[0].minor.yy38 = yylhsminor.yy38;
28562857
break;
28572858
case 87: /* object ::= nth OF|IN object */
2858
-#line 726 "pikchr.y"
2859
+#line 727 "pikchr.y"
28592860
{yylhsminor.yy38 = pik_find_nth(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2860
-#line 2885 "pikchr.c"
2861
+#line 2886 "pikchr.c"
28612862
yymsp[-2].minor.yy38 = yylhsminor.yy38;
28622863
break;
28632864
case 88: /* objectname ::= PLACENAME */
2864
-#line 728 "pikchr.y"
2865
+#line 729 "pikchr.y"
28652866
{yylhsminor.yy38 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2866
-#line 2891 "pikchr.c"
2867
+#line 2892 "pikchr.c"
28672868
yymsp[0].minor.yy38 = yylhsminor.yy38;
28682869
break;
28692870
case 89: /* objectname ::= objectname DOT_U PLACENAME */
2870
-#line 730 "pikchr.y"
2871
+#line 731 "pikchr.y"
28712872
{yylhsminor.yy38 = pik_find_byname(p,yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
2872
-#line 2897 "pikchr.c"
2873
+#line 2898 "pikchr.c"
28732874
yymsp[-2].minor.yy38 = yylhsminor.yy38;
28742875
break;
28752876
case 90: /* nth ::= NTH CLASSNAME */
2876
-#line 732 "pikchr.y"
2877
+#line 733 "pikchr.y"
28772878
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2878
-#line 2903 "pikchr.c"
2879
+#line 2904 "pikchr.c"
28792880
yymsp[-1].minor.yy0 = yylhsminor.yy0;
28802881
break;
28812882
case 91: /* nth ::= NTH LAST CLASSNAME */
2882
-#line 733 "pikchr.y"
2883
+#line 734 "pikchr.y"
28832884
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2884
-#line 2909 "pikchr.c"
2885
+#line 2910 "pikchr.c"
28852886
yymsp[-2].minor.yy0 = yylhsminor.yy0;
28862887
break;
28872888
case 92: /* nth ::= LAST CLASSNAME */
2888
-#line 734 "pikchr.y"
2889
+#line 735 "pikchr.y"
28892890
{yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2890
-#line 2915 "pikchr.c"
2891
+#line 2916 "pikchr.c"
28912892
break;
28922893
case 93: /* nth ::= LAST */
2893
-#line 735 "pikchr.y"
2894
+#line 736 "pikchr.y"
28942895
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2895
-#line 2920 "pikchr.c"
2896
+#line 2921 "pikchr.c"
28962897
yymsp[0].minor.yy0 = yylhsminor.yy0;
28972898
break;
28982899
case 94: /* nth ::= NTH LB RB */
2899
-#line 736 "pikchr.y"
2900
+#line 737 "pikchr.y"
29002901
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2901
-#line 2926 "pikchr.c"
2902
+#line 2927 "pikchr.c"
29022903
yymsp[-2].minor.yy0 = yylhsminor.yy0;
29032904
break;
29042905
case 95: /* nth ::= NTH LAST LB RB */
2905
-#line 737 "pikchr.y"
2906
+#line 738 "pikchr.y"
29062907
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2907
-#line 2932 "pikchr.c"
2908
+#line 2933 "pikchr.c"
29082909
yymsp[-3].minor.yy0 = yylhsminor.yy0;
29092910
break;
29102911
case 96: /* nth ::= LAST LB RB */
2911
-#line 738 "pikchr.y"
2912
+#line 739 "pikchr.y"
29122913
{yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2913
-#line 2938 "pikchr.c"
2914
+#line 2939 "pikchr.c"
29142915
break;
29152916
case 97: /* expr ::= expr PLUS expr */
2916
-#line 740 "pikchr.y"
2917
+#line 741 "pikchr.y"
29172918
{yylhsminor.yy265=yymsp[-2].minor.yy265+yymsp[0].minor.yy265;}
2918
-#line 2943 "pikchr.c"
2919
+#line 2944 "pikchr.c"
29192920
yymsp[-2].minor.yy265 = yylhsminor.yy265;
29202921
break;
29212922
case 98: /* expr ::= expr MINUS expr */
2922
-#line 741 "pikchr.y"
2923
+#line 742 "pikchr.y"
29232924
{yylhsminor.yy265=yymsp[-2].minor.yy265-yymsp[0].minor.yy265;}
2924
-#line 2949 "pikchr.c"
2925
+#line 2950 "pikchr.c"
29252926
yymsp[-2].minor.yy265 = yylhsminor.yy265;
29262927
break;
29272928
case 99: /* expr ::= expr STAR expr */
2928
-#line 742 "pikchr.y"
2929
+#line 743 "pikchr.y"
29292930
{yylhsminor.yy265=yymsp[-2].minor.yy265*yymsp[0].minor.yy265;}
2930
-#line 2955 "pikchr.c"
2931
+#line 2956 "pikchr.c"
29312932
yymsp[-2].minor.yy265 = yylhsminor.yy265;
29322933
break;
29332934
case 100: /* expr ::= expr SLASH expr */
2934
-#line 743 "pikchr.y"
2935
+#line 744 "pikchr.y"
29352936
{
29362937
if( yymsp[0].minor.yy265==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy265 = 0.0; }
29372938
else{ yylhsminor.yy265 = yymsp[-2].minor.yy265/yymsp[0].minor.yy265; }
29382939
}
2939
-#line 2964 "pikchr.c"
2940
+#line 2965 "pikchr.c"
29402941
yymsp[-2].minor.yy265 = yylhsminor.yy265;
29412942
break;
29422943
case 101: /* expr ::= MINUS expr */
2943
-#line 747 "pikchr.y"
2944
+#line 748 "pikchr.y"
29442945
{yymsp[-1].minor.yy265=-yymsp[0].minor.yy265;}
2945
-#line 2970 "pikchr.c"
2946
+#line 2971 "pikchr.c"
29462947
break;
29472948
case 102: /* expr ::= PLUS expr */
2948
-#line 748 "pikchr.y"
2949
+#line 749 "pikchr.y"
29492950
{yymsp[-1].minor.yy265=yymsp[0].minor.yy265;}
2950
-#line 2975 "pikchr.c"
2951
+#line 2976 "pikchr.c"
29512952
break;
29522953
case 103: /* expr ::= LP expr RP */
2953
-#line 749 "pikchr.y"
2954
+#line 750 "pikchr.y"
29542955
{yymsp[-2].minor.yy265=yymsp[-1].minor.yy265;}
2955
-#line 2980 "pikchr.c"
2956
+#line 2981 "pikchr.c"
29562957
break;
29572958
case 104: /* expr ::= LP FILL|COLOR|THICKNESS RP */
2958
-#line 750 "pikchr.y"
2959
+#line 751 "pikchr.y"
29592960
{yymsp[-2].minor.yy265=pik_get_var(p,&yymsp[-1].minor.yy0);}
2960
-#line 2985 "pikchr.c"
2961
+#line 2986 "pikchr.c"
29612962
break;
29622963
case 105: /* expr ::= NUMBER */
2963
-#line 751 "pikchr.y"
2964
+#line 752 "pikchr.y"
29642965
{yylhsminor.yy265=pik_atof(&yymsp[0].minor.yy0);}
2965
-#line 2990 "pikchr.c"
2966
+#line 2991 "pikchr.c"
29662967
yymsp[0].minor.yy265 = yylhsminor.yy265;
29672968
break;
29682969
case 106: /* expr ::= ID */
2969
-#line 752 "pikchr.y"
2970
+#line 753 "pikchr.y"
29702971
{yylhsminor.yy265=pik_get_var(p,&yymsp[0].minor.yy0);}
2971
-#line 2996 "pikchr.c"
2972
+#line 2997 "pikchr.c"
29722973
yymsp[0].minor.yy265 = yylhsminor.yy265;
29732974
break;
29742975
case 107: /* expr ::= FUNC1 LP expr RP */
2975
-#line 753 "pikchr.y"
2976
+#line 754 "pikchr.y"
29762977
{yylhsminor.yy265 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy265,0.0);}
2977
-#line 3002 "pikchr.c"
2978
+#line 3003 "pikchr.c"
29782979
yymsp[-3].minor.yy265 = yylhsminor.yy265;
29792980
break;
29802981
case 108: /* expr ::= FUNC2 LP expr COMMA expr RP */
2981
-#line 754 "pikchr.y"
2982
+#line 755 "pikchr.y"
29822983
{yylhsminor.yy265 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy265,yymsp[-1].minor.yy265);}
2983
-#line 3008 "pikchr.c"
2984
+#line 3009 "pikchr.c"
29842985
yymsp[-5].minor.yy265 = yylhsminor.yy265;
29852986
break;
29862987
case 109: /* expr ::= DIST LP position COMMA position RP */
2987
-#line 755 "pikchr.y"
2988
+#line 756 "pikchr.y"
29882989
{yymsp[-5].minor.yy265 = pik_dist(&yymsp[-3].minor.yy43,&yymsp[-1].minor.yy43);}
2989
-#line 3014 "pikchr.c"
2990
+#line 3015 "pikchr.c"
29902991
break;
29912992
case 110: /* expr ::= place2 DOT_XY X */
2992
-#line 756 "pikchr.y"
2993
+#line 757 "pikchr.y"
29932994
{yylhsminor.yy265 = yymsp[-2].minor.yy43.x;}
2994
-#line 3019 "pikchr.c"
2995
+#line 3020 "pikchr.c"
29952996
yymsp[-2].minor.yy265 = yylhsminor.yy265;
29962997
break;
29972998
case 111: /* expr ::= place2 DOT_XY Y */
2998
-#line 757 "pikchr.y"
2999
+#line 758 "pikchr.y"
29993000
{yylhsminor.yy265 = yymsp[-2].minor.yy43.y;}
3000
-#line 3025 "pikchr.c"
3001
+#line 3026 "pikchr.c"
30013002
yymsp[-2].minor.yy265 = yylhsminor.yy265;
30023003
break;
30033004
case 112: /* expr ::= object DOT_L numproperty */
30043005
case 113: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==113);
30053006
case 114: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==114);
3006
-#line 758 "pikchr.y"
3007
+#line 759 "pikchr.y"
30073008
{yylhsminor.yy265=pik_property_of(yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
3008
-#line 3033 "pikchr.c"
3009
+#line 3034 "pikchr.c"
30093010
yymsp[-2].minor.yy265 = yylhsminor.yy265;
30103011
break;
30113012
default:
30123013
/* (115) lvalue ::= ID */ yytestcase(yyruleno==115);
30133014
/* (116) lvalue ::= FILL */ yytestcase(yyruleno==116);
@@ -3106,19 +3107,19 @@
31063107
){
31073108
pik_parserARG_FETCH
31083109
pik_parserCTX_FETCH
31093110
#define TOKEN yyminor
31103111
/************ Begin %syntax_error code ****************************************/
3111
-#line 519 "pikchr.y"
3112
+#line 520 "pikchr.y"
31123113
31133114
if( TOKEN.z && TOKEN.z[0] ){
31143115
pik_error(p, &TOKEN, "syntax error");
31153116
}else{
31163117
pik_error(p, 0, "syntax error");
31173118
}
31183119
UNUSED_PARAMETER(yymajor);
3119
-#line 3144 "pikchr.c"
3120
+#line 3145 "pikchr.c"
31203121
/************ End %syntax_error code ******************************************/
31213122
pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
31223123
pik_parserCTX_STORE
31233124
}
31243125
@@ -3347,11 +3348,11 @@
33473348
#else
33483349
(void)iToken;
33493350
return 0;
33503351
#endif
33513352
}
3352
-#line 763 "pikchr.y"
3353
+#line 764 "pikchr.y"
33533354
33543355
33553356
33563357
/* Chart of the 148 official CSS color names with their
33573358
** corresponding RGB values thru Color Module Level 4:
@@ -4507,11 +4508,11 @@
45074508
**
45084509
** * Except for the above, only "<" and ">" are escaped.
45094510
*/
45104511
static void pik_append_text(Pik *p, const char *zText, int n, int mFlags){
45114512
int i;
4512
- char c;
4513
+ char c = 0;
45134514
int bQSpace = mFlags & 1;
45144515
int bQAmp = mFlags & 2;
45154516
if( n<0 ) n = (int)strlen(zText);
45164517
while( n>0 ){
45174518
for(i=0; i<n; i++){
@@ -4651,10 +4652,12 @@
46514652
char buf[200];
46524653
int x = (int)v;
46534654
int r, g, b;
46544655
if( x==0 && p->fgcolor>0 && !bg ){
46554656
x = p->fgcolor;
4657
+ }else if( bg && x>=0xffffff && p->bgcolor>0 ){
4658
+ x = p->bgcolor;
46564659
}else if( p->mFlags & PIKCHR_DARK_MODE ){
46574660
x = pik_color_to_dark_mode(x,bg);
46584661
}
46594662
r = (x>>16) & 0xff;
46604663
g = (x>>8) & 0xff;
@@ -4928,24 +4931,24 @@
49284931
y0 = y+ch;
49294932
x1 = nx-cw/2;
49304933
y1 = y-ch;
49314934
}
49324935
if( (t->eCode & TP_ALIGN)!=0 && pObj->nPath>=2 ){
4933
- int n = pObj->nPath;
4934
- PNum dx = pObj->aPath[n-1].x - pObj->aPath[0].x;
4935
- PNum dy = pObj->aPath[n-1].y - pObj->aPath[0].y;
4936
+ int nn = pObj->nPath;
4937
+ PNum dx = pObj->aPath[nn-1].x - pObj->aPath[0].x;
4938
+ PNum dy = pObj->aPath[nn-1].y - pObj->aPath[0].y;
49364939
if( dx!=0 || dy!=0 ){
49374940
PNum dist = hypot(dx,dy);
4938
- PNum t;
4941
+ PNum tt;
49394942
dx /= dist;
49404943
dy /= dist;
4941
- t = dx*x0 - dy*y0;
4944
+ tt = dx*x0 - dy*y0;
49424945
y0 = dy*x0 - dx*y0;
4943
- x0 = t;
4944
- t = dx*x1 - dy*y1;
4946
+ x0 = tt;
4947
+ tt = dx*x1 - dy*y1;
49454948
y1 = dy*x1 - dx*y1;
4946
- x1 = t;
4949
+ x1 = tt;
49474950
}
49484951
}
49494952
pik_bbox_add_xy(pBox, x+x0, orig_y+y0);
49504953
pik_bbox_add_xy(pBox, x+x1, orig_y+y1);
49514954
continue;
@@ -4975,13 +4978,13 @@
49754978
if( xtraFontScale<=0.99 || xtraFontScale>=1.01 ){
49764979
pik_append_num(p, " font-size=\"", xtraFontScale*100.0);
49774980
pik_append(p, "%\"", 2);
49784981
}
49794982
if( (t->eCode & TP_ALIGN)!=0 && pObj->nPath>=2 ){
4980
- int n = pObj->nPath;
4981
- PNum dx = pObj->aPath[n-1].x - pObj->aPath[0].x;
4982
- PNum dy = pObj->aPath[n-1].y - pObj->aPath[0].y;
4983
+ int nn = pObj->nPath;
4984
+ PNum dx = pObj->aPath[nn-1].x - pObj->aPath[0].x;
4985
+ PNum dy = pObj->aPath[nn-1].y - pObj->aPath[0].y;
49834986
if( dx!=0 || dy!=0 ){
49844987
PNum ang = atan2(dy,dx)*-180/M_PI;
49854988
pik_append_num(p, " transform=\"rotate(", ang);
49864989
pik_append_xy(p, " ", x, orig_y);
49874990
pik_append(p,")\"",2);
@@ -5456,11 +5459,11 @@
54565459
54575460
/* Change the layout direction.
54585461
*/
54595462
static void pik_set_direction(Pik *p, int eDir){
54605463
assert( ValidDir(eDir) );
5461
- p->eDir = eDir;
5464
+ p->eDir = (unsigned char)eDir;
54625465
54635466
/* It seems to make sense to reach back into the last object and
54645467
** change its exit point (its ".end") to correspond to the new
54655468
** direction. Things just seem to work better this way. However,
54665469
** legacy PIC does *not* do this.
@@ -5912,11 +5915,11 @@
59125915
pik_error(p, pTxt, "too many text terms");
59135916
return;
59145917
}
59155918
pT = &pObj->aTxt[pObj->nTxt++];
59165919
*pT = *pTxt;
5917
- pT->eCode = iPos;
5920
+ pT->eCode = (short)iPos;
59185921
}
59195922
59205923
/* Merge "text-position" flags
59215924
*/
59225925
static int pik_text_position(int iPrev, PToken *pFlag){
@@ -6293,11 +6296,11 @@
62936296
if( i>1000 ){
62946297
pik_error(p, pNth, "value too big - max '1000th'");
62956298
i = 1;
62966299
}
62976300
if( i==0 && pik_token_eq(pNth,"first")==0 ) i = 1;
6298
- return i;
6301
+ return (short int)i;
62996302
}
63006303
63016304
/* Search for the NTH object.
63026305
**
63036306
** If pBasis is not NULL then it should be a [] object. Use the
@@ -6501,11 +6504,11 @@
65016504
}
65026505
65036506
/* Return the coordinates for the n-th vertex of a line.
65046507
*/
65056508
static PPoint pik_nth_vertex(Pik *p, PToken *pNth, PToken *pErr, PObj *pObj){
6506
- static const PPoint zero;
6509
+ static const PPoint zero = {0, 0};
65076510
int n;
65086511
if( p->nErr || pObj==0 ) return p->aTPath[0];
65096512
if( !pObj->type->isLine ){
65106513
pik_error(p, pErr, "object is not a line");
65116514
return zero;
@@ -6668,11 +6671,12 @@
66686671
case DIR_DOWN: p->aTPath[1].y -= pObj->h; break;
66696672
case DIR_LEFT: p->aTPath[1].x -= pObj->w; break;
66706673
case DIR_UP: p->aTPath[1].y += pObj->h; break;
66716674
}
66726675
if( pObj->type->xInit==arcInit ){
6673
- p->eDir = pObj->outDir = (pObj->inDir + (pObj->cw ? 1 : 3))%4;
6676
+ pObj->outDir = (pObj->inDir + (pObj->cw ? 1 : 3))%4;
6677
+ p->eDir = (unsigned char)pObj->outDir;
66746678
switch( pObj->outDir ){
66756679
default: p->aTPath[1].x += pObj->w; break;
66766680
case DIR_DOWN: p->aTPath[1].y -= pObj->h; break;
66776681
case DIR_LEFT: p->aTPath[1].x -= pObj->w; break;
66786682
case DIR_UP: p->aTPath[1].y += pObj->h; break;
@@ -6759,11 +6763,11 @@
67596763
case DIR_DOWN: pObj->ptExit.y -= h2; break;
67606764
}
67616765
pik_bbox_add_xy(&pObj->bbox, pObj->ptAt.x - w2, pObj->ptAt.y - h2);
67626766
pik_bbox_add_xy(&pObj->bbox, pObj->ptAt.x + w2, pObj->ptAt.y + h2);
67636767
}
6764
- p->eDir = pObj->outDir;
6768
+ p->eDir = (unsigned char)pObj->outDir;
67656769
}
67666770
67676771
/* Show basic information about each object as a comment in the
67686772
** generated HTML. Used for testing and debugging. Activated
67696773
** by the (undocumented) "debug = 1;"
@@ -6921,17 +6925,26 @@
69216925
thickness = pik_value(p,"thickness",9,0);
69226926
if( thickness<=0.01 ) thickness = 0.01;
69236927
margin = pik_value(p,"margin",6,0);
69246928
margin += thickness;
69256929
wArrow = p->wArrow*thickness;
6930
+ miss = 0;
69266931
p->fgcolor = (int)pik_value(p,"fgcolor",7,&miss);
69276932
if( miss ){
69286933
PToken t;
69296934
t.z = "fgcolor";
69306935
t.n = 7;
69316936
p->fgcolor = (int)pik_lookup_color(0, &t);
69326937
}
6938
+ miss = 0;
6939
+ p->bgcolor = (int)pik_value(p,"bgcolor",7,&miss);
6940
+ if( miss ){
6941
+ PToken t;
6942
+ t.z = "bgcolor";
6943
+ t.n = 7;
6944
+ p->bgcolor = (int)pik_lookup_color(0, &t);
6945
+ }
69336946
69346947
/* Compute a bounding box over all objects so that we can know
69356948
** how big to declare the SVG canvas */
69366949
pik_bbox_init(&p->bbox);
69376950
pik_bbox_add_elist(p, pList, wArrow);
@@ -6953,13 +6966,15 @@
69536966
w = p->bbox.ne.x - p->bbox.sw.x;
69546967
h = p->bbox.ne.y - p->bbox.sw.y;
69556968
p->wSVG = (int)(p->rScale*w);
69566969
p->hSVG = (int)(p->rScale*h);
69576970
pikScale = pik_value(p,"scale",5,0);
6958
- if( pikScale<0.99 || pikScale>1.01 ){
6959
- p->wSVG *= pikScale;
6960
- p->hSVG *= pikScale;
6971
+ if( pikScale>=0.001 && pikScale<=1000.0
6972
+ && (pikScale<0.99 || pikScale>1.01)
6973
+ ){
6974
+ p->wSVG = (int)(p->wSVG*pikScale);
6975
+ p->hSVG = (int)(p->hSVG*pikScale);
69616976
pik_append_num(p, " width=\"", p->wSVG);
69626977
pik_append_num(p, "\" height=\"", p->hSVG);
69636978
pik_append(p, "\"", 1);
69646979
}
69656980
pik_append_dis(p, " viewBox=\"0 0 ",w,"");
@@ -7333,10 +7348,11 @@
73337348
return i;
73347349
}
73357350
}else{
73367351
isInt = 0;
73377352
nDigit = 0;
7353
+ i = 0;
73387354
}
73397355
if( c=='.' ){
73407356
isInt = 0;
73417357
for(i++; (c = z[i])>='0' && c<='9'; i++){ nDigit++; }
73427358
}
@@ -7672,11 +7688,11 @@
76727688
#if defined(PIKCHR_SHELL)
76737689
/* Print a usage comment for the shell and exit. */
76747690
static void usage(const char *argv0){
76757691
fprintf(stderr, "usage: %s [OPTIONS] FILE ...\n", argv0);
76767692
fprintf(stderr,
7677
- "Convert Pikchr input files into SVG.\n"
7693
+ "Convert Pikchr input files into SVG. Filename \"-\" means stdin.\n"
76787694
"Options:\n"
76797695
" --dont-stop Process all files even if earlier files have errors\n"
76807696
" --svg-only Omit raw SVG without the HTML wrapper\n"
76817697
);
76827698
exit(1);
@@ -7700,10 +7716,51 @@
77007716
}else if( c==0 ){
77017717
break;
77027718
}
77037719
}
77047720
}
7721
+
7722
+/* Read the content of file zFilename into memory obtained from malloc()
7723
+** Return the memory. If something goes wrong (ex: the file does not exist
7724
+** or cannot be opened) put an error message on stderr and return NULL.
7725
+**
7726
+** If the filename is "-" read stdin.
7727
+*/
7728
+static char *readFile(const char *zFilename){
7729
+ FILE *in;
7730
+ size_t n;
7731
+ size_t nUsed = 0;
7732
+ size_t nAlloc = 0;
7733
+ char *z = 0, *zNew;
7734
+ in = strcmp(zFilename,"-")==0 ? stdin : fopen(zFilename, "rb");
7735
+ if( in==0 ){
7736
+ fprintf(stderr, "cannot open \"%s\" for reading\n", zFilename);
7737
+ return 0;
7738
+ }
7739
+ while(1){
7740
+ if( nUsed+2>=nAlloc ){
7741
+ nAlloc = nAlloc*2 + 4000;
7742
+ zNew = realloc(z, nAlloc);
7743
+ }
7744
+ if( zNew==0 ){
7745
+ free(z);
7746
+ fprintf(stderr, "out of memory trying to allocate %lld bytes\n",
7747
+ (long long int)nAlloc);
7748
+ exit(1);
7749
+ }
7750
+ z = zNew;
7751
+ n = fread(z+nUsed, 1, nAlloc-nUsed-1, in);
7752
+ if( n<=0 ){
7753
+ break;
7754
+ }
7755
+ nUsed += n;
7756
+ }
7757
+ if( in!=stderr ) fclose(in);
7758
+ z[nUsed] = 0;
7759
+ return z;
7760
+}
7761
+
77057762
77067763
/* Testing interface
77077764
**
77087765
** Generate HTML on standard output that displays both the original
77097766
** input text and the rendered SVG for all files named on the command
@@ -7739,17 +7796,15 @@
77397796
"</head>\n"
77407797
"<body>\n"
77417798
;
77427799
if( argc<2 ) usage(argv[0]);
77437800
for(i=1; i<argc; i++){
7744
- FILE *in;
7745
- size_t sz;
77467801
char *zIn;
77477802
char *zOut;
77487803
int w, h;
77497804
7750
- if( argv[i][0]=='-' ){
7805
+ if( argv[i][0]=='-' && argv[i][1]!=0 ){
77517806
char *z = argv[i];
77527807
z++;
77537808
if( z[0]=='-' ) z++;
77547809
if( strcmp(z,"dont-stop")==0 ){
77557810
bDontStop = 1;
@@ -7770,27 +7825,12 @@
77707825
fprintf(stderr,"unknown option: \"%s\"\n", argv[i]);
77717826
usage(argv[0]);
77727827
}
77737828
continue;
77747829
}
7775
- in = fopen(argv[i], "rb");
7776
- if( in==0 ){
7777
- fprintf(stderr, "cannot open \"%s\" for reading\n", argv[i]);
7778
- continue;
7779
- }
7780
- fseek(in, 0, SEEK_END);
7781
- sz = ftell(in);
7782
- rewind(in);
7783
- zIn = malloc( sz+1 );
7784
- if( zIn==0 ){
7785
- fprintf(stderr, "cannot allocate space for file \"%s\"\n", argv[i]);
7786
- fclose(in);
7787
- continue;
7788
- }
7789
- sz = fread(zIn, 1, sz, in);
7790
- fclose(in);
7791
- zIn[sz] = 0;
7830
+ zIn = readFile(argv[i]);
7831
+ if( zIn==0 ) continue;
77927832
zOut = pikchr(zIn, "pikchr", mFlags, &w, &h);
77937833
if( w<0 ) exitCode = 1;
77947834
if( zOut==0 ){
77957835
fprintf(stderr, "pikchr() returns NULL. Out of memory?\n");
77967836
if( !bDontStop ) exit(1);
@@ -7852,10 +7892,11 @@
78527892
int w, h; /* Width and height of the pikchr */
78537893
const char *zIn; /* Source text input */
78547894
char *zOut; /* SVG output text */
78557895
Tcl_Obj *pRes; /* The result TCL object */
78567896
7897
+ (void)clientData;
78577898
if( objc!=2 ){
78587899
Tcl_WrongNumArgs(interp, 1, objv, "PIKCHR_SOURCE_TEXT");
78597900
return TCL_ERROR;
78607901
}
78617902
zIn = Tcl_GetString(objv[1]);
@@ -7875,13 +7916,14 @@
78757916
78767917
/* Invoke this routine to register the "pikchr" command with the interpreter
78777918
** given in the argument */
78787919
int Pikchr_Init(Tcl_Interp *interp){
78797920
Tcl_CreateObjCommand(interp, "pikchr", pik_tcl_command, 0, 0);
7921
+ Tcl_PkgProvide (interp, PACKAGE_NAME, PACKAGE_VERSION);
78807922
return TCL_OK;
78817923
}
78827924
78837925
78847926
#endif /* PIKCHR_TCL */
78857927
78867928
7887
-#line 7912 "pikchr.c"
7929
+#line 7954 "pikchr.c"
78887930
--- src/pikchr.c
+++ src/pikchr.c
@@ -363,11 +363,12 @@
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 */
@@ -473,11 +474,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
@@ -642,12 +643,12 @@
642 typedef union {
643 int yyinit;
644 pik_parserTOKENTYPE yy0;
645 PObj* yy38;
646 PPoint yy43;
 
647 PList* yy119;
648 int yy196;
649 PRel yy200;
650 PNum yy265;
651 } YYMINORTYPE;
652 #ifndef YYSTACKDEPTH
653 #define YYSTACKDEPTH 100
@@ -1690,22 +1691,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 }
@@ -1919,14 +1920,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
@@ -2400,614 +2401,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);
@@ -3106,19 +3107,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
@@ -3347,11 +3348,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:
@@ -4507,11 +4508,11 @@
4507 **
4508 ** * Except for the above, only "<" and ">" are escaped.
4509 */
4510 static void pik_append_text(Pik *p, const char *zText, int n, int mFlags){
4511 int i;
4512 char c;
4513 int bQSpace = mFlags & 1;
4514 int bQAmp = mFlags & 2;
4515 if( n<0 ) n = (int)strlen(zText);
4516 while( n>0 ){
4517 for(i=0; i<n; i++){
@@ -4651,10 +4652,12 @@
4651 char buf[200];
4652 int x = (int)v;
4653 int r, g, b;
4654 if( x==0 && p->fgcolor>0 && !bg ){
4655 x = p->fgcolor;
 
 
4656 }else if( p->mFlags & PIKCHR_DARK_MODE ){
4657 x = pik_color_to_dark_mode(x,bg);
4658 }
4659 r = (x>>16) & 0xff;
4660 g = (x>>8) & 0xff;
@@ -4928,24 +4931,24 @@
4928 y0 = y+ch;
4929 x1 = nx-cw/2;
4930 y1 = y-ch;
4931 }
4932 if( (t->eCode & TP_ALIGN)!=0 && pObj->nPath>=2 ){
4933 int n = pObj->nPath;
4934 PNum dx = pObj->aPath[n-1].x - pObj->aPath[0].x;
4935 PNum dy = pObj->aPath[n-1].y - pObj->aPath[0].y;
4936 if( dx!=0 || dy!=0 ){
4937 PNum dist = hypot(dx,dy);
4938 PNum t;
4939 dx /= dist;
4940 dy /= dist;
4941 t = dx*x0 - dy*y0;
4942 y0 = dy*x0 - dx*y0;
4943 x0 = t;
4944 t = dx*x1 - dy*y1;
4945 y1 = dy*x1 - dx*y1;
4946 x1 = t;
4947 }
4948 }
4949 pik_bbox_add_xy(pBox, x+x0, orig_y+y0);
4950 pik_bbox_add_xy(pBox, x+x1, orig_y+y1);
4951 continue;
@@ -4975,13 +4978,13 @@
4975 if( xtraFontScale<=0.99 || xtraFontScale>=1.01 ){
4976 pik_append_num(p, " font-size=\"", xtraFontScale*100.0);
4977 pik_append(p, "%\"", 2);
4978 }
4979 if( (t->eCode & TP_ALIGN)!=0 && pObj->nPath>=2 ){
4980 int n = pObj->nPath;
4981 PNum dx = pObj->aPath[n-1].x - pObj->aPath[0].x;
4982 PNum dy = pObj->aPath[n-1].y - pObj->aPath[0].y;
4983 if( dx!=0 || dy!=0 ){
4984 PNum ang = atan2(dy,dx)*-180/M_PI;
4985 pik_append_num(p, " transform=\"rotate(", ang);
4986 pik_append_xy(p, " ", x, orig_y);
4987 pik_append(p,")\"",2);
@@ -5456,11 +5459,11 @@
5456
5457 /* Change the layout direction.
5458 */
5459 static void pik_set_direction(Pik *p, int eDir){
5460 assert( ValidDir(eDir) );
5461 p->eDir = eDir;
5462
5463 /* It seems to make sense to reach back into the last object and
5464 ** change its exit point (its ".end") to correspond to the new
5465 ** direction. Things just seem to work better this way. However,
5466 ** legacy PIC does *not* do this.
@@ -5912,11 +5915,11 @@
5912 pik_error(p, pTxt, "too many text terms");
5913 return;
5914 }
5915 pT = &pObj->aTxt[pObj->nTxt++];
5916 *pT = *pTxt;
5917 pT->eCode = iPos;
5918 }
5919
5920 /* Merge "text-position" flags
5921 */
5922 static int pik_text_position(int iPrev, PToken *pFlag){
@@ -6293,11 +6296,11 @@
6293 if( i>1000 ){
6294 pik_error(p, pNth, "value too big - max '1000th'");
6295 i = 1;
6296 }
6297 if( i==0 && pik_token_eq(pNth,"first")==0 ) i = 1;
6298 return i;
6299 }
6300
6301 /* Search for the NTH object.
6302 **
6303 ** If pBasis is not NULL then it should be a [] object. Use the
@@ -6501,11 +6504,11 @@
6501 }
6502
6503 /* Return the coordinates for the n-th vertex of a line.
6504 */
6505 static PPoint pik_nth_vertex(Pik *p, PToken *pNth, PToken *pErr, PObj *pObj){
6506 static const PPoint zero;
6507 int n;
6508 if( p->nErr || pObj==0 ) return p->aTPath[0];
6509 if( !pObj->type->isLine ){
6510 pik_error(p, pErr, "object is not a line");
6511 return zero;
@@ -6668,11 +6671,12 @@
6668 case DIR_DOWN: p->aTPath[1].y -= pObj->h; break;
6669 case DIR_LEFT: p->aTPath[1].x -= pObj->w; break;
6670 case DIR_UP: p->aTPath[1].y += pObj->h; break;
6671 }
6672 if( pObj->type->xInit==arcInit ){
6673 p->eDir = pObj->outDir = (pObj->inDir + (pObj->cw ? 1 : 3))%4;
 
6674 switch( pObj->outDir ){
6675 default: p->aTPath[1].x += pObj->w; break;
6676 case DIR_DOWN: p->aTPath[1].y -= pObj->h; break;
6677 case DIR_LEFT: p->aTPath[1].x -= pObj->w; break;
6678 case DIR_UP: p->aTPath[1].y += pObj->h; break;
@@ -6759,11 +6763,11 @@
6759 case DIR_DOWN: pObj->ptExit.y -= h2; break;
6760 }
6761 pik_bbox_add_xy(&pObj->bbox, pObj->ptAt.x - w2, pObj->ptAt.y - h2);
6762 pik_bbox_add_xy(&pObj->bbox, pObj->ptAt.x + w2, pObj->ptAt.y + h2);
6763 }
6764 p->eDir = pObj->outDir;
6765 }
6766
6767 /* Show basic information about each object as a comment in the
6768 ** generated HTML. Used for testing and debugging. Activated
6769 ** by the (undocumented) "debug = 1;"
@@ -6921,17 +6925,26 @@
6921 thickness = pik_value(p,"thickness",9,0);
6922 if( thickness<=0.01 ) thickness = 0.01;
6923 margin = pik_value(p,"margin",6,0);
6924 margin += thickness;
6925 wArrow = p->wArrow*thickness;
 
6926 p->fgcolor = (int)pik_value(p,"fgcolor",7,&miss);
6927 if( miss ){
6928 PToken t;
6929 t.z = "fgcolor";
6930 t.n = 7;
6931 p->fgcolor = (int)pik_lookup_color(0, &t);
6932 }
 
 
 
 
 
 
 
 
6933
6934 /* Compute a bounding box over all objects so that we can know
6935 ** how big to declare the SVG canvas */
6936 pik_bbox_init(&p->bbox);
6937 pik_bbox_add_elist(p, pList, wArrow);
@@ -6953,13 +6966,15 @@
6953 w = p->bbox.ne.x - p->bbox.sw.x;
6954 h = p->bbox.ne.y - p->bbox.sw.y;
6955 p->wSVG = (int)(p->rScale*w);
6956 p->hSVG = (int)(p->rScale*h);
6957 pikScale = pik_value(p,"scale",5,0);
6958 if( pikScale<0.99 || pikScale>1.01 ){
6959 p->wSVG *= pikScale;
6960 p->hSVG *= pikScale;
 
 
6961 pik_append_num(p, " width=\"", p->wSVG);
6962 pik_append_num(p, "\" height=\"", p->hSVG);
6963 pik_append(p, "\"", 1);
6964 }
6965 pik_append_dis(p, " viewBox=\"0 0 ",w,"");
@@ -7333,10 +7348,11 @@
7333 return i;
7334 }
7335 }else{
7336 isInt = 0;
7337 nDigit = 0;
 
7338 }
7339 if( c=='.' ){
7340 isInt = 0;
7341 for(i++; (c = z[i])>='0' && c<='9'; i++){ nDigit++; }
7342 }
@@ -7672,11 +7688,11 @@
7672 #if defined(PIKCHR_SHELL)
7673 /* Print a usage comment for the shell and exit. */
7674 static void usage(const char *argv0){
7675 fprintf(stderr, "usage: %s [OPTIONS] FILE ...\n", argv0);
7676 fprintf(stderr,
7677 "Convert Pikchr input files into SVG.\n"
7678 "Options:\n"
7679 " --dont-stop Process all files even if earlier files have errors\n"
7680 " --svg-only Omit raw SVG without the HTML wrapper\n"
7681 );
7682 exit(1);
@@ -7700,10 +7716,51 @@
7700 }else if( c==0 ){
7701 break;
7702 }
7703 }
7704 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7705
7706 /* Testing interface
7707 **
7708 ** Generate HTML on standard output that displays both the original
7709 ** input text and the rendered SVG for all files named on the command
@@ -7739,17 +7796,15 @@
7739 "</head>\n"
7740 "<body>\n"
7741 ;
7742 if( argc<2 ) usage(argv[0]);
7743 for(i=1; i<argc; i++){
7744 FILE *in;
7745 size_t sz;
7746 char *zIn;
7747 char *zOut;
7748 int w, h;
7749
7750 if( argv[i][0]=='-' ){
7751 char *z = argv[i];
7752 z++;
7753 if( z[0]=='-' ) z++;
7754 if( strcmp(z,"dont-stop")==0 ){
7755 bDontStop = 1;
@@ -7770,27 +7825,12 @@
7770 fprintf(stderr,"unknown option: \"%s\"\n", argv[i]);
7771 usage(argv[0]);
7772 }
7773 continue;
7774 }
7775 in = fopen(argv[i], "rb");
7776 if( in==0 ){
7777 fprintf(stderr, "cannot open \"%s\" for reading\n", argv[i]);
7778 continue;
7779 }
7780 fseek(in, 0, SEEK_END);
7781 sz = ftell(in);
7782 rewind(in);
7783 zIn = malloc( sz+1 );
7784 if( zIn==0 ){
7785 fprintf(stderr, "cannot allocate space for file \"%s\"\n", argv[i]);
7786 fclose(in);
7787 continue;
7788 }
7789 sz = fread(zIn, 1, sz, in);
7790 fclose(in);
7791 zIn[sz] = 0;
7792 zOut = pikchr(zIn, "pikchr", mFlags, &w, &h);
7793 if( w<0 ) exitCode = 1;
7794 if( zOut==0 ){
7795 fprintf(stderr, "pikchr() returns NULL. Out of memory?\n");
7796 if( !bDontStop ) exit(1);
@@ -7852,10 +7892,11 @@
7852 int w, h; /* Width and height of the pikchr */
7853 const char *zIn; /* Source text input */
7854 char *zOut; /* SVG output text */
7855 Tcl_Obj *pRes; /* The result TCL object */
7856
 
7857 if( objc!=2 ){
7858 Tcl_WrongNumArgs(interp, 1, objv, "PIKCHR_SOURCE_TEXT");
7859 return TCL_ERROR;
7860 }
7861 zIn = Tcl_GetString(objv[1]);
@@ -7875,13 +7916,14 @@
7875
7876 /* Invoke this routine to register the "pikchr" command with the interpreter
7877 ** given in the argument */
7878 int Pikchr_Init(Tcl_Interp *interp){
7879 Tcl_CreateObjCommand(interp, "pikchr", pik_tcl_command, 0, 0);
 
7880 return TCL_OK;
7881 }
7882
7883
7884 #endif /* PIKCHR_TCL */
7885
7886
7887 #line 7912 "pikchr.c"
7888
--- src/pikchr.c
+++ src/pikchr.c
@@ -363,11 +363,12 @@
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; /* foreground color value, or -1 for none */
369 int bgcolor; /* background color value, or -1 for none */
370 /* Paths for lines are constructed here first, then transferred into
371 ** the PObj object at the end: */
372 int nTPath; /* Number of entries on aTPath[] */
373 int mTPath; /* For last entry, 1: x set, 2: y set */
374 PPoint aTPath[1000]; /* Path under construction */
@@ -473,11 +474,11 @@
474 static PObj *pik_position_assert(Pik*,PPoint*,PToken*,PPoint*);
475 static PNum pik_dist(PPoint*,PPoint*);
476 static void pik_add_macro(Pik*,PToken *pId,PToken *pCode);
477
478
479 #line 505 "pikchr.c"
480 /**************** End of %include directives **********************************/
481 /* These constants specify the various numeric values for terminal symbols.
482 ***************** Begin token definitions *************************************/
483 #ifndef T_ID
484 #define T_ID 1
@@ -642,12 +643,12 @@
643 typedef union {
644 int yyinit;
645 pik_parserTOKENTYPE yy0;
646 PObj* yy38;
647 PPoint yy43;
648 short int yy44;
649 PList* yy119;
 
650 PRel yy200;
651 PNum yy265;
652 } YYMINORTYPE;
653 #ifndef YYSTACKDEPTH
654 #define YYSTACKDEPTH 100
@@ -1690,22 +1691,22 @@
1691 ** inside the C code.
1692 */
1693 /********* Begin destructor definitions ***************************************/
1694 case 98: /* statement_list */
1695 {
1696 #line 494 "pikchr.y"
1697 pik_elist_free(p,(yypminor->yy119));
1698 #line 1723 "pikchr.c"
1699 }
1700 break;
1701 case 99: /* statement */
1702 case 100: /* unnamed_statement */
1703 case 101: /* basetype */
1704 {
1705 #line 496 "pikchr.y"
1706 pik_elem_free(p,(yypminor->yy38));
1707 #line 1732 "pikchr.c"
1708 }
1709 break;
1710 /********* End destructor definitions *****************************************/
1711 default: break; /* If no destructor action specified: do nothing */
1712 }
@@ -1919,14 +1920,14 @@
1920 #endif
1921 while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
1922 /* Here code is inserted which will execute if the parser
1923 ** stack every overflows */
1924 /******** Begin %stack_overflow code ******************************************/
1925 #line 528 "pikchr.y"
1926
1927 pik_error(p, 0, "parser stack overflow");
1928 #line 1953 "pikchr.c"
1929 /******** End %stack_overflow code ********************************************/
1930 pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
1931 pik_parserCTX_STORE
1932 }
1933
@@ -2400,614 +2401,614 @@
2401 ** break;
2402 */
2403 /********** Begin reduce actions **********************************************/
2404 YYMINORTYPE yylhsminor;
2405 case 0: /* document ::= statement_list */
2406 #line 532 "pikchr.y"
2407 {pik_render(p,yymsp[0].minor.yy119);}
2408 #line 2433 "pikchr.c"
2409 break;
2410 case 1: /* statement_list ::= statement */
2411 #line 535 "pikchr.y"
2412 { yylhsminor.yy119 = pik_elist_append(p,0,yymsp[0].minor.yy38); }
2413 #line 2438 "pikchr.c"
2414 yymsp[0].minor.yy119 = yylhsminor.yy119;
2415 break;
2416 case 2: /* statement_list ::= statement_list EOL statement */
2417 #line 537 "pikchr.y"
2418 { yylhsminor.yy119 = pik_elist_append(p,yymsp[-2].minor.yy119,yymsp[0].minor.yy38); }
2419 #line 2444 "pikchr.c"
2420 yymsp[-2].minor.yy119 = yylhsminor.yy119;
2421 break;
2422 case 3: /* statement ::= */
2423 #line 540 "pikchr.y"
2424 { yymsp[1].minor.yy38 = 0; }
2425 #line 2450 "pikchr.c"
2426 break;
2427 case 4: /* statement ::= direction */
2428 #line 541 "pikchr.y"
2429 { pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy38=0; }
2430 #line 2455 "pikchr.c"
2431 yymsp[0].minor.yy38 = yylhsminor.yy38;
2432 break;
2433 case 5: /* statement ::= lvalue ASSIGN rvalue */
2434 #line 542 "pikchr.y"
2435 {pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy265,&yymsp[-1].minor.yy0); yylhsminor.yy38=0;}
2436 #line 2461 "pikchr.c"
2437 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2438 break;
2439 case 6: /* statement ::= PLACENAME COLON unnamed_statement */
2440 #line 544 "pikchr.y"
2441 { yylhsminor.yy38 = yymsp[0].minor.yy38; pik_elem_setname(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0); }
2442 #line 2467 "pikchr.c"
2443 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2444 break;
2445 case 7: /* statement ::= PLACENAME COLON position */
2446 #line 546 "pikchr.y"
2447 { yylhsminor.yy38 = pik_elem_new(p,0,0,0);
2448 if(yylhsminor.yy38){ yylhsminor.yy38->ptAt = yymsp[0].minor.yy43; pik_elem_setname(p,yylhsminor.yy38,&yymsp[-2].minor.yy0); }}
2449 #line 2474 "pikchr.c"
2450 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2451 break;
2452 case 8: /* statement ::= unnamed_statement */
2453 #line 548 "pikchr.y"
2454 {yylhsminor.yy38 = yymsp[0].minor.yy38;}
2455 #line 2480 "pikchr.c"
2456 yymsp[0].minor.yy38 = yylhsminor.yy38;
2457 break;
2458 case 9: /* statement ::= print prlist */
2459 #line 549 "pikchr.y"
2460 {pik_append(p,"<br>\n",5); yymsp[-1].minor.yy38=0;}
2461 #line 2486 "pikchr.c"
2462 break;
2463 case 10: /* statement ::= ASSERT LP expr EQ expr RP */
2464 #line 554 "pikchr.y"
2465 {yymsp[-5].minor.yy38=pik_assert(p,yymsp[-3].minor.yy265,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy265);}
2466 #line 2491 "pikchr.c"
2467 break;
2468 case 11: /* statement ::= ASSERT LP position EQ position RP */
2469 #line 556 "pikchr.y"
2470 {yymsp[-5].minor.yy38=pik_position_assert(p,&yymsp[-3].minor.yy43,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy43);}
2471 #line 2496 "pikchr.c"
2472 break;
2473 case 12: /* statement ::= DEFINE ID CODEBLOCK */
2474 #line 557 "pikchr.y"
2475 {yymsp[-2].minor.yy38=0; pik_add_macro(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
2476 #line 2501 "pikchr.c"
2477 break;
2478 case 13: /* rvalue ::= PLACENAME */
2479 #line 568 "pikchr.y"
2480 {yylhsminor.yy265 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2481 #line 2506 "pikchr.c"
2482 yymsp[0].minor.yy265 = yylhsminor.yy265;
2483 break;
2484 case 14: /* pritem ::= FILL */
2485 case 15: /* pritem ::= COLOR */ yytestcase(yyruleno==15);
2486 case 16: /* pritem ::= THICKNESS */ yytestcase(yyruleno==16);
2487 #line 573 "pikchr.y"
2488 {pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2489 #line 2514 "pikchr.c"
2490 break;
2491 case 17: /* pritem ::= rvalue */
2492 #line 576 "pikchr.y"
2493 {pik_append_num(p,"",yymsp[0].minor.yy265);}
2494 #line 2519 "pikchr.c"
2495 break;
2496 case 18: /* pritem ::= STRING */
2497 #line 577 "pikchr.y"
2498 {pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2499 #line 2524 "pikchr.c"
2500 break;
2501 case 19: /* prsep ::= COMMA */
2502 #line 578 "pikchr.y"
2503 {pik_append(p, " ", 1);}
2504 #line 2529 "pikchr.c"
2505 break;
2506 case 20: /* unnamed_statement ::= basetype attribute_list */
2507 #line 581 "pikchr.y"
2508 {yylhsminor.yy38 = yymsp[-1].minor.yy38; pik_after_adding_attributes(p,yylhsminor.yy38);}
2509 #line 2534 "pikchr.c"
2510 yymsp[-1].minor.yy38 = yylhsminor.yy38;
2511 break;
2512 case 21: /* basetype ::= CLASSNAME */
2513 #line 583 "pikchr.y"
2514 {yylhsminor.yy38 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2515 #line 2540 "pikchr.c"
2516 yymsp[0].minor.yy38 = yylhsminor.yy38;
2517 break;
2518 case 22: /* basetype ::= STRING textposition */
2519 #line 585 "pikchr.y"
2520 {yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy44; yylhsminor.yy38 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2521 #line 2546 "pikchr.c"
2522 yymsp[-1].minor.yy38 = yylhsminor.yy38;
2523 break;
2524 case 23: /* basetype ::= LB savelist statement_list RB */
2525 #line 587 "pikchr.y"
2526 { 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; }
2527 #line 2552 "pikchr.c"
2528 break;
2529 case 24: /* savelist ::= */
2530 #line 592 "pikchr.y"
2531 {yymsp[1].minor.yy119 = p->list; p->list = 0;}
2532 #line 2557 "pikchr.c"
2533 break;
2534 case 25: /* relexpr ::= expr */
2535 #line 599 "pikchr.y"
2536 {yylhsminor.yy200.rAbs = yymsp[0].minor.yy265; yylhsminor.yy200.rRel = 0;}
2537 #line 2562 "pikchr.c"
2538 yymsp[0].minor.yy200 = yylhsminor.yy200;
2539 break;
2540 case 26: /* relexpr ::= expr PERCENT */
2541 #line 600 "pikchr.y"
2542 {yylhsminor.yy200.rAbs = 0; yylhsminor.yy200.rRel = yymsp[-1].minor.yy265/100;}
2543 #line 2568 "pikchr.c"
2544 yymsp[-1].minor.yy200 = yylhsminor.yy200;
2545 break;
2546 case 27: /* optrelexpr ::= */
2547 #line 602 "pikchr.y"
2548 {yymsp[1].minor.yy200.rAbs = 0; yymsp[1].minor.yy200.rRel = 1.0;}
2549 #line 2574 "pikchr.c"
2550 break;
2551 case 28: /* attribute_list ::= relexpr alist */
2552 #line 604 "pikchr.y"
2553 {pik_add_direction(p,0,&yymsp[-1].minor.yy200);}
2554 #line 2579 "pikchr.c"
2555 break;
2556 case 29: /* attribute ::= numproperty relexpr */
2557 #line 608 "pikchr.y"
2558 { pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy200); }
2559 #line 2584 "pikchr.c"
2560 break;
2561 case 30: /* attribute ::= dashproperty expr */
2562 #line 609 "pikchr.y"
2563 { pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy265); }
2564 #line 2589 "pikchr.c"
2565 break;
2566 case 31: /* attribute ::= dashproperty */
2567 #line 610 "pikchr.y"
2568 { pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2569 #line 2594 "pikchr.c"
2570 break;
2571 case 32: /* attribute ::= colorproperty rvalue */
2572 #line 611 "pikchr.y"
2573 { pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy265); }
2574 #line 2599 "pikchr.c"
2575 break;
2576 case 33: /* attribute ::= go direction optrelexpr */
2577 #line 612 "pikchr.y"
2578 { pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy200);}
2579 #line 2604 "pikchr.c"
2580 break;
2581 case 34: /* attribute ::= go direction even position */
2582 #line 613 "pikchr.y"
2583 {pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy43);}
2584 #line 2609 "pikchr.c"
2585 break;
2586 case 35: /* attribute ::= CLOSE */
2587 #line 614 "pikchr.y"
2588 { pik_close_path(p,&yymsp[0].minor.yy0); }
2589 #line 2614 "pikchr.c"
2590 break;
2591 case 36: /* attribute ::= CHOP */
2592 #line 615 "pikchr.y"
2593 { p->cur->bChop = 1; }
2594 #line 2619 "pikchr.c"
2595 break;
2596 case 37: /* attribute ::= FROM position */
2597 #line 616 "pikchr.y"
2598 { pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy43); }
2599 #line 2624 "pikchr.c"
2600 break;
2601 case 38: /* attribute ::= TO position */
2602 #line 617 "pikchr.y"
2603 { pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy43); }
2604 #line 2629 "pikchr.c"
2605 break;
2606 case 39: /* attribute ::= THEN */
2607 #line 618 "pikchr.y"
2608 { pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2609 #line 2634 "pikchr.c"
2610 break;
2611 case 40: /* attribute ::= THEN optrelexpr HEADING expr */
2612 case 42: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==42);
2613 #line 620 "pikchr.y"
2614 {pik_move_hdg(p,&yymsp[-2].minor.yy200,&yymsp[-1].minor.yy0,yymsp[0].minor.yy265,0,&yymsp[-3].minor.yy0);}
2615 #line 2640 "pikchr.c"
2616 break;
2617 case 41: /* attribute ::= THEN optrelexpr EDGEPT */
2618 case 43: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==43);
2619 #line 621 "pikchr.y"
2620 {pik_move_hdg(p,&yymsp[-1].minor.yy200,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2621 #line 2646 "pikchr.c"
2622 break;
2623 case 44: /* attribute ::= AT position */
2624 #line 626 "pikchr.y"
2625 { pik_set_at(p,0,&yymsp[0].minor.yy43,&yymsp[-1].minor.yy0); }
2626 #line 2651 "pikchr.c"
2627 break;
2628 case 45: /* attribute ::= SAME */
2629 #line 628 "pikchr.y"
2630 {pik_same(p,0,&yymsp[0].minor.yy0);}
2631 #line 2656 "pikchr.c"
2632 break;
2633 case 46: /* attribute ::= SAME AS object */
2634 #line 629 "pikchr.y"
2635 {pik_same(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2636 #line 2661 "pikchr.c"
2637 break;
2638 case 47: /* attribute ::= STRING textposition */
2639 #line 630 "pikchr.y"
2640 {pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy44);}
2641 #line 2666 "pikchr.c"
2642 break;
2643 case 48: /* attribute ::= FIT */
2644 #line 631 "pikchr.y"
2645 {pik_size_to_fit(p,&yymsp[0].minor.yy0,3); }
2646 #line 2671 "pikchr.c"
2647 break;
2648 case 49: /* attribute ::= BEHIND object */
2649 #line 632 "pikchr.y"
2650 {pik_behind(p,yymsp[0].minor.yy38);}
2651 #line 2676 "pikchr.c"
2652 break;
2653 case 50: /* withclause ::= DOT_E edge AT position */
2654 case 51: /* withclause ::= edge AT position */ yytestcase(yyruleno==51);
2655 #line 640 "pikchr.y"
2656 { pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy43,&yymsp[-1].minor.yy0); }
2657 #line 2682 "pikchr.c"
2658 break;
2659 case 52: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2660 #line 644 "pikchr.y"
2661 {yylhsminor.yy0 = yymsp[0].minor.yy0;}
2662 #line 2687 "pikchr.c"
2663 yymsp[0].minor.yy0 = yylhsminor.yy0;
2664 break;
2665 case 53: /* boolproperty ::= CW */
2666 #line 655 "pikchr.y"
2667 {p->cur->cw = 1;}
2668 #line 2693 "pikchr.c"
2669 break;
2670 case 54: /* boolproperty ::= CCW */
2671 #line 656 "pikchr.y"
2672 {p->cur->cw = 0;}
2673 #line 2698 "pikchr.c"
2674 break;
2675 case 55: /* boolproperty ::= LARROW */
2676 #line 657 "pikchr.y"
2677 {p->cur->larrow=1; p->cur->rarrow=0; }
2678 #line 2703 "pikchr.c"
2679 break;
2680 case 56: /* boolproperty ::= RARROW */
2681 #line 658 "pikchr.y"
2682 {p->cur->larrow=0; p->cur->rarrow=1; }
2683 #line 2708 "pikchr.c"
2684 break;
2685 case 57: /* boolproperty ::= LRARROW */
2686 #line 659 "pikchr.y"
2687 {p->cur->larrow=1; p->cur->rarrow=1; }
2688 #line 2713 "pikchr.c"
2689 break;
2690 case 58: /* boolproperty ::= INVIS */
2691 #line 660 "pikchr.y"
2692 {p->cur->sw = 0.0;}
2693 #line 2718 "pikchr.c"
2694 break;
2695 case 59: /* boolproperty ::= THICK */
2696 #line 661 "pikchr.y"
2697 {p->cur->sw *= 1.5;}
2698 #line 2723 "pikchr.c"
2699 break;
2700 case 60: /* boolproperty ::= THIN */
2701 #line 662 "pikchr.y"
2702 {p->cur->sw *= 0.67;}
2703 #line 2728 "pikchr.c"
2704 break;
2705 case 61: /* boolproperty ::= SOLID */
2706 #line 663 "pikchr.y"
2707 {p->cur->sw = pik_value(p,"thickness",9,0);
2708 p->cur->dotted = p->cur->dashed = 0.0;}
2709 #line 2734 "pikchr.c"
2710 break;
2711 case 62: /* textposition ::= */
2712 #line 666 "pikchr.y"
2713 {yymsp[1].minor.yy44 = 0;}
2714 #line 2739 "pikchr.c"
2715 break;
2716 case 63: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2717 #line 669 "pikchr.y"
2718 {yylhsminor.yy44 = (short int)pik_text_position(yymsp[-1].minor.yy44,&yymsp[0].minor.yy0);}
2719 #line 2744 "pikchr.c"
2720 yymsp[-1].minor.yy44 = yylhsminor.yy44;
2721 break;
2722 case 64: /* position ::= expr COMMA expr */
2723 #line 672 "pikchr.y"
2724 {yylhsminor.yy43.x=yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[0].minor.yy265;}
2725 #line 2750 "pikchr.c"
2726 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2727 break;
2728 case 65: /* position ::= place PLUS expr COMMA expr */
2729 #line 674 "pikchr.y"
2730 {yylhsminor.yy43.x=yymsp[-4].minor.yy43.x+yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[-4].minor.yy43.y+yymsp[0].minor.yy265;}
2731 #line 2756 "pikchr.c"
2732 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2733 break;
2734 case 66: /* position ::= place MINUS expr COMMA expr */
2735 #line 675 "pikchr.y"
2736 {yylhsminor.yy43.x=yymsp[-4].minor.yy43.x-yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[-4].minor.yy43.y-yymsp[0].minor.yy265;}
2737 #line 2762 "pikchr.c"
2738 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2739 break;
2740 case 67: /* position ::= place PLUS LP expr COMMA expr RP */
2741 #line 677 "pikchr.y"
2742 {yylhsminor.yy43.x=yymsp[-6].minor.yy43.x+yymsp[-3].minor.yy265; yylhsminor.yy43.y=yymsp[-6].minor.yy43.y+yymsp[-1].minor.yy265;}
2743 #line 2768 "pikchr.c"
2744 yymsp[-6].minor.yy43 = yylhsminor.yy43;
2745 break;
2746 case 68: /* position ::= place MINUS LP expr COMMA expr RP */
2747 #line 679 "pikchr.y"
2748 {yylhsminor.yy43.x=yymsp[-6].minor.yy43.x-yymsp[-3].minor.yy265; yylhsminor.yy43.y=yymsp[-6].minor.yy43.y-yymsp[-1].minor.yy265;}
2749 #line 2774 "pikchr.c"
2750 yymsp[-6].minor.yy43 = yylhsminor.yy43;
2751 break;
2752 case 69: /* position ::= LP position COMMA position RP */
2753 #line 680 "pikchr.y"
2754 {yymsp[-4].minor.yy43.x=yymsp[-3].minor.yy43.x; yymsp[-4].minor.yy43.y=yymsp[-1].minor.yy43.y;}
2755 #line 2780 "pikchr.c"
2756 break;
2757 case 70: /* position ::= LP position RP */
2758 #line 681 "pikchr.y"
2759 {yymsp[-2].minor.yy43=yymsp[-1].minor.yy43;}
2760 #line 2785 "pikchr.c"
2761 break;
2762 case 71: /* position ::= expr between position AND position */
2763 #line 683 "pikchr.y"
2764 {yylhsminor.yy43 = pik_position_between(yymsp[-4].minor.yy265,yymsp[-2].minor.yy43,yymsp[0].minor.yy43);}
2765 #line 2790 "pikchr.c"
2766 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2767 break;
2768 case 72: /* position ::= expr LT position COMMA position GT */
2769 #line 685 "pikchr.y"
2770 {yylhsminor.yy43 = pik_position_between(yymsp[-5].minor.yy265,yymsp[-3].minor.yy43,yymsp[-1].minor.yy43);}
2771 #line 2796 "pikchr.c"
2772 yymsp[-5].minor.yy43 = yylhsminor.yy43;
2773 break;
2774 case 73: /* position ::= expr ABOVE position */
2775 #line 686 "pikchr.y"
2776 {yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.y += yymsp[-2].minor.yy265;}
2777 #line 2802 "pikchr.c"
2778 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2779 break;
2780 case 74: /* position ::= expr BELOW position */
2781 #line 687 "pikchr.y"
2782 {yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.y -= yymsp[-2].minor.yy265;}
2783 #line 2808 "pikchr.c"
2784 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2785 break;
2786 case 75: /* position ::= expr LEFT OF position */
2787 #line 688 "pikchr.y"
2788 {yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.x -= yymsp[-3].minor.yy265;}
2789 #line 2814 "pikchr.c"
2790 yymsp[-3].minor.yy43 = yylhsminor.yy43;
2791 break;
2792 case 76: /* position ::= expr RIGHT OF position */
2793 #line 689 "pikchr.y"
2794 {yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.x += yymsp[-3].minor.yy265;}
2795 #line 2820 "pikchr.c"
2796 yymsp[-3].minor.yy43 = yylhsminor.yy43;
2797 break;
2798 case 77: /* position ::= expr ON HEADING EDGEPT OF position */
2799 #line 691 "pikchr.y"
2800 {yylhsminor.yy43 = pik_position_at_hdg(yymsp[-5].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2801 #line 2826 "pikchr.c"
2802 yymsp[-5].minor.yy43 = yylhsminor.yy43;
2803 break;
2804 case 78: /* position ::= expr HEADING EDGEPT OF position */
2805 #line 693 "pikchr.y"
2806 {yylhsminor.yy43 = pik_position_at_hdg(yymsp[-4].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2807 #line 2832 "pikchr.c"
2808 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2809 break;
2810 case 79: /* position ::= expr EDGEPT OF position */
2811 #line 695 "pikchr.y"
2812 {yylhsminor.yy43 = pik_position_at_hdg(yymsp[-3].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2813 #line 2838 "pikchr.c"
2814 yymsp[-3].minor.yy43 = yylhsminor.yy43;
2815 break;
2816 case 80: /* position ::= expr ON HEADING expr FROM position */
2817 #line 697 "pikchr.y"
2818 {yylhsminor.yy43 = pik_position_at_angle(yymsp[-5].minor.yy265,yymsp[-2].minor.yy265,yymsp[0].minor.yy43);}
2819 #line 2844 "pikchr.c"
2820 yymsp[-5].minor.yy43 = yylhsminor.yy43;
2821 break;
2822 case 81: /* position ::= expr HEADING expr FROM position */
2823 #line 699 "pikchr.y"
2824 {yylhsminor.yy43 = pik_position_at_angle(yymsp[-4].minor.yy265,yymsp[-2].minor.yy265,yymsp[0].minor.yy43);}
2825 #line 2850 "pikchr.c"
2826 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2827 break;
2828 case 82: /* place ::= edge OF object */
2829 #line 711 "pikchr.y"
2830 {yylhsminor.yy43 = pik_place_of_elem(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2831 #line 2856 "pikchr.c"
2832 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2833 break;
2834 case 83: /* place2 ::= object */
2835 #line 712 "pikchr.y"
2836 {yylhsminor.yy43 = pik_place_of_elem(p,yymsp[0].minor.yy38,0);}
2837 #line 2862 "pikchr.c"
2838 yymsp[0].minor.yy43 = yylhsminor.yy43;
2839 break;
2840 case 84: /* place2 ::= object DOT_E edge */
2841 #line 713 "pikchr.y"
2842 {yylhsminor.yy43 = pik_place_of_elem(p,yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
2843 #line 2868 "pikchr.c"
2844 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2845 break;
2846 case 85: /* place2 ::= NTH VERTEX OF object */
2847 #line 714 "pikchr.y"
2848 {yylhsminor.yy43 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy38);}
2849 #line 2874 "pikchr.c"
2850 yymsp[-3].minor.yy43 = yylhsminor.yy43;
2851 break;
2852 case 86: /* object ::= nth */
2853 #line 726 "pikchr.y"
2854 {yylhsminor.yy38 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2855 #line 2880 "pikchr.c"
2856 yymsp[0].minor.yy38 = yylhsminor.yy38;
2857 break;
2858 case 87: /* object ::= nth OF|IN object */
2859 #line 727 "pikchr.y"
2860 {yylhsminor.yy38 = pik_find_nth(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2861 #line 2886 "pikchr.c"
2862 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2863 break;
2864 case 88: /* objectname ::= PLACENAME */
2865 #line 729 "pikchr.y"
2866 {yylhsminor.yy38 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2867 #line 2892 "pikchr.c"
2868 yymsp[0].minor.yy38 = yylhsminor.yy38;
2869 break;
2870 case 89: /* objectname ::= objectname DOT_U PLACENAME */
2871 #line 731 "pikchr.y"
2872 {yylhsminor.yy38 = pik_find_byname(p,yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
2873 #line 2898 "pikchr.c"
2874 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2875 break;
2876 case 90: /* nth ::= NTH CLASSNAME */
2877 #line 733 "pikchr.y"
2878 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2879 #line 2904 "pikchr.c"
2880 yymsp[-1].minor.yy0 = yylhsminor.yy0;
2881 break;
2882 case 91: /* nth ::= NTH LAST CLASSNAME */
2883 #line 734 "pikchr.y"
2884 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2885 #line 2910 "pikchr.c"
2886 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2887 break;
2888 case 92: /* nth ::= LAST CLASSNAME */
2889 #line 735 "pikchr.y"
2890 {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2891 #line 2916 "pikchr.c"
2892 break;
2893 case 93: /* nth ::= LAST */
2894 #line 736 "pikchr.y"
2895 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2896 #line 2921 "pikchr.c"
2897 yymsp[0].minor.yy0 = yylhsminor.yy0;
2898 break;
2899 case 94: /* nth ::= NTH LB RB */
2900 #line 737 "pikchr.y"
2901 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2902 #line 2927 "pikchr.c"
2903 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2904 break;
2905 case 95: /* nth ::= NTH LAST LB RB */
2906 #line 738 "pikchr.y"
2907 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2908 #line 2933 "pikchr.c"
2909 yymsp[-3].minor.yy0 = yylhsminor.yy0;
2910 break;
2911 case 96: /* nth ::= LAST LB RB */
2912 #line 739 "pikchr.y"
2913 {yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2914 #line 2939 "pikchr.c"
2915 break;
2916 case 97: /* expr ::= expr PLUS expr */
2917 #line 741 "pikchr.y"
2918 {yylhsminor.yy265=yymsp[-2].minor.yy265+yymsp[0].minor.yy265;}
2919 #line 2944 "pikchr.c"
2920 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2921 break;
2922 case 98: /* expr ::= expr MINUS expr */
2923 #line 742 "pikchr.y"
2924 {yylhsminor.yy265=yymsp[-2].minor.yy265-yymsp[0].minor.yy265;}
2925 #line 2950 "pikchr.c"
2926 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2927 break;
2928 case 99: /* expr ::= expr STAR expr */
2929 #line 743 "pikchr.y"
2930 {yylhsminor.yy265=yymsp[-2].minor.yy265*yymsp[0].minor.yy265;}
2931 #line 2956 "pikchr.c"
2932 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2933 break;
2934 case 100: /* expr ::= expr SLASH expr */
2935 #line 744 "pikchr.y"
2936 {
2937 if( yymsp[0].minor.yy265==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy265 = 0.0; }
2938 else{ yylhsminor.yy265 = yymsp[-2].minor.yy265/yymsp[0].minor.yy265; }
2939 }
2940 #line 2965 "pikchr.c"
2941 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2942 break;
2943 case 101: /* expr ::= MINUS expr */
2944 #line 748 "pikchr.y"
2945 {yymsp[-1].minor.yy265=-yymsp[0].minor.yy265;}
2946 #line 2971 "pikchr.c"
2947 break;
2948 case 102: /* expr ::= PLUS expr */
2949 #line 749 "pikchr.y"
2950 {yymsp[-1].minor.yy265=yymsp[0].minor.yy265;}
2951 #line 2976 "pikchr.c"
2952 break;
2953 case 103: /* expr ::= LP expr RP */
2954 #line 750 "pikchr.y"
2955 {yymsp[-2].minor.yy265=yymsp[-1].minor.yy265;}
2956 #line 2981 "pikchr.c"
2957 break;
2958 case 104: /* expr ::= LP FILL|COLOR|THICKNESS RP */
2959 #line 751 "pikchr.y"
2960 {yymsp[-2].minor.yy265=pik_get_var(p,&yymsp[-1].minor.yy0);}
2961 #line 2986 "pikchr.c"
2962 break;
2963 case 105: /* expr ::= NUMBER */
2964 #line 752 "pikchr.y"
2965 {yylhsminor.yy265=pik_atof(&yymsp[0].minor.yy0);}
2966 #line 2991 "pikchr.c"
2967 yymsp[0].minor.yy265 = yylhsminor.yy265;
2968 break;
2969 case 106: /* expr ::= ID */
2970 #line 753 "pikchr.y"
2971 {yylhsminor.yy265=pik_get_var(p,&yymsp[0].minor.yy0);}
2972 #line 2997 "pikchr.c"
2973 yymsp[0].minor.yy265 = yylhsminor.yy265;
2974 break;
2975 case 107: /* expr ::= FUNC1 LP expr RP */
2976 #line 754 "pikchr.y"
2977 {yylhsminor.yy265 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy265,0.0);}
2978 #line 3003 "pikchr.c"
2979 yymsp[-3].minor.yy265 = yylhsminor.yy265;
2980 break;
2981 case 108: /* expr ::= FUNC2 LP expr COMMA expr RP */
2982 #line 755 "pikchr.y"
2983 {yylhsminor.yy265 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy265,yymsp[-1].minor.yy265);}
2984 #line 3009 "pikchr.c"
2985 yymsp[-5].minor.yy265 = yylhsminor.yy265;
2986 break;
2987 case 109: /* expr ::= DIST LP position COMMA position RP */
2988 #line 756 "pikchr.y"
2989 {yymsp[-5].minor.yy265 = pik_dist(&yymsp[-3].minor.yy43,&yymsp[-1].minor.yy43);}
2990 #line 3015 "pikchr.c"
2991 break;
2992 case 110: /* expr ::= place2 DOT_XY X */
2993 #line 757 "pikchr.y"
2994 {yylhsminor.yy265 = yymsp[-2].minor.yy43.x;}
2995 #line 3020 "pikchr.c"
2996 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2997 break;
2998 case 111: /* expr ::= place2 DOT_XY Y */
2999 #line 758 "pikchr.y"
3000 {yylhsminor.yy265 = yymsp[-2].minor.yy43.y;}
3001 #line 3026 "pikchr.c"
3002 yymsp[-2].minor.yy265 = yylhsminor.yy265;
3003 break;
3004 case 112: /* expr ::= object DOT_L numproperty */
3005 case 113: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==113);
3006 case 114: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==114);
3007 #line 759 "pikchr.y"
3008 {yylhsminor.yy265=pik_property_of(yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
3009 #line 3034 "pikchr.c"
3010 yymsp[-2].minor.yy265 = yylhsminor.yy265;
3011 break;
3012 default:
3013 /* (115) lvalue ::= ID */ yytestcase(yyruleno==115);
3014 /* (116) lvalue ::= FILL */ yytestcase(yyruleno==116);
@@ -3106,19 +3107,19 @@
3107 ){
3108 pik_parserARG_FETCH
3109 pik_parserCTX_FETCH
3110 #define TOKEN yyminor
3111 /************ Begin %syntax_error code ****************************************/
3112 #line 520 "pikchr.y"
3113
3114 if( TOKEN.z && TOKEN.z[0] ){
3115 pik_error(p, &TOKEN, "syntax error");
3116 }else{
3117 pik_error(p, 0, "syntax error");
3118 }
3119 UNUSED_PARAMETER(yymajor);
3120 #line 3145 "pikchr.c"
3121 /************ End %syntax_error code ******************************************/
3122 pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
3123 pik_parserCTX_STORE
3124 }
3125
@@ -3347,11 +3348,11 @@
3348 #else
3349 (void)iToken;
3350 return 0;
3351 #endif
3352 }
3353 #line 764 "pikchr.y"
3354
3355
3356
3357 /* Chart of the 148 official CSS color names with their
3358 ** corresponding RGB values thru Color Module Level 4:
@@ -4507,11 +4508,11 @@
4508 **
4509 ** * Except for the above, only "<" and ">" are escaped.
4510 */
4511 static void pik_append_text(Pik *p, const char *zText, int n, int mFlags){
4512 int i;
4513 char c = 0;
4514 int bQSpace = mFlags & 1;
4515 int bQAmp = mFlags & 2;
4516 if( n<0 ) n = (int)strlen(zText);
4517 while( n>0 ){
4518 for(i=0; i<n; i++){
@@ -4651,10 +4652,12 @@
4652 char buf[200];
4653 int x = (int)v;
4654 int r, g, b;
4655 if( x==0 && p->fgcolor>0 && !bg ){
4656 x = p->fgcolor;
4657 }else if( bg && x>=0xffffff && p->bgcolor>0 ){
4658 x = p->bgcolor;
4659 }else if( p->mFlags & PIKCHR_DARK_MODE ){
4660 x = pik_color_to_dark_mode(x,bg);
4661 }
4662 r = (x>>16) & 0xff;
4663 g = (x>>8) & 0xff;
@@ -4928,24 +4931,24 @@
4931 y0 = y+ch;
4932 x1 = nx-cw/2;
4933 y1 = y-ch;
4934 }
4935 if( (t->eCode & TP_ALIGN)!=0 && pObj->nPath>=2 ){
4936 int nn = pObj->nPath;
4937 PNum dx = pObj->aPath[nn-1].x - pObj->aPath[0].x;
4938 PNum dy = pObj->aPath[nn-1].y - pObj->aPath[0].y;
4939 if( dx!=0 || dy!=0 ){
4940 PNum dist = hypot(dx,dy);
4941 PNum tt;
4942 dx /= dist;
4943 dy /= dist;
4944 tt = dx*x0 - dy*y0;
4945 y0 = dy*x0 - dx*y0;
4946 x0 = tt;
4947 tt = dx*x1 - dy*y1;
4948 y1 = dy*x1 - dx*y1;
4949 x1 = tt;
4950 }
4951 }
4952 pik_bbox_add_xy(pBox, x+x0, orig_y+y0);
4953 pik_bbox_add_xy(pBox, x+x1, orig_y+y1);
4954 continue;
@@ -4975,13 +4978,13 @@
4978 if( xtraFontScale<=0.99 || xtraFontScale>=1.01 ){
4979 pik_append_num(p, " font-size=\"", xtraFontScale*100.0);
4980 pik_append(p, "%\"", 2);
4981 }
4982 if( (t->eCode & TP_ALIGN)!=0 && pObj->nPath>=2 ){
4983 int nn = pObj->nPath;
4984 PNum dx = pObj->aPath[nn-1].x - pObj->aPath[0].x;
4985 PNum dy = pObj->aPath[nn-1].y - pObj->aPath[0].y;
4986 if( dx!=0 || dy!=0 ){
4987 PNum ang = atan2(dy,dx)*-180/M_PI;
4988 pik_append_num(p, " transform=\"rotate(", ang);
4989 pik_append_xy(p, " ", x, orig_y);
4990 pik_append(p,")\"",2);
@@ -5456,11 +5459,11 @@
5459
5460 /* Change the layout direction.
5461 */
5462 static void pik_set_direction(Pik *p, int eDir){
5463 assert( ValidDir(eDir) );
5464 p->eDir = (unsigned char)eDir;
5465
5466 /* It seems to make sense to reach back into the last object and
5467 ** change its exit point (its ".end") to correspond to the new
5468 ** direction. Things just seem to work better this way. However,
5469 ** legacy PIC does *not* do this.
@@ -5912,11 +5915,11 @@
5915 pik_error(p, pTxt, "too many text terms");
5916 return;
5917 }
5918 pT = &pObj->aTxt[pObj->nTxt++];
5919 *pT = *pTxt;
5920 pT->eCode = (short)iPos;
5921 }
5922
5923 /* Merge "text-position" flags
5924 */
5925 static int pik_text_position(int iPrev, PToken *pFlag){
@@ -6293,11 +6296,11 @@
6296 if( i>1000 ){
6297 pik_error(p, pNth, "value too big - max '1000th'");
6298 i = 1;
6299 }
6300 if( i==0 && pik_token_eq(pNth,"first")==0 ) i = 1;
6301 return (short int)i;
6302 }
6303
6304 /* Search for the NTH object.
6305 **
6306 ** If pBasis is not NULL then it should be a [] object. Use the
@@ -6501,11 +6504,11 @@
6504 }
6505
6506 /* Return the coordinates for the n-th vertex of a line.
6507 */
6508 static PPoint pik_nth_vertex(Pik *p, PToken *pNth, PToken *pErr, PObj *pObj){
6509 static const PPoint zero = {0, 0};
6510 int n;
6511 if( p->nErr || pObj==0 ) return p->aTPath[0];
6512 if( !pObj->type->isLine ){
6513 pik_error(p, pErr, "object is not a line");
6514 return zero;
@@ -6668,11 +6671,12 @@
6671 case DIR_DOWN: p->aTPath[1].y -= pObj->h; break;
6672 case DIR_LEFT: p->aTPath[1].x -= pObj->w; break;
6673 case DIR_UP: p->aTPath[1].y += pObj->h; break;
6674 }
6675 if( pObj->type->xInit==arcInit ){
6676 pObj->outDir = (pObj->inDir + (pObj->cw ? 1 : 3))%4;
6677 p->eDir = (unsigned char)pObj->outDir;
6678 switch( pObj->outDir ){
6679 default: p->aTPath[1].x += pObj->w; break;
6680 case DIR_DOWN: p->aTPath[1].y -= pObj->h; break;
6681 case DIR_LEFT: p->aTPath[1].x -= pObj->w; break;
6682 case DIR_UP: p->aTPath[1].y += pObj->h; break;
@@ -6759,11 +6763,11 @@
6763 case DIR_DOWN: pObj->ptExit.y -= h2; break;
6764 }
6765 pik_bbox_add_xy(&pObj->bbox, pObj->ptAt.x - w2, pObj->ptAt.y - h2);
6766 pik_bbox_add_xy(&pObj->bbox, pObj->ptAt.x + w2, pObj->ptAt.y + h2);
6767 }
6768 p->eDir = (unsigned char)pObj->outDir;
6769 }
6770
6771 /* Show basic information about each object as a comment in the
6772 ** generated HTML. Used for testing and debugging. Activated
6773 ** by the (undocumented) "debug = 1;"
@@ -6921,17 +6925,26 @@
6925 thickness = pik_value(p,"thickness",9,0);
6926 if( thickness<=0.01 ) thickness = 0.01;
6927 margin = pik_value(p,"margin",6,0);
6928 margin += thickness;
6929 wArrow = p->wArrow*thickness;
6930 miss = 0;
6931 p->fgcolor = (int)pik_value(p,"fgcolor",7,&miss);
6932 if( miss ){
6933 PToken t;
6934 t.z = "fgcolor";
6935 t.n = 7;
6936 p->fgcolor = (int)pik_lookup_color(0, &t);
6937 }
6938 miss = 0;
6939 p->bgcolor = (int)pik_value(p,"bgcolor",7,&miss);
6940 if( miss ){
6941 PToken t;
6942 t.z = "bgcolor";
6943 t.n = 7;
6944 p->bgcolor = (int)pik_lookup_color(0, &t);
6945 }
6946
6947 /* Compute a bounding box over all objects so that we can know
6948 ** how big to declare the SVG canvas */
6949 pik_bbox_init(&p->bbox);
6950 pik_bbox_add_elist(p, pList, wArrow);
@@ -6953,13 +6966,15 @@
6966 w = p->bbox.ne.x - p->bbox.sw.x;
6967 h = p->bbox.ne.y - p->bbox.sw.y;
6968 p->wSVG = (int)(p->rScale*w);
6969 p->hSVG = (int)(p->rScale*h);
6970 pikScale = pik_value(p,"scale",5,0);
6971 if( pikScale>=0.001 && pikScale<=1000.0
6972 && (pikScale<0.99 || pikScale>1.01)
6973 ){
6974 p->wSVG = (int)(p->wSVG*pikScale);
6975 p->hSVG = (int)(p->hSVG*pikScale);
6976 pik_append_num(p, " width=\"", p->wSVG);
6977 pik_append_num(p, "\" height=\"", p->hSVG);
6978 pik_append(p, "\"", 1);
6979 }
6980 pik_append_dis(p, " viewBox=\"0 0 ",w,"");
@@ -7333,10 +7348,11 @@
7348 return i;
7349 }
7350 }else{
7351 isInt = 0;
7352 nDigit = 0;
7353 i = 0;
7354 }
7355 if( c=='.' ){
7356 isInt = 0;
7357 for(i++; (c = z[i])>='0' && c<='9'; i++){ nDigit++; }
7358 }
@@ -7672,11 +7688,11 @@
7688 #if defined(PIKCHR_SHELL)
7689 /* Print a usage comment for the shell and exit. */
7690 static void usage(const char *argv0){
7691 fprintf(stderr, "usage: %s [OPTIONS] FILE ...\n", argv0);
7692 fprintf(stderr,
7693 "Convert Pikchr input files into SVG. Filename \"-\" means stdin.\n"
7694 "Options:\n"
7695 " --dont-stop Process all files even if earlier files have errors\n"
7696 " --svg-only Omit raw SVG without the HTML wrapper\n"
7697 );
7698 exit(1);
@@ -7700,10 +7716,51 @@
7716 }else if( c==0 ){
7717 break;
7718 }
7719 }
7720 }
7721
7722 /* Read the content of file zFilename into memory obtained from malloc()
7723 ** Return the memory. If something goes wrong (ex: the file does not exist
7724 ** or cannot be opened) put an error message on stderr and return NULL.
7725 **
7726 ** If the filename is "-" read stdin.
7727 */
7728 static char *readFile(const char *zFilename){
7729 FILE *in;
7730 size_t n;
7731 size_t nUsed = 0;
7732 size_t nAlloc = 0;
7733 char *z = 0, *zNew;
7734 in = strcmp(zFilename,"-")==0 ? stdin : fopen(zFilename, "rb");
7735 if( in==0 ){
7736 fprintf(stderr, "cannot open \"%s\" for reading\n", zFilename);
7737 return 0;
7738 }
7739 while(1){
7740 if( nUsed+2>=nAlloc ){
7741 nAlloc = nAlloc*2 + 4000;
7742 zNew = realloc(z, nAlloc);
7743 }
7744 if( zNew==0 ){
7745 free(z);
7746 fprintf(stderr, "out of memory trying to allocate %lld bytes\n",
7747 (long long int)nAlloc);
7748 exit(1);
7749 }
7750 z = zNew;
7751 n = fread(z+nUsed, 1, nAlloc-nUsed-1, in);
7752 if( n<=0 ){
7753 break;
7754 }
7755 nUsed += n;
7756 }
7757 if( in!=stderr ) fclose(in);
7758 z[nUsed] = 0;
7759 return z;
7760 }
7761
7762
7763 /* Testing interface
7764 **
7765 ** Generate HTML on standard output that displays both the original
7766 ** input text and the rendered SVG for all files named on the command
@@ -7739,17 +7796,15 @@
7796 "</head>\n"
7797 "<body>\n"
7798 ;
7799 if( argc<2 ) usage(argv[0]);
7800 for(i=1; i<argc; i++){
 
 
7801 char *zIn;
7802 char *zOut;
7803 int w, h;
7804
7805 if( argv[i][0]=='-' && argv[i][1]!=0 ){
7806 char *z = argv[i];
7807 z++;
7808 if( z[0]=='-' ) z++;
7809 if( strcmp(z,"dont-stop")==0 ){
7810 bDontStop = 1;
@@ -7770,27 +7825,12 @@
7825 fprintf(stderr,"unknown option: \"%s\"\n", argv[i]);
7826 usage(argv[0]);
7827 }
7828 continue;
7829 }
7830 zIn = readFile(argv[i]);
7831 if( zIn==0 ) continue;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7832 zOut = pikchr(zIn, "pikchr", mFlags, &w, &h);
7833 if( w<0 ) exitCode = 1;
7834 if( zOut==0 ){
7835 fprintf(stderr, "pikchr() returns NULL. Out of memory?\n");
7836 if( !bDontStop ) exit(1);
@@ -7852,10 +7892,11 @@
7892 int w, h; /* Width and height of the pikchr */
7893 const char *zIn; /* Source text input */
7894 char *zOut; /* SVG output text */
7895 Tcl_Obj *pRes; /* The result TCL object */
7896
7897 (void)clientData;
7898 if( objc!=2 ){
7899 Tcl_WrongNumArgs(interp, 1, objv, "PIKCHR_SOURCE_TEXT");
7900 return TCL_ERROR;
7901 }
7902 zIn = Tcl_GetString(objv[1]);
@@ -7875,13 +7916,14 @@
7916
7917 /* Invoke this routine to register the "pikchr" command with the interpreter
7918 ** given in the argument */
7919 int Pikchr_Init(Tcl_Interp *interp){
7920 Tcl_CreateObjCommand(interp, "pikchr", pik_tcl_command, 0, 0);
7921 Tcl_PkgProvide (interp, PACKAGE_NAME, PACKAGE_VERSION);
7922 return TCL_OK;
7923 }
7924
7925
7926 #endif /* PIKCHR_TCL */
7927
7928
7929 #line 7954 "pikchr.c"
7930
--- src/skins.c
+++ src/skins.c
@@ -85,10 +85,11 @@
8585
*/
8686
static struct SkinDetail {
8787
const char *zName; /* Name of the detail */
8888
const char *zValue; /* Value of the detail */
8989
} aSkinDetail[] = {
90
+ { "pikchr-background", "" },
9091
{ "pikchr-fontscale", "" },
9192
{ "pikchr-foreground", "" },
9293
{ "pikchr-scale", "" },
9394
{ "timeline-arrowheads", "1" },
9495
{ "timeline-circle-nodes", "0" },
9596
--- src/skins.c
+++ src/skins.c
@@ -85,10 +85,11 @@
85 */
86 static struct SkinDetail {
87 const char *zName; /* Name of the detail */
88 const char *zValue; /* Value of the detail */
89 } aSkinDetail[] = {
 
90 { "pikchr-fontscale", "" },
91 { "pikchr-foreground", "" },
92 { "pikchr-scale", "" },
93 { "timeline-arrowheads", "1" },
94 { "timeline-circle-nodes", "0" },
95
--- src/skins.c
+++ src/skins.c
@@ -85,10 +85,11 @@
85 */
86 static struct SkinDetail {
87 const char *zName; /* Name of the detail */
88 const char *zValue; /* Value of the detail */
89 } aSkinDetail[] = {
90 { "pikchr-background", "" },
91 { "pikchr-fontscale", "" },
92 { "pikchr-foreground", "" },
93 { "pikchr-scale", "" },
94 { "timeline-arrowheads", "1" },
95 { "timeline-circle-nodes", "0" },
96

Keyboard Shortcuts

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