Fossil SCM

Automatically invert Pikchr colors in dark mode skins, based on the "white-foreground" setting.

drh 2020-11-09 19:21 trunk
Commit 71c4db598ad4c2459eb876a205f7522e7384bf19c3ed6cb9b9882d9e19ab2449
--- src/markdown_html.c
+++ src/markdown_html.c
@@ -369,10 +369,13 @@
369369
pikFlags |= PIKCHR_PROCESS_DIV_SOURCE_INLINE;
370370
}
371371
while( i<nArg && fossil_isspace(zArg[i]) ){ i++; }
372372
zArg += i;
373373
nArg -= i;
374
+ }
375
+ if( skin_detail_boolean("white-foreground") ){
376
+ pikFlags |= 0x02; /* PIKCHR_DARK_MODE */
374377
}
375378
blob_append(&bSrc, zSrc, nSrc)
376379
/*have to dup input to ensure a NUL-terminated source string */;
377380
pikchr_process(blob_str(&bSrc), pikFlags, 0, ob);
378381
blob_reset(&bSrc);
379382
--- src/markdown_html.c
+++ src/markdown_html.c
@@ -369,10 +369,13 @@
369 pikFlags |= PIKCHR_PROCESS_DIV_SOURCE_INLINE;
370 }
371 while( i<nArg && fossil_isspace(zArg[i]) ){ i++; }
372 zArg += i;
373 nArg -= i;
 
 
 
