Fossil

Check-in [71c4db598a]
Login

Check-in [71c4db598a]

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Automatically invert Pikchr colors in dark mode skins, based on the "white-foreground" setting.
Downloads: Tarball | ZIP archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 71c4db598ad4c2459eb876a205f7522e7384bf19c3ed6cb9b9882d9e19ab2449
User & Date: drh 2020-11-09 19:21:16.590
Context
2020-11-09
20:45
Improvements to the dark-mode color inversion algorthm in Pikchr. ... (check-in: 919fa97ed4 user: drh tags: trunk)
19:21
Automatically invert Pikchr colors in dark mode skins, based on the "white-foreground" setting. ... (check-in: 71c4db598a user: drh tags: trunk)
2020-11-07
13:28
Styling improvements: (1) Change the "style_footer()" interface to "style_finish_page()" and give it a parameter which is the page type. (2) Enhance the CSS to make use of the page type. ... (check-in: 3d6444fc4a user: drh tags: trunk)
Changes
Unified Diff Ignore Whitespace Patch
Changes to src/markdown_html.c.
367
368
369
370
371
372
373



374
375
376
377
378
379
380
      pikFlags |= PIKCHR_PROCESS_DIV_SOURCE;
    }else if( i==13 && strncmp(zArg, "source-inline", 13)==0 ){
      pikFlags |= PIKCHR_PROCESS_DIV_SOURCE_INLINE;
    }
    while( i<nArg && fossil_isspace(zArg[i]) ){ i++; }
    zArg += i;
    nArg -= i;



  }
  blob_append(&bSrc, zSrc, nSrc)
    /*have to dup input to ensure a NUL-terminated source string */;
  pikchr_process(blob_str(&bSrc), pikFlags, 0, ob);
  blob_reset(&bSrc);
}








>
>
>







367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
      pikFlags |= PIKCHR_PROCESS_DIV_SOURCE;
    }else if( i==13 && strncmp(zArg, "source-inline", 13)==0 ){
      pikFlags |= PIKCHR_PROCESS_DIV_SOURCE_INLINE;
    }
    while( i<nArg && fossil_isspace(zArg[i]) ){ i++; }
    zArg += i;
    nArg -= i;
  }
  if( skin_detail_boolean("white-foreground") ){
    pikFlags |= 0x02;  /* PIKCHR_DARK_MODE */
  }
  blob_append(&bSrc, zSrc, nSrc)
    /*have to dup input to ensure a NUL-terminated source string */;
  pikchr_process(blob_str(&bSrc), pikFlags, 0, ob);
  blob_reset(&bSrc);
}

Changes to src/pikchr.c.
377
378
379
380
381
382
383




384
385
386
387
388
389
390

/* Include PIKCHR_PLAINTEXT_ERRORS among the bits of mFlags on the 3rd
** argument to pikchr() in order to cause error message text to come out
** as text/plain instead of as text/html
*/
#define PIKCHR_PLAINTEXT_ERRORS 0x0001





/*
** The behavior of an object class is defined by an instance of
** this structure. This is the "virtual method" table.
*/
struct PClass {
  const char *zName;                     /* Name of class */
  char isLine;                           /* True if a line class */







>
>
>
>







377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394

/* Include PIKCHR_PLAINTEXT_ERRORS among the bits of mFlags on the 3rd
** argument to pikchr() in order to cause error message text to come out
** as text/plain instead of as text/html
*/
#define PIKCHR_PLAINTEXT_ERRORS 0x0001

/* Include PIKCHR_DARK_MODE among the mFlag bits to invert colors.
*/
#define PIKCHR_DARK_MODE        0x0002

/*
** The behavior of an object class is defined by an instance of
** this structure. This is the "virtual method" table.
*/
struct PClass {
  const char *zName;                     /* Name of class */
  char isLine;                           /* True if a line class */
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
static void pik_behind(Pik*,PObj*);
static PObj *pik_assert(Pik*,PNum,PToken*,PNum);
static PObj *pik_position_assert(Pik*,PPoint*,PToken*,PPoint*);
static PNum pik_dist(PPoint*,PPoint*);
static void pik_add_macro(Pik*,PToken *pId,PToken *pCode);


#line 499 "pikchr.c"
/**************** End of %include directives **********************************/
/* These constants specify the various numeric values for terminal symbols.
***************** Begin token definitions *************************************/
#ifndef T_ID
#define T_ID                              1
#define T_EDGEPT                          2
#define T_OF                              3







|







470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
static void pik_behind(Pik*,PObj*);
static PObj *pik_assert(Pik*,PNum,PToken*,PNum);
static PObj *pik_position_assert(Pik*,PPoint*,PToken*,PPoint*);
static PNum pik_dist(PPoint*,PPoint*);
static void pik_add_macro(Pik*,PToken *pId,PToken *pCode);


#line 503 "pikchr.c"
/**************** End of %include directives **********************************/
/* These constants specify the various numeric values for terminal symbols.
***************** Begin token definitions *************************************/
#ifndef T_ID
#define T_ID                              1
#define T_EDGEPT                          2
#define T_OF                              3
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
    ** Note: during a reduce, the only symbols destroyed are those
    ** which appear on the RHS of the rule, but which are *not* used
    ** inside the C code.
    */
/********* Begin destructor definitions ***************************************/
    case 98: /* statement_list */
{
#line 488 "pikchr.y"
pik_elist_free(p,(yypminor->yy119));
#line 1717 "pikchr.c"
}
      break;
    case 99: /* statement */
    case 100: /* unnamed_statement */
    case 101: /* basetype */
{
#line 490 "pikchr.y"
pik_elem_free(p,(yypminor->yy38));
#line 1726 "pikchr.c"
}
      break;
/********* End destructor definitions *****************************************/
    default:  break;   /* If no destructor action specified: do nothing */
  }
}








|

|






|

|







1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
    ** Note: during a reduce, the only symbols destroyed are those
    ** which appear on the RHS of the rule, but which are *not* used
    ** inside the C code.
    */
/********* Begin destructor definitions ***************************************/
    case 98: /* statement_list */
{
#line 492 "pikchr.y"
pik_elist_free(p,(yypminor->yy119));
#line 1721 "pikchr.c"
}
      break;
    case 99: /* statement */
    case 100: /* unnamed_statement */
    case 101: /* basetype */
{
#line 494 "pikchr.y"
pik_elem_free(p,(yypminor->yy38));
#line 1730 "pikchr.c"
}
      break;
/********* End destructor definitions *****************************************/
    default:  break;   /* If no destructor action specified: do nothing */
  }
}

1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
     fprintf(yyTraceFILE,"%sStack Overflow!\n",yyTracePrompt);
   }
#endif
   while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
   /* Here code is inserted which will execute if the parser
   ** stack every overflows */
/******** Begin %stack_overflow code ******************************************/
#line 522 "pikchr.y"

  pik_error(p, 0, "parser stack overflow");
#line 1947 "pikchr.c"
/******** End %stack_overflow code ********************************************/
   pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
   pik_parserCTX_STORE
}

/*
** Print tracing information for a SHIFT action







|


|







1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
     fprintf(yyTraceFILE,"%sStack Overflow!\n",yyTracePrompt);
   }
#endif
   while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
   /* Here code is inserted which will execute if the parser
   ** stack every overflows */
/******** Begin %stack_overflow code ******************************************/
#line 526 "pikchr.y"

  pik_error(p, 0, "parser stack overflow");
#line 1951 "pikchr.c"
/******** End %stack_overflow code ********************************************/
   pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
   pik_parserCTX_STORE
}

/*
** Print tracing information for a SHIFT action
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
  **     { ... }           // User supplied code
  **  #line <lineno> <thisfile>
  **     break;
  */
/********** Begin reduce actions **********************************************/
        YYMINORTYPE yylhsminor;
      case 0: /* document ::= statement_list */
#line 526 "pikchr.y"
{pik_render(p,yymsp[0].minor.yy119);}
#line 2427 "pikchr.c"
        break;
      case 1: /* statement_list ::= statement */
#line 529 "pikchr.y"
{ yylhsminor.yy119 = pik_elist_append(p,0,yymsp[0].minor.yy38); }
#line 2432 "pikchr.c"
  yymsp[0].minor.yy119 = yylhsminor.yy119;
        break;
      case 2: /* statement_list ::= statement_list EOL statement */
#line 531 "pikchr.y"
{ yylhsminor.yy119 = pik_elist_append(p,yymsp[-2].minor.yy119,yymsp[0].minor.yy38); }
#line 2438 "pikchr.c"
  yymsp[-2].minor.yy119 = yylhsminor.yy119;
        break;
      case 3: /* statement ::= */
#line 534 "pikchr.y"
{ yymsp[1].minor.yy38 = 0; }
#line 2444 "pikchr.c"
        break;
      case 4: /* statement ::= direction */
#line 535 "pikchr.y"
{ pik_set_direction(p,yymsp[0].minor.yy0.eCode);  yylhsminor.yy38=0; }
#line 2449 "pikchr.c"
  yymsp[0].minor.yy38 = yylhsminor.yy38;
        break;
      case 5: /* statement ::= lvalue ASSIGN rvalue */
#line 536 "pikchr.y"
{pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy265,&yymsp[-1].minor.yy0); yylhsminor.yy38=0;}
#line 2455 "pikchr.c"
  yymsp[-2].minor.yy38 = yylhsminor.yy38;
        break;
      case 6: /* statement ::= PLACENAME COLON unnamed_statement */
#line 538 "pikchr.y"
{ yylhsminor.yy38 = yymsp[0].minor.yy38;  pik_elem_setname(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0); }
#line 2461 "pikchr.c"
  yymsp[-2].minor.yy38 = yylhsminor.yy38;
        break;
      case 7: /* statement ::= PLACENAME COLON position */
#line 540 "pikchr.y"
{ yylhsminor.yy38 = pik_elem_new(p,0,0,0);
                 if(yylhsminor.yy38){ yylhsminor.yy38->ptAt = yymsp[0].minor.yy43; pik_elem_setname(p,yylhsminor.yy38,&yymsp[-2].minor.yy0); }}
#line 2468 "pikchr.c"
  yymsp[-2].minor.yy38 = yylhsminor.yy38;
        break;
      case 8: /* statement ::= unnamed_statement */
#line 542 "pikchr.y"
{yylhsminor.yy38 = yymsp[0].minor.yy38;}
#line 2474 "pikchr.c"
  yymsp[0].minor.yy38 = yylhsminor.yy38;
        break;
      case 9: /* statement ::= print prlist */
#line 543 "pikchr.y"
{pik_append(p,"<br>\n",5); yymsp[-1].minor.yy38=0;}
#line 2480 "pikchr.c"
        break;
      case 10: /* statement ::= ASSERT LP expr EQ expr RP */
#line 548 "pikchr.y"
{yymsp[-5].minor.yy38=pik_assert(p,yymsp[-3].minor.yy265,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy265);}
#line 2485 "pikchr.c"
        break;
      case 11: /* statement ::= ASSERT LP position EQ position RP */
#line 550 "pikchr.y"
{yymsp[-5].minor.yy38=pik_position_assert(p,&yymsp[-3].minor.yy43,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy43);}
#line 2490 "pikchr.c"
        break;
      case 12: /* statement ::= DEFINE ID CODEBLOCK */
#line 551 "pikchr.y"
{yymsp[-2].minor.yy38=0; pik_add_macro(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
#line 2495 "pikchr.c"
        break;
      case 13: /* rvalue ::= PLACENAME */
#line 562 "pikchr.y"
{yylhsminor.yy265 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
#line 2500 "pikchr.c"
  yymsp[0].minor.yy265 = yylhsminor.yy265;
        break;
      case 14: /* pritem ::= FILL */
      case 15: /* pritem ::= COLOR */ yytestcase(yyruleno==15);
      case 16: /* pritem ::= THICKNESS */ yytestcase(yyruleno==16);
#line 567 "pikchr.y"
{pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
#line 2508 "pikchr.c"
        break;
      case 17: /* pritem ::= rvalue */
#line 570 "pikchr.y"
{pik_append_num(p,"",yymsp[0].minor.yy265);}
#line 2513 "pikchr.c"
        break;
      case 18: /* pritem ::= STRING */
#line 571 "pikchr.y"
{pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
#line 2518 "pikchr.c"
        break;
      case 19: /* prsep ::= COMMA */
#line 572 "pikchr.y"
{pik_append(p, " ", 1);}
#line 2523 "pikchr.c"
        break;
      case 20: /* unnamed_statement ::= basetype attribute_list */
#line 575 "pikchr.y"
{yylhsminor.yy38 = yymsp[-1].minor.yy38; pik_after_adding_attributes(p,yylhsminor.yy38);}
#line 2528 "pikchr.c"
  yymsp[-1].minor.yy38 = yylhsminor.yy38;
        break;
      case 21: /* basetype ::= CLASSNAME */
#line 577 "pikchr.y"
{yylhsminor.yy38 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
#line 2534 "pikchr.c"
  yymsp[0].minor.yy38 = yylhsminor.yy38;
        break;
      case 22: /* basetype ::= STRING textposition */
#line 579 "pikchr.y"
{yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy196; yylhsminor.yy38 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
#line 2540 "pikchr.c"
  yymsp[-1].minor.yy38 = yylhsminor.yy38;
        break;
      case 23: /* basetype ::= LB savelist statement_list RB */
#line 581 "pikchr.y"
{ 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; }
#line 2546 "pikchr.c"
        break;
      case 24: /* savelist ::= */
#line 586 "pikchr.y"
{yymsp[1].minor.yy119 = p->list; p->list = 0;}
#line 2551 "pikchr.c"
        break;
      case 25: /* relexpr ::= expr */
#line 593 "pikchr.y"
{yylhsminor.yy200.rAbs = yymsp[0].minor.yy265; yylhsminor.yy200.rRel = 0;}
#line 2556 "pikchr.c"
  yymsp[0].minor.yy200 = yylhsminor.yy200;
        break;
      case 26: /* relexpr ::= expr PERCENT */
#line 594 "pikchr.y"
{yylhsminor.yy200.rAbs = 0; yylhsminor.yy200.rRel = yymsp[-1].minor.yy265/100;}
#line 2562 "pikchr.c"
  yymsp[-1].minor.yy200 = yylhsminor.yy200;
        break;
      case 27: /* optrelexpr ::= */
#line 596 "pikchr.y"
{yymsp[1].minor.yy200.rAbs = 0; yymsp[1].minor.yy200.rRel = 1.0;}
#line 2568 "pikchr.c"
        break;
      case 28: /* attribute_list ::= relexpr alist */
#line 598 "pikchr.y"
{pik_add_direction(p,0,&yymsp[-1].minor.yy200);}
#line 2573 "pikchr.c"
        break;
      case 29: /* attribute ::= numproperty relexpr */
#line 602 "pikchr.y"
{ pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy200); }
#line 2578 "pikchr.c"
        break;
      case 30: /* attribute ::= dashproperty expr */
#line 603 "pikchr.y"
{ pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy265); }
#line 2583 "pikchr.c"
        break;
      case 31: /* attribute ::= dashproperty */
#line 604 "pikchr.y"
{ pik_set_dashed(p,&yymsp[0].minor.yy0,0);  }
#line 2588 "pikchr.c"
        break;
      case 32: /* attribute ::= colorproperty rvalue */
#line 605 "pikchr.y"
{ pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy265); }
#line 2593 "pikchr.c"
        break;
      case 33: /* attribute ::= go direction optrelexpr */
#line 606 "pikchr.y"
{ pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy200);}
#line 2598 "pikchr.c"
        break;
      case 34: /* attribute ::= go direction even position */
#line 607 "pikchr.y"
{pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy43);}
#line 2603 "pikchr.c"
        break;
      case 35: /* attribute ::= CLOSE */
#line 608 "pikchr.y"
{ pik_close_path(p,&yymsp[0].minor.yy0); }
#line 2608 "pikchr.c"
        break;
      case 36: /* attribute ::= CHOP */
#line 609 "pikchr.y"
{ p->cur->bChop = 1; }
#line 2613 "pikchr.c"
        break;
      case 37: /* attribute ::= FROM position */
#line 610 "pikchr.y"
{ pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy43); }
#line 2618 "pikchr.c"
        break;
      case 38: /* attribute ::= TO position */
#line 611 "pikchr.y"
{ pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy43); }
#line 2623 "pikchr.c"
        break;
      case 39: /* attribute ::= THEN */
#line 612 "pikchr.y"
{ pik_then(p, &yymsp[0].minor.yy0, p->cur); }
#line 2628 "pikchr.c"
        break;
      case 40: /* attribute ::= THEN optrelexpr HEADING expr */
      case 42: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==42);
#line 614 "pikchr.y"
{pik_move_hdg(p,&yymsp[-2].minor.yy200,&yymsp[-1].minor.yy0,yymsp[0].minor.yy265,0,&yymsp[-3].minor.yy0);}
#line 2634 "pikchr.c"
        break;
      case 41: /* attribute ::= THEN optrelexpr EDGEPT */
      case 43: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==43);