374 }
375 blob_append(&bSrc, zSrc, nSrc)
376 /*have to dup input to ensure a NUL-terminated source string */;
377 pikchr_process(blob_str(&bSrc), pikFlags, 0, ob);
378 blob_reset(&bSrc);
379
--- src/markdown_html.c
+++ src/markdown_html.c
@@ -369,10 +369,13 @@
369 pikFlags |= PIKCHR_PROCESS_DIV_SOURCE_INLINE;
370 }
371 while( i<nArg && fossil_isspace(zArg[i]) ){ i++; }
372 zArg += i;
373 nArg -= i;
374 }
375 if( skin_detail_boolean("white-foreground") ){
376 pikFlags |= 0x02; /* PIKCHR_DARK_MODE */
377 }
378 blob_append(&bSrc, zSrc, nSrc)
379 /*have to dup input to ensure a NUL-terminated source string */;
380 pikchr_process(blob_str(&bSrc), pikFlags, 0, ob);
381 blob_reset(&bSrc);
382
+286 -243
--- src/pikchr.c
+++ src/pikchr.c
@@ -379,10 +379,14 @@
379379
** argument to pikchr() in order to cause error message text to come out
380380
** as text/plain instead of as text/html
381381
*/
382382
#define PIKCHR_PLAINTEXT_ERRORS 0x0001
383383
384
+/* Include PIKCHR_DARK_MODE among the mFlag bits to invert colors.
385
+*/
386
+#define PIKCHR_DARK_MODE 0x0002
387
+
384388
/*
385389
** The behavior of an object class is defined by an instance of
386390
** this structure. This is the "virtual method" table.
387391
*/
388392
struct PClass {
@@ -468,11 +472,11 @@
468472
static PObj *pik_position_assert(Pik*,PPoint*,PToken*,PPoint*);
469473
static PNum pik_dist(PPoint*,PPoint*);
470474
static void pik_add_macro(Pik*,PToken *pId,PToken *pCode);
471475
472476
473
-#line 499 "pikchr.c"
477
+#line 503 "pikchr.c"
474478
/**************** End of %include directives **********************************/
475479
/* These constants specify the various numeric values for terminal symbols.
476480
***************** Begin token definitions *************************************/
477481
#ifndef T_ID
478482
#define T_ID 1
@@ -1685,22 +1689,22 @@
16851689
** inside the C code.
16861690
*/
16871691
/********* Begin destructor definitions ***************************************/
16881692
case 98: /* statement_list */
16891693
{
1690
-#line 488 "pikchr.y"
1694
+#line 492 "pikchr.y"
16911695
pik_elist_free(p,(yypminor->yy119));
1692
-#line 1717 "pikchr.c"
1696
+#line 1721 "pikchr.c"
16931697
}
16941698
break;
16951699
case 99: /* statement */
16961700
case 100: /* unnamed_statement */
16971701
case 101: /* basetype */
16981702
{
1699
-#line 490 "pikchr.y"
1703
+#line 494 "pikchr.y"
17001704
pik_elem_free(p,(yypminor->yy38));
1701
-#line 1726 "pikchr.c"
1705
+#line 1730 "pikchr.c"
17021706
}
17031707
break;
17041708
/********* End destructor definitions *****************************************/
17051709
default: break; /* If no destructor action specified: do nothing */
17061710
}
@@ -1914,14 +1918,14 @@
19141918
#endif
19151919
while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
19161920
/* Here code is inserted which will execute if the parser
19171921
** stack every overflows */
19181922
/******** Begin %stack_overflow code ******************************************/
1919
-#line 522 "pikchr.y"
1923
+#line 526 "pikchr.y"
19201924
19211925
pik_error(p, 0, "parser stack overflow");
1922
-#line 1947 "pikchr.c"
1926
+#line 1951 "pikchr.c"
19231927
/******** End %stack_overflow code ********************************************/
19241928
pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
19251929
pik_parserCTX_STORE
19261930
}
19271931
@@ -2395,614 +2399,614 @@
23952399
** break;
23962400
*/
23972401
/********** Begin reduce actions **********************************************/
23982402
YYMINORTYPE yylhsminor;
23992403
case 0: /* document ::= statement_list */
2400
-#line 526 "pikchr.y"
2404
+#line 530 "pikchr.y"
24012405
{pik_render(p,yymsp[0].minor.yy119);}
2402
-#line 2427 "pikchr.c"
2406
+#line 2431 "pikchr.c"
24032407
break;
24042408
case 1: /* statement_list ::= statement */
2405
-#line 529 "pikchr.y"
2409
+#line 533 "pikchr.y"
24062410
{ yylhsminor.yy119 = pik_elist_append(p,0,yymsp[0].minor.yy38); }
2407
-#line 2432 "pikchr.c"
2411
+#line 2436 "pikchr.c"
24082412
yymsp[0].minor.yy119 = yylhsminor.yy119;
24092413
break;
24102414
case 2: /* statement_list ::= statement_list EOL statement */
2411
-#line 531 "pikchr.y"
2415
+#line 535 "pikchr.y"
24122416
{ yylhsminor.yy119 = pik_elist_append(p,yymsp[-2].minor.yy119,yymsp[0].minor.yy38); }
2413
-#line 2438 "pikchr.c"
2417
+#line 2442 "pikchr.c"
24142418
yymsp[-2].minor.yy119 = yylhsminor.yy119;
24152419
break;
24162420
case 3: /* statement ::= */
2417
-#line 534 "pikchr.y"
2421
+#line 538 "pikchr.y"
24182422
{ yymsp[1].minor.yy38 = 0; }
2419
-#line 2444 "pikchr.c"
2423
+#line 2448 "pikchr.c"
24202424
break;
24212425
case 4: /* statement ::= direction */
2422
-#line 535 "pikchr.y"
2426
+#line 539 "pikchr.y"
24232427
{ pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy38=0; }
2424
-#line 2449 "pikchr.c"
2428
+#line 2453 "pikchr.c"
24252429
yymsp[0].minor.yy38 = yylhsminor.yy38;
24262430
break;
24272431
case 5: /* statement ::= lvalue ASSIGN rvalue */
2428
-#line 536 "pikchr.y"
2432
+#line 540 "pikchr.y"
24292433
{pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy265,&yymsp[-1].minor.yy0); yylhsminor.yy38=0;}
2430
-#line 2455 "pikchr.c"
2434
+#line 2459 "pikchr.c"
24312435
yymsp[-2].minor.yy38 = yylhsminor.yy38;
24322436
break;
24332437
case 6: /* statement ::= PLACENAME COLON unnamed_statement */
2434
-#line 538 "pikchr.y"
2438
+#line 542 "pikchr.y"
24352439
{ yylhsminor.yy38 = yymsp[0].minor.yy38; pik_elem_setname(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0); }
2436
-#line 2461 "pikchr.c"
2440
+#line 2465 "pikchr.c"
24372441
yymsp[-2].minor.yy38 = yylhsminor.yy38;
24382442
break;
24392443
case 7: /* statement ::= PLACENAME COLON position */
2440
-#line 540 "pikchr.y"
2444
+#line 544 "pikchr.y"
24412445
{ yylhsminor.yy38 = pik_elem_new(p,0,0,0);
24422446
if(yylhsminor.yy38){ yylhsminor.yy38->ptAt = yymsp[0].minor.yy43; pik_elem_setname(p,yylhsminor.yy38,&yymsp[-2].minor.yy0); }}
2443
-#line 2468 "pikchr.c"
2447
+#line 2472 "pikchr.c"
24442448
yymsp[-2].minor.yy38 = yylhsminor.yy38;
24452449
break;
24462450
case 8: /* statement ::= unnamed_statement */
2447
-#line 542 "pikchr.y"
2451
+#line 546 "pikchr.y"
24482452
{yylhsminor.yy38 = yymsp[0].minor.yy38;}
2449
-#line 2474 "pikchr.c"
2453
+#line 2478 "pikchr.c"
24502454
yymsp[0].minor.yy38 = yylhsminor.yy38;
24512455
break;
24522456
case 9: /* statement ::= print prlist */
2453
-#line 543 "pikchr.y"
2457
+#line 547 "pikchr.y"
24542458
{pik_append(p,"<br>\n",5); yymsp[-1].minor.yy38=0;}
2455
-#line 2480 "pikchr.c"
2459
+#line 2484 "pikchr.c"
24562460
break;
24572461
case 10: /* statement ::= ASSERT LP expr EQ expr RP */
2458
-#line 548 "pikchr.y"
2462
+#line 552 "pikchr.y"
24592463
{yymsp[-5].minor.yy38=pik_assert(p,yymsp[-3].minor.yy265,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy265);}
2460
-#line 2485 "pikchr.c"
2464
+#line 2489 "pikchr.c"
24612465
break;
24622466
case 11: /* statement ::= ASSERT LP position EQ position RP */
2463
-#line 550 "pikchr.y"
2467
+#line 554 "pikchr.y"
24642468
{yymsp[-5].minor.yy38=pik_position_assert(p,&yymsp[-3].minor.yy43,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy43);}
2465
-#line 2490 "pikchr.c"
2469
+#line 2494 "pikchr.c"
24662470
break;
24672471
case 12: /* statement ::= DEFINE ID CODEBLOCK */
2468
-#line 551 "pikchr.y"
2472
+#line 555 "pikchr.y"
24692473
{yymsp[-2].minor.yy38=0; pik_add_macro(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
2470
-#line 2495 "pikchr.c"
2474
+#line 2499 "pikchr.c"
24712475
break;
24722476
case 13: /* rvalue ::= PLACENAME */
2473
-#line 562 "pikchr.y"
2477
+#line 566 "pikchr.y"
24742478
{yylhsminor.yy265 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2475
-#line 2500 "pikchr.c"
2479
+#line 2504 "pikchr.c"
24762480
yymsp[0].minor.yy265 = yylhsminor.yy265;
24772481
break;
24782482
case 14: /* pritem ::= FILL */
24792483
case 15: /* pritem ::= COLOR */ yytestcase(yyruleno==15);
24802484
case 16: /* pritem ::= THICKNESS */ yytestcase(yyruleno==16);
2481
-#line 567 "pikchr.y"
2485
+#line 571 "pikchr.y"
24822486
{pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2483
-#line 2508 "pikchr.c"
2487
+#line 2512 "pikchr.c"
24842488
break;
24852489
case 17: /* pritem ::= rvalue */
2486
-#line 570 "pikchr.y"
2490
+#line 574 "pikchr.y"
24872491
{pik_append_num(p,"",yymsp[0].minor.yy265);}
2488
-#line 2513 "pikchr.c"
2492
+#line 2517 "pikchr.c"
24892493
break;
24902494
case 18: /* pritem ::= STRING */
2491
-#line 571 "pikchr.y"
2495
+#line 575 "pikchr.y"
24922496
{pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2493
-#line 2518 "pikchr.c"
2497
+#line 2522 "pikchr.c"
24942498
break;
24952499
case 19: /* prsep ::= COMMA */
2496
-#line 572 "pikchr.y"
2500
+#line 576 "pikchr.y"
24972501
{pik_append(p, " ", 1);}
2498
-#line 2523 "pikchr.c"
2502
+#line 2527 "pikchr.c"
24992503
break;
25002504
case 20: /* unnamed_statement ::= basetype attribute_list */
2501
-#line 575 "pikchr.y"
2505
+#line 579 "pikchr.y"
25022506
{yylhsminor.yy38 = yymsp[-1].minor.yy38; pik_after_adding_attributes(p,yylhsminor.yy38);}
2503
-#line 2528 "pikchr.c"
2507
+#line 2532 "pikchr.c"
25042508
yymsp[-1].minor.yy38 = yylhsminor.yy38;
25052509
break;
25062510
case 21: /* basetype ::= CLASSNAME */
2507
-#line 577 "pikchr.y"
2511
+#line 581 "pikchr.y"
25082512
{yylhsminor.yy38 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2509
-#line 2534 "pikchr.c"
2513
+#line 2538 "pikchr.c"
25102514
yymsp[0].minor.yy38 = yylhsminor.yy38;
25112515
break;
25122516
case 22: /* basetype ::= STRING textposition */
2513
-#line 579 "pikchr.y"
2517
+#line 583 "pikchr.y"
25142518
{yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy196; yylhsminor.yy38 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2515
-#line 2540 "pikchr.c"
2519
+#line 2544 "pikchr.c"
25162520
yymsp[-1].minor.yy38 = yylhsminor.yy38;
25172521
break;
25182522
case 23: /* basetype ::= LB savelist statement_list RB */
2519
-#line 581 "pikchr.y"
2523
+#line 585 "pikchr.y"
25202524
{ 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; }
2521
-#line 2546 "pikchr.c"
2525
+#line 2550 "pikchr.c"
25222526
break;
25232527
case 24: /* savelist ::= */
2524
-#line 586 "pikchr.y"
2528
+#line 590 "pikchr.y"
25252529
{yymsp[1].minor.yy119 = p->list; p->list = 0;}
2526
-#line 2551 "pikchr.c"
2530
+#line 2555 "pikchr.c"
25272531
break;
25282532
case 25: /* relexpr ::= expr */
2529
-#line 593 "pikchr.y"
2533
+#line 597 "pikchr.y"
25302534
{yylhsminor.yy200.rAbs = yymsp[0].minor.yy265; yylhsminor.yy200.rRel = 0;}
2531
-#line 2556 "pikchr.c"
2535
+#line 2560 "pikchr.c"
25322536
yymsp[0].minor.yy200 = yylhsminor.yy200;
25332537
break;
25342538
case 26: /* relexpr ::= expr PERCENT */
2535
-#line 594 "pikchr.y"
2539
+#line 598 "pikchr.y"
25362540
{yylhsminor.yy200.rAbs = 0; yylhsminor.yy200.rRel = yymsp[-1].minor.yy265/100;}
2537
-#line 2562 "pikchr.c"
2541
+#line 2566 "pikchr.c"
25382542
yymsp[-1].minor.yy200 = yylhsminor.yy200;
25392543
break;
25402544
case 27: /* optrelexpr ::= */
2541
-#line 596 "pikchr.y"
2545
+#line 600 "pikchr.y"
25422546
{yymsp[1].minor.yy200.rAbs = 0; yymsp[1].minor.yy200.rRel = 1.0;}
2543
-#line 2568 "pikchr.c"
2547
+#line 2572 "pikchr.c"
25442548
break;
25452549
case 28: /* attribute_list ::= relexpr alist */
2546
-#line 598 "pikchr.y"
2550
+#line 602 "pikchr.y"
25472551
{pik_add_direction(p,0,&yymsp[-1].minor.yy200);}
2548
-#line 2573 "pikchr.c"
2552
+#line 2577 "pikchr.c"
25492553
break;
25502554
case 29: /* attribute ::= numproperty relexpr */
2551
-#line 602 "pikchr.y"
2555
+#line 606 "pikchr.y"
25522556
{ pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy200); }
2553
-#line 2578 "pikchr.c"
2557
+#line 2582 "pikchr.c"
25542558
break;
25552559
case 30: /* attribute ::= dashproperty expr */
2556
-#line 603 "pikchr.y"
2560
+#line 607 "pikchr.y"
25572561
{ pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy265); }
2558
-#line 2583 "pikchr.c"
2562
+#line 2587 "pikchr.c"
25592563
break;
25602564
case 31: /* attribute ::= dashproperty */
2561
-#line 604 "pikchr.y"
2565
+#line 608 "pikchr.y"
25622566
{ pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2563
-#line 2588 "pikchr.c"
2567
+#line 2592 "pikchr.c"
25642568
break;
25652569
case 32: /* attribute ::= colorproperty rvalue */
2566
-#line 605 "pikchr.y"
2570
+#line 609 "pikchr.y"
25672571
{ pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy265); }
2568
-#line 2593 "pikchr.c"
2572
+#line 2597 "pikchr.c"
25692573
break;
25702574
case 33: /* attribute ::= go direction optrelexpr */
2571
-#line 606 "pikchr.y"
2575
+#line 610 "pikchr.y"
25722576
{ pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy200);}
2573
-#line 2598 "pikchr.c"
2577
+#line 2602 "pikchr.c"
25742578
break;
25752579
case 34: /* attribute ::= go direction even position */
2576
-#line 607 "pikchr.y"
2580
+#line 611 "pikchr.y"
25772581
{pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy43);}
2578
-#line 2603 "pikchr.c"
2582
+#line 2607 "pikchr.c"
25792583
break;
25802584
case 35: /* attribute ::= CLOSE */
2581
-#line 608 "pikchr.y"
2585
+#line 612 "pikchr.y"
25822586
{ pik_close_path(p,&yymsp[0].minor.yy0); }
2583
-#line 2608 "pikchr.c"
2587
+#line 2612 "pikchr.c"
25842588
break;
25852589
case 36: /* attribute ::= CHOP */
2586
-#line 609 "pikchr.y"
2590
+#line 613 "pikchr.y"
25872591
{ p->cur->bChop = 1; }
2588
-#line 2613 "pikchr.c"
2592
+#line 2617 "pikchr.c"
25892593
break;
25902594
case 37: /* attribute ::= FROM position */
2591
-#line 610 "pikchr.y"
2595
+#line 614 "pikchr.y"
25922596
{ pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy43); }
2593
-#line 2618 "pikchr.c"
2597
+#line 2622 "pikchr.c"
25942598
break;
25952599
case 38: /* attribute ::= TO position */
2596
-#line 611 "pikchr.y"
2600
+#line 615 "pikchr.y"
25972601
{ pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy43); }
2598
-#line 2623 "pikchr.c"
2602
+#line 2627 "pikchr.c"
25992603
break;
26002604
case 39: /* attribute ::= THEN */
2601
-#line 612 "pikchr.y"
2605
+#line 616 "pikchr.y"
26022606
{ pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2603
-#line 2628 "pikchr.c"
2607
+#line 2632 "pikchr.c"
26042608
break;
26052609
case 40: /* attribute ::= THEN optrelexpr HEADING expr */
26062610
case 42: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==42);
2607
-#line 614 "pikchr.y"
2611
+#line 618 "pikchr.y"
26082612
{pik_move_hdg(p,&yymsp[-2].minor.yy200,&yymsp[-1].minor.yy0,yymsp[0].minor.yy265,0,&yymsp[-3].minor.yy0);}
2609
-#line 2634 "pikchr.c"
2613
+#line 2638 "pikchr.c"
26102614
break;
26112615
case 41: /* attribute ::= THEN optrelexpr EDGEPT */
26122616
case 43: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==43);
2613
-#line 615 "pikchr.y"
2617
+#line 619 "pikchr.y"
26142618
{pik_move_hdg(p,&yymsp[-1].minor.yy200,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2615
-#line 2640 "pikchr.c"
2619
+#line 2644 "pikchr.c"
26162620
break;
26172621
case 44: /* attribute ::= AT position */
2618
-#line 620 "pikchr.y"
2622
+#line 624 "pikchr.y"
26192623
{ pik_set_at(p,0,&yymsp[0].minor.yy43,&yymsp[-1].minor.yy0); }
2620
-#line 2645 "pikchr.c"
2624
+#line 2649 "pikchr.c"
26212625
break;
26222626
case 45: /* attribute ::= SAME */
2623
-#line 622 "pikchr.y"
2627
+#line 626 "pikchr.y"
26242628
{pik_same(p,0,&yymsp[0].minor.yy0);}
2625
-#line 2650 "pikchr.c"
2629
+#line 2654 "pikchr.c"
26262630
break;
26272631
case 46: /* attribute ::= SAME AS object */
2628
-#line 623 "pikchr.y"
2632
+#line 627 "pikchr.y"
26292633
{pik_same(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2630
-#line 2655 "pikchr.c"
2634
+#line 2659 "pikchr.c"
26312635
break;
26322636
case 47: /* attribute ::= STRING textposition */
2633
-#line 624 "pikchr.y"
2637
+#line 628 "pikchr.y"
26342638
{pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy196);}
2635
-#line 2660 "pikchr.c"
2639
+#line 2664 "pikchr.c"
26362640
break;
26372641
case 48: /* attribute ::= FIT */
2638
-#line 625 "pikchr.y"
2642
+#line 629 "pikchr.y"
26392643
{pik_size_to_fit(p,&yymsp[0].minor.yy0,3); }
2640
-#line 2665 "pikchr.c"
2644
+#line 2669 "pikchr.c"
26412645
break;
26422646
case 49: /* attribute ::= BEHIND object */
2643
-#line 626 "pikchr.y"
2647
+#line 630 "pikchr.y"
26442648
{pik_behind(p,yymsp[0].minor.yy38);}
2645
-#line 2670 "pikchr.c"
2649
+#line 2674 "pikchr.c"
26462650
break;
26472651
case 50: /* withclause ::= DOT_E edge AT position */
26482652
case 51: /* withclause ::= edge AT position */ yytestcase(yyruleno==51);
2649
-#line 634 "pikchr.y"
2653
+#line 638 "pikchr.y"
26502654
{ pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy43,&yymsp[-1].minor.yy0); }
2651
-#line 2676 "pikchr.c"
2655
+#line 2680 "pikchr.c"
26522656
break;
26532657
case 52: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2654
-#line 638 "pikchr.y"
2658
+#line 642 "pikchr.y"
26552659
{yylhsminor.yy0 = yymsp[0].minor.yy0;}
2656
-#line 2681 "pikchr.c"
2660
+#line 2685 "pikchr.c"
26572661
yymsp[0].minor.yy0 = yylhsminor.yy0;
26582662
break;
26592663
case 53: /* boolproperty ::= CW */
2660
-#line 649 "pikchr.y"
2664
+#line 653 "pikchr.y"
26612665
{p->cur->cw = 1;}
2662
-#line 2687 "pikchr.c"
2666
+#line 2691 "pikchr.c"
26632667
break;
26642668
case 54: /* boolproperty ::= CCW */
2665
-#line 650 "pikchr.y"
2669
+#line 654 "pikchr.y"
26662670
{p->cur->cw = 0;}
2667
-#line 2692 "pikchr.c"
2671
+#line 2696 "pikchr.c"
26682672
break;
26692673
case 55: /* boolproperty ::= LARROW */
2670
-#line 651 "pikchr.y"
2674
+#line 655 "pikchr.y"
26712675
{p->cur->larrow=1; p->cur->rarrow=0; }
2672
-#line 2697 "pikchr.c"
2676
+#line 2701 "pikchr.c"
26732677
break;
26742678
case 56: /* boolproperty ::= RARROW */
2675
-#line 652 "pikchr.y"
2679
+#line 656 "pikchr.y"
26762680
{p->cur->larrow=0; p->cur->rarrow=1; }
2677
-#line 2702 "pikchr.c"
2681
+#line 2706 "pikchr.c"
26782682
break;
26792683
case 57: /* boolproperty ::= LRARROW */
2680
-#line 653 "pikchr.y"
2684
+#line 657 "pikchr.y"
26812685
{p->cur->larrow=1; p->cur->rarrow=1; }
2682
-#line 2707 "pikchr.c"
2686
+#line 2711 "pikchr.c"
26832687
break;
26842688
case 58: /* boolproperty ::= INVIS */
2685
-#line 654 "pikchr.y"
2689
+#line 658 "pikchr.y"
26862690
{p->cur->sw = 0.0;}
2687
-#line 2712 "pikchr.c"
2691
+#line 2716 "pikchr.c"
26882692
break;
26892693
case 59: /* boolproperty ::= THICK */
2690
-#line 655 "pikchr.y"
2694
+#line 659 "pikchr.y"
26912695
{p->cur->sw *= 1.5;}
2692
-#line 2717 "pikchr.c"
2696
+#line 2721 "pikchr.c"
26932697
break;
26942698
case 60: /* boolproperty ::= THIN */
2695
-#line 656 "pikchr.y"
2699
+#line 660 "pikchr.y"
26962700
{p->cur->sw *= 0.67;}
2697
-#line 2722 "pikchr.c"
2701
+#line 2726 "pikchr.c"
26982702
break;
26992703
case 61: /* boolproperty ::= SOLID */
2700
-#line 657 "pikchr.y"
2704
+#line 661 "pikchr.y"
27012705
{p->cur->sw = pik_value(p,"thickness",9,0);
27022706
p->cur->dotted = p->cur->dashed = 0.0;}
2703
-#line 2728 "pikchr.c"
2707
+#line 2732 "pikchr.c"
27042708
break;
27052709
case 62: /* textposition ::= */
2706
-#line 660 "pikchr.y"
2710
+#line 664 "pikchr.y"
27072711
{yymsp[1].minor.yy196 = 0;}
2708
-#line 2733 "pikchr.c"
2712
+#line 2737 "pikchr.c"
27092713
break;
27102714
case 63: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2711
-#line 663 "pikchr.y"
2715
+#line 667 "pikchr.y"
27122716
{yylhsminor.yy196 = pik_text_position(yymsp[-1].minor.yy196,&yymsp[0].minor.yy0);}
2713
-#line 2738 "pikchr.c"
2717
+#line 2742 "pikchr.c"
27142718
yymsp[-1].minor.yy196 = yylhsminor.yy196;
27152719
break;
27162720
case 64: /* position ::= expr COMMA expr */
2717
-#line 666 "pikchr.y"
2721
+#line 670 "pikchr.y"
27182722
{yylhsminor.yy43.x=yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[0].minor.yy265;}
2719
-#line 2744 "pikchr.c"
2723
+#line 2748 "pikchr.c"
27202724
yymsp[-2].minor.yy43 = yylhsminor.yy43;
27212725
break;
27222726
case 65: /* position ::= place PLUS expr COMMA expr */
2723
-#line 668 "pikchr.y"
2727
+#line 672 "pikchr.y"
27242728
{yylhsminor.yy43.x=yymsp[-4].minor.yy43.x+yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[-4].minor.yy43.y+yymsp[0].minor.yy265;}
2725
-#line 2750 "pikchr.c"
2729
+#line 2754 "pikchr.c"
27262730
yymsp[-4].minor.yy43 = yylhsminor.yy43;
27272731
break;
27282732
case 66: /* position ::= place MINUS expr COMMA expr */
2729
-#line 669 "pikchr.y"
2733
+#line 673 "pikchr.y"
27302734
{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"
2735
+#line 2760 "pikchr.c"
27322736
yymsp[-4].minor.yy43 = yylhsminor.yy43;
27332737
break;
27342738
case 67: /* position ::= place PLUS LP expr COMMA expr RP */
2735
-#line 671 "pikchr.y"
2739
+#line 675 "pikchr.y"
27362740
{yylhsminor.yy43.x=yymsp[-6].minor.yy43.x+yymsp[-3].minor.yy265; yylhsminor.yy43.y=yymsp[-6].minor.yy43.y+yymsp[-1].minor.yy265;}
2737
-#line 2762 "pikchr.c"
2741
+#line 2766 "pikchr.c"
27382742
yymsp[-6].minor.yy43 = yylhsminor.yy43;
27392743
break;
27402744
case 68: /* position ::= place MINUS LP expr COMMA expr RP */
2741
-#line 673 "pikchr.y"
2745
+#line 677 "pikchr.y"
27422746
{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"
2747
+#line 2772 "pikchr.c"
27442748
yymsp[-6].minor.yy43 = yylhsminor.yy43;
27452749
break;
27462750
case 69: /* position ::= LP position COMMA position RP */
2747
-#line 674 "pikchr.y"
2751
+#line 678 "pikchr.y"
27482752
{yymsp[-4].minor.yy43.x=yymsp[-3].minor.yy43.x; yymsp[-4].minor.yy43.y=yymsp[-1].minor.yy43.y;}
2749
-#line 2774 "pikchr.c"
2753
+#line 2778 "pikchr.c"
27502754
break;
27512755
case 70: /* position ::= LP position RP */
2752
-#line 675 "pikchr.y"
2756
+#line 679 "pikchr.y"
27532757
{yymsp[-2].minor.yy43=yymsp[-1].minor.yy43;}
2754
-#line 2779 "pikchr.c"
2758
+#line 2783 "pikchr.c"
27552759
break;
27562760
case 71: /* position ::= expr between position AND position */
2757
-#line 677 "pikchr.y"
2761
+#line 681 "pikchr.y"
27582762
{yylhsminor.yy43 = pik_position_between(yymsp[-4].minor.yy265,yymsp[-2].minor.yy43,yymsp[0].minor.yy43);}
2759
-#line 2784 "pikchr.c"
2763
+#line 2788 "pikchr.c"
27602764
yymsp[-4].minor.yy43 = yylhsminor.yy43;
27612765
break;
27622766
case 72: /* position ::= expr LT position COMMA position GT */
2763
-#line 679 "pikchr.y"
2767
+#line 683 "pikchr.y"
27642768
{yylhsminor.yy43 = pik_position_between(yymsp[-5].minor.yy265,yymsp[-3].minor.yy43,yymsp[-1].minor.yy43);}
2765
-#line 2790 "pikchr.c"
2769
+#line 2794 "pikchr.c"
27662770
yymsp[-5].minor.yy43 = yylhsminor.yy43;
27672771
break;
27682772
case 73: /* position ::= expr ABOVE position */
2769
-#line 680 "pikchr.y"
2773
+#line 684 "pikchr.y"
27702774
{yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.y += yymsp[-2].minor.yy265;}
2771
-#line 2796 "pikchr.c"
2775
+#line 2800 "pikchr.c"
27722776
yymsp[-2].minor.yy43 = yylhsminor.yy43;
27732777
break;
27742778
case 74: /* position ::= expr BELOW position */
2775
-#line 681 "pikchr.y"
2779
+#line 685 "pikchr.y"
27762780
{yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.y -= yymsp[-2].minor.yy265;}
2777
-#line 2802 "pikchr.c"
2781
+#line 2806 "pikchr.c"
27782782
yymsp[-2].minor.yy43 = yylhsminor.yy43;
27792783
break;
27802784
case 75: /* position ::= expr LEFT OF position */
2781
-#line 682 "pikchr.y"
2785
+#line 686 "pikchr.y"
27822786
{yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.x -= yymsp[-3].minor.yy265;}
2783
-#line 2808 "pikchr.c"
2787
+#line 2812 "pikchr.c"
27842788
yymsp[-3].minor.yy43 = yylhsminor.yy43;
27852789
break;
27862790
case 76: /* position ::= expr RIGHT OF position */
2787
-#line 683 "pikchr.y"
2791
+#line 687 "pikchr.y"
27882792
{yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.x += yymsp[-3].minor.yy265;}
2789
-#line 2814 "pikchr.c"
2793
+#line 2818 "pikchr.c"
27902794
yymsp[-3].minor.yy43 = yylhsminor.yy43;
27912795
break;
27922796
case 77: /* position ::= expr ON HEADING EDGEPT OF position */
2793
-#line 685 "pikchr.y"
2797
+#line 689 "pikchr.y"
27942798
{yylhsminor.yy43 = pik_position_at_hdg(yymsp[-5].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2795
-#line 2820 "pikchr.c"
2799
+#line 2824 "pikchr.c"
27962800
yymsp[-5].minor.yy43 = yylhsminor.yy43;
27972801
break;
27982802
case 78: /* position ::= expr HEADING EDGEPT OF position */
2799
-#line 687 "pikchr.y"
2803
+#line 691 "pikchr.y"
28002804
{yylhsminor.yy43 = pik_position_at_hdg(yymsp[-4].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2801
-#line 2826 "pikchr.c"
2805
+#line 2830 "pikchr.c"
28022806
yymsp[-4].minor.yy43 = yylhsminor.yy43;
28032807
break;
28042808
case 79: /* position ::= expr EDGEPT OF position */
2805
-#line 689 "pikchr.y"
2809
+#line 693 "pikchr.y"
28062810
{yylhsminor.yy43 = pik_position_at_hdg(yymsp[-3].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2807
-#line 2832 "pikchr.c"
2811
+#line 2836 "pikchr.c"
28082812
yymsp[-3].minor.yy43 = yylhsminor.yy43;
28092813
break;
28102814
case 80: /* position ::= expr ON HEADING expr FROM position */
2811
-#line 691 "pikchr.y"
2815
+#line 695 "pikchr.y"
28122816
{yylhsminor.yy43 = pik_position_at_angle(yymsp[-5].minor.yy265,yymsp[-2].minor.yy265,yymsp[0].minor.yy43);}
2813
-#line 2838 "pikchr.c"
2817
+#line 2842 "pikchr.c"
28142818
yymsp[-5].minor.yy43 = yylhsminor.yy43;
28152819
break;
28162820
case 81: /* position ::= expr HEADING expr FROM position */
2817
-#line 693 "pikchr.y"
2821
+#line 697 "pikchr.y"
28182822
{yylhsminor.yy43 = pik_position_at_angle(yymsp[-4].minor.yy265,yymsp[-2].minor.yy265,yymsp[0].minor.yy43);}
2819
-#line 2844 "pikchr.c"
2823
+#line 2848 "pikchr.c"
28202824
yymsp[-4].minor.yy43 = yylhsminor.yy43;
28212825
break;
28222826
case 82: /* place ::= edge OF object */
2823
-#line 705 "pikchr.y"
2827
+#line 709 "pikchr.y"
28242828
{yylhsminor.yy43 = pik_place_of_elem(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2825
-#line 2850 "pikchr.c"
2829
+#line 2854 "pikchr.c"
28262830
yymsp[-2].minor.yy43 = yylhsminor.yy43;
28272831
break;
28282832
case 83: /* place2 ::= object */
2829
-#line 706 "pikchr.y"
2833
+#line 710 "pikchr.y"
28302834
{yylhsminor.yy43 = pik_place_of_elem(p,yymsp[0].minor.yy38,0);}
2831
-#line 2856 "pikchr.c"
2835
+#line 2860 "pikchr.c"
28322836
yymsp[0].minor.yy43 = yylhsminor.yy43;
28332837
break;
28342838
case 84: /* place2 ::= object DOT_E edge */
2835
-#line 707 "pikchr.y"
2839
+#line 711 "pikchr.y"
28362840
{yylhsminor.yy43 = pik_place_of_elem(p,yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
2837
-#line 2862 "pikchr.c"
2841
+#line 2866 "pikchr.c"
28382842
yymsp[-2].minor.yy43 = yylhsminor.yy43;
28392843
break;
28402844
case 85: /* place2 ::= NTH VERTEX OF object */
2841
-#line 708 "pikchr.y"
2845
+#line 712 "pikchr.y"
28422846
{yylhsminor.yy43 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy38);}
2843
-#line 2868 "pikchr.c"
2847
+#line 2872 "pikchr.c"
28442848
yymsp[-3].minor.yy43 = yylhsminor.yy43;
28452849
break;
28462850
case 86: /* object ::= nth */
2847
-#line 720 "pikchr.y"
2851
+#line 724 "pikchr.y"
28482852
{yylhsminor.yy38 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2849
-#line 2874 "pikchr.c"
2853
+#line 2878 "pikchr.c"
28502854
yymsp[0].minor.yy38 = yylhsminor.yy38;
28512855
break;
28522856
case 87: /* object ::= nth OF|IN object */
2853
-#line 721 "pikchr.y"
2857
+#line 725 "pikchr.y"
28542858
{yylhsminor.yy38 = pik_find_nth(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2855
-#line 2880 "pikchr.c"
2859
+#line 2884 "pikchr.c"
28562860
yymsp[-2].minor.yy38 = yylhsminor.yy38;
28572861
break;
28582862
case 88: /* objectname ::= PLACENAME */
2859
-#line 723 "pikchr.y"
2863
+#line 727 "pikchr.y"
28602864
{yylhsminor.yy38 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2861
-#line 2886 "pikchr.c"
2865
+#line 2890 "pikchr.c"
28622866
yymsp[0].minor.yy38 = yylhsminor.yy38;
28632867
break;
28642868
case 89: /* objectname ::= objectname DOT_U PLACENAME */
2865
-#line 725 "pikchr.y"
2869
+#line 729 "pikchr.y"
28662870
{yylhsminor.yy38 = pik_find_byname(p,yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
2867
-#line 2892 "pikchr.c"
2871
+#line 2896 "pikchr.c"
28682872
yymsp[-2].minor.yy38 = yylhsminor.yy38;
28692873
break;
28702874
case 90: /* nth ::= NTH CLASSNAME */
2871
-#line 727 "pikchr.y"
2875
+#line 731 "pikchr.y"
28722876
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2873
-#line 2898 "pikchr.c"
2877
+#line 2902 "pikchr.c"
28742878
yymsp[-1].minor.yy0 = yylhsminor.yy0;
28752879
break;
28762880
case 91: /* nth ::= NTH LAST CLASSNAME */
2877
-#line 728 "pikchr.y"
2881
+#line 732 "pikchr.y"
28782882
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2879
-#line 2904 "pikchr.c"
2883
+#line 2908 "pikchr.c"
28802884
yymsp[-2].minor.yy0 = yylhsminor.yy0;
28812885
break;
28822886
case 92: /* nth ::= LAST CLASSNAME */
2883
-#line 729 "pikchr.y"
2887
+#line 733 "pikchr.y"
28842888
{yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2885
-#line 2910 "pikchr.c"
2889
+#line 2914 "pikchr.c"
28862890
break;
28872891
case 93: /* nth ::= LAST */
2888
-#line 730 "pikchr.y"
2892
+#line 734 "pikchr.y"
28892893
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2890
-#line 2915 "pikchr.c"
2894
+#line 2919 "pikchr.c"
28912895
yymsp[0].minor.yy0 = yylhsminor.yy0;
28922896
break;
28932897
case 94: /* nth ::= NTH LB RB */
2894
-#line 731 "pikchr.y"
2898
+#line 735 "pikchr.y"
28952899
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2896
-#line 2921 "pikchr.c"
2900
+#line 2925 "pikchr.c"
28972901
yymsp[-2].minor.yy0 = yylhsminor.yy0;
28982902
break;
28992903
case 95: /* nth ::= NTH LAST LB RB */
2900
-#line 732 "pikchr.y"
2904
+#line 736 "pikchr.y"
29012905
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2902
-#line 2927 "pikchr.c"
2906
+#line 2931 "pikchr.c"
29032907
yymsp[-3].minor.yy0 = yylhsminor.yy0;
29042908
break;
29052909
case 96: /* nth ::= LAST LB RB */
2906
-#line 733 "pikchr.y"
2910
+#line 737 "pikchr.y"
29072911
{yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2908
-#line 2933 "pikchr.c"
2912
+#line 2937 "pikchr.c"
29092913
break;
29102914
case 97: /* expr ::= expr PLUS expr */
2911
-#line 735 "pikchr.y"
2915
+#line 739 "pikchr.y"
29122916
{yylhsminor.yy265=yymsp[-2].minor.yy265+yymsp[0].minor.yy265;}
2913
-#line 2938 "pikchr.c"
2917
+#line 2942 "pikchr.c"
29142918
yymsp[-2].minor.yy265 = yylhsminor.yy265;
29152919
break;
29162920
case 98: /* expr ::= expr MINUS expr */
2917
-#line 736 "pikchr.y"
2921
+#line 740 "pikchr.y"
29182922
{yylhsminor.yy265=yymsp[-2].minor.yy265-yymsp[0].minor.yy265;}
2919
-#line 2944 "pikchr.c"
2923
+#line 2948 "pikchr.c"
29202924
yymsp[-2].minor.yy265 = yylhsminor.yy265;
29212925
break;
29222926
case 99: /* expr ::= expr STAR expr */
2923
-#line 737 "pikchr.y"
2927
+#line 741 "pikchr.y"
29242928
{yylhsminor.yy265=yymsp[-2].minor.yy265*yymsp[0].minor.yy265;}
2925
-#line 2950 "pikchr.c"
2929
+#line 2954 "pikchr.c"
29262930
yymsp[-2].minor.yy265 = yylhsminor.yy265;
29272931
break;
29282932
case 100: /* expr ::= expr SLASH expr */
2929
-#line 738 "pikchr.y"
2933
+#line 742 "pikchr.y"
29302934
{
29312935
if( yymsp[0].minor.yy265==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy265 = 0.0; }
29322936
else{ yylhsminor.yy265 = yymsp[-2].minor.yy265/yymsp[0].minor.yy265; }
29332937
}
2934
-#line 2959 "pikchr.c"
2938
+#line 2963 "pikchr.c"
29352939
yymsp[-2].minor.yy265 = yylhsminor.yy265;
29362940
break;
29372941
case 101: /* expr ::= MINUS expr */
2938
-#line 742 "pikchr.y"
2942
+#line 746 "pikchr.y"
29392943
{yymsp[-1].minor.yy265=-yymsp[0].minor.yy265;}
2940
-#line 2965 "pikchr.c"
2944
+#line 2969 "pikchr.c"
29412945
break;
29422946
case 102: /* expr ::= PLUS expr */
2943
-#line 743 "pikchr.y"
2947
+#line 747 "pikchr.y"
29442948
{yymsp[-1].minor.yy265=yymsp[0].minor.yy265;}
2945
-#line 2970 "pikchr.c"
2949
+#line 2974 "pikchr.c"
29462950
break;
29472951
case 103: /* expr ::= LP expr RP */
2948
-#line 744 "pikchr.y"
2952
+#line 748 "pikchr.y"
29492953
{yymsp[-2].minor.yy265=yymsp[-1].minor.yy265;}
2950
-#line 2975 "pikchr.c"
2954
+#line 2979 "pikchr.c"
29512955
break;
29522956
case 104: /* expr ::= LP FILL|COLOR|THICKNESS RP */
2953
-#line 745 "pikchr.y"
2957
+#line 749 "pikchr.y"
29542958
{yymsp[-2].minor.yy265=pik_get_var(p,&yymsp[-1].minor.yy0);}
2955
-#line 2980 "pikchr.c"
2959
+#line 2984 "pikchr.c"
29562960
break;
29572961
case 105: /* expr ::= NUMBER */
2958
-#line 746 "pikchr.y"
2962
+#line 750 "pikchr.y"
29592963
{yylhsminor.yy265=pik_atof(&yymsp[0].minor.yy0);}
2960
-#line 2985 "pikchr.c"
2964
+#line 2989 "pikchr.c"
29612965
yymsp[0].minor.yy265 = yylhsminor.yy265;
29622966
break;
29632967
case 106: /* expr ::= ID */
2964
-#line 747 "pikchr.y"
2968
+#line 751 "pikchr.y"
29652969
{yylhsminor.yy265=pik_get_var(p,&yymsp[0].minor.yy0);}
2966
-#line 2991 "pikchr.c"
2970
+#line 2995 "pikchr.c"
29672971
yymsp[0].minor.yy265 = yylhsminor.yy265;
29682972
break;
29692973
case 107: /* expr ::= FUNC1 LP expr RP */
2970
-#line 748 "pikchr.y"
2974
+#line 752 "pikchr.y"
29712975
{yylhsminor.yy265 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy265,0.0);}
2972
-#line 2997 "pikchr.c"
2976
+#line 3001 "pikchr.c"
29732977
yymsp[-3].minor.yy265 = yylhsminor.yy265;
29742978
break;
29752979
case 108: /* expr ::= FUNC2 LP expr COMMA expr RP */
2976
-#line 749 "pikchr.y"
2980
+#line 753 "pikchr.y"
29772981
{yylhsminor.yy265 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy265,yymsp[-1].minor.yy265);}
2978
-#line 3003 "pikchr.c"
2982
+#line 3007 "pikchr.c"
29792983
yymsp[-5].minor.yy265 = yylhsminor.yy265;
29802984
break;
29812985
case 109: /* expr ::= DIST LP position COMMA position RP */
2982
-#line 750 "pikchr.y"
2986
+#line 754 "pikchr.y"
29832987
{yymsp[-5].minor.yy265 = pik_dist(&yymsp[-3].minor.yy43,&yymsp[-1].minor.yy43);}
2984
-#line 3009 "pikchr.c"
2988
+#line 3013 "pikchr.c"
29852989
break;
29862990
case 110: /* expr ::= place2 DOT_XY X */
2987
-#line 751 "pikchr.y"
2991
+#line 755 "pikchr.y"
29882992
{yylhsminor.yy265 = yymsp[-2].minor.yy43.x;}
2989
-#line 3014 "pikchr.c"
2993
+#line 3018 "pikchr.c"
29902994
yymsp[-2].minor.yy265 = yylhsminor.yy265;
29912995
break;
29922996
case 111: /* expr ::= place2 DOT_XY Y */
2993
-#line 752 "pikchr.y"
2997
+#line 756 "pikchr.y"
29942998
{yylhsminor.yy265 = yymsp[-2].minor.yy43.y;}
2995
-#line 3020 "pikchr.c"
2999
+#line 3024 "pikchr.c"
29963000
yymsp[-2].minor.yy265 = yylhsminor.yy265;
29973001
break;
29983002
case 112: /* expr ::= object DOT_L numproperty */
29993003
case 113: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==113);
30003004
case 114: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==114);
3001
-#line 753 "pikchr.y"
3005
+#line 757 "pikchr.y"
30023006
{yylhsminor.yy265=pik_property_of(yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
3003
-#line 3028 "pikchr.c"
3007
+#line 3032 "pikchr.c"
30043008
yymsp[-2].minor.yy265 = yylhsminor.yy265;
30053009
break;
30063010
default:
30073011
/* (115) lvalue ::= ID */ yytestcase(yyruleno==115);
30083012
/* (116) lvalue ::= FILL */ yytestcase(yyruleno==116);
@@ -3101,19 +3105,19 @@
31013105
){
31023106
pik_parserARG_FETCH
31033107
pik_parserCTX_FETCH
31043108
#define TOKEN yyminor
31053109
/************ Begin %syntax_error code ****************************************/
3106
-#line 514 "pikchr.y"
3110
+#line 518 "pikchr.y"
31073111
31083112
if( TOKEN.z && TOKEN.z[0] ){
31093113
pik_error(p, &TOKEN, "syntax error");
31103114
}else{
31113115
pik_error(p, 0, "syntax error");
31123116
}
31133117
UNUSED_PARAMETER(yymajor);
3114
-#line 3139 "pikchr.c"
3118
+#line 3143 "pikchr.c"
31153119
/************ End %syntax_error code ******************************************/
31163120
pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
31173121
pik_parserCTX_STORE
31183122
}
31193123
@@ -3342,16 +3346,17 @@
33423346
#else
33433347
(void)iToken;
33443348
return 0;
33453349
#endif
33463350
}
3347
-#line 758 "pikchr.y"
3351
+#line 762 "pikchr.y"
33483352
33493353
33503354
3351
-/* Chart of the 140 official HTML color names with their
3352
-** corresponding RGB value.
3355
+/* Chart of the 148 official CSS color names with their
3356
+** corresponding RGB values thru Color Module Level 4:
3357
+** https://developer.mozilla.org/en-US/docs/Web/CSS/color_value
33533358
**
33543359
** Two new names "None" and "Off" are added with a value
33553360
** of -1.
33563361
*/
33573362
static const struct {
@@ -3359,11 +3364,11 @@
33593364
int val; /* RGB value */
33603365
} aColor[] = {
33613366
{ "AliceBlue", 0xf0f8ff },
33623367
{ "AntiqueWhite", 0xfaebd7 },
33633368
{ "Aqua", 0x00ffff },
3364
- { "AquaMarine", 0x7fffd4 },
3369
+ { "Aquamarine", 0x7fffd4 },
33653370
{ "Azure", 0xf0ffff },
33663371
{ "Beige", 0xf5f5dc },
33673372
{ "Bisque", 0xffe4c4 },
33683373
{ "Black", 0x000000 },
33693374
{ "BlanchedAlmond", 0xffebcd },
@@ -3373,19 +3378,20 @@
33733378
{ "BurlyWood", 0xdeb887 },
33743379
{ "CadetBlue", 0x5f9ea0 },
33753380
{ "Chartreuse", 0x7fff00 },
33763381
{ "Chocolate", 0xd2691e },
33773382
{ "Coral", 0xff7f50 },
3378
- { "CornFlowerBlue", 0x6495ed },
3383
+ { "CornflowerBlue", 0x6495ed },
33793384
{ "Cornsilk", 0xfff8dc },
33803385
{ "Crimson", 0xdc143c },
33813386
{ "Cyan", 0x00ffff },
33823387
{ "DarkBlue", 0x00008b },
33833388
{ "DarkCyan", 0x008b8b },
3384
- { "DarkGoldenRod", 0xb8860b },
3389
+ { "DarkGoldenrod", 0xb8860b },
33853390
{ "DarkGray", 0xa9a9a9 },
33863391
{ "DarkGreen", 0x006400 },
3392
+ { "DarkGrey", 0xa9a9a9 },
33873393
{ "DarkKhaki", 0xbdb76b },
33883394
{ "DarkMagenta", 0x8b008b },
33893395
{ "DarkOliveGreen", 0x556b2f },
33903396
{ "DarkOrange", 0xff8c00 },
33913397
{ "DarkOrchid", 0x9932cc },
@@ -3392,28 +3398,31 @@
33923398
{ "DarkRed", 0x8b0000 },
33933399
{ "DarkSalmon", 0xe9967a },
33943400
{ "DarkSeaGreen", 0x8fbc8f },
33953401
{ "DarkSlateBlue", 0x483d8b },
33963402
{ "DarkSlateGray", 0x2f4f4f },
3403
+ { "DarkSlateGrey", 0x2f4f4f },
33973404
{ "DarkTurquoise", 0x00ced1 },
33983405
{ "DarkViolet", 0x9400d3 },
33993406
{ "DeepPink", 0xff1493 },
34003407
{ "DeepSkyBlue", 0x00bfff },
34013408
{ "DimGray", 0x696969 },
3409
+ { "DimGrey", 0x696969 },
34023410
{ "DodgerBlue", 0x1e90ff },
3403
- { "FireBrick", 0xb22222 },
3411
+ { "Firebrick", 0xb22222 },
34043412
{ "FloralWhite", 0xfffaf0 },
34053413
{ "ForestGreen", 0x228b22 },
34063414
{ "Fuchsia", 0xff00ff },
34073415
{ "Gainsboro", 0xdcdcdc },
34083416
{ "GhostWhite", 0xf8f8ff },
34093417
{ "Gold", 0xffd700 },
3410
- { "GoldenRod", 0xdaa520 },
3418
+ { "Goldenrod", 0xdaa520 },
34113419
{ "Gray", 0x808080 },
34123420
{ "Green", 0x008000 },
34133421
{ "GreenYellow", 0xadff2f },
3414
- { "HoneyDew", 0xf0fff0 },
3422
+ { "Grey", 0x808080 },
3423
+ { "Honeydew", 0xf0fff0 },
34153424
{ "HotPink", 0xff69b4 },
34163425
{ "IndianRed", 0xcd5c5c },
34173426
{ "Indigo", 0x4b0082 },
34183427
{ "Ivory", 0xfffff0 },
34193428
{ "Khaki", 0xf0e68c },
@@ -3425,26 +3434,28 @@
34253434
{ "LightCoral", 0xf08080 },
34263435
{ "LightCyan", 0xe0ffff },
34273436
{ "LightGoldenrodYellow", 0xfafad2 },
34283437
{ "LightGray", 0xd3d3d3 },
34293438
{ "LightGreen", 0x90ee90 },
3439
+ { "LightGrey", 0xd3d3d3 },
34303440
{ "LightPink", 0xffb6c1 },
34313441
{ "LightSalmon", 0xffa07a },
34323442
{ "LightSeaGreen", 0x20b2aa },
34333443
{ "LightSkyBlue", 0x87cefa },
34343444
{ "LightSlateGray", 0x778899 },
3445
+ { "LightSlateGrey", 0x778899 },
34353446
{ "LightSteelBlue", 0xb0c4de },
34363447
{ "LightYellow", 0xffffe0 },
34373448
{ "Lime", 0x00ff00 },
34383449
{ "LimeGreen", 0x32cd32 },
34393450
{ "Linen", 0xfaf0e6 },
34403451
{ "Magenta", 0xff00ff },
34413452
{ "Maroon", 0x800000 },
3442
- { "MediumAquaMarine", 0x66cdaa },
3453
+ { "MediumAquamarine", 0x66cdaa },
34433454
{ "MediumBlue", 0x0000cd },
34443455
{ "MediumOrchid", 0xba55d3 },
3445
- { "MediumPurple", 0x9370d8 },
3456
+ { "MediumPurple", 0x9370db },
34463457
{ "MediumSeaGreen", 0x3cb371 },
34473458
{ "MediumSlateBlue", 0x7b68ee },
34483459
{ "MediumSpringGreen", 0x00fa9a },
34493460
{ "MediumTurquoise", 0x48d1cc },
34503461
{ "MediumVioletRed", 0xc71585 },
@@ -3460,11 +3471,11 @@
34603471
{ "Olive", 0x808000 },
34613472
{ "OliveDrab", 0x6b8e23 },
34623473
{ "Orange", 0xffa500 },
34633474
{ "OrangeRed", 0xff4500 },
34643475
{ "Orchid", 0xda70d6 },
3465
- { "PaleGoldenRod", 0xeee8aa },
3476
+ { "PaleGoldenrod", 0xeee8aa },
34663477
{ "PaleGreen", 0x98fb98 },
34673478
{ "PaleTurquoise", 0xafeeee },
34683479
{ "PaleVioletRed", 0xdb7093 },
34693480
{ "PapayaWhip", 0xffefd5 },
34703481
{ "PeachPuff", 0xffdab9 },
@@ -3471,23 +3482,25 @@
34713482
{ "Peru", 0xcd853f },
34723483
{ "Pink", 0xffc0cb },
34733484
{ "Plum", 0xdda0dd },
34743485
{ "PowderBlue", 0xb0e0e6 },
34753486
{ "Purple", 0x800080 },
3487
+ { "RebeccaPurple", 0x663399 },
34763488
{ "Red", 0xff0000 },
34773489
{ "RosyBrown", 0xbc8f8f },
34783490
{ "RoyalBlue", 0x4169e1 },
34793491
{ "SaddleBrown", 0x8b4513 },
34803492
{ "Salmon", 0xfa8072 },
34813493
{ "SandyBrown", 0xf4a460 },
34823494
{ "SeaGreen", 0x2e8b57 },
3483
- { "SeaShell", 0xfff5ee },
3495
+ { "Seashell", 0xfff5ee },
34843496
{ "Sienna", 0xa0522d },
34853497
{ "Silver", 0xc0c0c0 },
34863498
{ "SkyBlue", 0x87ceeb },
34873499
{ "SlateBlue", 0x6a5acd },
34883500
{ "SlateGray", 0x708090 },
3501
+ { "SlateGrey", 0x708090 },
34893502
{ "Snow", 0xfffafa },
34903503
{ "SpringGreen", 0x00ff7f },
34913504
{ "SteelBlue", 0x4682b4 },
34923505
{ "Tan", 0xd2b48c },
34933506
{ "Teal", 0x008080 },
@@ -4552,10 +4565,32 @@
45524565
(double)pPt->x, (double)pPt->y);
45534566
buf[sizeof(buf)-1] = 0;
45544567
pik_append(p, z, -1);
45554568
pik_append(p, buf, -1);
45564569
}
4570
+
4571
+/*
4572
+** Invert the RGB color so that it is appropriate for dark mode.
4573
+*/
4574
+static int pik_color_to_dark_mode(int x){
4575
+ int r, g, b;
4576
+ int mn, mx;
4577
+ x = 0xffffff - x;
4578
+ r = (x>>16) & 0xff;
4579
+ g = (x>>8) & 0xff;
4580
+ b = x & 0xff;
4581
+ mx = r;
4582
+ if( g>mx ) mx = g;
4583
+ if( b>mx ) mx = b;
4584
+ mn = r;
4585
+ if( g<mn ) mn = g;
4586
+ if( b<mn ) mn = b;
4587
+ r = mn + (mx-r);
4588
+ g = mn + (mx-g);
4589
+ b = mn + (mx-b);
4590
+ return r*0x10000 + g*0x100 + b;
4591
+}
45574592
45584593
/* Append a PNum value surrounded by text. Do coordinate transformations
45594594
** on the value.
45604595
*/
45614596
static void pik_append_x(Pik *p, const char *z1, PNum v, const char *z2){
@@ -4588,13 +4623,15 @@
45884623
pik_append(p, buf, -1);
45894624
}
45904625
static void pik_append_clr(Pik *p, const char *z1, PNum v, const char *z2){
45914626
char buf[200];
45924627
int x = (int)v;
4593
- int r = (x>>16) & 0xff;
4594
- int g = (x>>8) & 0xff;
4595
- int b = x & 0xff;
4628
+ int r, g, b;
4629
+ if( p->mFlags & PIKCHR_DARK_MODE ) x = pik_color_to_dark_mode(x);
4630
+ r = (x>>16) & 0xff;
4631
+ g = (x>>8) & 0xff;
4632
+ b = x & 0xff;
45964633
snprintf(buf, sizeof(buf)-1, "%srgb(%d,%d,%d)%s", z1, r, g, b, z2);
45974634
buf[sizeof(buf)-1] = 0;
45984635
pik_append(p, buf, -1);
45994636
}
46004637
@@ -7620,10 +7657,11 @@
76207657
int i;
76217658
int bSvgOnly = 0; /* Output SVG only. No HTML wrapper */
76227659
int bDontStop = 0; /* Continue in spite of errors */
76237660
int exitCode = 0; /* What to return */
76247661
int mFlags = 0; /* mFlags argument to pikchr() */
7662
+ const char *zStyle = ""; /* Extra styling */
76257663
const char *zHtmlHdr =
76267664
"<!DOCTYPE html>\n"
76277665
"<html lang=\"en-US\">\n"
76287666
"<head>\n<title>PIKCHR Test</title>\n"
76297667
"<style>\n"
@@ -7657,10 +7695,14 @@
76577695
char *z = argv[i];
76587696
z++;
76597697
if( z[0]=='-' ) z++;
76607698
if( strcmp(z,"dont-stop")==0 ){
76617699
bDontStop = 1;
7700
+ }else
7701
+ if( strcmp(z,"dark-mode")==0 ){
7702
+ zStyle = "color:white;background-color:black;";
7703
+ mFlags |= PIKCHR_DARK_MODE;
76627704
}else
76637705
if( strcmp(z,"svg-only")==0 ){
76647706
if( zHtmlHdr==0 ){
76657707
fprintf(stderr, "the \"%s\" option must come first\n",argv[i]);
76667708
exit(1);
@@ -7706,11 +7748,12 @@
77067748
printf("<h1>File %s</h1>\n", argv[i]);
77077749
if( w<0 ){
77087750
printf("<p>ERROR</p>\n%s\n", zOut);
77097751
}else{
77107752
printf("<div id=\"svg-%d\" onclick=\"toggleHidden('svg-%d')\">\n",i,i);
7711
- printf("<div style='border:3px solid lightgray;max-width:%dpx;'>\n",w);
7753
+ printf("<div style='border:3px solid lightgray;max-width:%dpx;%s'>\n",
7754
+ w,zStyle);
77127755
printf("%s</div>\n", zOut);
77137756
printf("<pre class='hidden'>");
77147757
print_escape_html(zIn);
77157758
printf("</pre>\n</div>\n");
77167759
}
@@ -7783,6 +7826,6 @@
77837826
77847827
77857828
#endif /* PIKCHR_TCL */
77867829
77877830
7788
-#line 7813 "pikchr.c"
7831
+#line 7856 "pikchr.c"
77897832
--- src/pikchr.c
+++ src/pikchr.c
@@ -379,10 +379,14 @@
379 ** argument to pikchr() in order to cause error message text to come out
380 ** as text/plain instead of as text/html
381 */
382 #define PIKCHR_PLAINTEXT_ERRORS 0x0001
383
 
 
 
 
384 /*
385 ** The behavior of an object class is defined by an instance of
386 ** this structure. This is the "virtual method" table.
387 */
388 struct PClass {
@@ -468,11 +472,11 @@
468 static PObj *pik_position_assert(Pik*,PPoint*,PToken*,PPoint*);
469 static PNum pik_dist(PPoint*,PPoint*);
470 static void pik_add_macro(Pik*,PToken *pId,PToken *pCode);
471
472
473 #line 499 "pikchr.c"
474 /**************** End of %include directives **********************************/
475 /* These constants specify the various numeric values for terminal symbols.
476 ***************** Begin token definitions *************************************/
477 #ifndef T_ID
478 #define T_ID 1
@@ -1685,22 +1689,22 @@
1685 ** inside the C code.
1686 */
1687 /********* Begin destructor definitions ***************************************/
1688 case 98: /* statement_list */
1689 {
1690 #line 488 "pikchr.y"
1691 pik_elist_free(p,(yypminor->yy119));
1692 #line 1717 "pikchr.c"
1693 }
1694 break;
1695 case 99: /* statement */
1696 case 100: /* unnamed_statement */
1697 case 101: /* basetype */
1698 {
1699 #line 490 "pikchr.y"
1700 pik_elem_free(p,(yypminor->yy38));
1701 #line 1726 "pikchr.c"
1702 }
1703 break;
1704 /********* End destructor definitions *****************************************/
1705 default: break; /* If no destructor action specified: do nothing */
1706 }
@@ -1914,14 +1918,14 @@
1914 #endif
1915 while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
1916 /* Here code is inserted which will execute if the parser
1917 ** stack every overflows */
1918 /******** Begin %stack_overflow code ******************************************/
1919 #line 522 "pikchr.y"
1920
1921 pik_error(p, 0, "parser stack overflow");
1922 #line 1947 "pikchr.c"
1923 /******** End %stack_overflow code ********************************************/
1924 pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
1925 pik_parserCTX_STORE
1926 }
1927
@@ -2395,614 +2399,614 @@
2395 ** break;
2396 */
2397 /********** Begin reduce actions **********************************************/
2398 YYMINORTYPE yylhsminor;
2399 case 0: /* document ::= statement_list */
2400 #line 526 "pikchr.y"
2401 {pik_render(p,yymsp[0].minor.yy119);}
2402 #line 2427 "pikchr.c"
2403 break;
2404 case 1: /* statement_list ::= statement */
2405 #line 529 "pikchr.y"
2406 { yylhsminor.yy119 = pik_elist_append(p,0,yymsp[0].minor.yy38); }
2407 #line 2432 "pikchr.c"
2408 yymsp[0].minor.yy119 = yylhsminor.yy119;
2409 break;
2410 case 2: /* statement_list ::= statement_list EOL statement */
2411 #line 531 "pikchr.y"
2412 { yylhsminor.yy119 = pik_elist_append(p,yymsp[-2].minor.yy119,yymsp[0].minor.yy38); }
2413 #line 2438 "pikchr.c"
2414 yymsp[-2].minor.yy119 = yylhsminor.yy119;
2415 break;
2416 case 3: /* statement ::= */
2417 #line 534 "pikchr.y"
2418 { yymsp[1].minor.yy38 = 0; }
2419 #line 2444 "pikchr.c"
2420 break;
2421 case 4: /* statement ::= direction */
2422 #line 535 "pikchr.y"
2423 { pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy38=0; }
2424 #line 2449 "pikchr.c"
2425 yymsp[0].minor.yy38 = yylhsminor.yy38;
2426 break;
2427 case 5: /* statement ::= lvalue ASSIGN rvalue */
2428 #line 536 "pikchr.y"
2429 {pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy265,&yymsp[-1].minor.yy0); yylhsminor.yy38=0;}
2430 #line 2455 "pikchr.c"
2431 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2432 break;
2433 case 6: /* statement ::= PLACENAME COLON unnamed_statement */
2434 #line 538 "pikchr.y"
2435 { yylhsminor.yy38 = yymsp[0].minor.yy38; pik_elem_setname(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0); }
2436 #line 2461 "pikchr.c"
2437 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2438 break;
2439 case 7: /* statement ::= PLACENAME COLON position */
2440 #line 540 "pikchr.y"
2441 { yylhsminor.yy38 = pik_elem_new(p,0,0,0);
2442 if(yylhsminor.yy38){ yylhsminor.yy38->ptAt = yymsp[0].minor.yy43; pik_elem_setname(p,yylhsminor.yy38,&yymsp[-2].minor.yy0); }}
2443 #line 2468 "pikchr.c"
2444 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2445 break;
2446 case 8: /* statement ::= unnamed_statement */
2447 #line 542 "pikchr.y"
2448 {yylhsminor.yy38 = yymsp[0].minor.yy38;}
2449 #line 2474 "pikchr.c"
2450 yymsp[0].minor.yy38 = yylhsminor.yy38;
2451 break;
2452 case 9: /* statement ::= print prlist */
2453 #line 543 "pikchr.y"
2454 {pik_append(p,"<br>\n",5); yymsp[-1].minor.yy38=0;}
2455 #line 2480 "pikchr.c"
2456 break;
2457 case 10: /* statement ::= ASSERT LP expr EQ expr RP */
2458 #line 548 "pikchr.y"
2459 {yymsp[-5].minor.yy38=pik_assert(p,yymsp[-3].minor.yy265,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy265);}
2460 #line 2485 "pikchr.c"
2461 break;
2462 case 11: /* statement ::= ASSERT LP position EQ position RP */
2463 #line 550 "pikchr.y"
2464 {yymsp[-5].minor.yy38=pik_position_assert(p,&yymsp[-3].minor.yy43,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy43);}
2465 #line 2490 "pikchr.c"
2466 break;
2467 case 12: /* statement ::= DEFINE ID CODEBLOCK */
2468 #line 551 "pikchr.y"
2469 {yymsp[-2].minor.yy38=0; pik_add_macro(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
2470 #line 2495 "pikchr.c"
2471 break;
2472 case 13: /* rvalue ::= PLACENAME */
2473 #line 562 "pikchr.y"
2474 {yylhsminor.yy265 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2475 #line 2500 "pikchr.c"
2476 yymsp[0].minor.yy265 = yylhsminor.yy265;
2477 break;
2478 case 14: /* pritem ::= FILL */
2479 case 15: /* pritem ::= COLOR */ yytestcase(yyruleno==15);
2480 case 16: /* pritem ::= THICKNESS */ yytestcase(yyruleno==16);
2481 #line 567 "pikchr.y"
2482 {pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2483 #line 2508 "pikchr.c"
2484 break;
2485 case 17: /* pritem ::= rvalue */
2486 #line 570 "pikchr.y"
2487 {pik_append_num(p,"",yymsp[0].minor.yy265);}
2488 #line 2513 "pikchr.c"
2489 break;
2490 case 18: /* pritem ::= STRING */
2491 #line 571 "pikchr.y"
2492 {pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2493 #line 2518 "pikchr.c"
2494 break;
2495 case 19: /* prsep ::= COMMA */
2496 #line 572 "pikchr.y"
2497 {pik_append(p, " ", 1);}
2498 #line 2523 "pikchr.c"
2499 break;
2500 case 20: /* unnamed_statement ::= basetype attribute_list */
2501 #line 575 "pikchr.y"
2502 {yylhsminor.yy38 = yymsp[-1].minor.yy38; pik_after_adding_attributes(p,yylhsminor.yy38);}
2503 #line 2528 "pikchr.c"
2504 yymsp[-1].minor.yy38 = yylhsminor.yy38;
2505 break;
2506 case 21: /* basetype ::= CLASSNAME */
2507 #line 577 "pikchr.y"
2508 {yylhsminor.yy38 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2509 #line 2534 "pikchr.c"
2510 yymsp[0].minor.yy38 = yylhsminor.yy38;
2511 break;
2512 case 22: /* basetype ::= STRING textposition */
2513 #line 579 "pikchr.y"
2514 {yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy196; yylhsminor.yy38 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2515 #line 2540 "pikchr.c"
2516 yymsp[-1].minor.yy38 = yylhsminor.yy38;
2517 break;
2518 case 23: /* basetype ::= LB savelist statement_list RB */
2519 #line 581 "pikchr.y"
2520 { 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; }
2521 #line 2546 "pikchr.c"
2522 break;
2523 case 24: /* savelist ::= */
2524 #line 586 "pikchr.y"
2525 {yymsp[1].minor.yy119 = p->list; p->list = 0;}
2526 #line 2551 "pikchr.c"
2527 break;
2528 case 25: /* relexpr ::= expr */
2529 #line 593 "pikchr.y"
2530 {yylhsminor.yy200.rAbs = yymsp[0].minor.yy265; yylhsminor.yy200.rRel = 0;}
2531 #line 2556 "pikchr.c"
2532 yymsp[0].minor.yy200 = yylhsminor.yy200;
2533 break;
2534 case 26: /* relexpr ::= expr PERCENT */
2535 #line 594 "pikchr.y"
2536 {yylhsminor.yy200.rAbs = 0; yylhsminor.yy200.rRel = yymsp[-1].minor.yy265/100;}
2537 #line 2562 "pikchr.c"
2538 yymsp[-1].minor.yy200 = yylhsminor.yy200;
2539 break;
2540 case 27: /* optrelexpr ::= */
2541 #line 596 "pikchr.y"
2542 {yymsp[1].minor.yy200.rAbs = 0; yymsp[1].minor.yy200.rRel = 1.0;}
2543 #line 2568 "pikchr.c"
2544 break;
2545 case 28: /* attribute_list ::= relexpr alist */
2546 #line 598 "pikchr.y"
2547 {pik_add_direction(p,0,&yymsp[-1].minor.yy200);}
2548 #line 2573 "pikchr.c"
2549 break;
2550 case 29: /* attribute ::= numproperty relexpr */
2551 #line 602 "pikchr.y"
2552 { pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy200); }
2553 #line 2578 "pikchr.c"
2554 break;
2555 case 30: /* attribute ::= dashproperty expr */
2556 #line 603 "pikchr.y"
2557 { pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy265); }
2558 #line 2583 "pikchr.c"
2559 break;
2560 case 31: /* attribute ::= dashproperty */
2561 #line 604 "pikchr.y"
2562 { pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2563 #line 2588 "pikchr.c"
2564 break;
2565 case 32: /* attribute ::= colorproperty rvalue */
2566 #line 605 "pikchr.y"
2567 { pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy265); }
2568 #line 2593 "pikchr.c"
2569 break;
2570 case 33: /* attribute ::= go direction optrelexpr */
2571 #line 606 "pikchr.y"
2572 { pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy200);}
2573 #line 2598 "pikchr.c"
2574 break;
2575 case 34: /* attribute ::= go direction even position */
2576 #line 607 "pikchr.y"
2577 {pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy43);}
2578 #line 2603 "pikchr.c"
2579 break;
2580 case 35: /* attribute ::= CLOSE */
2581 #line 608 "pikchr.y"
2582 { pik_close_path(p,&yymsp[0].minor.yy0); }
2583 #line 2608 "pikchr.c"
2584 break;
2585 case 36: /* attribute ::= CHOP */
2586 #line 609 "pikchr.y"
2587 { p->cur->bChop = 1; }
2588 #line 2613 "pikchr.c"
2589 break;
2590 case 37: /* attribute ::= FROM position */
2591 #line 610 "pikchr.y"
2592 { pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy43); }
2593 #line 2618 "pikchr.c"
2594 break;
2595 case 38: /* attribute ::= TO position */
2596 #line 611 "pikchr.y"
2597 { pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy43); }
2598 #line 2623 "pikchr.c"
2599 break;
2600 case 39: /* attribute ::= THEN */
2601 #line 612 "pikchr.y"
2602 { pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2603 #line 2628 "pikchr.c"
2604 break;
2605 case 40: /* attribute ::= THEN optrelexpr HEADING expr */
2606 case 42: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==42);
2607 #line 614 "pikchr.y"
2608 {pik_move_hdg(p,&yymsp[-2].minor.yy200,&yymsp[-1].minor.yy0,yymsp[0].minor.yy265,0,&yymsp[-3].minor.yy0);}
2609 #line 2634 "pikchr.c"
2610 break;
2611 case 41: /* attribute ::= THEN optrelexpr EDGEPT */
2612 case 43: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==43);
2613 #line 615 "pikchr.y"
2614 {pik_move_hdg(p,&yymsp[-1].minor.yy200,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2615 #line 2640 "pikchr.c"
2616 break;
2617 case 44: /* attribute ::= AT position */
2618 #line 620 "pikchr.y"
2619 { pik_set_at(p,0,&yymsp[0].minor.yy43,&yymsp[-1].minor.yy0); }
2620 #line 2645 "pikchr.c"
2621 break;
2622 case 45: /* attribute ::= SAME */
2623 #line 622 "pikchr.y"
2624 {pik_same(p,0,&yymsp[0].minor.yy0);}
2625 #line 2650 "pikchr.c"
2626 break;
2627 case 46: /* attribute ::= SAME AS object */
2628 #line 623 "pikchr.y"
2629 {pik_same(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2630 #line 2655 "pikchr.c"
2631 break;
2632 case 47: /* attribute ::= STRING textposition */
2633 #line 624 "pikchr.y"
2634 {pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy196);}
2635 #line 2660 "pikchr.c"
2636 break;
2637 case 48: /* attribute ::= FIT */
2638 #line 625 "pikchr.y"
2639 {pik_size_to_fit(p,&yymsp[0].minor.yy0,3); }
2640 #line 2665 "pikchr.c"
2641 break;
2642 case 49: /* attribute ::= BEHIND object */
2643 #line 626 "pikchr.y"
2644 {pik_behind(p,yymsp[0].minor.yy38);}
2645 #line 2670 "pikchr.c"
2646 break;
2647 case 50: /* withclause ::= DOT_E edge AT position */
2648 case 51: /* withclause ::= edge AT position */ yytestcase(yyruleno==51);
2649 #line 634 "pikchr.y"
2650 { pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy43,&yymsp[-1].minor.yy0); }
2651 #line 2676 "pikchr.c"
2652 break;
2653 case 52: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2654 #line 638 "pikchr.y"
2655 {yylhsminor.yy0 = yymsp[0].minor.yy0;}
2656 #line 2681 "pikchr.c"
2657 yymsp[0].minor.yy0 = yylhsminor.yy0;
2658 break;
2659 case 53: /* boolproperty ::= CW */
2660 #line 649 "pikchr.y"
2661 {p->cur->cw = 1;}
2662 #line 2687 "pikchr.c"
2663 break;
2664 case 54: /* boolproperty ::= CCW */
2665 #line 650 "pikchr.y"
2666 {p->cur->cw = 0;}
2667 #line 2692 "pikchr.c"
2668 break;
2669 case 55: /* boolproperty ::= LARROW */
2670 #line 651 "pikchr.y"
2671 {p->cur->larrow=1; p->cur->rarrow=0; }
2672 #line 2697 "pikchr.c"
2673 break;
2674 case 56: /* boolproperty ::= RARROW */
2675 #line 652 "pikchr.y"
2676 {p->cur->larrow=0; p->cur->rarrow=1; }
2677 #line 2702 "pikchr.c"
2678 break;
2679 case 57: /* boolproperty ::= LRARROW */
2680 #line 653 "pikchr.y"
2681 {p->cur->larrow=1; p->cur->rarrow=1; }
2682 #line 2707 "pikchr.c"
2683 break;
2684 case 58: /* boolproperty ::= INVIS */
2685 #line 654 "pikchr.y"
2686 {p->cur->sw = 0.0;}
2687 #line 2712 "pikchr.c"
2688 break;
2689 case 59: /* boolproperty ::= THICK */
2690 #line 655 "pikchr.y"
2691 {p->cur->sw *= 1.5;}
2692 #line 2717 "pikchr.c"
2693 break;
2694 case 60: /* boolproperty ::= THIN */
2695 #line 656 "pikchr.y"
2696 {p->cur->sw *= 0.67;}
2697 #line 2722 "pikchr.c"
2698 break;
2699 case 61: /* boolproperty ::= SOLID */
2700 #line 657 "pikchr.y"
2701 {p->cur->sw = pik_value(p,"thickness",9,0);
2702 p->cur->dotted = p->cur->dashed = 0.0;}
2703 #line 2728 "pikchr.c"
2704 break;
2705 case 62: /* textposition ::= */
2706 #line 660 "pikchr.y"
2707 {yymsp[1].minor.yy196 = 0;}
2708 #line 2733 "pikchr.c"
2709 break;
2710 case 63: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2711 #line 663 "pikchr.y"
2712 {yylhsminor.yy196 = pik_text_position(yymsp[-1].minor.yy196,&yymsp[0].minor.yy0);}
2713 #line 2738 "pikchr.c"
2714 yymsp[-1].minor.yy196 = yylhsminor.yy196;
2715 break;
2716 case 64: /* position ::= expr COMMA expr */
2717 #line 666 "pikchr.y"
2718 {yylhsminor.yy43.x=yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[0].minor.yy265;}
2719 #line 2744 "pikchr.c"
2720 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2721 break;
2722 case 65: /* position ::= place PLUS expr COMMA expr */
2723 #line 668 "pikchr.y"
2724 {yylhsminor.yy43.x=yymsp[-4].minor.yy43.x+yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[-4].minor.yy43.y+yymsp[0].minor.yy265;}
2725 #line 2750 "pikchr.c"
2726 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2727 break;
2728 case 66: /* position ::= place MINUS expr COMMA expr */
2729 #line 669 "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 67: /* position ::= place PLUS LP expr COMMA expr RP */
2735 #line 671 "pikchr.y"
2736 {yylhsminor.yy43.x=yymsp[-6].minor.yy43.x+yymsp[-3].minor.yy265; yylhsminor.yy43.y=yymsp[-6].minor.yy43.y+yymsp[-1].minor.yy265;}
2737 #line 2762 "pikchr.c"
2738 yymsp[-6].minor.yy43 = yylhsminor.yy43;
2739 break;
2740 case 68: /* position ::= place MINUS LP expr COMMA expr RP */
2741 #line 673 "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 69: /* position ::= LP position COMMA position RP */
2747 #line 674 "pikchr.y"
2748 {yymsp[-4].minor.yy43.x=yymsp[-3].minor.yy43.x; yymsp[-4].minor.yy43.y=yymsp[-1].minor.yy43.y;}
2749 #line 2774 "pikchr.c"
2750 break;
2751 case 70: /* position ::= LP position RP */
2752 #line 675 "pikchr.y"
2753 {yymsp[-2].minor.yy43=yymsp[-1].minor.yy43;}
2754 #line 2779 "pikchr.c"
2755 break;
2756 case 71: /* position ::= expr between position AND position */
2757 #line 677 "pikchr.y"
2758 {yylhsminor.yy43 = pik_position_between(yymsp[-4].minor.yy265,yymsp[-2].minor.yy43,yymsp[0].minor.yy43);}
2759 #line 2784 "pikchr.c"
2760 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2761 break;
2762 case 72: /* position ::= expr LT position COMMA position GT */
2763 #line 679 "pikchr.y"
2764 {yylhsminor.yy43 = pik_position_between(yymsp[-5].minor.yy265,yymsp[-3].minor.yy43,yymsp[-1].minor.yy43);}
2765 #line 2790 "pikchr.c"
2766 yymsp[-5].minor.yy43 = yylhsminor.yy43;
2767 break;
2768 case 73: /* position ::= expr ABOVE position */
2769 #line 680 "pikchr.y"
2770 {yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.y += yymsp[-2].minor.yy265;}
2771 #line 2796 "pikchr.c"
2772 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2773 break;
2774 case 74: /* position ::= expr BELOW position */
2775 #line 681 "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 75: /* position ::= expr LEFT OF position */
2781 #line 682 "pikchr.y"
2782 {yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.x -= yymsp[-3].minor.yy265;}
2783 #line 2808 "pikchr.c"
2784 yymsp[-3].minor.yy43 = yylhsminor.yy43;
2785 break;
2786 case 76: /* position ::= expr RIGHT OF position */
2787 #line 683 "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 77: /* position ::= expr ON HEADING EDGEPT OF position */
2793 #line 685 "pikchr.y"
2794 {yylhsminor.yy43 = pik_position_at_hdg(yymsp[-5].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2795 #line 2820 "pikchr.c"
2796 yymsp[-5].minor.yy43 = yylhsminor.yy43;
2797 break;
2798 case 78: /* position ::= expr HEADING EDGEPT OF position */
2799 #line 687 "pikchr.y"
2800 {yylhsminor.yy43 = pik_position_at_hdg(yymsp[-4].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2801 #line 2826 "pikchr.c"
2802 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2803 break;
2804 case 79: /* position ::= expr EDGEPT OF position */
2805 #line 689 "pikchr.y"
2806 {yylhsminor.yy43 = pik_position_at_hdg(yymsp[-3].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2807 #line 2832 "pikchr.c"
2808 yymsp[-3].minor.yy43 = yylhsminor.yy43;
2809 break;
2810 case 80: /* position ::= expr ON HEADING expr FROM position */
2811 #line 691 "pikchr.y"
2812 {yylhsminor.yy43 = pik_position_at_angle(yymsp[-5].minor.yy265,yymsp[-2].minor.yy265,yymsp[0].minor.yy43);}
2813 #line 2838 "pikchr.c"
2814 yymsp[-5].minor.yy43 = yylhsminor.yy43;
2815 break;
2816 case 81: /* position ::= expr HEADING expr FROM position */
2817 #line 693 "pikchr.y"
2818 {yylhsminor.yy43 = pik_position_at_angle(yymsp[-4].minor.yy265,yymsp[-2].minor.yy265,yymsp[0].minor.yy43);}
2819 #line 2844 "pikchr.c"
2820 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2821 break;
2822 case 82: /* place ::= edge OF object */
2823 #line 705 "pikchr.y"
2824 {yylhsminor.yy43 = pik_place_of_elem(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2825 #line 2850 "pikchr.c"
2826 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2827 break;
2828 case 83: /* place2 ::= object */
2829 #line 706 "pikchr.y"
2830 {yylhsminor.yy43 = pik_place_of_elem(p,yymsp[0].minor.yy38,0);}
2831 #line 2856 "pikchr.c"
2832 yymsp[0].minor.yy43 = yylhsminor.yy43;
2833 break;
2834 case 84: /* place2 ::= object DOT_E edge */
2835 #line 707 "pikchr.y"
2836 {yylhsminor.yy43 = pik_place_of_elem(p,yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
2837 #line 2862 "pikchr.c"
2838 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2839 break;
2840 case 85: /* place2 ::= NTH VERTEX OF object */
2841 #line 708 "pikchr.y"
2842 {yylhsminor.yy43 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy38);}
2843 #line 2868 "pikchr.c"
2844 yymsp[-3].minor.yy43 = yylhsminor.yy43;
2845 break;
2846 case 86: /* object ::= nth */
2847 #line 720 "pikchr.y"
2848 {yylhsminor.yy38 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2849 #line 2874 "pikchr.c"
2850 yymsp[0].minor.yy38 = yylhsminor.yy38;
2851 break;
2852 case 87: /* object ::= nth OF|IN object */
2853 #line 721 "pikchr.y"
2854 {yylhsminor.yy38 = pik_find_nth(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2855 #line 2880 "pikchr.c"
2856 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2857 break;
2858 case 88: /* objectname ::= PLACENAME */
2859 #line 723 "pikchr.y"
2860 {yylhsminor.yy38 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2861 #line 2886 "pikchr.c"
2862 yymsp[0].minor.yy38 = yylhsminor.yy38;
2863 break;
2864 case 89: /* objectname ::= objectname DOT_U PLACENAME */
2865 #line 725 "pikchr.y"
2866 {yylhsminor.yy38 = pik_find_byname(p,yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
2867 #line 2892 "pikchr.c"
2868 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2869 break;
2870 case 90: /* nth ::= NTH CLASSNAME */
2871 #line 727 "pikchr.y"
2872 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2873 #line 2898 "pikchr.c"
2874 yymsp[-1].minor.yy0 = yylhsminor.yy0;
2875 break;
2876 case 91: /* nth ::= NTH LAST CLASSNAME */
2877 #line 728 "pikchr.y"
2878 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2879 #line 2904 "pikchr.c"
2880 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2881 break;
2882 case 92: /* nth ::= LAST CLASSNAME */
2883 #line 729 "pikchr.y"
2884 {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2885 #line 2910 "pikchr.c"
2886 break;
2887 case 93: /* nth ::= LAST */
2888 #line 730 "pikchr.y"
2889 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2890 #line 2915 "pikchr.c"
2891 yymsp[0].minor.yy0 = yylhsminor.yy0;
2892 break;
2893 case 94: /* nth ::= NTH LB RB */
2894 #line 731 "pikchr.y"
2895 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2896 #line 2921 "pikchr.c"
2897 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2898 break;
2899 case 95: /* nth ::= NTH LAST LB RB */
2900 #line 732 "pikchr.y"
2901 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2902 #line 2927 "pikchr.c"
2903 yymsp[-3].minor.yy0 = yylhsminor.yy0;
2904 break;
2905 case 96: /* nth ::= LAST LB RB */
2906 #line 733 "pikchr.y"
2907 {yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2908 #line 2933 "pikchr.c"
2909 break;
2910 case 97: /* expr ::= expr PLUS expr */
2911 #line 735 "pikchr.y"
2912 {yylhsminor.yy265=yymsp[-2].minor.yy265+yymsp[0].minor.yy265;}
2913 #line 2938 "pikchr.c"
2914 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2915 break;
2916 case 98: /* expr ::= expr MINUS expr */
2917 #line 736 "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 99: /* expr ::= expr STAR expr */
2923 #line 737 "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 100: /* expr ::= expr SLASH expr */
2929 #line 738 "pikchr.y"
2930 {
2931 if( yymsp[0].minor.yy265==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy265 = 0.0; }
2932 else{ yylhsminor.yy265 = yymsp[-2].minor.yy265/yymsp[0].minor.yy265; }
2933 }
2934 #line 2959 "pikchr.c"
2935 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2936 break;
2937 case 101: /* expr ::= MINUS expr */
2938 #line 742 "pikchr.y"
2939 {yymsp[-1].minor.yy265=-yymsp[0].minor.yy265;}
2940 #line 2965 "pikchr.c"
2941 break;
2942 case 102: /* expr ::= PLUS expr */
2943 #line 743 "pikchr.y"
2944 {yymsp[-1].minor.yy265=yymsp[0].minor.yy265;}
2945 #line 2970 "pikchr.c"
2946 break;
2947 case 103: /* expr ::= LP expr RP */
2948 #line 744 "pikchr.y"
2949 {yymsp[-2].minor.yy265=yymsp[-1].minor.yy265;}
2950 #line 2975 "pikchr.c"
2951 break;
2952 case 104: /* expr ::= LP FILL|COLOR|THICKNESS RP */
2953 #line 745 "pikchr.y"
2954 {yymsp[-2].minor.yy265=pik_get_var(p,&yymsp[-1].minor.yy0);}
2955 #line 2980 "pikchr.c"
2956 break;
2957 case 105: /* expr ::= NUMBER */
2958 #line 746 "pikchr.y"
2959 {yylhsminor.yy265=pik_atof(&yymsp[0].minor.yy0);}
2960 #line 2985 "pikchr.c"
2961 yymsp[0].minor.yy265 = yylhsminor.yy265;
2962 break;
2963 case 106: /* expr ::= ID */
2964 #line 747 "pikchr.y"
2965 {yylhsminor.yy265=pik_get_var(p,&yymsp[0].minor.yy0);}
2966 #line 2991 "pikchr.c"
2967 yymsp[0].minor.yy265 = yylhsminor.yy265;
2968 break;
2969 case 107: /* expr ::= FUNC1 LP expr RP */
2970 #line 748 "pikchr.y"
2971 {yylhsminor.yy265 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy265,0.0);}
2972 #line 2997 "pikchr.c"
2973 yymsp[-3].minor.yy265 = yylhsminor.yy265;
2974 break;
2975 case 108: /* expr ::= FUNC2 LP expr COMMA expr RP */
2976 #line 749 "pikchr.y"
2977 {yylhsminor.yy265 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy265,yymsp[-1].minor.yy265);}
2978 #line 3003 "pikchr.c"
2979 yymsp[-5].minor.yy265 = yylhsminor.yy265;
2980 break;
2981 case 109: /* expr ::= DIST LP position COMMA position RP */
2982 #line 750 "pikchr.y"
2983 {yymsp[-5].minor.yy265 = pik_dist(&yymsp[-3].minor.yy43,&yymsp[-1].minor.yy43);}
2984 #line 3009 "pikchr.c"
2985 break;
2986 case 110: /* expr ::= place2 DOT_XY X */
2987 #line 751 "pikchr.y"
2988 {yylhsminor.yy265 = yymsp[-2].minor.yy43.x;}
2989 #line 3014 "pikchr.c"
2990 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2991 break;
2992 case 111: /* expr ::= place2 DOT_XY Y */
2993 #line 752 "pikchr.y"
2994 {yylhsminor.yy265 = yymsp[-2].minor.yy43.y;}
2995 #line 3020 "pikchr.c"
2996 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2997 break;
2998 case 112: /* expr ::= object DOT_L numproperty */
2999 case 113: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==113);
3000 case 114: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==114);
3001 #line 753 "pikchr.y"
3002 {yylhsminor.yy265=pik_property_of(yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
3003 #line 3028 "pikchr.c"
3004 yymsp[-2].minor.yy265 = yylhsminor.yy265;
3005 break;
3006 default:
3007 /* (115) lvalue ::= ID */ yytestcase(yyruleno==115);
3008 /* (116) lvalue ::= FILL */ yytestcase(yyruleno==116);
@@ -3101,19 +3105,19 @@
3101 ){
3102 pik_parserARG_FETCH
3103 pik_parserCTX_FETCH
3104 #define TOKEN yyminor
3105 /************ Begin %syntax_error code ****************************************/
3106 #line 514 "pikchr.y"
3107
3108 if( TOKEN.z && TOKEN.z[0] ){
3109 pik_error(p, &TOKEN, "syntax error");
3110 }else{
3111 pik_error(p, 0, "syntax error");
3112 }
3113 UNUSED_PARAMETER(yymajor);
3114 #line 3139 "pikchr.c"
3115 /************ End %syntax_error code ******************************************/
3116 pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
3117 pik_parserCTX_STORE
3118 }
3119
@@ -3342,16 +3346,17 @@
3342 #else
3343 (void)iToken;
3344 return 0;
3345 #endif
3346 }
3347 #line 758 "pikchr.y"
3348
3349
3350
3351 /* Chart of the 140 official HTML color names with their
3352 ** corresponding RGB value.
 
3353 **
3354 ** Two new names "None" and "Off" are added with a value
3355 ** of -1.
3356 */
3357 static const struct {
@@ -3359,11 +3364,11 @@
3359 int val; /* RGB value */
3360 } aColor[] = {
3361 { "AliceBlue", 0xf0f8ff },
3362 { "AntiqueWhite", 0xfaebd7 },
3363 { "Aqua", 0x00ffff },
3364 { "AquaMarine", 0x7fffd4 },
3365 { "Azure", 0xf0ffff },
3366 { "Beige", 0xf5f5dc },
3367 { "Bisque", 0xffe4c4 },
3368 { "Black", 0x000000 },
3369 { "BlanchedAlmond", 0xffebcd },
@@ -3373,19 +3378,20 @@
3373 { "BurlyWood", 0xdeb887 },
3374 { "CadetBlue", 0x5f9ea0 },
3375 { "Chartreuse", 0x7fff00 },
3376 { "Chocolate", 0xd2691e },
3377 { "Coral", 0xff7f50 },
3378 { "CornFlowerBlue", 0x6495ed },
3379 { "Cornsilk", 0xfff8dc },
3380 { "Crimson", 0xdc143c },
3381 { "Cyan", 0x00ffff },
3382 { "DarkBlue", 0x00008b },
3383 { "DarkCyan", 0x008b8b },
3384 { "DarkGoldenRod", 0xb8860b },
3385 { "DarkGray", 0xa9a9a9 },
3386 { "DarkGreen", 0x006400 },
 
3387 { "DarkKhaki", 0xbdb76b },
3388 { "DarkMagenta", 0x8b008b },
3389 { "DarkOliveGreen", 0x556b2f },
3390 { "DarkOrange", 0xff8c00 },
3391 { "DarkOrchid", 0x9932cc },
@@ -3392,28 +3398,31 @@
3392 { "DarkRed", 0x8b0000 },
3393 { "DarkSalmon", 0xe9967a },
3394 { "DarkSeaGreen", 0x8fbc8f },
3395 { "DarkSlateBlue", 0x483d8b },
3396 { "DarkSlateGray", 0x2f4f4f },
 
3397 { "DarkTurquoise", 0x00ced1 },
3398 { "DarkViolet", 0x9400d3 },
3399 { "DeepPink", 0xff1493 },
3400 { "DeepSkyBlue", 0x00bfff },
3401 { "DimGray", 0x696969 },
 
3402 { "DodgerBlue", 0x1e90ff },
3403 { "FireBrick", 0xb22222 },
3404 { "FloralWhite", 0xfffaf0 },
3405 { "ForestGreen", 0x228b22 },
3406 { "Fuchsia", 0xff00ff },
3407 { "Gainsboro", 0xdcdcdc },
3408 { "GhostWhite", 0xf8f8ff },
3409 { "Gold", 0xffd700 },
3410 { "GoldenRod", 0xdaa520 },
3411 { "Gray", 0x808080 },
3412 { "Green", 0x008000 },
3413 { "GreenYellow", 0xadff2f },
3414 { "HoneyDew", 0xf0fff0 },
 
3415 { "HotPink", 0xff69b4 },
3416 { "IndianRed", 0xcd5c5c },
3417 { "Indigo", 0x4b0082 },
3418 { "Ivory", 0xfffff0 },
3419 { "Khaki", 0xf0e68c },
@@ -3425,26 +3434,28 @@
3425 { "LightCoral", 0xf08080 },
3426 { "LightCyan", 0xe0ffff },
3427 { "LightGoldenrodYellow", 0xfafad2 },
3428 { "LightGray", 0xd3d3d3 },
3429 { "LightGreen", 0x90ee90 },
 
3430 { "LightPink", 0xffb6c1 },
3431 { "LightSalmon", 0xffa07a },
3432 { "LightSeaGreen", 0x20b2aa },
3433 { "LightSkyBlue", 0x87cefa },
3434 { "LightSlateGray", 0x778899 },
 
3435 { "LightSteelBlue", 0xb0c4de },
3436 { "LightYellow", 0xffffe0 },
3437 { "Lime", 0x00ff00 },
3438 { "LimeGreen", 0x32cd32 },
3439 { "Linen", 0xfaf0e6 },
3440 { "Magenta", 0xff00ff },
3441 { "Maroon", 0x800000 },
3442 { "MediumAquaMarine", 0x66cdaa },
3443 { "MediumBlue", 0x0000cd },
3444 { "MediumOrchid", 0xba55d3 },
3445 { "MediumPurple", 0x9370d8 },
3446 { "MediumSeaGreen", 0x3cb371 },
3447 { "MediumSlateBlue", 0x7b68ee },
3448 { "MediumSpringGreen", 0x00fa9a },
3449 { "MediumTurquoise", 0x48d1cc },
3450 { "MediumVioletRed", 0xc71585 },
@@ -3460,11 +3471,11 @@
3460 { "Olive", 0x808000 },
3461 { "OliveDrab", 0x6b8e23 },
3462 { "Orange", 0xffa500 },
3463 { "OrangeRed", 0xff4500 },
3464 { "Orchid", 0xda70d6 },
3465 { "PaleGoldenRod", 0xeee8aa },
3466 { "PaleGreen", 0x98fb98 },
3467 { "PaleTurquoise", 0xafeeee },
3468 { "PaleVioletRed", 0xdb7093 },
3469 { "PapayaWhip", 0xffefd5 },
3470 { "PeachPuff", 0xffdab9 },
@@ -3471,23 +3482,25 @@
3471 { "Peru", 0xcd853f },
3472 { "Pink", 0xffc0cb },
3473 { "Plum", 0xdda0dd },
3474 { "PowderBlue", 0xb0e0e6 },
3475 { "Purple", 0x800080 },
 
3476 { "Red", 0xff0000 },
3477 { "RosyBrown", 0xbc8f8f },
3478 { "RoyalBlue", 0x4169e1 },
3479 { "SaddleBrown", 0x8b4513 },
3480 { "Salmon", 0xfa8072 },
3481 { "SandyBrown", 0xf4a460 },
3482 { "SeaGreen", 0x2e8b57 },
3483 { "SeaShell", 0xfff5ee },
3484 { "Sienna", 0xa0522d },
3485 { "Silver", 0xc0c0c0 },
3486 { "SkyBlue", 0x87ceeb },
3487 { "SlateBlue", 0x6a5acd },
3488 { "SlateGray", 0x708090 },
 
3489 { "Snow", 0xfffafa },
3490 { "SpringGreen", 0x00ff7f },
3491 { "SteelBlue", 0x4682b4 },
3492 { "Tan", 0xd2b48c },
3493 { "Teal", 0x008080 },
@@ -4552,10 +4565,32 @@
4552 (double)pPt->x, (double)pPt->y);
4553 buf[sizeof(buf)-1] = 0;
4554 pik_append(p, z, -1);
4555 pik_append(p, buf, -1);
4556 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4557
4558 /* Append a PNum value surrounded by text. Do coordinate transformations
4559 ** on the value.
4560 */
4561 static void pik_append_x(Pik *p, const char *z1, PNum v, const char *z2){
@@ -4588,13 +4623,15 @@
4588 pik_append(p, buf, -1);
4589 }
4590 static void pik_append_clr(Pik *p, const char *z1, PNum v, const char *z2){
4591 char buf[200];
4592 int x = (int)v;
4593 int r = (x>>16) & 0xff;
4594 int g = (x>>8) & 0xff;
4595 int b = x & 0xff;
 
 
4596 snprintf(buf, sizeof(buf)-1, "%srgb(%d,%d,%d)%s", z1, r, g, b, z2);
4597 buf[sizeof(buf)-1] = 0;
4598 pik_append(p, buf, -1);
4599 }
4600
@@ -7620,10 +7657,11 @@
7620 int i;
7621 int bSvgOnly = 0; /* Output SVG only. No HTML wrapper */
7622 int bDontStop = 0; /* Continue in spite of errors */
7623 int exitCode = 0; /* What to return */
7624 int mFlags = 0; /* mFlags argument to pikchr() */
 
7625 const char *zHtmlHdr =
7626 "<!DOCTYPE html>\n"
7627 "<html lang=\"en-US\">\n"
7628 "<head>\n<title>PIKCHR Test</title>\n"
7629 "<style>\n"
@@ -7657,10 +7695,14 @@
7657 char *z = argv[i];
7658 z++;
7659 if( z[0]=='-' ) z++;
7660 if( strcmp(z,"dont-stop")==0 ){
7661 bDontStop = 1;
 
 
 
 
7662 }else
7663 if( strcmp(z,"svg-only")==0 ){
7664 if( zHtmlHdr==0 ){
7665 fprintf(stderr, "the \"%s\" option must come first\n",argv[i]);
7666 exit(1);
@@ -7706,11 +7748,12 @@
7706 printf("<h1>File %s</h1>\n", argv[i]);
7707 if( w<0 ){
7708 printf("<p>ERROR</p>\n%s\n", zOut);
7709 }else{
7710 printf("<div id=\"svg-%d\" onclick=\"toggleHidden('svg-%d')\">\n",i,i);
7711 printf("<div style='border:3px solid lightgray;max-width:%dpx;'>\n",w);
 
7712 printf("%s</div>\n", zOut);
7713 printf("<pre class='hidden'>");
7714 print_escape_html(zIn);
7715 printf("</pre>\n</div>\n");
7716 }
@@ -7783,6 +7826,6 @@
7783
7784
7785 #endif /* PIKCHR_TCL */
7786
7787
7788 #line 7813 "pikchr.c"
7789
--- src/pikchr.c
+++ src/pikchr.c
@@ -379,10 +379,14 @@
379 ** argument to pikchr() in order to cause error message text to come out
380 ** as text/plain instead of as text/html
381 */
382 #define PIKCHR_PLAINTEXT_ERRORS 0x0001
383
384 /* Include PIKCHR_DARK_MODE among the mFlag bits to invert colors.
385 */
386 #define PIKCHR_DARK_MODE 0x0002
387
388 /*
389 ** The behavior of an object class is defined by an instance of
390 ** this structure. This is the "virtual method" table.
391 */
392 struct PClass {
@@ -468,11 +472,11 @@
472 static PObj *pik_position_assert(Pik*,PPoint*,PToken*,PPoint*);
473 static PNum pik_dist(PPoint*,PPoint*);
474 static void pik_add_macro(Pik*,PToken *pId,PToken *pCode);
475
476
477 #line 503 "pikchr.c"
478 /**************** End of %include directives **********************************/
479 /* These constants specify the various numeric values for terminal symbols.
480 ***************** Begin token definitions *************************************/
481 #ifndef T_ID
482 #define T_ID 1
@@ -1685,22 +1689,22 @@
1689 ** inside the C code.
1690 */
1691 /********* Begin destructor definitions ***************************************/
1692 case 98: /* statement_list */
1693 {
1694 #line 492 "pikchr.y"
1695 pik_elist_free(p,(yypminor->yy119));
1696 #line 1721 "pikchr.c"
1697 }
1698 break;
1699 case 99: /* statement */
1700 case 100: /* unnamed_statement */
1701 case 101: /* basetype */
1702 {
1703 #line 494 "pikchr.y"
1704 pik_elem_free(p,(yypminor->yy38));
1705 #line 1730 "pikchr.c"
1706 }
1707 break;
1708 /********* End destructor definitions *****************************************/
1709 default: break; /* If no destructor action specified: do nothing */
1710 }
@@ -1914,14 +1918,14 @@
1918 #endif
1919 while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
1920 /* Here code is inserted which will execute if the parser
1921 ** stack every overflows */
1922 /******** Begin %stack_overflow code ******************************************/
1923 #line 526 "pikchr.y"
1924
1925 pik_error(p, 0, "parser stack overflow");
1926 #line 1951 "pikchr.c"
1927 /******** End %stack_overflow code ********************************************/
1928 pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
1929 pik_parserCTX_STORE
1930 }
1931
@@ -2395,614 +2399,614 @@
2399 ** break;
2400 */
2401 /********** Begin reduce actions **********************************************/
2402 YYMINORTYPE yylhsminor;
2403 case 0: /* document ::= statement_list */
2404 #line 530 "pikchr.y"
2405 {pik_render(p,yymsp[0].minor.yy119);}
2406 #line 2431 "pikchr.c"
2407 break;
2408 case 1: /* statement_list ::= statement */
2409 #line 533 "pikchr.y"
2410 { yylhsminor.yy119 = pik_elist_append(p,0,yymsp[0].minor.yy38); }
2411 #line 2436 "pikchr.c"
2412 yymsp[0].minor.yy119 = yylhsminor.yy119;
2413 break;
2414 case 2: /* statement_list ::= statement_list EOL statement */
2415 #line 535 "pikchr.y"
2416 { yylhsminor.yy119 = pik_elist_append(p,yymsp[-2].minor.yy119,yymsp[0].minor.yy38); }
2417 #line 2442 "pikchr.c"
2418 yymsp[-2].minor.yy119 = yylhsminor.yy119;
2419 break;
2420 case 3: /* statement ::= */
2421 #line 538 "pikchr.y"
2422 { yymsp[1].minor.yy38 = 0; }
2423 #line 2448 "pikchr.c"
2424 break;
2425 case 4: /* statement ::= direction */
2426 #line 539 "pikchr.y"
2427 { pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy38=0; }
2428 #line 2453 "pikchr.c"
2429 yymsp[0].minor.yy38 = yylhsminor.yy38;
2430 break;
2431 case 5: /* statement ::= lvalue ASSIGN rvalue */
2432 #line 540 "pikchr.y"
2433 {pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy265,&yymsp[-1].minor.yy0); yylhsminor.yy38=0;}
2434 #line 2459 "pikchr.c"
2435 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2436 break;
2437 case 6: /* statement ::= PLACENAME COLON unnamed_statement */
2438 #line 542 "pikchr.y"
2439 { yylhsminor.yy38 = yymsp[0].minor.yy38; pik_elem_setname(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0); }
2440 #line 2465 "pikchr.c"
2441 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2442 break;
2443 case 7: /* statement ::= PLACENAME COLON position */
2444 #line 544 "pikchr.y"
2445 { yylhsminor.yy38 = pik_elem_new(p,0,0,0);
2446 if(yylhsminor.yy38){ yylhsminor.yy38->ptAt = yymsp[0].minor.yy43; pik_elem_setname(p,yylhsminor.yy38,&yymsp[-2].minor.yy0); }}
2447 #line 2472 "pikchr.c"
2448 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2449 break;
2450 case 8: /* statement ::= unnamed_statement */
2451 #line 546 "pikchr.y"
2452 {yylhsminor.yy38 = yymsp[0].minor.yy38;}
2453 #line 2478 "pikchr.c"
2454 yymsp[0].minor.yy38 = yylhsminor.yy38;
2455 break;
2456 case 9: /* statement ::= print prlist */
2457 #line 547 "pikchr.y"
2458 {pik_append(p,"<br>\n",5); yymsp[-1].minor.yy38=0;}
2459 #line 2484 "pikchr.c"
2460 break;
2461 case 10: /* statement ::= ASSERT LP expr EQ expr RP */
2462 #line 552 "pikchr.y"
2463 {yymsp[-5].minor.yy38=pik_assert(p,yymsp[-3].minor.yy265,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy265);}
2464 #line 2489 "pikchr.c"
2465 break;
2466 case 11: /* statement ::= ASSERT LP position EQ position RP */
2467 #line 554 "pikchr.y"
2468 {yymsp[-5].minor.yy38=pik_position_assert(p,&yymsp[-3].minor.yy43,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy43);}
2469 #line 2494 "pikchr.c"
2470 break;
2471 case 12: /* statement ::= DEFINE ID CODEBLOCK */
2472 #line 555 "pikchr.y"
2473 {yymsp[-2].minor.yy38=0; pik_add_macro(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
2474 #line 2499 "pikchr.c"
2475 break;
2476 case 13: /* rvalue ::= PLACENAME */
2477 #line 566 "pikchr.y"
2478 {yylhsminor.yy265 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2479 #line 2504 "pikchr.c"
2480 yymsp[0].minor.yy265 = yylhsminor.yy265;
2481 break;
2482 case 14: /* pritem ::= FILL */
2483 case 15: /* pritem ::= COLOR */ yytestcase(yyruleno==15);
2484 case 16: /* pritem ::= THICKNESS */ yytestcase(yyruleno==16);
2485 #line 571 "pikchr.y"
2486 {pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2487 #line 2512 "pikchr.c"
2488 break;
2489 case 17: /* pritem ::= rvalue */
2490 #line 574 "pikchr.y"
2491 {pik_append_num(p,"",yymsp[0].minor.yy265);}
2492 #line 2517 "pikchr.c"
2493 break;
2494 case 18: /* pritem ::= STRING */
2495 #line 575 "pikchr.y"
2496 {pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2497 #line 2522 "pikchr.c"
2498 break;
2499 case 19: /* prsep ::= COMMA */
2500 #line 576 "pikchr.y"
2501 {pik_append(p, " ", 1);}
2502 #line 2527 "pikchr.c"
2503 break;
2504 case 20: /* unnamed_statement ::= basetype attribute_list */
2505 #line 579 "pikchr.y"
2506 {yylhsminor.yy38 = yymsp[-1].minor.yy38; pik_after_adding_attributes(p,yylhsminor.yy38);}
2507 #line 2532 "pikchr.c"
2508 yymsp[-1].minor.yy38 = yylhsminor.yy38;
2509 break;
2510 case 21: /* basetype ::= CLASSNAME */
2511 #line 581 "pikchr.y"
2512 {yylhsminor.yy38 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2513 #line 2538 "pikchr.c"
2514 yymsp[0].minor.yy38 = yylhsminor.yy38;
2515 break;
2516 case 22: /* basetype ::= STRING textposition */
2517 #line 583 "pikchr.y"
2518 {yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy196; yylhsminor.yy38 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2519 #line 2544 "pikchr.c"
2520 yymsp[-1].minor.yy38 = yylhsminor.yy38;
2521 break;
2522 case 23: /* basetype ::= LB savelist statement_list RB */
2523 #line 585 "pikchr.y"
2524 { p->list = yymsp[-2].minor.yy119; yymsp[-3].minor.yy38 = pik_elem_new(p,0,0,yymsp[-1].minor.yy119); if(yymsp[-3].minor.yy38) yymsp[-3].minor.yy38->errTok = yymsp[0].minor.yy0; }
2525 #line 2550 "pikchr.c"
2526 break;
2527 case 24: /* savelist ::= */
2528 #line 590 "pikchr.y"
2529 {yymsp[1].minor.yy119 = p->list; p->list = 0;}
2530 #line 2555 "pikchr.c"
2531 break;
2532 case 25: /* relexpr ::= expr */
2533 #line 597 "pikchr.y"
2534 {yylhsminor.yy200.rAbs = yymsp[0].minor.yy265; yylhsminor.yy200.rRel = 0;}
2535 #line 2560 "pikchr.c"
2536 yymsp[0].minor.yy200 = yylhsminor.yy200;
2537 break;
2538 case 26: /* relexpr ::= expr PERCENT */
2539 #line 598 "pikchr.y"
2540 {yylhsminor.yy200.rAbs = 0; yylhsminor.yy200.rRel = yymsp[-1].minor.yy265/100;}
2541 #line 2566 "pikchr.c"
2542 yymsp[-1].minor.yy200 = yylhsminor.yy200;
2543 break;
2544 case 27: /* optrelexpr ::= */
2545 #line 600 "pikchr.y"
2546 {yymsp[1].minor.yy200.rAbs = 0; yymsp[1].minor.yy200.rRel = 1.0;}
2547 #line 2572 "pikchr.c"
2548 break;
2549 case 28: /* attribute_list ::= relexpr alist */
2550 #line 602 "pikchr.y"
2551 {pik_add_direction(p,0,&yymsp[-1].minor.yy200);}
2552 #line 2577 "pikchr.c"
2553 break;
2554 case 29: /* attribute ::= numproperty relexpr */
2555 #line 606 "pikchr.y"
2556 { pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy200); }
2557 #line 2582 "pikchr.c"
2558 break;
2559 case 30: /* attribute ::= dashproperty expr */
2560 #line 607 "pikchr.y"
2561 { pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy265); }
2562 #line 2587 "pikchr.c"
2563 break;
2564 case 31: /* attribute ::= dashproperty */
2565 #line 608 "pikchr.y"
2566 { pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2567 #line 2592 "pikchr.c"
2568 break;
2569 case 32: /* attribute ::= colorproperty rvalue */
2570 #line 609 "pikchr.y"
2571 { pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy265); }
2572 #line 2597 "pikchr.c"
2573 break;
2574 case 33: /* attribute ::= go direction optrelexpr */
2575 #line 610 "pikchr.y"
2576 { pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy200);}
2577 #line 2602 "pikchr.c"
2578 break;
2579 case 34: /* attribute ::= go direction even position */
2580 #line 611 "pikchr.y"
2581 {pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy43);}
2582 #line 2607 "pikchr.c"
2583 break;
2584 case 35: /* attribute ::= CLOSE */
2585 #line 612 "pikchr.y"
2586 { pik_close_path(p,&yymsp[0].minor.yy0); }
2587 #line 2612 "pikchr.c"
2588 break;
2589 case 36: /* attribute ::= CHOP */
2590 #line 613 "pikchr.y"
2591 { p->cur->bChop = 1; }
2592 #line 2617 "pikchr.c"
2593 break;
2594 case 37: /* attribute ::= FROM position */
2595 #line 614 "pikchr.y"
2596 { pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy43); }
2597 #line 2622 "pikchr.c"
2598 break;
2599 case 38: /* attribute ::= TO position */
2600 #line 615 "pikchr.y"
2601 { pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy43); }
2602 #line 2627 "pikchr.c"
2603 break;
2604 case 39: /* attribute ::= THEN */
2605 #line 616 "pikchr.y"
2606 { pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2607 #line 2632 "pikchr.c"
2608 break;
2609 case 40: /* attribute ::= THEN optrelexpr HEADING expr */
2610 case 42: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==42);
2611 #line 618 "pikchr.y"
2612 {pik_move_hdg(p,&yymsp[-2].minor.yy200,&yymsp[-1].minor.yy0,yymsp[0].minor.yy265,0,&yymsp[-3].minor.yy0);}
2613 #line 2638 "pikchr.c"
2614 break;
2615 case 41: /* attribute ::= THEN optrelexpr EDGEPT */
2616 case 43: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==43);
2617 #line 619 "pikchr.y"
2618 {pik_move_hdg(p,&yymsp[-1].minor.yy200,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2619 #line 2644 "pikchr.c"
2620 break;
2621 case 44: /* attribute ::= AT position */
2622 #line 624 "pikchr.y"
2623 { pik_set_at(p,0,&yymsp[0].minor.yy43,&yymsp[-1].minor.yy0); }
2624 #line 2649 "pikchr.c"
2625 break;
2626 case 45: /* attribute ::= SAME */
2627 #line 626 "pikchr.y"
2628 {pik_same(p,0,&yymsp[0].minor.yy0);}
2629 #line 2654 "pikchr.c"
2630 break;
2631 case 46: /* attribute ::= SAME AS object */
2632 #line 627 "pikchr.y"
2633 {pik_same(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2634 #line 2659 "pikchr.c"
2635 break;
2636 case 47: /* attribute ::= STRING textposition */
2637 #line 628 "pikchr.y"
2638 {pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy196);}
2639 #line 2664 "pikchr.c"
2640 break;
2641 case 48: /* attribute ::= FIT */
2642 #line 629 "pikchr.y"
2643 {pik_size_to_fit(p,&yymsp[0].minor.yy0,3); }
2644 #line 2669 "pikchr.c"
2645 break;
2646 case 49: /* attribute ::= BEHIND object */
2647 #line 630 "pikchr.y"
2648 {pik_behind(p,yymsp[0].minor.yy38);}
2649 #line 2674 "pikchr.c"
2650 break;
2651 case 50: /* withclause ::= DOT_E edge AT position */
2652 case 51: /* withclause ::= edge AT position */ yytestcase(yyruleno==51);
2653 #line 638 "pikchr.y"
2654 { pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy43,&yymsp[-1].minor.yy0); }
2655 #line 2680 "pikchr.c"
2656 break;
2657 case 52: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2658 #line 642 "pikchr.y"
2659 {yylhsminor.yy0 = yymsp[0].minor.yy0;}
2660 #line 2685 "pikchr.c"
2661 yymsp[0].minor.yy0 = yylhsminor.yy0;
2662 break;
2663 case 53: /* boolproperty ::= CW */
2664 #line 653 "pikchr.y"
2665 {p->cur->cw = 1;}
2666 #line 2691 "pikchr.c"
2667 break;
2668 case 54: /* boolproperty ::= CCW */
2669 #line 654 "pikchr.y"
2670 {p->cur->cw = 0;}
2671 #line 2696 "pikchr.c"
2672 break;
2673 case 55: /* boolproperty ::= LARROW */
2674 #line 655 "pikchr.y"
2675 {p->cur->larrow=1; p->cur->rarrow=0; }
2676 #line 2701 "pikchr.c"
2677 break;
2678 case 56: /* boolproperty ::= RARROW */
2679 #line 656 "pikchr.y"
2680 {p->cur->larrow=0; p->cur->rarrow=1; }
2681 #line 2706 "pikchr.c"
2682 break;
2683 case 57: /* boolproperty ::= LRARROW */
2684 #line 657 "pikchr.y"
2685 {p->cur->larrow=1; p->cur->rarrow=1; }
2686 #line 2711 "pikchr.c"
2687 break;
2688 case 58: /* boolproperty ::= INVIS */
2689 #line 658 "pikchr.y"
2690 {p->cur->sw = 0.0;}
2691 #line 2716 "pikchr.c"
2692 break;
2693 case 59: /* boolproperty ::= THICK */
2694 #line 659 "pikchr.y"
2695 {p->cur->sw *= 1.5;}
2696 #line 2721 "pikchr.c"
2697 break;
2698 case 60: /* boolproperty ::= THIN */
2699 #line 660 "pikchr.y"
2700 {p->cur->sw *= 0.67;}
2701 #line 2726 "pikchr.c"
2702 break;
2703 case 61: /* boolproperty ::= SOLID */
2704 #line 661 "pikchr.y"
2705 {p->cur->sw = pik_value(p,"thickness",9,0);
2706 p->cur->dotted = p->cur->dashed = 0.0;}
2707 #line 2732 "pikchr.c"
2708 break;
2709 case 62: /* textposition ::= */
2710 #line 664 "pikchr.y"
2711 {yymsp[1].minor.yy196 = 0;}
2712 #line 2737 "pikchr.c"
2713 break;
2714 case 63: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2715 #line 667 "pikchr.y"
2716 {yylhsminor.yy196 = pik_text_position(yymsp[-1].minor.yy196,&yymsp[0].minor.yy0);}
2717 #line 2742 "pikchr.c"
2718 yymsp[-1].minor.yy196 = yylhsminor.yy196;
2719 break;
2720 case 64: /* position ::= expr COMMA expr */
2721 #line 670 "pikchr.y"
2722 {yylhsminor.yy43.x=yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[0].minor.yy265;}
2723 #line 2748 "pikchr.c"
2724 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2725 break;
2726 case 65: /* position ::= place PLUS expr COMMA expr */
2727 #line 672 "pikchr.y"
2728 {yylhsminor.yy43.x=yymsp[-4].minor.yy43.x+yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[-4].minor.yy43.y+yymsp[0].minor.yy265;}
2729 #line 2754 "pikchr.c"
2730 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2731 break;
2732 case 66: /* position ::= place MINUS expr COMMA expr */
2733 #line 673 "pikchr.y"
2734 {yylhsminor.yy43.x=yymsp[-4].minor.yy43.x-yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[-4].minor.yy43.y-yymsp[0].minor.yy265;}
2735 #line 2760 "pikchr.c"
2736 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2737 break;
2738 case 67: /* position ::= place PLUS LP expr COMMA expr RP */
2739 #line 675 "pikchr.y"
2740 {yylhsminor.yy43.x=yymsp[-6].minor.yy43.x+yymsp[-3].minor.yy265; yylhsminor.yy43.y=yymsp[-6].minor.yy43.y+yymsp[-1].minor.yy265;}
2741 #line 2766 "pikchr.c"
2742 yymsp[-6].minor.yy43 = yylhsminor.yy43;
2743 break;
2744 case 68: /* position ::= place MINUS LP expr COMMA expr RP */
2745 #line 677 "pikchr.y"
2746 {yylhsminor.yy43.x=yymsp[-6].minor.yy43.x-yymsp[-3].minor.yy265; yylhsminor.yy43.y=yymsp[-6].minor.yy43.y-yymsp[-1].minor.yy265;}
2747 #line 2772 "pikchr.c"
2748 yymsp[-6].minor.yy43 = yylhsminor.yy43;
2749 break;
2750 case 69: /* position ::= LP position COMMA position RP */
2751 #line 678 "pikchr.y"
2752 {yymsp[-4].minor.yy43.x=yymsp[-3].minor.yy43.x; yymsp[-4].minor.yy43.y=yymsp[-1].minor.yy43.y;}
2753 #line 2778 "pikchr.c"
2754 break;
2755 case 70: /* position ::= LP position RP */
2756 #line 679 "pikchr.y"
2757 {yymsp[-2].minor.yy43=yymsp[-1].minor.yy43;}
2758 #line 2783 "pikchr.c"
2759 break;
2760 case 71: /* position ::= expr between position AND position */
2761 #line 681 "pikchr.y"
2762 {yylhsminor.yy43 = pik_position_between(yymsp[-4].minor.yy265,yymsp[-2].minor.yy43,yymsp[0].minor.yy43);}
2763 #line 2788 "pikchr.c"
2764 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2765 break;
2766 case 72: /* position ::= expr LT position COMMA position GT */
2767 #line 683 "pikchr.y"
2768 {yylhsminor.yy43 = pik_position_between(yymsp[-5].minor.yy265,yymsp[-3].minor.yy43,yymsp[-1].minor.yy43);}
2769 #line 2794 "pikchr.c"
2770 yymsp[-5].minor.yy43 = yylhsminor.yy43;
2771 break;
2772 case 73: /* position ::= expr ABOVE position */
2773 #line 684 "pikchr.y"
2774 {yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.y += yymsp[-2].minor.yy265;}
2775 #line 2800 "pikchr.c"
2776 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2777 break;
2778 case 74: /* position ::= expr BELOW position */
2779 #line 685 "pikchr.y"
2780 {yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.y -= yymsp[-2].minor.yy265;}
2781 #line 2806 "pikchr.c"
2782 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2783 break;
2784 case 75: /* position ::= expr LEFT OF position */
2785 #line 686 "pikchr.y"
2786 {yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.x -= yymsp[-3].minor.yy265;}
2787 #line 2812 "pikchr.c"
2788 yymsp[-3].minor.yy43 = yylhsminor.yy43;
2789 break;
2790 case 76: /* position ::= expr RIGHT OF position */
2791 #line 687 "pikchr.y"
2792 {yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.x += yymsp[-3].minor.yy265;}
2793 #line 2818 "pikchr.c"
2794 yymsp[-3].minor.yy43 = yylhsminor.yy43;
2795 break;
2796 case 77: /* position ::= expr ON HEADING EDGEPT OF position */
2797 #line 689 "pikchr.y"
2798 {yylhsminor.yy43 = pik_position_at_hdg(yymsp[-5].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2799 #line 2824 "pikchr.c"
2800 yymsp[-5].minor.yy43 = yylhsminor.yy43;
2801 break;
2802 case 78: /* position ::= expr HEADING EDGEPT OF position */
2803 #line 691 "pikchr.y"
2804 {yylhsminor.yy43 = pik_position_at_hdg(yymsp[-4].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2805 #line 2830 "pikchr.c"
2806 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2807 break;
2808 case 79: /* position ::= expr EDGEPT OF position */
2809 #line 693 "pikchr.y"
2810 {yylhsminor.yy43 = pik_position_at_hdg(yymsp[-3].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2811 #line 2836 "pikchr.c"
2812 yymsp[-3].minor.yy43 = yylhsminor.yy43;
2813 break;
2814 case 80: /* position ::= expr ON HEADING expr FROM position */
2815 #line 695 "pikchr.y"
2816 {yylhsminor.yy43 = pik_position_at_angle(yymsp[-5].minor.yy265,yymsp[-2].minor.yy265,yymsp[0].minor.yy43);}
2817 #line 2842 "pikchr.c"
2818 yymsp[-5].minor.yy43 = yylhsminor.yy43;
2819 break;
2820 case 81: /* position ::= expr HEADING expr FROM position */
2821 #line 697 "pikchr.y"
2822 {yylhsminor.yy43 = pik_position_at_angle(yymsp[-4].minor.yy265,yymsp[-2].minor.yy265,yymsp[0].minor.yy43);}
2823 #line 2848 "pikchr.c"
2824 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2825 break;
2826 case 82: /* place ::= edge OF object */
2827 #line 709 "pikchr.y"
2828 {yylhsminor.yy43 = pik_place_of_elem(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2829 #line 2854 "pikchr.c"
2830 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2831 break;
2832 case 83: /* place2 ::= object */
2833 #line 710 "pikchr.y"
2834 {yylhsminor.yy43 = pik_place_of_elem(p,yymsp[0].minor.yy38,0);}
2835 #line 2860 "pikchr.c"
2836 yymsp[0].minor.yy43 = yylhsminor.yy43;
2837 break;
2838 case 84: /* place2 ::= object DOT_E edge */
2839 #line 711 "pikchr.y"
2840 {yylhsminor.yy43 = pik_place_of_elem(p,yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
2841 #line 2866 "pikchr.c"
2842 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2843 break;
2844 case 85: /* place2 ::= NTH VERTEX OF object */
2845 #line 712 "pikchr.y"
2846 {yylhsminor.yy43 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy38);}
2847 #line 2872 "pikchr.c"
2848 yymsp[-3].minor.yy43 = yylhsminor.yy43;
2849 break;
2850 case 86: /* object ::= nth */
2851 #line 724 "pikchr.y"
2852 {yylhsminor.yy38 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2853 #line 2878 "pikchr.c"
2854 yymsp[0].minor.yy38 = yylhsminor.yy38;
2855 break;
2856 case 87: /* object ::= nth OF|IN object */
2857 #line 725 "pikchr.y"
2858 {yylhsminor.yy38 = pik_find_nth(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2859 #line 2884 "pikchr.c"
2860 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2861 break;
2862 case 88: /* objectname ::= PLACENAME */
2863 #line 727 "pikchr.y"
2864 {yylhsminor.yy38 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2865 #line 2890 "pikchr.c"
2866 yymsp[0].minor.yy38 = yylhsminor.yy38;
2867 break;
2868 case 89: /* objectname ::= objectname DOT_U PLACENAME */
2869 #line 729 "pikchr.y"
2870 {yylhsminor.yy38 = pik_find_byname(p,yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
2871 #line 2896 "pikchr.c"
2872 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2873 break;
2874 case 90: /* nth ::= NTH CLASSNAME */
2875 #line 731 "pikchr.y"
2876 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2877 #line 2902 "pikchr.c"
2878 yymsp[-1].minor.yy0 = yylhsminor.yy0;
2879 break;
2880 case 91: /* nth ::= NTH LAST CLASSNAME */
2881 #line 732 "pikchr.y"
2882 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2883 #line 2908 "pikchr.c"
2884 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2885 break;
2886 case 92: /* nth ::= LAST CLASSNAME */
2887 #line 733 "pikchr.y"
2888 {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2889 #line 2914 "pikchr.c"
2890 break;
2891 case 93: /* nth ::= LAST */
2892 #line 734 "pikchr.y"
2893 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2894 #line 2919 "pikchr.c"
2895 yymsp[0].minor.yy0 = yylhsminor.yy0;
2896 break;
2897 case 94: /* nth ::= NTH LB RB */
2898 #line 735 "pikchr.y"
2899 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2900 #line 2925 "pikchr.c"
2901 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2902 break;
2903 case 95: /* nth ::= NTH LAST LB RB */
2904 #line 736 "pikchr.y"
2905 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2906 #line 2931 "pikchr.c"
2907 yymsp[-3].minor.yy0 = yylhsminor.yy0;
2908 break;
2909 case 96: /* nth ::= LAST LB RB */
2910 #line 737 "pikchr.y"
2911 {yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2912 #line 2937 "pikchr.c"
2913 break;
2914 case 97: /* expr ::= expr PLUS expr */
2915 #line 739 "pikchr.y"
2916 {yylhsminor.yy265=yymsp[-2].minor.yy265+yymsp[0].minor.yy265;}
2917 #line 2942 "pikchr.c"
2918 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2919 break;
2920 case 98: /* expr ::= expr MINUS expr */
2921 #line 740 "pikchr.y"
2922 {yylhsminor.yy265=yymsp[-2].minor.yy265-yymsp[0].minor.yy265;}
2923 #line 2948 "pikchr.c"
2924 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2925 break;
2926 case 99: /* expr ::= expr STAR expr */
2927 #line 741 "pikchr.y"
2928 {yylhsminor.yy265=yymsp[-2].minor.yy265*yymsp[0].minor.yy265;}
2929 #line 2954 "pikchr.c"
2930 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2931 break;
2932 case 100: /* expr ::= expr SLASH expr */
2933 #line 742 "pikchr.y"
2934 {
2935 if( yymsp[0].minor.yy265==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy265 = 0.0; }
2936 else{ yylhsminor.yy265 = yymsp[-2].minor.yy265/yymsp[0].minor.yy265; }
2937 }
2938 #line 2963 "pikchr.c"
2939 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2940 break;
2941 case 101: /* expr ::= MINUS expr */
2942 #line 746 "pikchr.y"
2943 {yymsp[-1].minor.yy265=-yymsp[0].minor.yy265;}
2944 #line 2969 "pikchr.c"
2945 break;
2946 case 102: /* expr ::= PLUS expr */
2947 #line 747 "pikchr.y"
2948 {yymsp[-1].minor.yy265=yymsp[0].minor.yy265;}
2949 #line 2974 "pikchr.c"
2950 break;
2951 case 103: /* expr ::= LP expr RP */
2952 #line 748 "pikchr.y"
2953 {yymsp[-2].minor.yy265=yymsp[-1].minor.yy265;}
2954 #line 2979 "pikchr.c"
2955 break;
2956 case 104: /* expr ::= LP FILL|COLOR|THICKNESS RP */
2957 #line 749 "pikchr.y"
2958 {yymsp[-2].minor.yy265=pik_get_var(p,&yymsp[-1].minor.yy0);}
2959 #line 2984 "pikchr.c"
2960 break;
2961 case 105: /* expr ::= NUMBER */
2962 #line 750 "pikchr.y"
2963 {yylhsminor.yy265=pik_atof(&yymsp[0].minor.yy0);}
2964 #line 2989 "pikchr.c"
2965 yymsp[0].minor.yy265 = yylhsminor.yy265;
2966 break;
2967 case 106: /* expr ::= ID */
2968 #line 751 "pikchr.y"
2969 {yylhsminor.yy265=pik_get_var(p,&yymsp[0].minor.yy0);}
2970 #line 2995 "pikchr.c"
2971 yymsp[0].minor.yy265 = yylhsminor.yy265;
2972 break;
2973 case 107: /* expr ::= FUNC1 LP expr RP */
2974 #line 752 "pikchr.y"
2975 {yylhsminor.yy265 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy265,0.0);}
2976 #line 3001 "pikchr.c"
2977 yymsp[-3].minor.yy265 = yylhsminor.yy265;
2978 break;
2979 case 108: /* expr ::= FUNC2 LP expr COMMA expr RP */
2980 #line 753 "pikchr.y"
2981 {yylhsminor.yy265 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy265,yymsp[-1].minor.yy265);}
2982 #line 3007 "pikchr.c"
2983 yymsp[-5].minor.yy265 = yylhsminor.yy265;
2984 break;
2985 case 109: /* expr ::= DIST LP position COMMA position RP */
2986 #line 754 "pikchr.y"
2987 {yymsp[-5].minor.yy265 = pik_dist(&yymsp[-3].minor.yy43,&yymsp[-1].minor.yy43);}
2988 #line 3013 "pikchr.c"
2989 break;
2990 case 110: /* expr ::= place2 DOT_XY X */
2991 #line 755 "pikchr.y"
2992 {yylhsminor.yy265 = yymsp[-2].minor.yy43.x;}
2993 #line 3018 "pikchr.c"
2994 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2995 break;
2996 case 111: /* expr ::= place2 DOT_XY Y */
2997 #line 756 "pikchr.y"
2998 {yylhsminor.yy265 = yymsp[-2].minor.yy43.y;}
2999 #line 3024 "pikchr.c"
3000 yymsp[-2].minor.yy265 = yylhsminor.yy265;
3001 break;
3002 case 112: /* expr ::= object DOT_L numproperty */
3003 case 113: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==113);
3004 case 114: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==114);
3005 #line 757 "pikchr.y"
3006 {yylhsminor.yy265=pik_property_of(yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
3007 #line 3032 "pikchr.c"
3008 yymsp[-2].minor.yy265 = yylhsminor.yy265;
3009 break;
3010 default:
3011 /* (115) lvalue ::= ID */ yytestcase(yyruleno==115);
3012 /* (116) lvalue ::= FILL */ yytestcase(yyruleno==116);
@@ -3101,19 +3105,19 @@
3105 ){
3106 pik_parserARG_FETCH
3107 pik_parserCTX_FETCH
3108 #define TOKEN yyminor
3109 /************ Begin %syntax_error code ****************************************/
3110 #line 518 "pikchr.y"
3111
3112 if( TOKEN.z && TOKEN.z[0] ){
3113 pik_error(p, &TOKEN, "syntax error");
3114 }else{
3115 pik_error(p, 0, "syntax error");
3116 }
3117 UNUSED_PARAMETER(yymajor);
3118 #line 3143 "pikchr.c"
3119 /************ End %syntax_error code ******************************************/
3120 pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
3121 pik_parserCTX_STORE
3122 }
3123
@@ -3342,16 +3346,17 @@
3346 #else
3347 (void)iToken;
3348 return 0;
3349 #endif
3350 }
3351 #line 762 "pikchr.y"
3352
3353
3354
3355 /* Chart of the 148 official CSS color names with their
3356 ** corresponding RGB values thru Color Module Level 4:
3357 ** https://developer.mozilla.org/en-US/docs/Web/CSS/color_value
3358 **
3359 ** Two new names "None" and "Off" are added with a value
3360 ** of -1.
3361 */
3362 static const struct {
@@ -3359,11 +3364,11 @@
3364 int val; /* RGB value */
3365 } aColor[] = {
3366 { "AliceBlue", 0xf0f8ff },
3367 { "AntiqueWhite", 0xfaebd7 },
3368 { "Aqua", 0x00ffff },
3369 { "Aquamarine", 0x7fffd4 },
3370 { "Azure", 0xf0ffff },
3371 { "Beige", 0xf5f5dc },
3372 { "Bisque", 0xffe4c4 },
3373 { "Black", 0x000000 },
3374 { "BlanchedAlmond", 0xffebcd },
@@ -3373,19 +3378,20 @@
3378 { "BurlyWood", 0xdeb887 },
3379 { "CadetBlue", 0x5f9ea0 },
3380 { "Chartreuse", 0x7fff00 },
3381 { "Chocolate", 0xd2691e },
3382 { "Coral", 0xff7f50 },
3383 { "CornflowerBlue", 0x6495ed },
3384 { "Cornsilk", 0xfff8dc },
3385 { "Crimson", 0xdc143c },
3386 { "Cyan", 0x00ffff },
3387 { "DarkBlue", 0x00008b },
3388 { "DarkCyan", 0x008b8b },
3389 { "DarkGoldenrod", 0xb8860b },
3390 { "DarkGray", 0xa9a9a9 },
3391 { "DarkGreen", 0x006400 },
3392 { "DarkGrey", 0xa9a9a9 },
3393 { "DarkKhaki", 0xbdb76b },
3394 { "DarkMagenta", 0x8b008b },
3395 { "DarkOliveGreen", 0x556b2f },
3396 { "DarkOrange", 0xff8c00 },
3397 { "DarkOrchid", 0x9932cc },
@@ -3392,28 +3398,31 @@
3398 { "DarkRed", 0x8b0000 },
3399 { "DarkSalmon", 0xe9967a },
3400 { "DarkSeaGreen", 0x8fbc8f },
3401 { "DarkSlateBlue", 0x483d8b },
3402 { "DarkSlateGray", 0x2f4f4f },
3403 { "DarkSlateGrey", 0x2f4f4f },
3404 { "DarkTurquoise", 0x00ced1 },
3405 { "DarkViolet", 0x9400d3 },
3406 { "DeepPink", 0xff1493 },
3407 { "DeepSkyBlue", 0x00bfff },
3408 { "DimGray", 0x696969 },
3409 { "DimGrey", 0x696969 },
3410 { "DodgerBlue", 0x1e90ff },
3411 { "Firebrick", 0xb22222 },
3412 { "FloralWhite", 0xfffaf0 },
3413 { "ForestGreen", 0x228b22 },
3414 { "Fuchsia", 0xff00ff },
3415 { "Gainsboro", 0xdcdcdc },
3416 { "GhostWhite", 0xf8f8ff },
3417 { "Gold", 0xffd700 },
3418 { "Goldenrod", 0xdaa520 },
3419 { "Gray", 0x808080 },
3420 { "Green", 0x008000 },
3421 { "GreenYellow", 0xadff2f },
3422 { "Grey", 0x808080 },
3423 { "Honeydew", 0xf0fff0 },
3424 { "HotPink", 0xff69b4 },
3425 { "IndianRed", 0xcd5c5c },
3426 { "Indigo", 0x4b0082 },
3427 { "Ivory", 0xfffff0 },
3428 { "Khaki", 0xf0e68c },
@@ -3425,26 +3434,28 @@
3434 { "LightCoral", 0xf08080 },
3435 { "LightCyan", 0xe0ffff },
3436 { "LightGoldenrodYellow", 0xfafad2 },
3437 { "LightGray", 0xd3d3d3 },
3438 { "LightGreen", 0x90ee90 },
3439 { "LightGrey", 0xd3d3d3 },
3440 { "LightPink", 0xffb6c1 },
3441 { "LightSalmon", 0xffa07a },
3442 { "LightSeaGreen", 0x20b2aa },
3443 { "LightSkyBlue", 0x87cefa },
3444 { "LightSlateGray", 0x778899 },
3445 { "LightSlateGrey", 0x778899 },
3446 { "LightSteelBlue", 0xb0c4de },
3447 { "LightYellow", 0xffffe0 },
3448 { "Lime", 0x00ff00 },
3449 { "LimeGreen", 0x32cd32 },
3450 { "Linen", 0xfaf0e6 },
3451 { "Magenta", 0xff00ff },
3452 { "Maroon", 0x800000 },
3453 { "MediumAquamarine", 0x66cdaa },
3454 { "MediumBlue", 0x0000cd },
3455 { "MediumOrchid", 0xba55d3 },
3456 { "MediumPurple", 0x9370db },
3457 { "MediumSeaGreen", 0x3cb371 },
3458 { "MediumSlateBlue", 0x7b68ee },
3459 { "MediumSpringGreen", 0x00fa9a },
3460 { "MediumTurquoise", 0x48d1cc },
3461 { "MediumVioletRed", 0xc71585 },
@@ -3460,11 +3471,11 @@
3471 { "Olive", 0x808000 },
3472 { "OliveDrab", 0x6b8e23 },
3473 { "Orange", 0xffa500 },
3474 { "OrangeRed", 0xff4500 },
3475 { "Orchid", 0xda70d6 },
3476 { "PaleGoldenrod", 0xeee8aa },
3477 { "PaleGreen", 0x98fb98 },
3478 { "PaleTurquoise", 0xafeeee },
3479 { "PaleVioletRed", 0xdb7093 },
3480 { "PapayaWhip", 0xffefd5 },
3481 { "PeachPuff", 0xffdab9 },
@@ -3471,23 +3482,25 @@
3482 { "Peru", 0xcd853f },
3483 { "Pink", 0xffc0cb },
3484 { "Plum", 0xdda0dd },
3485 { "PowderBlue", 0xb0e0e6 },
3486 { "Purple", 0x800080 },
3487 { "RebeccaPurple", 0x663399 },
3488 { "Red", 0xff0000 },
3489 { "RosyBrown", 0xbc8f8f },
3490 { "RoyalBlue", 0x4169e1 },
3491 { "SaddleBrown", 0x8b4513 },
3492 { "Salmon", 0xfa8072 },
3493 { "SandyBrown", 0xf4a460 },
3494 { "SeaGreen", 0x2e8b57 },
3495 { "Seashell", 0xfff5ee },
3496 { "Sienna", 0xa0522d },
3497 { "Silver", 0xc0c0c0 },
3498 { "SkyBlue", 0x87ceeb },
3499 { "SlateBlue", 0x6a5acd },
3500 { "SlateGray", 0x708090 },
3501 { "SlateGrey", 0x708090 },
3502 { "Snow", 0xfffafa },
3503 { "SpringGreen", 0x00ff7f },
3504 { "SteelBlue", 0x4682b4 },
3505 { "Tan", 0xd2b48c },
3506 { "Teal", 0x008080 },
@@ -4552,10 +4565,32 @@
4565 (double)pPt->x, (double)pPt->y);
4566 buf[sizeof(buf)-1] = 0;
4567 pik_append(p, z, -1);
4568 pik_append(p, buf, -1);
4569 }
4570
4571 /*
4572 ** Invert the RGB color so that it is appropriate for dark mode.
4573 */
4574 static int pik_color_to_dark_mode(int x){
4575 int r, g, b;
4576 int mn, mx;
4577 x = 0xffffff - x;
4578 r = (x>>16) & 0xff;
4579 g = (x>>8) & 0xff;
4580 b = x & 0xff;
4581 mx = r;
4582 if( g>mx ) mx = g;
4583 if( b>mx ) mx = b;
4584 mn = r;
4585 if( g<mn ) mn = g;
4586 if( b<mn ) mn = b;
4587 r = mn + (mx-r);
4588 g = mn + (mx-g);
4589 b = mn + (mx-b);
4590 return r*0x10000 + g*0x100 + b;
4591 }
4592
4593 /* Append a PNum value surrounded by text. Do coordinate transformations
4594 ** on the value.
4595 */
4596 static void pik_append_x(Pik *p, const char *z1, PNum v, const char *z2){
@@ -4588,13 +4623,15 @@
4623 pik_append(p, buf, -1);
4624 }
4625 static void pik_append_clr(Pik *p, const char *z1, PNum v, const char *z2){
4626 char buf[200];
4627 int x = (int)v;
4628 int r, g, b;
4629 if( p->mFlags & PIKCHR_DARK_MODE ) x = pik_color_to_dark_mode(x);
4630 r = (x>>16) & 0xff;
4631 g = (x>>8) & 0xff;
4632 b = x & 0xff;
4633 snprintf(buf, sizeof(buf)-1, "%srgb(%d,%d,%d)%s", z1, r, g, b, z2);
4634 buf[sizeof(buf)-1] = 0;
4635 pik_append(p, buf, -1);
4636 }
4637
@@ -7620,10 +7657,11 @@
7657 int i;
7658 int bSvgOnly = 0; /* Output SVG only. No HTML wrapper */
7659 int bDontStop = 0; /* Continue in spite of errors */
7660 int exitCode = 0; /* What to return */
7661 int mFlags = 0; /* mFlags argument to pikchr() */
7662 const char *zStyle = ""; /* Extra styling */
7663 const char *zHtmlHdr =
7664 "<!DOCTYPE html>\n"
7665 "<html lang=\"en-US\">\n"
7666 "<head>\n<title>PIKCHR Test</title>\n"
7667 "<style>\n"
@@ -7657,10 +7695,14 @@
7695 char *z = argv[i];
7696 z++;
7697 if( z[0]=='-' ) z++;
7698 if( strcmp(z,"dont-stop")==0 ){
7699 bDontStop = 1;
7700 }else
7701 if( strcmp(z,"dark-mode")==0 ){
7702 zStyle = "color:white;background-color:black;";
7703 mFlags |= PIKCHR_DARK_MODE;
7704 }else
7705 if( strcmp(z,"svg-only")==0 ){
7706 if( zHtmlHdr==0 ){
7707 fprintf(stderr, "the \"%s\" option must come first\n",argv[i]);
7708 exit(1);
@@ -7706,11 +7748,12 @@
7748 printf("<h1>File %s</h1>\n", argv[i]);
7749 if( w<0 ){
7750 printf("<p>ERROR</p>\n%s\n", zOut);
7751 }else{
7752 printf("<div id=\"svg-%d\" onclick=\"toggleHidden('svg-%d')\">\n",i,i);
7753 printf("<div style='border:3px solid lightgray;max-width:%dpx;%s'>\n",
7754 w,zStyle);
7755 printf("%s</div>\n", zOut);
7756 printf("<pre class='hidden'>");
7757 print_escape_html(zIn);
7758 printf("</pre>\n</div>\n");
7759 }
@@ -7783,6 +7826,6 @@
7826
7827
7828 #endif /* PIKCHR_TCL */
7829
7830
7831 #line 7856 "pikchr.c"
7832
--- src/pikchrshow.c
+++ src/pikchrshow.c
@@ -22,16 +22,17 @@
2222
#include <ctype.h>
2323
#include "pikchrshow.h"
2424
2525
#if INTERFACE
2626
/* These are described in pikchr_process()'s docs. */
27
-#define PIKCHR_PROCESS_TH1 0x01
28
-#define PIKCHR_PROCESS_TH1_NOSVG 0x02
29
-#define PIKCHR_PROCESS_NONCE 0x04
30
-#define PIKCHR_PROCESS_ERR_PRE 0x08
31
-#define PIKCHR_PROCESS_SRC 0x10
32
-#define PIKCHR_PROCESS_DIV 0x20
27
+#define PIKCHR_PROCESS_PASSTHROUGH 0x0003 /* Pass through these flags */
28
+#define PIKCHR_PROCESS_TH1 0x0004
29
+#define PIKCHR_PROCESS_TH1_NOSVG 0x0008
30
+#define PIKCHR_PROCESS_NONCE 0x0010
31
+#define PIKCHR_PROCESS_ERR_PRE 0x0020
32
+#define PIKCHR_PROCESS_SRC 0x0040
33
+#define PIKCHR_PROCESS_DIV 0x0080
3334
#define PIKCHR_PROCESS_DIV_INDENT 0x0100
3435
#define PIKCHR_PROCESS_DIV_CENTER 0x0200
3536
#define PIKCHR_PROCESS_DIV_FLOAT_LEFT 0x0400
3637
#define PIKCHR_PROCESS_DIV_FLOAT_RIGHT 0x0800
3738
#define PIKCHR_PROCESS_DIV_TOGGLE 0x1000
@@ -159,11 +160,11 @@
159160
}else{
160161
int w = 0, h = 0;
161162
const char * zContent = blob_str(&bIn);
162163
char *zOut;
163164
zOut = pikchr(zContent, "pikchr",
164
- 0x01/*==>PIKCHR_PLAINTEXT_ERRORS*/,
165
+ 0x01 | (pikFlags&PIKCHR_PROCESS_PASSTHROUGH),
165166
&w, &h);
166167
if( w>0 && h>0 ){
167168
const char * zClassToggle = "";
168169
const char * zClassSource = "";
169170
const char * zWrapperClass = "";
170171
--- src/pikchrshow.c
+++ src/pikchrshow.c
@@ -22,16 +22,17 @@
22 #include <ctype.h>
23 #include "pikchrshow.h"
24
25 #if INTERFACE
26 /* These are described in pikchr_process()'s docs. */
27 #define PIKCHR_PROCESS_TH1 0x01
28 #define PIKCHR_PROCESS_TH1_NOSVG 0x02
29 #define PIKCHR_PROCESS_NONCE 0x04
30 #define PIKCHR_PROCESS_ERR_PRE 0x08
31 #define PIKCHR_PROCESS_SRC 0x10
32 #define PIKCHR_PROCESS_DIV 0x20
 
33 #define PIKCHR_PROCESS_DIV_INDENT 0x0100
34 #define PIKCHR_PROCESS_DIV_CENTER 0x0200
35 #define PIKCHR_PROCESS_DIV_FLOAT_LEFT 0x0400
36 #define PIKCHR_PROCESS_DIV_FLOAT_RIGHT 0x0800
37 #define PIKCHR_PROCESS_DIV_TOGGLE 0x1000
@@ -159,11 +160,11 @@
159 }else{
160 int w = 0, h = 0;
161 const char * zContent = blob_str(&bIn);
162 char *zOut;
163 zOut = pikchr(zContent, "pikchr",
164 0x01/*==>PIKCHR_PLAINTEXT_ERRORS*/,
165 &w, &h);
166 if( w>0 && h>0 ){
167 const char * zClassToggle = "";
168 const char * zClassSource = "";
169 const char * zWrapperClass = "";
170
--- src/pikchrshow.c
+++ src/pikchrshow.c
@@ -22,16 +22,17 @@
22 #include <ctype.h>
23 #include "pikchrshow.h"
24
25 #if INTERFACE
26 /* These are described in pikchr_process()'s docs. */
27 #define PIKCHR_PROCESS_PASSTHROUGH 0x0003 /* Pass through these flags */
28 #define PIKCHR_PROCESS_TH1 0x0004
29 #define PIKCHR_PROCESS_TH1_NOSVG 0x0008
30 #define PIKCHR_PROCESS_NONCE 0x0010
31 #define PIKCHR_PROCESS_ERR_PRE 0x0020
32 #define PIKCHR_PROCESS_SRC 0x0040
33 #define PIKCHR_PROCESS_DIV 0x0080
34 #define PIKCHR_PROCESS_DIV_INDENT 0x0100
35 #define PIKCHR_PROCESS_DIV_CENTER 0x0200
36 #define PIKCHR_PROCESS_DIV_FLOAT_LEFT 0x0400
37 #define PIKCHR_PROCESS_DIV_FLOAT_RIGHT 0x0800
38 #define PIKCHR_PROCESS_DIV_TOGGLE 0x1000
@@ -159,11 +160,11 @@
160 }else{
161 int w = 0, h = 0;
162 const char * zContent = blob_str(&bIn);
163 char *zOut;
164 zOut = pikchr(zContent, "pikchr",
165 0x01 | (pikFlags&PIKCHR_PROCESS_PASSTHROUGH),
166 &w, &h);
167 if( w>0 && h>0 ){
168 const char * zClassToggle = "";
169 const char * zClassSource = "";
170 const char * zWrapperClass = "";
171

Keyboard Shortcuts

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