#line 615 "pikchr.y"
{pik_move_hdg(p,&yymsp[-1].minor.yy200,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
#line 2640 "pikchr.c"
        break;
      case 44: /* attribute ::= AT position */
#line 620 "pikchr.y"
{ pik_set_at(p,0,&yymsp[0].minor.yy43,&yymsp[-1].minor.yy0); }
#line 2645 "pikchr.c"
        break;
      case 45: /* attribute ::= SAME */
#line 622 "pikchr.y"
{pik_same(p,0,&yymsp[0].minor.yy0);}
#line 2650 "pikchr.c"
        break;
      case 46: /* attribute ::= SAME AS object */
#line 623 "pikchr.y"
{pik_same(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
#line 2655 "pikchr.c"
        break;
      case 47: /* attribute ::= STRING textposition */
#line 624 "pikchr.y"
{pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy196);}
#line 2660 "pikchr.c"
        break;
      case 48: /* attribute ::= FIT */
#line 625 "pikchr.y"
{pik_size_to_fit(p,&yymsp[0].minor.yy0,3); }
#line 2665 "pikchr.c"
        break;
      case 49: /* attribute ::= BEHIND object */
#line 626 "pikchr.y"
{pik_behind(p,yymsp[0].minor.yy38);}
#line 2670 "pikchr.c"
        break;
      case 50: /* withclause ::= DOT_E edge AT position */
      case 51: /* withclause ::= edge AT position */ yytestcase(yyruleno==51);
#line 634 "pikchr.y"
{ pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy43,&yymsp[-1].minor.yy0); }
#line 2676 "pikchr.c"
        break;
      case 52: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
#line 638 "pikchr.y"
{yylhsminor.yy0 = yymsp[0].minor.yy0;}
#line 2681 "pikchr.c"
  yymsp[0].minor.yy0 = yylhsminor.yy0;
        break;
      case 53: /* boolproperty ::= CW */
#line 649 "pikchr.y"
{p->cur->cw = 1;}
#line 2687 "pikchr.c"
        break;
      case 54: /* boolproperty ::= CCW */
#line 650 "pikchr.y"
{p->cur->cw = 0;}
#line 2692 "pikchr.c"
        break;
      case 55: /* boolproperty ::= LARROW */
#line 651 "pikchr.y"
{p->cur->larrow=1; p->cur->rarrow=0; }
#line 2697 "pikchr.c"
        break;
      case 56: /* boolproperty ::= RARROW */
#line 652 "pikchr.y"
{p->cur->larrow=0; p->cur->rarrow=1; }
#line 2702 "pikchr.c"
        break;
      case 57: /* boolproperty ::= LRARROW */
#line 653 "pikchr.y"
{p->cur->larrow=1; p->cur->rarrow=1; }
#line 2707 "pikchr.c"
        break;
      case 58: /* boolproperty ::= INVIS */
#line 654 "pikchr.y"
{p->cur->sw = 0.0;}
#line 2712 "pikchr.c"
        break;
      case 59: /* boolproperty ::= THICK */
#line 655 "pikchr.y"
{p->cur->sw *= 1.5;}
#line 2717 "pikchr.c"
        break;
      case 60: /* boolproperty ::= THIN */
#line 656 "pikchr.y"
{p->cur->sw *= 0.67;}
#line 2722 "pikchr.c"
        break;
      case 61: /* boolproperty ::= SOLID */
#line 657 "pikchr.y"
{p->cur->sw = pik_value(p,"thickness",9,0);
                               p->cur->dotted = p->cur->dashed = 0.0;}
#line 2728 "pikchr.c"
        break;
      case 62: /* textposition ::= */
#line 660 "pikchr.y"
{yymsp[1].minor.yy196 = 0;}
#line 2733 "pikchr.c"
        break;
      case 63: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
#line 663 "pikchr.y"
{yylhsminor.yy196 = pik_text_position(yymsp[-1].minor.yy196,&yymsp[0].minor.yy0);}
#line 2738 "pikchr.c"
  yymsp[-1].minor.yy196 = yylhsminor.yy196;
        break;
      case 64: /* position ::= expr COMMA expr */
#line 666 "pikchr.y"
{yylhsminor.yy43.x=yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[0].minor.yy265;}
#line 2744 "pikchr.c"
  yymsp[-2].minor.yy43 = yylhsminor.yy43;
        break;
      case 65: /* position ::= place PLUS expr COMMA expr */
#line 668 "pikchr.y"
{yylhsminor.yy43.x=yymsp[-4].minor.yy43.x+yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[-4].minor.yy43.y+yymsp[0].minor.yy265;}
#line 2750 "pikchr.c"
  yymsp[-4].minor.yy43 = yylhsminor.yy43;
        break;
      case 66: /* position ::= place MINUS expr COMMA expr */
#line 669 "pikchr.y"
{yylhsminor.yy43.x=yymsp[-4].minor.yy43.x-yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[-4].minor.yy43.y-yymsp[0].minor.yy265;}
#line 2756 "pikchr.c"
  yymsp[-4].minor.yy43 = yylhsminor.yy43;
        break;
      case 67: /* position ::= place PLUS LP expr COMMA expr RP */
#line 671 "pikchr.y"
{yylhsminor.yy43.x=yymsp[-6].minor.yy43.x+yymsp[-3].minor.yy265; yylhsminor.yy43.y=yymsp[-6].minor.yy43.y+yymsp[-1].minor.yy265;}
#line 2762 "pikchr.c"
  yymsp[-6].minor.yy43 = yylhsminor.yy43;
        break;
      case 68: /* position ::= place MINUS LP expr COMMA expr RP */
#line 673 "pikchr.y"
{yylhsminor.yy43.x=yymsp[-6].minor.yy43.x-yymsp[-3].minor.yy265; yylhsminor.yy43.y=yymsp[-6].minor.yy43.y-yymsp[-1].minor.yy265;}
#line 2768 "pikchr.c"
  yymsp[-6].minor.yy43 = yylhsminor.yy43;
        break;
      case 69: /* position ::= LP position COMMA position RP */
#line 674 "pikchr.y"
{yymsp[-4].minor.yy43.x=yymsp[-3].minor.yy43.x; yymsp[-4].minor.yy43.y=yymsp[-1].minor.yy43.y;}
#line 2774 "pikchr.c"
        break;
      case 70: /* position ::= LP position RP */
#line 675 "pikchr.y"
{yymsp[-2].minor.yy43=yymsp[-1].minor.yy43;}
#line 2779 "pikchr.c"
        break;
      case 71: /* position ::= expr between position AND position */
#line 677 "pikchr.y"
{yylhsminor.yy43 = pik_position_between(yymsp[-4].minor.yy265,yymsp[-2].minor.yy43,yymsp[0].minor.yy43);}
#line 2784 "pikchr.c"
  yymsp[-4].minor.yy43 = yylhsminor.yy43;
        break;
      case 72: /* position ::= expr LT position COMMA position GT */
#line 679 "pikchr.y"
{yylhsminor.yy43 = pik_position_between(yymsp[-5].minor.yy265,yymsp[-3].minor.yy43,yymsp[-1].minor.yy43);}
#line 2790 "pikchr.c"
  yymsp[-5].minor.yy43 = yylhsminor.yy43;
        break;
      case 73: /* position ::= expr ABOVE position */
#line 680 "pikchr.y"
{yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.y += yymsp[-2].minor.yy265;}
#line 2796 "pikchr.c"
  yymsp[-2].minor.yy43 = yylhsminor.yy43;
        break;
      case 74: /* position ::= expr BELOW position */
#line 681 "pikchr.y"
{yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.y -= yymsp[-2].minor.yy265;}
#line 2802 "pikchr.c"
  yymsp[-2].minor.yy43 = yylhsminor.yy43;
        break;
      case 75: /* position ::= expr LEFT OF position */
#line 682 "pikchr.y"
{yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.x -= yymsp[-3].minor.yy265;}
#line 2808 "pikchr.c"
  yymsp[-3].minor.yy43 = yylhsminor.yy43;
        break;
      case 76: /* position ::= expr RIGHT OF position */
#line 683 "pikchr.y"
{yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.x += yymsp[-3].minor.yy265;}
#line 2814 "pikchr.c"
  yymsp[-3].minor.yy43 = yylhsminor.yy43;
        break;
      case 77: /* position ::= expr ON HEADING EDGEPT OF position */
#line 685 "pikchr.y"
{yylhsminor.yy43 = pik_position_at_hdg(yymsp[-5].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
#line 2820 "pikchr.c"
  yymsp[-5].minor.yy43 = yylhsminor.yy43;
        break;
      case 78: /* position ::= expr HEADING EDGEPT OF position */
#line 687 "pikchr.y"
{yylhsminor.yy43 = pik_position_at_hdg(yymsp[-4].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
#line 2826 "pikchr.c"
  yymsp[-4].minor.yy43 = yylhsminor.yy43;
        break;
      case 79: /* position ::= expr EDGEPT OF position */
#line 689 "pikchr.y"
{yylhsminor.yy43 = pik_position_at_hdg(yymsp[-3].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
#line 2832 "pikchr.c"
  yymsp[-3].minor.yy43 = yylhsminor.yy43;
        break;
      case 80: /* position ::= expr ON HEADING expr FROM position */
#line 691 "pikchr.y"
{yylhsminor.yy43 = pik_position_at_angle(yymsp[-5].minor.yy265,yymsp[-2].minor.yy265,yymsp[0].minor.yy43);}
#line 2838 "pikchr.c"
  yymsp[-5].minor.yy43 = yylhsminor.yy43;
        break;
      case 81: /* position ::= expr HEADING expr FROM position */
#line 693 "pikchr.y"
{yylhsminor.yy43 = pik_position_at_angle(yymsp[-4].minor.yy265,yymsp[-2].minor.yy265,yymsp[0].minor.yy43);}
#line 2844 "pikchr.c"
  yymsp[-4].minor.yy43 = yylhsminor.yy43;
        break;
      case 82: /* place ::= edge OF object */
#line 705 "pikchr.y"
{yylhsminor.yy43 = pik_place_of_elem(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
#line 2850 "pikchr.c"
  yymsp[-2].minor.yy43 = yylhsminor.yy43;
        break;
      case 83: /* place2 ::= object */
#line 706 "pikchr.y"
{yylhsminor.yy43 = pik_place_of_elem(p,yymsp[0].minor.yy38,0);}
#line 2856 "pikchr.c"
  yymsp[0].minor.yy43 = yylhsminor.yy43;
        break;
      case 84: /* place2 ::= object DOT_E edge */
#line 707 "pikchr.y"
{yylhsminor.yy43 = pik_place_of_elem(p,yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
#line 2862 "pikchr.c"
  yymsp[-2].minor.yy43 = yylhsminor.yy43;
        break;
      case 85: /* place2 ::= NTH VERTEX OF object */
#line 708 "pikchr.y"
{yylhsminor.yy43 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy38);}
#line 2868 "pikchr.c"
  yymsp[-3].minor.yy43 = yylhsminor.yy43;
        break;
      case 86: /* object ::= nth */
#line 720 "pikchr.y"
{yylhsminor.yy38 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
#line 2874 "pikchr.c"
  yymsp[0].minor.yy38 = yylhsminor.yy38;
        break;
      case 87: /* object ::= nth OF|IN object */
#line 721 "pikchr.y"
{yylhsminor.yy38 = pik_find_nth(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
#line 2880 "pikchr.c"
  yymsp[-2].minor.yy38 = yylhsminor.yy38;
        break;
      case 88: /* objectname ::= PLACENAME */
#line 723 "pikchr.y"
{yylhsminor.yy38 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
#line 2886 "pikchr.c"
  yymsp[0].minor.yy38 = yylhsminor.yy38;
        break;
      case 89: /* objectname ::= objectname DOT_U PLACENAME */
#line 725 "pikchr.y"
{yylhsminor.yy38 = pik_find_byname(p,yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
#line 2892 "pikchr.c"
  yymsp[-2].minor.yy38 = yylhsminor.yy38;
        break;
      case 90: /* nth ::= NTH CLASSNAME */
#line 727 "pikchr.y"
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
#line 2898 "pikchr.c"
  yymsp[-1].minor.yy0 = yylhsminor.yy0;
        break;
      case 91: /* nth ::= NTH LAST CLASSNAME */
#line 728 "pikchr.y"
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
#line 2904 "pikchr.c"
  yymsp[-2].minor.yy0 = yylhsminor.yy0;
        break;
      case 92: /* nth ::= LAST CLASSNAME */
#line 729 "pikchr.y"
{yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
#line 2910 "pikchr.c"
        break;
      case 93: /* nth ::= LAST */
#line 730 "pikchr.y"
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
#line 2915 "pikchr.c"
  yymsp[0].minor.yy0 = yylhsminor.yy0;
        break;
      case 94: /* nth ::= NTH LB RB */
#line 731 "pikchr.y"
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
#line 2921 "pikchr.c"
  yymsp[-2].minor.yy0 = yylhsminor.yy0;
        break;
      case 95: /* nth ::= NTH LAST LB RB */
#line 732 "pikchr.y"
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
#line 2927 "pikchr.c"
  yymsp[-3].minor.yy0 = yylhsminor.yy0;
        break;
      case 96: /* nth ::= LAST LB RB */
#line 733 "pikchr.y"
{yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
#line 2933 "pikchr.c"
        break;
      case 97: /* expr ::= expr PLUS expr */
#line 735 "pikchr.y"
{yylhsminor.yy265=yymsp[-2].minor.yy265+yymsp[0].minor.yy265;}
#line 2938 "pikchr.c"
  yymsp[-2].minor.yy265 = yylhsminor.yy265;
        break;
      case 98: /* expr ::= expr MINUS expr */
#line 736 "pikchr.y"
{yylhsminor.yy265=yymsp[-2].minor.yy265-yymsp[0].minor.yy265;}
#line 2944 "pikchr.c"
  yymsp[-2].minor.yy265 = yylhsminor.yy265;
        break;
      case 99: /* expr ::= expr STAR expr */
#line 737 "pikchr.y"
{yylhsminor.yy265=yymsp[-2].minor.yy265*yymsp[0].minor.yy265;}
#line 2950 "pikchr.c"
  yymsp[-2].minor.yy265 = yylhsminor.yy265;
        break;
      case 100: /* expr ::= expr SLASH expr */
#line 738 "pikchr.y"
{
  if( yymsp[0].minor.yy265==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy265 = 0.0; }
  else{ yylhsminor.yy265 = yymsp[-2].minor.yy265/yymsp[0].minor.yy265; }
}
#line 2959 "pikchr.c"
  yymsp[-2].minor.yy265 = yylhsminor.yy265;
        break;
      case 101: /* expr ::= MINUS expr */
#line 742 "pikchr.y"
{yymsp[-1].minor.yy265=-yymsp[0].minor.yy265;}
#line 2965 "pikchr.c"
        break;
      case 102: /* expr ::= PLUS expr */
#line 743 "pikchr.y"
{yymsp[-1].minor.yy265=yymsp[0].minor.yy265;}
#line 2970 "pikchr.c"
        break;
      case 103: /* expr ::= LP expr RP */
#line 744 "pikchr.y"
{yymsp[-2].minor.yy265=yymsp[-1].minor.yy265;}
#line 2975 "pikchr.c"
        break;
      case 104: /* expr ::= LP FILL|COLOR|THICKNESS RP */
#line 745 "pikchr.y"
{yymsp[-2].minor.yy265=pik_get_var(p,&yymsp[-1].minor.yy0);}
#line 2980 "pikchr.c"
        break;
      case 105: /* expr ::= NUMBER */
#line 746 "pikchr.y"
{yylhsminor.yy265=pik_atof(&yymsp[0].minor.yy0);}
#line 2985 "pikchr.c"
  yymsp[0].minor.yy265 = yylhsminor.yy265;
        break;
      case 106: /* expr ::= ID */
#line 747 "pikchr.y"
{yylhsminor.yy265=pik_get_var(p,&yymsp[0].minor.yy0);}
#line 2991 "pikchr.c"
  yymsp[0].minor.yy265 = yylhsminor.yy265;
        break;
      case 107: /* expr ::= FUNC1 LP expr RP */
#line 748 "pikchr.y"
{yylhsminor.yy265 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy265,0.0);}
#line 2997 "pikchr.c"
  yymsp[-3].minor.yy265 = yylhsminor.yy265;
        break;
      case 108: /* expr ::= FUNC2 LP expr COMMA expr RP */
#line 749 "pikchr.y"
{yylhsminor.yy265 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy265,yymsp[-1].minor.yy265);}
#line 3003 "pikchr.c"
  yymsp[-5].minor.yy265 = yylhsminor.yy265;
        break;
      case 109: /* expr ::= DIST LP position COMMA position RP */
#line 750 "pikchr.y"
{yymsp[-5].minor.yy265 = pik_dist(&yymsp[-3].minor.yy43,&yymsp[-1].minor.yy43);}
#line 3009 "pikchr.c"
        break;
      case 110: /* expr ::= place2 DOT_XY X */
#line 751 "pikchr.y"
{yylhsminor.yy265 = yymsp[-2].minor.yy43.x;}
#line 3014 "pikchr.c"
  yymsp[-2].minor.yy265 = yylhsminor.yy265;
        break;
      case 111: /* expr ::= place2 DOT_XY Y */
#line 752 "pikchr.y"
{yylhsminor.yy265 = yymsp[-2].minor.yy43.y;}
#line 3020 "pikchr.c"
  yymsp[-2].minor.yy265 = yylhsminor.yy265;
        break;
      case 112: /* expr ::= object DOT_L numproperty */
      case 113: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==113);
      case 114: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==114);
#line 753 "pikchr.y"
{yylhsminor.yy265=pik_property_of(yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
#line 3028 "pikchr.c"
  yymsp[-2].minor.yy265 = yylhsminor.yy265;
        break;
      default:
      /* (115) lvalue ::= ID */ yytestcase(yyruleno==115);
      /* (116) lvalue ::= FILL */ yytestcase(yyruleno==116);
      /* (117) lvalue ::= COLOR */ yytestcase(yyruleno==117);
      /* (118) lvalue ::= THICKNESS */ yytestcase(yyruleno==118);







|

|


|

|



|

|



|

|


|

|



|

|



|

|



|


|



|

|



|

|


|

|


|

|


|

|


|

|





|

|


|

|


|

|


|

|


|

|



|

|



|

|



|

|


|

|


|

|



|

|



|

|


|

|


|

|


|

|


|

|


|

|


|

|


|

|


|

|


|

|


|

|


|

|


|

|



|

|



|

|


|

|


|

|


|

|


|

|


|

|


|

|



|

|


|

|



|

|


|

|


|

|


|

|


|

|


|

|


|

|


|

|


|


|


|

|


|

|



|

|



|

|



|

|



|

|



|

|



|

|


|

|


|

|



|

|



|

|



|

|



|

|



|

|



|

|



|

|



|

|



|

|



|

|



|

|



|

|



|

|



|

|



|

|



|

|



|

|



|

|



|

|



|

|



|

|


|

|



|

|



|

|



|

|


|

|



|

|



|

|



|




|



|

|


|

|


|

|


|

|


|

|



|

|



|

|



|

|



|

|


|

|



|

|





|

|







2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
  **     { ... }           // User supplied code
  **  #line <lineno> <thisfile>
  **     break;
  */
/********** Begin reduce actions **********************************************/
        YYMINORTYPE yylhsminor;
      case 0: /* document ::= statement_list */
#line 530 "pikchr.y"
{pik_render(p,yymsp[0].minor.yy119);}
#line 2431 "pikchr.c"
        break;
      case 1: /* statement_list ::= statement */
#line 533 "pikchr.y"
{ yylhsminor.yy119 = pik_elist_append(p,0,yymsp[0].minor.yy38); }
#line 2436 "pikchr.c"
  yymsp[0].minor.yy119 = yylhsminor.yy119;
        break;
      case 2: /* statement_list ::= statement_list EOL statement */
#line 535 "pikchr.y"
{ yylhsminor.yy119 = pik_elist_append(p,yymsp[-2].minor.yy119,yymsp[0].minor.yy38); }
#line 2442 "pikchr.c"
  yymsp[-2].minor.yy119 = yylhsminor.yy119;
        break;
      case 3: /* statement ::= */
#line 538 "pikchr.y"
{ yymsp[1].minor.yy38 = 0; }
#line 2448 "pikchr.c"
        break;
      case 4: /* statement ::= direction */
#line 539 "pikchr.y"
{ pik_set_direction(p,yymsp[0].minor.yy0.eCode);  yylhsminor.yy38=0; }
#line 2453 "pikchr.c"
  yymsp[0].minor.yy38 = yylhsminor.yy38;
        break;
      case 5: /* statement ::= lvalue ASSIGN rvalue */
#line 540 "pikchr.y"
{pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy265,&yymsp[-1].minor.yy0); yylhsminor.yy38=0;}
#line 2459 "pikchr.c"
  yymsp[-2].minor.yy38 = yylhsminor.yy38;
        break;
      case 6: /* statement ::= PLACENAME COLON unnamed_statement */
#line 542 "pikchr.y"
{ yylhsminor.yy38 = yymsp[0].minor.yy38;  pik_elem_setname(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0); }
#line 2465 "pikchr.c"
  yymsp[-2].minor.yy38 = yylhsminor.yy38;
        break;
      case 7: /* statement ::= PLACENAME COLON position */
#line 544 "pikchr.y"
{ yylhsminor.yy38 = pik_elem_new(p,0,0,0);
                 if(yylhsminor.yy38){ yylhsminor.yy38->ptAt = yymsp[0].minor.yy43; pik_elem_setname(p,yylhsminor.yy38,&yymsp[-2].minor.yy0); }}
#line 2472 "pikchr.c"
  yymsp[-2].minor.yy38 = yylhsminor.yy38;
        break;
      case 8: /* statement ::= unnamed_statement */
#line 546 "pikchr.y"
{yylhsminor.yy38 = yymsp[0].minor.yy38;}
#line 2478 "pikchr.c"
  yymsp[0].minor.yy38 = yylhsminor.yy38;
        break;
      case 9: /* statement ::= print prlist */
#line 547 "pikchr.y"
{pik_append(p,"<br>\n",5); yymsp[-1].minor.yy38=0;}
#line 2484 "pikchr.c"
        break;
      case 10: /* statement ::= ASSERT LP expr EQ expr RP */
#line 552 "pikchr.y"
{yymsp[-5].minor.yy38=pik_assert(p,yymsp[-3].minor.yy265,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy265);}
#line 2489 "pikchr.c"
        break;
      case 11: /* statement ::= ASSERT LP position EQ position RP */
#line 554 "pikchr.y"
{yymsp[-5].minor.yy38=pik_position_assert(p,&yymsp[-3].minor.yy43,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy43);}
#line 2494 "pikchr.c"
        break;
      case 12: /* statement ::= DEFINE ID CODEBLOCK */
#line 555 "pikchr.y"
{yymsp[-2].minor.yy38=0; pik_add_macro(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
#line 2499 "pikchr.c"
        break;
      case 13: /* rvalue ::= PLACENAME */
#line 566 "pikchr.y"
{yylhsminor.yy265 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
#line 2504 "pikchr.c"
  yymsp[0].minor.yy265 = yylhsminor.yy265;
        break;
      case 14: /* pritem ::= FILL */
      case 15: /* pritem ::= COLOR */ yytestcase(yyruleno==15);
      case 16: /* pritem ::= THICKNESS */ yytestcase(yyruleno==16);
#line 571 "pikchr.y"
{pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
#line 2512 "pikchr.c"
        break;
      case 17: /* pritem ::= rvalue */
#line 574 "pikchr.y"
{pik_append_num(p,"",yymsp[0].minor.yy265);}
#line 2517 "pikchr.c"
        break;
      case 18: /* pritem ::= STRING */
#line 575 "pikchr.y"
{pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
#line 2522 "pikchr.c"
        break;
      case 19: /* prsep ::= COMMA */
#line 576 "pikchr.y"
{pik_append(p, " ", 1);}
#line 2527 "pikchr.c"
        break;
      case 20: /* unnamed_statement ::= basetype attribute_list */
#line 579 "pikchr.y"
{yylhsminor.yy38 = yymsp[-1].minor.yy38; pik_after_adding_attributes(p,yylhsminor.yy38);}
#line 2532 "pikchr.c"
  yymsp[-1].minor.yy38 = yylhsminor.yy38;
        break;
      case 21: /* basetype ::= CLASSNAME */
#line 581 "pikchr.y"
{yylhsminor.yy38 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
#line 2538 "pikchr.c"
  yymsp[0].minor.yy38 = yylhsminor.yy38;
        break;
      case 22: /* basetype ::= STRING textposition */
#line 583 "pikchr.y"
{yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy196; yylhsminor.yy38 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
#line 2544 "pikchr.c"
  yymsp[-1].minor.yy38 = yylhsminor.yy38;
        break;
      case 23: /* basetype ::= LB savelist statement_list RB */
#line 585 "pikchr.y"
{ 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; }
#line 2550 "pikchr.c"
        break;
      case 24: /* savelist ::= */
#line 590 "pikchr.y"
{yymsp[1].minor.yy119 = p->list; p->list = 0;}
#line 2555 "pikchr.c"
        break;
      case 25: /* relexpr ::= expr */
#line 597 "pikchr.y"
{yylhsminor.yy200.rAbs = yymsp[0].minor.yy265; yylhsminor.yy200.rRel = 0;}
#line 2560 "pikchr.c"
  yymsp[0].minor.yy200 = yylhsminor.yy200;
        break;
      case 26: /* relexpr ::= expr PERCENT */
#line 598 "pikchr.y"
{yylhsminor.yy200.rAbs = 0; yylhsminor.yy200.rRel = yymsp[-1].minor.yy265/100;}
#line 2566 "pikchr.c"
  yymsp[-1].minor.yy200 = yylhsminor.yy200;
        break;
      case 27: /* optrelexpr ::= */
#line 600 "pikchr.y"
{yymsp[1].minor.yy200.rAbs = 0; yymsp[1].minor.yy200.rRel = 1.0;}
#line 2572 "pikchr.c"
        break;
      case 28: /* attribute_list ::= relexpr alist */
#line 602 "pikchr.y"
{pik_add_direction(p,0,&yymsp[-1].minor.yy200);}
#line 2577 "pikchr.c"
        break;
      case 29: /* attribute ::= numproperty relexpr */
#line 606 "pikchr.y"
{ pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy200); }
#line 2582 "pikchr.c"
        break;
      case 30: /* attribute ::= dashproperty expr */
#line 607 "pikchr.y"
{ pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy265); }
#line 2587 "pikchr.c"
        break;
      case 31: /* attribute ::= dashproperty */
#line 608 "pikchr.y"
{ pik_set_dashed(p,&yymsp[0].minor.yy0,0);  }
#line 2592 "pikchr.c"
        break;
      case 32: /* attribute ::= colorproperty rvalue */
#line 609 "pikchr.y"
{ pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy265); }
#line 2597 "pikchr.c"
        break;
      case 33: /* attribute ::= go direction optrelexpr */
#line 610 "pikchr.y"
{ pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy200);}
#line 2602 "pikchr.c"
        break;
      case 34: /* attribute ::= go direction even position */
#line 611 "pikchr.y"
{pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy43);}
#line 2607 "pikchr.c"
        break;
      case 35: /* attribute ::= CLOSE */
#line 612 "pikchr.y"
{ pik_close_path(p,&yymsp[0].minor.yy0); }
#line 2612 "pikchr.c"
        break;
      case 36: /* attribute ::= CHOP */
#line 613 "pikchr.y"
{ p->cur->bChop = 1; }
#line 2617 "pikchr.c"
        break;
      case 37: /* attribute ::= FROM position */
#line 614 "pikchr.y"
{ pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy43); }
#line 2622 "pikchr.c"
        break;
      case 38: /* attribute ::= TO position */
#line 615 "pikchr.y"
{ pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy43); }
#line 2627 "pikchr.c"
        break;
      case 39: /* attribute ::= THEN */
#line 616 "pikchr.y"
{ pik_then(p, &yymsp[0].minor.yy0, p->cur); }
#line 2632 "pikchr.c"
        break;
      case 40: /* attribute ::= THEN optrelexpr HEADING expr */
      case 42: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==42);
#line 618 "pikchr.y"
{pik_move_hdg(p,&yymsp[-2].minor.yy200,&yymsp[-1].minor.yy0,yymsp[0].minor.yy265,0,&yymsp[-3].minor.yy0);}
#line 2638 "pikchr.c"
        break;
      case 41: /* attribute ::= THEN optrelexpr EDGEPT */
      case 43: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==43);
#line 619 "pikchr.y"
{pik_move_hdg(p,&yymsp[-1].minor.yy200,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
#line 2644 "pikchr.c"
        break;
      case 44: /* attribute ::= AT position */
#line 624 "pikchr.y"
{ pik_set_at(p,0,&yymsp[0].minor.yy43,&yymsp[-1].minor.yy0); }
#line 2649 "pikchr.c"
        break;
      case 45: /* attribute ::= SAME */
#line 626 "pikchr.y"
{pik_same(p,0,&yymsp[0].minor.yy0);}
#line 2654 "pikchr.c"
        break;
      case 46: /* attribute ::= SAME AS object */
#line 627 "pikchr.y"
{pik_same(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
#line 2659 "pikchr.c"
        break;
      case 47: /* attribute ::= STRING textposition */
#line 628 "pikchr.y"
{pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy196);}
#line 2664 "pikchr.c"
        break;
      case 48: /* attribute ::= FIT */
#line 629 "pikchr.y"
{pik_size_to_fit(p,&yymsp[0].minor.yy0,3); }
#line 2669 "pikchr.c"
        break;
      case 49: /* attribute ::= BEHIND object */
#line 630 "pikchr.y"
{pik_behind(p,yymsp[0].minor.yy38);}
#line 2674 "pikchr.c"
        break;
      case 50: /* withclause ::= DOT_E edge AT position */
      case 51: /* withclause ::= edge AT position */ yytestcase(yyruleno==51);
#line 638 "pikchr.y"
{ pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy43,&yymsp[-1].minor.yy0); }
#line 2680 "pikchr.c"
        break;
      case 52: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
#line 642 "pikchr.y"
{yylhsminor.yy0 = yymsp[0].minor.yy0;}
#line 2685 "pikchr.c"
  yymsp[0].minor.yy0 = yylhsminor.yy0;
        break;
      case 53: /* boolproperty ::= CW */
#line 653 "pikchr.y"
{p->cur->cw = 1;}
#line 2691 "pikchr.c"
        break;
      case 54: /* boolproperty ::= CCW */
#line 654 "pikchr.y"
{p->cur->cw = 0;}
#line 2696 "pikchr.c"
        break;
      case 55: /* boolproperty ::= LARROW */
#line 655 "pikchr.y"
{p->cur->larrow=1; p->cur->rarrow=0; }
#line 2701 "pikchr.c"
        break;
      case 56: /* boolproperty ::= RARROW */
#line 656 "pikchr.y"
{p->cur->larrow=0; p->cur->rarrow=1; }
#line 2706 "pikchr.c"
        break;
      case 57: /* boolproperty ::= LRARROW */
#line 657 "pikchr.y"
{p->cur->larrow=1; p->cur->rarrow=1; }
#line 2711 "pikchr.c"
        break;
      case 58: /* boolproperty ::= INVIS */
#line 658 "pikchr.y"
{p->cur->sw = 0.0;}
#line 2716 "pikchr.c"
        break;
      case 59: /* boolproperty ::= THICK */
#line 659 "pikchr.y"
{p->cur->sw *= 1.5;}
#line 2721 "pikchr.c"
        break;
      case 60: /* boolproperty ::= THIN */
#line 660 "pikchr.y"
{p->cur->sw *= 0.67;}
#line 2726 "pikchr.c"
        break;
      case 61: /* boolproperty ::= SOLID */
#line 661 "pikchr.y"
{p->cur->sw = pik_value(p,"thickness",9,0);
                               p->cur->dotted = p->cur->dashed = 0.0;}
#line 2732 "pikchr.c"
        break;
      case 62: /* textposition ::= */
#line 664 "pikchr.y"
{yymsp[1].minor.yy196 = 0;}
#line 2737 "pikchr.c"
        break;
      case 63: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
#line 667 "pikchr.y"
{yylhsminor.yy196 = pik_text_position(yymsp[-1].minor.yy196,&yymsp[0].minor.yy0);}
#line 2742 "pikchr.c"
  yymsp[-1].minor.yy196 = yylhsminor.yy196;
        break;
      case 64: /* position ::= expr COMMA expr */
#line 670 "pikchr.y"
{yylhsminor.yy43.x=yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[0].minor.yy265;}
#line 2748 "pikchr.c"
  yymsp[-2].minor.yy43 = yylhsminor.yy43;
        break;
      case 65: /* position ::= place PLUS expr COMMA expr */
#line 672 "pikchr.y"
{yylhsminor.yy43.x=yymsp[-4].minor.yy43.x+yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[-4].minor.yy43.y+yymsp[0].minor.yy265;}
#line 2754 "pikchr.c"
  yymsp[-4].minor.yy43 = yylhsminor.yy43;
        break;
      case 66: /* position ::= place MINUS expr COMMA expr */
#line 673 "pikchr.y"
{yylhsminor.yy43.x=yymsp[-4].minor.yy43.x-yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[-4].minor.yy43.y-yymsp[0].minor.yy265;}
#line 2760 "pikchr.c"
  yymsp[-4].minor.yy43 = yylhsminor.yy43;
        break;
      case 67: /* position ::= place PLUS LP expr COMMA expr RP */
#line 675 "pikchr.y"
{yylhsminor.yy43.x=yymsp[-6].minor.yy43.x+yymsp[-3].minor.yy265; yylhsminor.yy43.y=yymsp[-6].minor.yy43.y+yymsp[-1].minor.yy265;}
#line 2766 "pikchr.c"
  yymsp[-6].minor.yy43 = yylhsminor.yy43;
        break;
      case 68: /* position ::= place MINUS LP expr COMMA expr RP */
#line 677 "pikchr.y"
{yylhsminor.yy43.x=yymsp[-6].minor.yy43.x-yymsp[-3].minor.yy265; yylhsminor.yy43.y=yymsp[-6].minor.yy43.y-yymsp[-1].minor.yy265;}
#line 2772 "pikchr.c"
  yymsp[-6].minor.yy43 = yylhsminor.yy43;
        break;
      case 69: /* position ::= LP position COMMA position RP */
#line 678 "pikchr.y"
{yymsp[-4].minor.yy43.x=yymsp[-3].minor.yy43.x; yymsp[-4].minor.yy43.y=yymsp[-1].minor.yy43.y;}
#line 2778 "pikchr.c"
        break;
      case 70: /* position ::= LP position RP */
#line 679 "pikchr.y"
{yymsp[-2].minor.yy43=yymsp[-1].minor.yy43;}
#line 2783 "pikchr.c"
        break;
      case 71: /* position ::= expr between position AND position */
#line 681 "pikchr.y"
{yylhsminor.yy43 = pik_position_between(yymsp[-4].minor.yy265,yymsp[-2].minor.yy43,yymsp[0].minor.yy43);}
#line 2788 "pikchr.c"
  yymsp[-4].minor.yy43 = yylhsminor.yy43;
        break;
      case 72: /* position ::= expr LT position COMMA position GT */
#line 683 "pikchr.y"
{yylhsminor.yy43 = pik_position_between(yymsp[-5].minor.yy265,yymsp[-3].minor.yy43,yymsp[-1].minor.yy43);}
#line 2794 "pikchr.c"
  yymsp[-5].minor.yy43 = yylhsminor.yy43;
        break;
      case 73: /* position ::= expr ABOVE position */
#line 684 "pikchr.y"
{yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.y += yymsp[-2].minor.yy265;}
#line 2800 "pikchr.c"
  yymsp[-2].minor.yy43 = yylhsminor.yy43;
        break;
      case 74: /* position ::= expr BELOW position */
#line 685 "pikchr.y"
{yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.y -= yymsp[-2].minor.yy265;}
#line 2806 "pikchr.c"
  yymsp[-2].minor.yy43 = yylhsminor.yy43;
        break;
      case 75: /* position ::= expr LEFT OF position */
#line 686 "pikchr.y"
{yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.x -= yymsp[-3].minor.yy265;}
#line 2812 "pikchr.c"
  yymsp[-3].minor.yy43 = yylhsminor.yy43;
        break;
      case 76: /* position ::= expr RIGHT OF position */
#line 687 "pikchr.y"
{yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.x += yymsp[-3].minor.yy265;}
#line 2818 "pikchr.c"
  yymsp[-3].minor.yy43 = yylhsminor.yy43;
        break;
      case 77: /* position ::= expr ON HEADING EDGEPT OF position */
#line 689 "pikchr.y"
{yylhsminor.yy43 = pik_position_at_hdg(yymsp[-5].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
#line 2824 "pikchr.c"
  yymsp[-5].minor.yy43 = yylhsminor.yy43;
        break;
      case 78: /* position ::= expr HEADING EDGEPT OF position */
#line 691 "pikchr.y"
{yylhsminor.yy43 = pik_position_at_hdg(yymsp[-4].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
#line 2830 "pikchr.c"
  yymsp[-4].minor.yy43 = yylhsminor.yy43;
        break;
      case 79: /* position ::= expr EDGEPT OF position */
#line 693 "pikchr.y"
{yylhsminor.yy43 = pik_position_at_hdg(yymsp[-3].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
#line 2836 "pikchr.c"
  yymsp[-3].minor.yy43 = yylhsminor.yy43;
        break;
      case 80: /* position ::= expr ON HEADING expr FROM position */
#line 695 "pikchr.y"
{yylhsminor.yy43 = pik_position_at_angle(yymsp[-5].minor.yy265,yymsp[-2].minor.yy265,yymsp[0].minor.yy43);}
#line 2842 "pikchr.c"
  yymsp[-5].minor.yy43 = yylhsminor.yy43;
        break;
      case 81: /* position ::= expr HEADING expr FROM position */
#line 697 "pikchr.y"
{yylhsminor.yy43 = pik_position_at_angle(yymsp[-4].minor.yy265,yymsp[-2].minor.yy265,yymsp[0].minor.yy43);}
#line 2848 "pikchr.c"
  yymsp[-4].minor.yy43 = yylhsminor.yy43;
        break;
      case 82: /* place ::= edge OF object */
#line 709 "pikchr.y"
{yylhsminor.yy43 = pik_place_of_elem(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
#line 2854 "pikchr.c"
  yymsp[-2].minor.yy43 = yylhsminor.yy43;
        break;
      case 83: /* place2 ::= object */
#line 710 "pikchr.y"
{yylhsminor.yy43 = pik_place_of_elem(p,yymsp[0].minor.yy38,0);}
#line 2860 "pikchr.c"
  yymsp[0].minor.yy43 = yylhsminor.yy43;
        break;
      case 84: /* place2 ::= object DOT_E edge */
#line 711 "pikchr.y"
{yylhsminor.yy43 = pik_place_of_elem(p,yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
#line 2866 "pikchr.c"
  yymsp[-2].minor.yy43 = yylhsminor.yy43;
        break;
      case 85: /* place2 ::= NTH VERTEX OF object */
#line 712 "pikchr.y"
{yylhsminor.yy43 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy38);}
#line 2872 "pikchr.c"
  yymsp[-3].minor.yy43 = yylhsminor.yy43;
        break;
      case 86: /* object ::= nth */
#line 724 "pikchr.y"
{yylhsminor.yy38 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
#line 2878 "pikchr.c"
  yymsp[0].minor.yy38 = yylhsminor.yy38;
        break;
      case 87: /* object ::= nth OF|IN object */
#line 725 "pikchr.y"
{yylhsminor.yy38 = pik_find_nth(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
#line 2884 "pikchr.c"
  yymsp[-2].minor.yy38 = yylhsminor.yy38;
        break;
      case 88: /* objectname ::= PLACENAME */
#line 727 "pikchr.y"
{yylhsminor.yy38 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
#line 2890 "pikchr.c"
  yymsp[0].minor.yy38 = yylhsminor.yy38;
        break;
      case 89: /* objectname ::= objectname DOT_U PLACENAME */
#line 729 "pikchr.y"
{yylhsminor.yy38 = pik_find_byname(p,yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
#line 2896 "pikchr.c"
  yymsp[-2].minor.yy38 = yylhsminor.yy38;
        break;
      case 90: /* nth ::= NTH CLASSNAME */
#line 731 "pikchr.y"
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
#line 2902 "pikchr.c"
  yymsp[-1].minor.yy0 = yylhsminor.yy0;
        break;
      case 91: /* nth ::= NTH LAST CLASSNAME */
#line 732 "pikchr.y"
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
#line 2908 "pikchr.c"
  yymsp[-2].minor.yy0 = yylhsminor.yy0;
        break;
      case 92: /* nth ::= LAST CLASSNAME */
#line 733 "pikchr.y"
{yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
#line 2914 "pikchr.c"
        break;
      case 93: /* nth ::= LAST */
#line 734 "pikchr.y"
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
#line 2919 "pikchr.c"
  yymsp[0].minor.yy0 = yylhsminor.yy0;
        break;
      case 94: /* nth ::= NTH LB RB */
#line 735 "pikchr.y"
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
#line 2925 "pikchr.c"
  yymsp[-2].minor.yy0 = yylhsminor.yy0;
        break;
      case 95: /* nth ::= NTH LAST LB RB */
#line 736 "pikchr.y"
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
#line 2931 "pikchr.c"
  yymsp[-3].minor.yy0 = yylhsminor.yy0;
        break;
      case 96: /* nth ::= LAST LB RB */
#line 737 "pikchr.y"
{yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
#line 2937 "pikchr.c"
        break;
      case 97: /* expr ::= expr PLUS expr */
#line 739 "pikchr.y"
{yylhsminor.yy265=yymsp[-2].minor.yy265+yymsp[0].minor.yy265;}
#line 2942 "pikchr.c"
  yymsp[-2].minor.yy265 = yylhsminor.yy265;
        break;
      case 98: /* expr ::= expr MINUS expr */
#line 740 "pikchr.y"
{yylhsminor.yy265=yymsp[-2].minor.yy265-yymsp[0].minor.yy265;}
#line 2948 "pikchr.c"
  yymsp[-2].minor.yy265 = yylhsminor.yy265;
        break;
      case 99: /* expr ::= expr STAR expr */
#line 741 "pikchr.y"
{yylhsminor.yy265=yymsp[-2].minor.yy265*yymsp[0].minor.yy265;}
#line 2954 "pikchr.c"
  yymsp[-2].minor.yy265 = yylhsminor.yy265;
        break;
      case 100: /* expr ::= expr SLASH expr */
#line 742 "pikchr.y"
{
  if( yymsp[0].minor.yy265==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy265 = 0.0; }
  else{ yylhsminor.yy265 = yymsp[-2].minor.yy265/yymsp[0].minor.yy265; }
}
#line 2963 "pikchr.c"
  yymsp[-2].minor.yy265 = yylhsminor.yy265;
        break;
      case 101: /* expr ::= MINUS expr */
#line 746 "pikchr.y"
{yymsp[-1].minor.yy265=-yymsp[0].minor.yy265;}
#line 2969 "pikchr.c"
        break;
      case 102: /* expr ::= PLUS expr */
#line 747 "pikchr.y"
{yymsp[-1].minor.yy265=yymsp[0].minor.yy265;}
#line 2974 "pikchr.c"
        break;
      case 103: /* expr ::= LP expr RP */
#line 748 "pikchr.y"
{yymsp[-2].minor.yy265=yymsp[-1].minor.yy265;}
#line 2979 "pikchr.c"
        break;
      case 104: /* expr ::= LP FILL|COLOR|THICKNESS RP */
#line 749 "pikchr.y"
{yymsp[-2].minor.yy265=pik_get_var(p,&yymsp[-1].minor.yy0);}
#line 2984 "pikchr.c"
        break;
      case 105: /* expr ::= NUMBER */
#line 750 "pikchr.y"
{yylhsminor.yy265=pik_atof(&yymsp[0].minor.yy0);}
#line 2989 "pikchr.c"
  yymsp[0].minor.yy265 = yylhsminor.yy265;
        break;
      case 106: /* expr ::= ID */
#line 751 "pikchr.y"
{yylhsminor.yy265=pik_get_var(p,&yymsp[0].minor.yy0);}
#line 2995 "pikchr.c"
  yymsp[0].minor.yy265 = yylhsminor.yy265;
        break;
      case 107: /* expr ::= FUNC1 LP expr RP */
#line 752 "pikchr.y"
{yylhsminor.yy265 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy265,0.0);}
#line 3001 "pikchr.c"
  yymsp[-3].minor.yy265 = yylhsminor.yy265;
        break;
      case 108: /* expr ::= FUNC2 LP expr COMMA expr RP */
#line 753 "pikchr.y"
{yylhsminor.yy265 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy265,yymsp[-1].minor.yy265);}
#line 3007 "pikchr.c"
  yymsp[-5].minor.yy265 = yylhsminor.yy265;
        break;
      case 109: /* expr ::= DIST LP position COMMA position RP */
#line 754 "pikchr.y"
{yymsp[-5].minor.yy265 = pik_dist(&yymsp[-3].minor.yy43,&yymsp[-1].minor.yy43);}
#line 3013 "pikchr.c"
        break;
      case 110: /* expr ::= place2 DOT_XY X */
#line 755 "pikchr.y"
{yylhsminor.yy265 = yymsp[-2].minor.yy43.x;}
#line 3018 "pikchr.c"
  yymsp[-2].minor.yy265 = yylhsminor.yy265;
        break;
      case 111: /* expr ::= place2 DOT_XY Y */
#line 756 "pikchr.y"
{yylhsminor.yy265 = yymsp[-2].minor.yy43.y;}
#line 3024 "pikchr.c"
  yymsp[-2].minor.yy265 = yylhsminor.yy265;
        break;
      case 112: /* expr ::= object DOT_L numproperty */
      case 113: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==113);
      case 114: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==114);
#line 757 "pikchr.y"
{yylhsminor.yy265=pik_property_of(yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
#line 3032 "pikchr.c"
  yymsp[-2].minor.yy265 = yylhsminor.yy265;
        break;
      default:
      /* (115) lvalue ::= ID */ yytestcase(yyruleno==115);
      /* (116) lvalue ::= FILL */ yytestcase(yyruleno==116);
      /* (117) lvalue ::= COLOR */ yytestcase(yyruleno==117);
      /* (118) lvalue ::= THICKNESS */ yytestcase(yyruleno==118);
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
  int yymajor,                   /* The major type of the error token */
  pik_parserTOKENTYPE yyminor         /* The minor type of the error token */
){
  pik_parserARG_FETCH
  pik_parserCTX_FETCH
#define TOKEN yyminor
/************ Begin %syntax_error code ****************************************/
#line 514 "pikchr.y"

  if( TOKEN.z && TOKEN.z[0] ){
    pik_error(p, &TOKEN, "syntax error");
  }else{
    pik_error(p, 0, "syntax error");
  }
  UNUSED_PARAMETER(yymajor);
#line 3139 "pikchr.c"
/************ End %syntax_error code ******************************************/
  pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
  pik_parserCTX_STORE
}

/*
** The following is executed when the parser accepts







|







|







3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
  int yymajor,                   /* The major type of the error token */
  pik_parserTOKENTYPE yyminor         /* The minor type of the error token */
){
  pik_parserARG_FETCH
  pik_parserCTX_FETCH
#define TOKEN yyminor
/************ Begin %syntax_error code ****************************************/
#line 518 "pikchr.y"

  if( TOKEN.z && TOKEN.z[0] ){
    pik_error(p, &TOKEN, "syntax error");
  }else{
    pik_error(p, 0, "syntax error");
  }
  UNUSED_PARAMETER(yymajor);
#line 3143 "pikchr.c"
/************ End %syntax_error code ******************************************/
  pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
  pik_parserCTX_STORE
}

/*
** The following is executed when the parser accepts
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352

3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386

3387
3388
3389
3390
3391
3392
3393
3394
3395
3396

3397
3398
3399
3400
3401

3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413

3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429

3430
3431
3432
3433
3434

3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475

3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488

3489
3490
3491
3492
3493
3494
3495
  assert( iToken<(int)(sizeof(yyFallback)/sizeof(yyFallback[0])) );
  return yyFallback[iToken];
#else
  (void)iToken;
  return 0;
#endif
}
#line 758 "pikchr.y"



/* Chart of the 140 official HTML color names with their
** corresponding RGB value.

**
** Two new names "None" and "Off" are added with a value
** of -1.
*/
static const struct {
  const char *zName;  /* Name of the color */
  int val;            /* RGB value */
} aColor[] = {
  { "AliceBlue",                   0xf0f8ff },
  { "AntiqueWhite",                0xfaebd7 },
  { "Aqua",                        0x00ffff },
  { "AquaMarine",                  0x7fffd4 },
  { "Azure",                       0xf0ffff },
  { "Beige",                       0xf5f5dc },
  { "Bisque",                      0xffe4c4 },
  { "Black",                       0x000000 },
  { "BlanchedAlmond",              0xffebcd },
  { "Blue",                        0x0000ff },
  { "BlueViolet",                  0x8a2be2 },
  { "Brown",                       0xa52a2a },
  { "BurlyWood",                   0xdeb887 },
  { "CadetBlue",                   0x5f9ea0 },
  { "Chartreuse",                  0x7fff00 },
  { "Chocolate",                   0xd2691e },
  { "Coral",                       0xff7f50 },
  { "CornFlowerBlue",              0x6495ed },
  { "Cornsilk",                    0xfff8dc },
  { "Crimson",                     0xdc143c },
  { "Cyan",                        0x00ffff },
  { "DarkBlue",                    0x00008b },
  { "DarkCyan",                    0x008b8b },
  { "DarkGoldenRod",               0xb8860b },
  { "DarkGray",                    0xa9a9a9 },
  { "DarkGreen",                   0x006400 },

  { "DarkKhaki",                   0xbdb76b },
  { "DarkMagenta",                 0x8b008b },
  { "DarkOliveGreen",              0x556b2f },
  { "DarkOrange",                  0xff8c00 },
  { "DarkOrchid",                  0x9932cc },
  { "DarkRed",                     0x8b0000 },
  { "DarkSalmon",                  0xe9967a },
  { "DarkSeaGreen",                0x8fbc8f },
  { "DarkSlateBlue",               0x483d8b },
  { "DarkSlateGray",               0x2f4f4f },

  { "DarkTurquoise",               0x00ced1 },
  { "DarkViolet",                  0x9400d3 },
  { "DeepPink",                    0xff1493 },
  { "DeepSkyBlue",                 0x00bfff },
  { "DimGray",                     0x696969 },

  { "DodgerBlue",                  0x1e90ff },
  { "FireBrick",                   0xb22222 },
  { "FloralWhite",                 0xfffaf0 },
  { "ForestGreen",                 0x228b22 },
  { "Fuchsia",                     0xff00ff },
  { "Gainsboro",                   0xdcdcdc },
  { "GhostWhite",                  0xf8f8ff },
  { "Gold",                        0xffd700 },
  { "GoldenRod",                   0xdaa520 },
  { "Gray",                        0x808080 },
  { "Green",                       0x008000 },
  { "GreenYellow",                 0xadff2f },

  { "HoneyDew",                    0xf0fff0 },
  { "HotPink",                     0xff69b4 },
  { "IndianRed",                   0xcd5c5c },
  { "Indigo",                      0x4b0082 },
  { "Ivory",                       0xfffff0 },
  { "Khaki",                       0xf0e68c },
  { "Lavender",                    0xe6e6fa },
  { "LavenderBlush",               0xfff0f5 },
  { "LawnGreen",                   0x7cfc00 },
  { "LemonChiffon",                0xfffacd },
  { "LightBlue",                   0xadd8e6 },
  { "LightCoral",                  0xf08080 },
  { "LightCyan",                   0xe0ffff },
  { "LightGoldenrodYellow",        0xfafad2 },
  { "LightGray",                   0xd3d3d3 },
  { "LightGreen",                  0x90ee90 },

  { "LightPink",                   0xffb6c1 },
  { "LightSalmon",                 0xffa07a },
  { "LightSeaGreen",               0x20b2aa },
  { "LightSkyBlue",                0x87cefa },
  { "LightSlateGray",              0x778899 },

  { "LightSteelBlue",              0xb0c4de },
  { "LightYellow",                 0xffffe0 },
  { "Lime",                        0x00ff00 },
  { "LimeGreen",                   0x32cd32 },
  { "Linen",                       0xfaf0e6 },
  { "Magenta",                     0xff00ff },
  { "Maroon",                      0x800000 },
  { "MediumAquaMarine",            0x66cdaa },
  { "MediumBlue",                  0x0000cd },
  { "MediumOrchid",                0xba55d3 },
  { "MediumPurple",                0x9370d8 },
  { "MediumSeaGreen",              0x3cb371 },
  { "MediumSlateBlue",             0x7b68ee },
  { "MediumSpringGreen",           0x00fa9a },
  { "MediumTurquoise",             0x48d1cc },
  { "MediumVioletRed",             0xc71585 },
  { "MidnightBlue",                0x191970 },
  { "MintCream",                   0xf5fffa },
  { "MistyRose",                   0xffe4e1 },
  { "Moccasin",                    0xffe4b5 },
  { "NavajoWhite",                 0xffdead },
  { "Navy",                        0x000080 },
  { "None",                              -1 },  /* Non-standard addition */
  { "Off",                               -1 },  /* Non-standard addition */
  { "OldLace",                     0xfdf5e6 },
  { "Olive",                       0x808000 },
  { "OliveDrab",                   0x6b8e23 },
  { "Orange",                      0xffa500 },
  { "OrangeRed",                   0xff4500 },
  { "Orchid",                      0xda70d6 },
  { "PaleGoldenRod",               0xeee8aa },
  { "PaleGreen",                   0x98fb98 },
  { "PaleTurquoise",               0xafeeee },
  { "PaleVioletRed",               0xdb7093 },
  { "PapayaWhip",                  0xffefd5 },
  { "PeachPuff",                   0xffdab9 },
  { "Peru",                        0xcd853f },
  { "Pink",                        0xffc0cb },
  { "Plum",                        0xdda0dd },
  { "PowderBlue",                  0xb0e0e6 },
  { "Purple",                      0x800080 },

  { "Red",                         0xff0000 },
  { "RosyBrown",                   0xbc8f8f },
  { "RoyalBlue",                   0x4169e1 },
  { "SaddleBrown",                 0x8b4513 },
  { "Salmon",                      0xfa8072 },
  { "SandyBrown",                  0xf4a460 },
  { "SeaGreen",                    0x2e8b57 },
  { "SeaShell",                    0xfff5ee },
  { "Sienna",                      0xa0522d },
  { "Silver",                      0xc0c0c0 },
  { "SkyBlue",                     0x87ceeb },
  { "SlateBlue",                   0x6a5acd },
  { "SlateGray",                   0x708090 },

  { "Snow",                        0xfffafa },
  { "SpringGreen",                 0x00ff7f },
  { "SteelBlue",                   0x4682b4 },
  { "Tan",                         0xd2b48c },
  { "Teal",                        0x008080 },
  { "Thistle",                     0xd8bfd8 },
  { "Tomato",                      0xff6347 },







|



|
|
>











|













|





|


>










>





>

|






|



>
|















>





>







|


|



















|










>







|





>







3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
  assert( iToken<(int)(sizeof(yyFallback)/sizeof(yyFallback[0])) );
  return yyFallback[iToken];
#else
  (void)iToken;
  return 0;
#endif
}
#line 762 "pikchr.y"



/* Chart of the 148 official CSS color names with their
** corresponding RGB values thru Color Module Level 4:
** https://developer.mozilla.org/en-US/docs/Web/CSS/color_value
**
** Two new names "None" and "Off" are added with a value
** of -1.
*/
static const struct {
  const char *zName;  /* Name of the color */
  int val;            /* RGB value */
} aColor[] = {
  { "AliceBlue",                   0xf0f8ff },
  { "AntiqueWhite",                0xfaebd7 },
  { "Aqua",                        0x00ffff },
  { "Aquamarine",                  0x7fffd4 },
  { "Azure",                       0xf0ffff },
  { "Beige",                       0xf5f5dc },
  { "Bisque",                      0xffe4c4 },
  { "Black",                       0x000000 },
  { "BlanchedAlmond",              0xffebcd },
  { "Blue",                        0x0000ff },
  { "BlueViolet",                  0x8a2be2 },
  { "Brown",                       0xa52a2a },
  { "BurlyWood",                   0xdeb887 },
  { "CadetBlue",                   0x5f9ea0 },
  { "Chartreuse",                  0x7fff00 },
  { "Chocolate",                   0xd2691e },
  { "Coral",                       0xff7f50 },
  { "CornflowerBlue",              0x6495ed },
  { "Cornsilk",                    0xfff8dc },
  { "Crimson",                     0xdc143c },
  { "Cyan",                        0x00ffff },
  { "DarkBlue",                    0x00008b },
  { "DarkCyan",                    0x008b8b },
  { "DarkGoldenrod",               0xb8860b },
  { "DarkGray",                    0xa9a9a9 },
  { "DarkGreen",                   0x006400 },
  { "DarkGrey",                    0xa9a9a9 },
  { "DarkKhaki",                   0xbdb76b },
  { "DarkMagenta",                 0x8b008b },
  { "DarkOliveGreen",              0x556b2f },
  { "DarkOrange",                  0xff8c00 },
  { "DarkOrchid",                  0x9932cc },
  { "DarkRed",                     0x8b0000 },
  { "DarkSalmon",                  0xe9967a },
  { "DarkSeaGreen",                0x8fbc8f },
  { "DarkSlateBlue",               0x483d8b },
  { "DarkSlateGray",               0x2f4f4f },
  { "DarkSlateGrey",               0x2f4f4f },
  { "DarkTurquoise",               0x00ced1 },
  { "DarkViolet",                  0x9400d3 },
  { "DeepPink",                    0xff1493 },
  { "DeepSkyBlue",                 0x00bfff },
  { "DimGray",                     0x696969 },
  { "DimGrey",                     0x696969 },
  { "DodgerBlue",                  0x1e90ff },
  { "Firebrick",                   0xb22222 },
  { "FloralWhite",                 0xfffaf0 },
  { "ForestGreen",                 0x228b22 },
  { "Fuchsia",                     0xff00ff },
  { "Gainsboro",                   0xdcdcdc },
  { "GhostWhite",                  0xf8f8ff },
  { "Gold",                        0xffd700 },
  { "Goldenrod",                   0xdaa520 },
  { "Gray",                        0x808080 },
  { "Green",                       0x008000 },
  { "GreenYellow",                 0xadff2f },
  { "Grey",                        0x808080 },
  { "Honeydew",                    0xf0fff0 },
  { "HotPink",                     0xff69b4 },
  { "IndianRed",                   0xcd5c5c },
  { "Indigo",                      0x4b0082 },
  { "Ivory",                       0xfffff0 },
  { "Khaki",                       0xf0e68c },
  { "Lavender",                    0xe6e6fa },
  { "LavenderBlush",               0xfff0f5 },
  { "LawnGreen",                   0x7cfc00 },
  { "LemonChiffon",                0xfffacd },
  { "LightBlue",                   0xadd8e6 },
  { "LightCoral",                  0xf08080 },
  { "LightCyan",                   0xe0ffff },
  { "LightGoldenrodYellow",        0xfafad2 },
  { "LightGray",                   0xd3d3d3 },
  { "LightGreen",                  0x90ee90 },
  { "LightGrey",                   0xd3d3d3 },
  { "LightPink",                   0xffb6c1 },
  { "LightSalmon",                 0xffa07a },
  { "LightSeaGreen",               0x20b2aa },
  { "LightSkyBlue",                0x87cefa },
  { "LightSlateGray",              0x778899 },
  { "LightSlateGrey",              0x778899 },
  { "LightSteelBlue",              0xb0c4de },
  { "LightYellow",                 0xffffe0 },
  { "Lime",                        0x00ff00 },
  { "LimeGreen",                   0x32cd32 },
  { "Linen",                       0xfaf0e6 },
  { "Magenta",                     0xff00ff },
  { "Maroon",                      0x800000 },
  { "MediumAquamarine",            0x66cdaa },
  { "MediumBlue",                  0x0000cd },
  { "MediumOrchid",                0xba55d3 },
  { "MediumPurple",                0x9370db },
  { "MediumSeaGreen",              0x3cb371 },
  { "MediumSlateBlue",             0x7b68ee },
  { "MediumSpringGreen",           0x00fa9a },
  { "MediumTurquoise",             0x48d1cc },
  { "MediumVioletRed",             0xc71585 },
  { "MidnightBlue",                0x191970 },
  { "MintCream",                   0xf5fffa },
  { "MistyRose",                   0xffe4e1 },
  { "Moccasin",                    0xffe4b5 },
  { "NavajoWhite",                 0xffdead },
  { "Navy",                        0x000080 },
  { "None",                              -1 },  /* Non-standard addition */
  { "Off",                               -1 },  /* Non-standard addition */
  { "OldLace",                     0xfdf5e6 },
  { "Olive",                       0x808000 },
  { "OliveDrab",                   0x6b8e23 },
  { "Orange",                      0xffa500 },
  { "OrangeRed",                   0xff4500 },
  { "Orchid",                      0xda70d6 },
  { "PaleGoldenrod",               0xeee8aa },
  { "PaleGreen",                   0x98fb98 },
  { "PaleTurquoise",               0xafeeee },
  { "PaleVioletRed",               0xdb7093 },
  { "PapayaWhip",                  0xffefd5 },
  { "PeachPuff",                   0xffdab9 },
  { "Peru",                        0xcd853f },
  { "Pink",                        0xffc0cb },
  { "Plum",                        0xdda0dd },
  { "PowderBlue",                  0xb0e0e6 },
  { "Purple",                      0x800080 },
  { "RebeccaPurple",               0x663399 },
  { "Red",                         0xff0000 },
  { "RosyBrown",                   0xbc8f8f },
  { "RoyalBlue",                   0x4169e1 },
  { "SaddleBrown",                 0x8b4513 },
  { "Salmon",                      0xfa8072 },
  { "SandyBrown",                  0xf4a460 },
  { "SeaGreen",                    0x2e8b57 },
  { "Seashell",                    0xfff5ee },
  { "Sienna",                      0xa0522d },
  { "Silver",                      0xc0c0c0 },
  { "SkyBlue",                     0x87ceeb },
  { "SlateBlue",                   0x6a5acd },
  { "SlateGray",                   0x708090 },
  { "SlateGrey",                   0x708090 },
  { "Snow",                        0xfffafa },
  { "SpringGreen",                 0x00ff7f },
  { "SteelBlue",                   0x4682b4 },
  { "Tan",                         0xd2b48c },
  { "Teal",                        0x008080 },
  { "Thistle",                     0xd8bfd8 },
  { "Tomato",                      0xff6347 },
4550
4551
4552
4553
4554
4555
4556






















4557
4558
4559
4560
4561
4562
4563
  char buf[100];
  snprintf(buf, sizeof(buf)-1, "%.10g,%.10g", 
          (double)pPt->x, (double)pPt->y);
  buf[sizeof(buf)-1] = 0;
  pik_append(p, z, -1);
  pik_append(p, buf, -1);
}























/* Append a PNum value surrounded by text.  Do coordinate transformations
** on the value.
*/
static void pik_append_x(Pik *p, const char *z1, PNum v, const char *z2){
  char buf[200];
  v -= p->bbox.sw.x;







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
  char buf[100];
  snprintf(buf, sizeof(buf)-1, "%.10g,%.10g", 
          (double)pPt->x, (double)pPt->y);
  buf[sizeof(buf)-1] = 0;
  pik_append(p, z, -1);
  pik_append(p, buf, -1);
}

/*
** Invert the RGB color so that it is appropriate for dark mode.
*/
static int pik_color_to_dark_mode(int x){
  int r, g, b;
  int mn, mx;
  x = 0xffffff - x;
  r = (x>>16) & 0xff;
  g = (x>>8) & 0xff;
  b = x & 0xff;
  mx = r;
  if( g>mx ) mx = g;
  if( b>mx ) mx = b;
  mn = r;
  if( g<mn ) mn = g;
  if( b<mn ) mn = b;
  r = mn + (mx-r);
  g = mn + (mx-g);
  b = mn + (mx-b);
  return r*0x10000 + g*0x100 + b;
}

/* Append a PNum value surrounded by text.  Do coordinate transformations
** on the value.
*/
static void pik_append_x(Pik *p, const char *z1, PNum v, const char *z2){
  char buf[200];
  v -= p->bbox.sw.x;
4586
4587
4588
4589
4590
4591
4592


4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
  snprintf(buf, sizeof(buf)-1, "%s%g%s", z1, p->rScale*v, z2);
  buf[sizeof(buf)-1] = 0;
  pik_append(p, buf, -1);
}
static void pik_append_clr(Pik *p, const char *z1, PNum v, const char *z2){
  char buf[200];
  int x = (int)v;


  int r = (x>>16) & 0xff;
  int g = (x>>8) & 0xff;
  int b = x & 0xff;
  snprintf(buf, sizeof(buf)-1, "%srgb(%d,%d,%d)%s", z1, r, g, b, z2);
  buf[sizeof(buf)-1] = 0;
  pik_append(p, buf, -1);
}

/* Append an SVG path A record:
**







>
>
|
|
|







4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
  snprintf(buf, sizeof(buf)-1, "%s%g%s", z1, p->rScale*v, z2);
  buf[sizeof(buf)-1] = 0;
  pik_append(p, buf, -1);
}
static void pik_append_clr(Pik *p, const char *z1, PNum v, const char *z2){
  char buf[200];
  int x = (int)v;
  int r, g, b;
  if( p->mFlags & PIKCHR_DARK_MODE ) x = pik_color_to_dark_mode(x);
  r = (x>>16) & 0xff;
  g = (x>>8) & 0xff;
  b = x & 0xff;
  snprintf(buf, sizeof(buf)-1, "%srgb(%d,%d,%d)%s", z1, r, g, b, z2);
  buf[sizeof(buf)-1] = 0;
  pik_append(p, buf, -1);
}

/* Append an SVG path A record:
**
7618
7619
7620
7621
7622
7623
7624

7625
7626
7627
7628
7629
7630
7631
*/
int main(int argc, char **argv){
  int i;
  int bSvgOnly = 0;            /* Output SVG only.  No HTML wrapper */
  int bDontStop = 0;           /* Continue in spite of errors */
  int exitCode = 0;            /* What to return */
  int mFlags = 0;              /* mFlags argument to pikchr() */

  const char *zHtmlHdr = 
    "<!DOCTYPE html>\n"
    "<html lang=\"en-US\">\n"
    "<head>\n<title>PIKCHR Test</title>\n"
    "<style>\n"
    "  .hidden {\n"
    "     position: absolute !important;\n"







>







7655
7656
7657
7658
7659
7660
7661
7662
7663
7664
7665
7666
7667
7668
7669
*/
int main(int argc, char **argv){
  int i;
  int bSvgOnly = 0;            /* Output SVG only.  No HTML wrapper */
  int bDontStop = 0;           /* Continue in spite of errors */
  int exitCode = 0;            /* What to return */
  int mFlags = 0;              /* mFlags argument to pikchr() */
  const char *zStyle = "";     /* Extra styling */
  const char *zHtmlHdr = 
    "<!DOCTYPE html>\n"
    "<html lang=\"en-US\">\n"
    "<head>\n<title>PIKCHR Test</title>\n"
    "<style>\n"
    "  .hidden {\n"
    "     position: absolute !important;\n"
7655
7656
7657
7658
7659
7660
7661




7662
7663
7664
7665
7666
7667
7668

    if( argv[i][0]=='-' ){
      char *z = argv[i];
      z++;
      if( z[0]=='-' ) z++;
      if( strcmp(z,"dont-stop")==0 ){
        bDontStop = 1;




      }else
      if( strcmp(z,"svg-only")==0 ){
        if( zHtmlHdr==0 ){
          fprintf(stderr, "the \"%s\" option must come first\n",argv[i]);
          exit(1);
        }
        bSvgOnly = 1;







>
>
>
>







7693
7694
7695
7696
7697
7698
7699
7700
7701
7702
7703
7704
7705
7706
7707
7708
7709
7710

    if( argv[i][0]=='-' ){
      char *z = argv[i];
      z++;
      if( z[0]=='-' ) z++;
      if( strcmp(z,"dont-stop")==0 ){
        bDontStop = 1;
      }else
      if( strcmp(z,"dark-mode")==0 ){
        zStyle = "color:white;background-color:black;";
        mFlags |= PIKCHR_DARK_MODE;
      }else
      if( strcmp(z,"svg-only")==0 ){
        if( zHtmlHdr==0 ){
          fprintf(stderr, "the \"%s\" option must come first\n",argv[i]);
          exit(1);
        }
        bSvgOnly = 1;
7704
7705
7706
7707
7708
7709
7710
7711

7712
7713
7714
7715
7716
7717
7718
        zHtmlHdr = 0;
      }
      printf("<h1>File %s</h1>\n", argv[i]);
      if( w<0 ){
        printf("<p>ERROR</p>\n%s\n", zOut);
      }else{
        printf("<div id=\"svg-%d\" onclick=\"toggleHidden('svg-%d')\">\n",i,i);
        printf("<div style='border:3px solid lightgray;max-width:%dpx;'>\n",w);

        printf("%s</div>\n", zOut);
        printf("<pre class='hidden'>");
        print_escape_html(zIn);
        printf("</pre>\n</div>\n");
      }
    }
    free(zOut);







|
>







7746
7747
7748
7749
7750
7751
7752
7753
7754
7755
7756
7757
7758
7759
7760
7761
        zHtmlHdr = 0;
      }
      printf("<h1>File %s</h1>\n", argv[i]);
      if( w<0 ){
        printf("<p>ERROR</p>\n%s\n", zOut);
      }else{
        printf("<div id=\"svg-%d\" onclick=\"toggleHidden('svg-%d')\">\n",i,i);
        printf("<div style='border:3px solid lightgray;max-width:%dpx;%s'>\n",
               w,zStyle);
        printf("%s</div>\n", zOut);
        printf("<pre class='hidden'>");
        print_escape_html(zIn);
        printf("</pre>\n</div>\n");
      }
    }
    free(zOut);
7781
7782
7783
7784
7785
7786
7787
7788
  return TCL_OK;
}


#endif /* PIKCHR_TCL */


#line 7813 "pikchr.c"







|
7824
7825
7826
7827
7828
7829
7830
7831
  return TCL_OK;
}


#endif /* PIKCHR_TCL */


#line 7856 "pikchr.c"
Changes to src/pikchrshow.c.
20
21
22
23
24
25
26

27
28
29
30
31
32
33
34
35
36
37
38
39
#include "config.h"
#include <assert.h>
#include <ctype.h>
#include "pikchrshow.h"

#if INTERFACE
/* These are described in pikchr_process()'s docs. */

#define PIKCHR_PROCESS_TH1        0x01
#define PIKCHR_PROCESS_TH1_NOSVG  0x02
#define PIKCHR_PROCESS_NONCE      0x04
#define PIKCHR_PROCESS_ERR_PRE    0x08
#define PIKCHR_PROCESS_SRC        0x10
#define PIKCHR_PROCESS_DIV        0x20
#define PIKCHR_PROCESS_DIV_INDENT        0x0100
#define PIKCHR_PROCESS_DIV_CENTER        0x0200
#define PIKCHR_PROCESS_DIV_FLOAT_LEFT    0x0400
#define PIKCHR_PROCESS_DIV_FLOAT_RIGHT   0x0800
#define PIKCHR_PROCESS_DIV_TOGGLE        0x1000
#define PIKCHR_PROCESS_DIV_SOURCE        0x2000
#define PIKCHR_PROCESS_DIV_SOURCE_INLINE 0x4000







>
|
|
|
|
|
|







20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "config.h"
#include <assert.h>
#include <ctype.h>
#include "pikchrshow.h"

#if INTERFACE
/* These are described in pikchr_process()'s docs. */
#define PIKCHR_PROCESS_PASSTHROUGH       0x0003   /* Pass through these flags */
#define PIKCHR_PROCESS_TH1               0x0004
#define PIKCHR_PROCESS_TH1_NOSVG         0x0008
#define PIKCHR_PROCESS_NONCE             0x0010
#define PIKCHR_PROCESS_ERR_PRE           0x0020
#define PIKCHR_PROCESS_SRC               0x0040
#define PIKCHR_PROCESS_DIV               0x0080
#define PIKCHR_PROCESS_DIV_INDENT        0x0100
#define PIKCHR_PROCESS_DIV_CENTER        0x0200
#define PIKCHR_PROCESS_DIV_FLOAT_LEFT    0x0400
#define PIKCHR_PROCESS_DIV_FLOAT_RIGHT   0x0800
#define PIKCHR_PROCESS_DIV_TOGGLE        0x1000
#define PIKCHR_PROCESS_DIV_SOURCE        0x2000
#define PIKCHR_PROCESS_DIV_SOURCE_INLINE 0x4000
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
    if(PIKCHR_PROCESS_TH1_NOSVG & pikFlags){
      blob_append(pOut, blob_str(&bIn), blob_size(&bIn));
    }else{
      int w = 0, h = 0;
      const char * zContent = blob_str(&bIn);
      char *zOut;
      zOut = pikchr(zContent, "pikchr",
                    0x01/*==>PIKCHR_PLAINTEXT_ERRORS*/,
                    &w, &h);
      if( w>0 && h>0 ){
        const char * zClassToggle = "";
        const char * zClassSource = "";
        const char * zWrapperClass = "";
        if(PIKCHR_PROCESS_DIV & pikFlags){
          if(PIKCHR_PROCESS_DIV_CENTER & pikFlags){







|







158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
    if(PIKCHR_PROCESS_TH1_NOSVG & pikFlags){
      blob_append(pOut, blob_str(&bIn), blob_size(&bIn));
    }else{
      int w = 0, h = 0;
      const char * zContent = blob_str(&bIn);
      char *zOut;
      zOut = pikchr(zContent, "pikchr",
                    0x01 | (pikFlags&PIKCHR_PROCESS_PASSTHROUGH),
                    &w, &h);
      if( w>0 && h>0 ){
        const char * zClassToggle = "";
        const char * zClassSource = "";
        const char * zWrapperClass = "";
        if(PIKCHR_PROCESS_DIV & pikFlags){
          if(PIKCHR_PROCESS_DIV_CENTER & pikFlags){