Fossil

Diff
Login

Differences From Artifact [8f0dc5ef14]:

To Artifact [feb57e361c]:


371
372
373
374
375
376
377





378
379
380
381
382
383
384
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389







+
+
+
+
+







  int mTPath;              /* For last entry, 1: x set,  2: y set */
  PPoint aTPath[1000];     /* Path under construction */
  /* Error contexts */
  unsigned int nCtx;       /* Number of error contexts */
  PToken aCtx[10];         /* Nested error contexts */
};

/* 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 */
461
462
463
464
465
466
467
468

469
470
471
472
473
474
475
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 494 "pikchr.c"
#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
1678
1679
1680
1681
1682
1683
1684
1685

1686
1687

1688
1689
1690
1691
1692
1693
1694

1695
1696

1697
1698
1699
1700
1701
1702
1703
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 483 "pikchr.y"
#line 488 "pikchr.y"
pik_elist_free(p,(yypminor->yy119));
#line 1712 "pikchr.c"
#line 1717 "pikchr.c"
}
      break;
    case 99: /* statement */
    case 100: /* unnamed_statement */
    case 101: /* basetype */
{
#line 485 "pikchr.y"
#line 490 "pikchr.y"
pik_elem_free(p,(yypminor->yy38));
#line 1721 "pikchr.c"
#line 1726 "pikchr.c"
}
      break;
/********* End destructor definitions *****************************************/
    default:  break;   /* If no destructor action specified: do nothing */
  }
}

1907
1908
1909
1910
1911
1912
1913
1914

1915
1916
1917

1918
1919
1920
1921
1922
1923
1924
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 517 "pikchr.y"
#line 522 "pikchr.y"

  pik_error(p, 0, "parser stack overflow");
#line 1942 "pikchr.c"
#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
2388
2389
2390
2391
2392
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
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 521 "pikchr.y"
#line 526 "pikchr.y"
{pik_render(p,yymsp[0].minor.yy119);}
#line 2422 "pikchr.c"
#line 2427 "pikchr.c"
        break;
      case 1: /* statement_list ::= statement */
#line 524 "pikchr.y"
#line 529 "pikchr.y"
{ yylhsminor.yy119 = pik_elist_append(p,0,yymsp[0].minor.yy38); }
#line 2427 "pikchr.c"
#line 2432 "pikchr.c"
  yymsp[0].minor.yy119 = yylhsminor.yy119;
        break;
      case 2: /* statement_list ::= statement_list EOL statement */
#line 526 "pikchr.y"
#line 531 "pikchr.y"
{ yylhsminor.yy119 = pik_elist_append(p,yymsp[-2].minor.yy119,yymsp[0].minor.yy38); }
#line 2433 "pikchr.c"
#line 2438 "pikchr.c"
  yymsp[-2].minor.yy119 = yylhsminor.yy119;
        break;
      case 3: /* statement ::= */
#line 529 "pikchr.y"
#line 534 "pikchr.y"
{ yymsp[1].minor.yy38 = 0; }
#line 2439 "pikchr.c"
#line 2444 "pikchr.c"
        break;
      case 4: /* statement ::= direction */
#line 530 "pikchr.y"
#line 535 "pikchr.y"
{ pik_set_direction(p,yymsp[0].minor.yy0.eCode);  yylhsminor.yy38=0; }
#line 2444 "pikchr.c"
#line 2449 "pikchr.c"
  yymsp[0].minor.yy38 = yylhsminor.yy38;
        break;
      case 5: /* statement ::= lvalue ASSIGN rvalue */
#line 531 "pikchr.y"
#line 536 "pikchr.y"
{pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy265,&yymsp[-1].minor.yy0); yylhsminor.yy38=0;}
#line 2450 "pikchr.c"
#line 2455 "pikchr.c"
  yymsp[-2].minor.yy38 = yylhsminor.yy38;
        break;
      case 6: /* statement ::= PLACENAME COLON unnamed_statement */
#line 533 "pikchr.y"
#line 538 "pikchr.y"
{ yylhsminor.yy38 = yymsp[0].minor.yy38;  pik_elem_setname(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0); }
#line 2456 "pikchr.c"
#line 2461 "pikchr.c"
  yymsp[-2].minor.yy38 = yylhsminor.yy38;
        break;
      case 7: /* statement ::= PLACENAME COLON position */
#line 535 "pikchr.y"
#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 2463 "pikchr.c"
#line 2468 "pikchr.c"
  yymsp[-2].minor.yy38 = yylhsminor.yy38;
        break;
      case 8: /* statement ::= unnamed_statement */
#line 537 "pikchr.y"
#line 542 "pikchr.y"
{yylhsminor.yy38 = yymsp[0].minor.yy38;}
#line 2469 "pikchr.c"
#line 2474 "pikchr.c"
  yymsp[0].minor.yy38 = yylhsminor.yy38;
        break;
      case 9: /* statement ::= print prlist */
#line 538 "pikchr.y"
#line 543 "pikchr.y"
{pik_append(p,"<br>\n",5); yymsp[-1].minor.yy38=0;}
#line 2475 "pikchr.c"
#line 2480 "pikchr.c"
        break;
      case 10: /* statement ::= ASSERT LP expr EQ expr RP */
#line 543 "pikchr.y"
#line 548 "pikchr.y"
{yymsp[-5].minor.yy38=pik_assert(p,yymsp[-3].minor.yy265,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy265);}
#line 2480 "pikchr.c"
#line 2485 "pikchr.c"
        break;
      case 11: /* statement ::= ASSERT LP position EQ position RP */
#line 545 "pikchr.y"
#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 2485 "pikchr.c"
#line 2490 "pikchr.c"
        break;
      case 12: /* statement ::= DEFINE ID CODEBLOCK */
#line 546 "pikchr.y"
#line 551 "pikchr.y"
{yymsp[-2].minor.yy38=0; pik_add_macro(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
#line 2490 "pikchr.c"
#line 2495 "pikchr.c"
        break;
      case 13: /* rvalue ::= PLACENAME */
#line 557 "pikchr.y"
#line 562 "pikchr.y"
{yylhsminor.yy265 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
#line 2495 "pikchr.c"
#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 562 "pikchr.y"
#line 567 "pikchr.y"
{pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
#line 2503 "pikchr.c"
#line 2508 "pikchr.c"
        break;
      case 17: /* pritem ::= rvalue */
#line 565 "pikchr.y"
#line 570 "pikchr.y"
{pik_append_num(p,"",yymsp[0].minor.yy265);}
#line 2508 "pikchr.c"
#line 2513 "pikchr.c"
        break;
      case 18: /* pritem ::= STRING */
#line 566 "pikchr.y"
#line 571 "pikchr.y"
{pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
#line 2513 "pikchr.c"
#line 2518 "pikchr.c"
        break;
      case 19: /* prsep ::= COMMA */
#line 567 "pikchr.y"
#line 572 "pikchr.y"
{pik_append(p, " ", 1);}
#line 2518 "pikchr.c"
#line 2523 "pikchr.c"
        break;
      case 20: /* unnamed_statement ::= basetype attribute_list */
#line 570 "pikchr.y"
#line 575 "pikchr.y"
{yylhsminor.yy38 = yymsp[-1].minor.yy38; pik_after_adding_attributes(p,yylhsminor.yy38);}
#line 2523 "pikchr.c"
#line 2528 "pikchr.c"
  yymsp[-1].minor.yy38 = yylhsminor.yy38;
        break;
      case 21: /* basetype ::= CLASSNAME */
#line 572 "pikchr.y"
#line 577 "pikchr.y"
{yylhsminor.yy38 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
#line 2529 "pikchr.c"
#line 2534 "pikchr.c"
  yymsp[0].minor.yy38 = yylhsminor.yy38;
        break;
      case 22: /* basetype ::= STRING textposition */
#line 574 "pikchr.y"
#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 2535 "pikchr.c"
#line 2540 "pikchr.c"
  yymsp[-1].minor.yy38 = yylhsminor.yy38;
        break;
      case 23: /* basetype ::= LB savelist statement_list RB */
#line 576 "pikchr.y"
#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 2541 "pikchr.c"
#line 2546 "pikchr.c"
        break;
      case 24: /* savelist ::= */
#line 581 "pikchr.y"
#line 586 "pikchr.y"
{yymsp[1].minor.yy119 = p->list; p->list = 0;}
#line 2546 "pikchr.c"
#line 2551 "pikchr.c"
        break;
      case 25: /* relexpr ::= expr */
#line 588 "pikchr.y"
#line 593 "pikchr.y"
{yylhsminor.yy200.rAbs = yymsp[0].minor.yy265; yylhsminor.yy200.rRel = 0;}
#line 2551 "pikchr.c"
#line 2556 "pikchr.c"
  yymsp[0].minor.yy200 = yylhsminor.yy200;
        break;
      case 26: /* relexpr ::= expr PERCENT */
#line 589 "pikchr.y"
#line 594 "pikchr.y"
{yylhsminor.yy200.rAbs = 0; yylhsminor.yy200.rRel = yymsp[-1].minor.yy265/100;}
#line 2557 "pikchr.c"
#line 2562 "pikchr.c"
  yymsp[-1].minor.yy200 = yylhsminor.yy200;
        break;
      case 27: /* optrelexpr ::= */
#line 591 "pikchr.y"
#line 596 "pikchr.y"
{yymsp[1].minor.yy200.rAbs = 0; yymsp[1].minor.yy200.rRel = 1.0;}
#line 2563 "pikchr.c"
#line 2568 "pikchr.c"
        break;
      case 28: /* attribute_list ::= relexpr alist */
#line 593 "pikchr.y"
#line 598 "pikchr.y"
{pik_add_direction(p,0,&yymsp[-1].minor.yy200);}
#line 2568 "pikchr.c"
#line 2573 "pikchr.c"
        break;
      case 29: /* attribute ::= numproperty relexpr */
#line 597 "pikchr.y"
#line 602 "pikchr.y"
{ pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy200); }
#line 2573 "pikchr.c"
#line 2578 "pikchr.c"
        break;
      case 30: /* attribute ::= dashproperty expr */
#line 598 "pikchr.y"
#line 603 "pikchr.y"
{ pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy265); }
#line 2578 "pikchr.c"
#line 2583 "pikchr.c"
        break;
      case 31: /* attribute ::= dashproperty */
#line 599 "pikchr.y"
#line 604 "pikchr.y"
{ pik_set_dashed(p,&yymsp[0].minor.yy0,0);  }
#line 2583 "pikchr.c"
#line 2588 "pikchr.c"
        break;
      case 32: /* attribute ::= colorproperty rvalue */
#line 600 "pikchr.y"
#line 605 "pikchr.y"
{ pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy265); }
#line 2588 "pikchr.c"
#line 2593 "pikchr.c"
        break;
      case 33: /* attribute ::= go direction optrelexpr */
#line 601 "pikchr.y"
#line 606 "pikchr.y"
{ pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy200);}
#line 2593 "pikchr.c"
#line 2598 "pikchr.c"
        break;
      case 34: /* attribute ::= go direction even position */
#line 602 "pikchr.y"
#line 607 "pikchr.y"
{pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy43);}
#line 2598 "pikchr.c"
#line 2603 "pikchr.c"
        break;
      case 35: /* attribute ::= CLOSE */
#line 603 "pikchr.y"
#line 608 "pikchr.y"
{ pik_close_path(p,&yymsp[0].minor.yy0); }
#line 2603 "pikchr.c"
#line 2608 "pikchr.c"
        break;
      case 36: /* attribute ::= CHOP */
#line 604 "pikchr.y"
#line 609 "pikchr.y"
{ p->cur->bChop = 1; }
#line 2608 "pikchr.c"
#line 2613 "pikchr.c"
        break;
      case 37: /* attribute ::= FROM position */
#line 605 "pikchr.y"
#line 610 "pikchr.y"
{ pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy43); }
#line 2613 "pikchr.c"
#line 2618 "pikchr.c"
        break;
      case 38: /* attribute ::= TO position */
#line 606 "pikchr.y"
#line 611 "pikchr.y"
{ pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy43); }
#line 2618 "pikchr.c"
#line 2623 "pikchr.c"
        break;
      case 39: /* attribute ::= THEN */
#line 607 "pikchr.y"
#line 612 "pikchr.y"
{ pik_then(p, &yymsp[0].minor.yy0, p->cur); }
#line 2623 "pikchr.c"
#line 2628 "pikchr.c"
        break;
      case 40: /* attribute ::= THEN optrelexpr HEADING expr */
      case 42: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==42);
#line 609 "pikchr.y"
#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 2629 "pikchr.c"
#line 2634 "pikchr.c"
        break;
      case 41: /* attribute ::= THEN optrelexpr EDGEPT */
      case 43: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==43);
#line 610 "pikchr.y"
#line 615 "pikchr.y"
{pik_move_hdg(p,&yymsp[-1].minor.yy200,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
#line 2635 "pikchr.c"
#line 2640 "pikchr.c"
        break;
      case 44: /* attribute ::= AT position */
#line 615 "pikchr.y"
#line 620 "pikchr.y"
{ pik_set_at(p,0,&yymsp[0].minor.yy43,&yymsp[-1].minor.yy0); }
#line 2640 "pikchr.c"
#line 2645 "pikchr.c"
        break;
      case 45: /* attribute ::= SAME */
#line 617 "pikchr.y"
#line 622 "pikchr.y"
{pik_same(p,0,&yymsp[0].minor.yy0);}
#line 2645 "pikchr.c"
#line 2650 "pikchr.c"
        break;
      case 46: /* attribute ::= SAME AS object */
#line 618 "pikchr.y"
#line 623 "pikchr.y"
{pik_same(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
#line 2650 "pikchr.c"
#line 2655 "pikchr.c"
        break;
      case 47: /* attribute ::= STRING textposition */
#line 619 "pikchr.y"
#line 624 "pikchr.y"
{pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy196);}
#line 2655 "pikchr.c"
#line 2660 "pikchr.c"
        break;
      case 48: /* attribute ::= FIT */
#line 620 "pikchr.y"
#line 625 "pikchr.y"
{pik_size_to_fit(p,&yymsp[0].minor.yy0,3); }
#line 2660 "pikchr.c"
#line 2665 "pikchr.c"
        break;
      case 49: /* attribute ::= BEHIND object */
#line 621 "pikchr.y"
#line 626 "pikchr.y"
{pik_behind(p,yymsp[0].minor.yy38);}
#line 2665 "pikchr.c"
#line 2670 "pikchr.c"
        break;
      case 50: /* withclause ::= DOT_E edge AT position */
      case 51: /* withclause ::= edge AT position */ yytestcase(yyruleno==51);
#line 629 "pikchr.y"
#line 634 "pikchr.y"
{ pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy43,&yymsp[-1].minor.yy0); }
#line 2671 "pikchr.c"
#line 2676 "pikchr.c"
        break;
      case 52: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
#line 633 "pikchr.y"
#line 638 "pikchr.y"
{yylhsminor.yy0 = yymsp[0].minor.yy0;}
#line 2676 "pikchr.c"
#line 2681 "pikchr.c"
  yymsp[0].minor.yy0 = yylhsminor.yy0;
        break;
      case 53: /* boolproperty ::= CW */
#line 644 "pikchr.y"
#line 649 "pikchr.y"
{p->cur->cw = 1;}
#line 2682 "pikchr.c"
#line 2687 "pikchr.c"
        break;
      case 54: /* boolproperty ::= CCW */
#line 645 "pikchr.y"
#line 650 "pikchr.y"
{p->cur->cw = 0;}
#line 2687 "pikchr.c"
#line 2692 "pikchr.c"
        break;
      case 55: /* boolproperty ::= LARROW */
#line 646 "pikchr.y"
#line 651 "pikchr.y"
{p->cur->larrow=1; p->cur->rarrow=0; }
#line 2692 "pikchr.c"
#line 2697 "pikchr.c"
        break;
      case 56: /* boolproperty ::= RARROW */
#line 647 "pikchr.y"
#line 652 "pikchr.y"
{p->cur->larrow=0; p->cur->rarrow=1; }
#line 2697 "pikchr.c"
#line 2702 "pikchr.c"
        break;
      case 57: /* boolproperty ::= LRARROW */
#line 648 "pikchr.y"
#line 653 "pikchr.y"
{p->cur->larrow=1; p->cur->rarrow=1; }
#line 2702 "pikchr.c"
#line 2707 "pikchr.c"
        break;
      case 58: /* boolproperty ::= INVIS */
#line 649 "pikchr.y"
#line 654 "pikchr.y"
{p->cur->sw = 0.0;}
#line 2707 "pikchr.c"
#line 2712 "pikchr.c"
        break;
      case 59: /* boolproperty ::= THICK */
#line 650 "pikchr.y"
#line 655 "pikchr.y"
{p->cur->sw *= 1.5;}
#line 2712 "pikchr.c"
#line 2717 "pikchr.c"
        break;
      case 60: /* boolproperty ::= THIN */
#line 651 "pikchr.y"
#line 656 "pikchr.y"
{p->cur->sw *= 0.67;}
#line 2717 "pikchr.c"
#line 2722 "pikchr.c"
        break;
      case 61: /* boolproperty ::= SOLID */
#line 652 "pikchr.y"
#line 657 "pikchr.y"
{p->cur->sw = pik_value(p,"thickness",9,0);
                               p->cur->dotted = p->cur->dashed = 0.0;}
#line 2723 "pikchr.c"
#line 2728 "pikchr.c"
        break;
      case 62: /* textposition ::= */
#line 655 "pikchr.y"
#line 660 "pikchr.y"
{yymsp[1].minor.yy196 = 0;}
#line 2728 "pikchr.c"
#line 2733 "pikchr.c"
        break;
      case 63: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
#line 658 "pikchr.y"
#line 663 "pikchr.y"
{yylhsminor.yy196 = pik_text_position(yymsp[-1].minor.yy196,&yymsp[0].minor.yy0);}
#line 2733 "pikchr.c"
#line 2738 "pikchr.c"
  yymsp[-1].minor.yy196 = yylhsminor.yy196;
        break;
      case 64: /* position ::= expr COMMA expr */
#line 661 "pikchr.y"
#line 666 "pikchr.y"
{yylhsminor.yy43.x=yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[0].minor.yy265;}
#line 2739 "pikchr.c"
#line 2744 "pikchr.c"
  yymsp[-2].minor.yy43 = yylhsminor.yy43;
        break;
      case 65: /* position ::= place PLUS expr COMMA expr */
#line 663 "pikchr.y"
#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 2745 "pikchr.c"
#line 2750 "pikchr.c"
  yymsp[-4].minor.yy43 = yylhsminor.yy43;
        break;
      case 66: /* position ::= place MINUS expr COMMA expr */
#line 664 "pikchr.y"
#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 2751 "pikchr.c"
#line 2756 "pikchr.c"
  yymsp[-4].minor.yy43 = yylhsminor.yy43;
        break;
      case 67: /* position ::= place PLUS LP expr COMMA expr RP */
#line 666 "pikchr.y"
#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 2757 "pikchr.c"
#line 2762 "pikchr.c"
  yymsp[-6].minor.yy43 = yylhsminor.yy43;
        break;
      case 68: /* position ::= place MINUS LP expr COMMA expr RP */
#line 668 "pikchr.y"
#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 2763 "pikchr.c"
#line 2768 "pikchr.c"
  yymsp[-6].minor.yy43 = yylhsminor.yy43;
        break;
      case 69: /* position ::= LP position COMMA position RP */
#line 669 "pikchr.y"
#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 2769 "pikchr.c"
#line 2774 "pikchr.c"
        break;
      case 70: /* position ::= LP position RP */
#line 670 "pikchr.y"
#line 675 "pikchr.y"
{yymsp[-2].minor.yy43=yymsp[-1].minor.yy43;}
#line 2774 "pikchr.c"
#line 2779 "pikchr.c"
        break;
      case 71: /* position ::= expr between position AND position */
#line 672 "pikchr.y"
#line 677 "pikchr.y"
{yylhsminor.yy43 = pik_position_between(yymsp[-4].minor.yy265,yymsp[-2].minor.yy43,yymsp[0].minor.yy43);}
#line 2779 "pikchr.c"
#line 2784 "pikchr.c"
  yymsp[-4].minor.yy43 = yylhsminor.yy43;
        break;
      case 72: /* position ::= expr LT position COMMA position GT */
#line 674 "pikchr.y"
#line 679 "pikchr.y"
{yylhsminor.yy43 = pik_position_between(yymsp[-5].minor.yy265,yymsp[-3].minor.yy43,yymsp[-1].minor.yy43);}
#line 2785 "pikchr.c"
#line 2790 "pikchr.c"
  yymsp[-5].minor.yy43 = yylhsminor.yy43;
        break;
      case 73: /* position ::= expr ABOVE position */
#line 675 "pikchr.y"
#line 680 "pikchr.y"
{yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.y += yymsp[-2].minor.yy265;}
#line 2791 "pikchr.c"
#line 2796 "pikchr.c"
  yymsp[-2].minor.yy43 = yylhsminor.yy43;
        break;
      case 74: /* position ::= expr BELOW position */
#line 676 "pikchr.y"
#line 681 "pikchr.y"
{yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.y -= yymsp[-2].minor.yy265;}
#line 2797 "pikchr.c"
#line 2802 "pikchr.c"
  yymsp[-2].minor.yy43 = yylhsminor.yy43;
        break;
      case 75: /* position ::= expr LEFT OF position */
#line 677 "pikchr.y"
#line 682 "pikchr.y"
{yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.x -= yymsp[-3].minor.yy265;}
#line 2803 "pikchr.c"
#line 2808 "pikchr.c"
  yymsp[-3].minor.yy43 = yylhsminor.yy43;
        break;
      case 76: /* position ::= expr RIGHT OF position */
#line 678 "pikchr.y"
#line 683 "pikchr.y"
{yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.x += yymsp[-3].minor.yy265;}
#line 2809 "pikchr.c"
#line 2814 "pikchr.c"
  yymsp[-3].minor.yy43 = yylhsminor.yy43;
        break;
      case 77: /* position ::= expr ON HEADING EDGEPT OF position */
#line 680 "pikchr.y"
#line 685 "pikchr.y"
{yylhsminor.yy43 = pik_position_at_hdg(yymsp[-5].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
#line 2815 "pikchr.c"
#line 2820 "pikchr.c"
  yymsp[-5].minor.yy43 = yylhsminor.yy43;
        break;
      case 78: /* position ::= expr HEADING EDGEPT OF position */
#line 682 "pikchr.y"
#line 687 "pikchr.y"
{yylhsminor.yy43 = pik_position_at_hdg(yymsp[-4].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
#line 2821 "pikchr.c"
#line 2826 "pikchr.c"
  yymsp[-4].minor.yy43 = yylhsminor.yy43;
        break;
      case 79: /* position ::= expr EDGEPT OF position */
#line 684 "pikchr.y"
#line 689 "pikchr.y"
{yylhsminor.yy43 = pik_position_at_hdg(yymsp[-3].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
#line 2827 "pikchr.c"
#line 2832 "pikchr.c"
  yymsp[-3].minor.yy43 = yylhsminor.yy43;
        break;
      case 80: /* position ::= expr ON HEADING expr FROM position */
#line 686 "pikchr.y"
#line 691 "pikchr.y"
{yylhsminor.yy43 = pik_position_at_angle(yymsp[-5].minor.yy265,yymsp[-2].minor.yy265,yymsp[0].minor.yy43);}
#line 2833 "pikchr.c"
#line 2838 "pikchr.c"
  yymsp[-5].minor.yy43 = yylhsminor.yy43;
        break;
      case 81: /* position ::= expr HEADING expr FROM position */
#line 688 "pikchr.y"
#line 693 "pikchr.y"
{yylhsminor.yy43 = pik_position_at_angle(yymsp[-4].minor.yy265,yymsp[-2].minor.yy265,yymsp[0].minor.yy43);}
#line 2839 "pikchr.c"
#line 2844 "pikchr.c"
  yymsp[-4].minor.yy43 = yylhsminor.yy43;
        break;
      case 82: /* place ::= edge OF object */
#line 700 "pikchr.y"
#line 705 "pikchr.y"
{yylhsminor.yy43 = pik_place_of_elem(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
#line 2845 "pikchr.c"
#line 2850 "pikchr.c"
  yymsp[-2].minor.yy43 = yylhsminor.yy43;
        break;
      case 83: /* place2 ::= object */
#line 701 "pikchr.y"
#line 706 "pikchr.y"
{yylhsminor.yy43 = pik_place_of_elem(p,yymsp[0].minor.yy38,0);}
#line 2851 "pikchr.c"
#line 2856 "pikchr.c"
  yymsp[0].minor.yy43 = yylhsminor.yy43;
        break;
      case 84: /* place2 ::= object DOT_E edge */
#line 702 "pikchr.y"
#line 707 "pikchr.y"
{yylhsminor.yy43 = pik_place_of_elem(p,yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
#line 2857 "pikchr.c"
#line 2862 "pikchr.c"
  yymsp[-2].minor.yy43 = yylhsminor.yy43;
        break;
      case 85: /* place2 ::= NTH VERTEX OF object */
#line 703 "pikchr.y"
#line 708 "pikchr.y"
{yylhsminor.yy43 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy38);}
#line 2863 "pikchr.c"
#line 2868 "pikchr.c"
  yymsp[-3].minor.yy43 = yylhsminor.yy43;
        break;
      case 86: /* object ::= nth */
#line 715 "pikchr.y"
#line 720 "pikchr.y"
{yylhsminor.yy38 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
#line 2869 "pikchr.c"
#line 2874 "pikchr.c"
  yymsp[0].minor.yy38 = yylhsminor.yy38;
        break;
      case 87: /* object ::= nth OF|IN object */
#line 716 "pikchr.y"
#line 721 "pikchr.y"
{yylhsminor.yy38 = pik_find_nth(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
#line 2875 "pikchr.c"
#line 2880 "pikchr.c"
  yymsp[-2].minor.yy38 = yylhsminor.yy38;
        break;
      case 88: /* objectname ::= PLACENAME */
#line 718 "pikchr.y"
#line 723 "pikchr.y"
{yylhsminor.yy38 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
#line 2881 "pikchr.c"
#line 2886 "pikchr.c"
  yymsp[0].minor.yy38 = yylhsminor.yy38;
        break;
      case 89: /* objectname ::= objectname DOT_U PLACENAME */
#line 720 "pikchr.y"
#line 725 "pikchr.y"
{yylhsminor.yy38 = pik_find_byname(p,yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
#line 2887 "pikchr.c"
#line 2892 "pikchr.c"
  yymsp[-2].minor.yy38 = yylhsminor.yy38;
        break;
      case 90: /* nth ::= NTH CLASSNAME */
#line 722 "pikchr.y"
#line 727 "pikchr.y"
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
#line 2893 "pikchr.c"
#line 2898 "pikchr.c"
  yymsp[-1].minor.yy0 = yylhsminor.yy0;
        break;
      case 91: /* nth ::= NTH LAST CLASSNAME */
#line 723 "pikchr.y"
#line 728 "pikchr.y"
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
#line 2899 "pikchr.c"
#line 2904 "pikchr.c"
  yymsp[-2].minor.yy0 = yylhsminor.yy0;
        break;
      case 92: /* nth ::= LAST CLASSNAME */
#line 724 "pikchr.y"
#line 729 "pikchr.y"
{yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
#line 2905 "pikchr.c"
#line 2910 "pikchr.c"
        break;
      case 93: /* nth ::= LAST */
#line 725 "pikchr.y"
#line 730 "pikchr.y"
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
#line 2910 "pikchr.c"
#line 2915 "pikchr.c"
  yymsp[0].minor.yy0 = yylhsminor.yy0;
        break;
      case 94: /* nth ::= NTH LB RB */
#line 726 "pikchr.y"
#line 731 "pikchr.y"
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
#line 2916 "pikchr.c"
#line 2921 "pikchr.c"
  yymsp[-2].minor.yy0 = yylhsminor.yy0;
        break;
      case 95: /* nth ::= NTH LAST LB RB */
#line 727 "pikchr.y"
#line 732 "pikchr.y"
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
#line 2922 "pikchr.c"
#line 2927 "pikchr.c"
  yymsp[-3].minor.yy0 = yylhsminor.yy0;
        break;
      case 96: /* nth ::= LAST LB RB */
#line 728 "pikchr.y"
#line 733 "pikchr.y"
{yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
#line 2928 "pikchr.c"
#line 2933 "pikchr.c"
        break;
      case 97: /* expr ::= expr PLUS expr */
#line 730 "pikchr.y"
#line 735 "pikchr.y"
{yylhsminor.yy265=yymsp[-2].minor.yy265+yymsp[0].minor.yy265;}
#line 2933 "pikchr.c"
#line 2938 "pikchr.c"
  yymsp[-2].minor.yy265 = yylhsminor.yy265;
        break;
      case 98: /* expr ::= expr MINUS expr */
#line 731 "pikchr.y"
#line 736 "pikchr.y"
{yylhsminor.yy265=yymsp[-2].minor.yy265-yymsp[0].minor.yy265;}
#line 2939 "pikchr.c"
#line 2944 "pikchr.c"
  yymsp[-2].minor.yy265 = yylhsminor.yy265;
        break;
      case 99: /* expr ::= expr STAR expr */
#line 732 "pikchr.y"
#line 737 "pikchr.y"
{yylhsminor.yy265=yymsp[-2].minor.yy265*yymsp[0].minor.yy265;}
#line 2945 "pikchr.c"
#line 2950 "pikchr.c"
  yymsp[-2].minor.yy265 = yylhsminor.yy265;
        break;
      case 100: /* expr ::= expr SLASH expr */
#line 733 "pikchr.y"
#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 2954 "pikchr.c"
#line 2959 "pikchr.c"
  yymsp[-2].minor.yy265 = yylhsminor.yy265;
        break;
      case 101: /* expr ::= MINUS expr */
#line 737 "pikchr.y"
#line 742 "pikchr.y"
{yymsp[-1].minor.yy265=-yymsp[0].minor.yy265;}
#line 2960 "pikchr.c"
#line 2965 "pikchr.c"
        break;
      case 102: /* expr ::= PLUS expr */
#line 738 "pikchr.y"
#line 743 "pikchr.y"
{yymsp[-1].minor.yy265=yymsp[0].minor.yy265;}
#line 2965 "pikchr.c"
#line 2970 "pikchr.c"
        break;
      case 103: /* expr ::= LP expr RP */
#line 739 "pikchr.y"
#line 744 "pikchr.y"
{yymsp[-2].minor.yy265=yymsp[-1].minor.yy265;}
#line 2970 "pikchr.c"
#line 2975 "pikchr.c"
        break;
      case 104: /* expr ::= LP FILL|COLOR|THICKNESS RP */
#line 740 "pikchr.y"
#line 745 "pikchr.y"
{yymsp[-2].minor.yy265=pik_get_var(p,&yymsp[-1].minor.yy0);}
#line 2975 "pikchr.c"
#line 2980 "pikchr.c"
        break;
      case 105: /* expr ::= NUMBER */
#line 741 "pikchr.y"
#line 746 "pikchr.y"
{yylhsminor.yy265=pik_atof(&yymsp[0].minor.yy0);}
#line 2980 "pikchr.c"
#line 2985 "pikchr.c"
  yymsp[0].minor.yy265 = yylhsminor.yy265;
        break;
      case 106: /* expr ::= ID */
#line 742 "pikchr.y"
#line 747 "pikchr.y"
{yylhsminor.yy265=pik_get_var(p,&yymsp[0].minor.yy0);}
#line 2986 "pikchr.c"
#line 2991 "pikchr.c"
  yymsp[0].minor.yy265 = yylhsminor.yy265;
        break;
      case 107: /* expr ::= FUNC1 LP expr RP */
#line 743 "pikchr.y"
#line 748 "pikchr.y"
{yylhsminor.yy265 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy265,0.0);}
#line 2992 "pikchr.c"
#line 2997 "pikchr.c"
  yymsp[-3].minor.yy265 = yylhsminor.yy265;
        break;
      case 108: /* expr ::= FUNC2 LP expr COMMA expr RP */
#line 744 "pikchr.y"
#line 749 "pikchr.y"
{yylhsminor.yy265 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy265,yymsp[-1].minor.yy265);}
#line 2998 "pikchr.c"
#line 3003 "pikchr.c"
  yymsp[-5].minor.yy265 = yylhsminor.yy265;
        break;
      case 109: /* expr ::= DIST LP position COMMA position RP */
#line 745 "pikchr.y"
#line 750 "pikchr.y"
{yymsp[-5].minor.yy265 = pik_dist(&yymsp[-3].minor.yy43,&yymsp[-1].minor.yy43);}
#line 3004 "pikchr.c"
#line 3009 "pikchr.c"
        break;
      case 110: /* expr ::= place2 DOT_XY X */
#line 746 "pikchr.y"
#line 751 "pikchr.y"
{yylhsminor.yy265 = yymsp[-2].minor.yy43.x;}
#line 3009 "pikchr.c"
#line 3014 "pikchr.c"
  yymsp[-2].minor.yy265 = yylhsminor.yy265;
        break;
      case 111: /* expr ::= place2 DOT_XY Y */
#line 747 "pikchr.y"
#line 752 "pikchr.y"
{yylhsminor.yy265 = yymsp[-2].minor.yy43.y;}
#line 3015 "pikchr.c"
#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 748 "pikchr.y"
#line 753 "pikchr.y"
{yylhsminor.yy265=pik_property_of(yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
#line 3023 "pikchr.c"
#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);
3094
3095
3096
3097
3098
3099
3100
3101

3102
3103
3104
3105
3106
3107
3108
3109

3110
3111
3112
3113
3114
3115
3116
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 509 "pikchr.y"
#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 3134 "pikchr.c"
#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
3335
3336
3337
3338
3339
3340
3341
3342

3343
3344
3345
3346
3347
3348
3349
3340
3341
3342
3343
3344
3345
3346

3347
3348
3349
3350
3351
3352
3353
3354







-
+







  assert( iToken<(int)(sizeof(yyFallback)/sizeof(yyFallback[0])) );
  return yyFallback[iToken];
#else
  (void)iToken;
  return 0;
#endif
}
#line 753 "pikchr.y"
#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
4506
4507
4508
4509
4510
4511
4512













4513
4514
4515
4516
4517
4518
4519
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537







+
+
+
+
+
+
+
+
+
+
+
+
+







    }
    i++;
    n -= i;
    zText += i;
    i = 0;
  }
}

/*
** Append error message text.  This is either a raw append, or an append
** with HTML escapes, depending on whether the PIKCHR_PLAINTEXT_ERRORS flag
** is set.
*/
static void pik_append_errtxt(Pik *p, const char *zText, int n){
  if( p->mFlags & PIKCHR_PLAINTEXT_ERRORS ){
    pik_append(p, zText, n);
  }else{
    pik_append_text(p, zText, n, 0);
  }
}

/* Append a PNum value
*/
static void pik_append_num(Pik *p, const char *z,PNum v){
  char buf[100];
  snprintf(buf, sizeof(buf)-1, "%.10g", (double)v);
  buf[sizeof(buf)-1] = 0;
4892
4893
4894
4895
4896
4897
4898
4899

4900
4901
4902
4903
4904
4905
4906
4910
4911
4912
4913
4914
4915
4916

4917
4918
4919
4920
4921
4922
4923
4924







-
+







  for(iEnd=iErrPt; p->sIn.z[iEnd]!=0 && p->sIn.z[iEnd]!='\n'; iEnd++){}
  i = iStart;
  while( iFirstLineno<=iLineno ){
    snprintf(zLineno,sizeof(zLineno)-1,"/* %4d */  ", iFirstLineno++);
    zLineno[sizeof(zLineno)-1] = 0;
    pik_append(p, zLineno, -1);
    for(i=iStart; p->sIn.z[i]!=0 && p->sIn.z[i]!='\n'; i++){}
    pik_append_text(p, p->sIn.z+iStart, i-iStart, 0);
    pik_append_errtxt(p, p->sIn.z+iStart, i-iStart);
    iStart = i+1;
    pik_append(p, "\n", 1);
  }
  for(iErrCol=0, i=iErrPt; i>0 && p->sIn.z[i]!='\n'; iErrCol++, i--){}
  for(i=0; i<iErrCol+11; i++){ pik_append(p, " ", 1); }
  for(i=0; i<(int)pErr->n; i++) pik_append(p, "^", 1);
  pik_append(p, "\n", 1);
4916
4917
4918
4919
4920
4921
4922



4923


4924
4925
4926
4927
4928

4929
4930

4931


4932
4933
4934

4935
4936
4937
4938
4939

4940


4941
4942
4943
4944
4945
4946
4947
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943

4944
4945
4946
4947
4948
4949

4950
4951
4952
4953

4954
4955
4956
4957

4958
4959
4960
4961
4962
4963
4964

4965
4966
4967
4968
4969
4970
4971
4972
4973







+
+
+
-
+
+




-
+


+
-
+
+


-
+





+
-
+
+







*/
static void pik_error(Pik *p, PToken *pErr, const char *zMsg){
  int i;
  if( p==0 ) return;
  if( p->nErr ) return;
  p->nErr++;
  if( zMsg==0 ){
    if( p->mFlags & PIKCHR_PLAINTEXT_ERRORS ){
      pik_append(p, "\nOut of memory\n", -1);
    }else{
    pik_append(p, "\n<div><p>Out of memory</p></div>\n", -1);
      pik_append(p, "\n<div><p>Out of memory</p></div>\n", -1);
    }
    return;
  }
  if( pErr==0 ){
    pik_append(p, "\n", 1);
    pik_append_text(p, zMsg, -1, 0);
    pik_append_errtxt(p, zMsg, -1);
    return;
  }
  if( (p->mFlags & PIKCHR_PLAINTEXT_ERRORS)==0 ){
  pik_append(p, "<div><pre>\n", -1);
    pik_append(p, "<div><pre>\n", -1);
  }
  pik_error_context(p, pErr, 5);
  pik_append(p, "ERROR: ", -1);
  pik_append_text(p, zMsg, -1, 0);
  pik_append_errtxt(p, zMsg, -1);
  pik_append(p, "\n", 1);
  for(i=p->nCtx-1; i>=0; i--){
    pik_append(p, "Called from:\n", -1);
    pik_error_context(p, &p->aCtx[i], 0);
  }
  if( (p->mFlags & PIKCHR_PLAINTEXT_ERRORS)==0 ){
  pik_append(p, "</pre></div>\n", -1);
    pik_append(p, "</pre></div>\n", -1);
  }
}

/*
** Process an "assert( e1 == e2 )" statement.  Always return NULL.
*/
static PObj *pik_assert(Pik *p, PNum e1, PToken *pEq, PNum e2){
  char zE1[100], zE2[100], zMsg[300];
7351
7352
7353
7354
7355
7356
7357
7358

7359
7360

7361
7362
7363
7364
7365
7366
7367
7377
7378
7379
7380
7381
7382
7383

7384
7385

7386
7387
7388
7389
7390
7391
7392
7393







-
+

-
+







  for(i=0; i<pIn->n && pIn->z[i] && p->nErr==0; i+=sz){
    token.eCode = 0;
    token.eEdge = 0;
    token.z = pIn->z + i;
    sz = pik_token_length(&token, 1);
    if( token.eType==T_WHITESPACE ){
      /* no-op */
    }else if( sz>1000 ){
    }else if( sz>50000 ){
      token.n = 1;
      pik_error(p, &token, "token is too long - max length 1000 bytes");
      pik_error(p, &token, "token is too long - max length 50000 bytes");
      break;
    }else if( token.eType==T_ERROR ){
      token.n = (unsigned short)(sz & 0xffff);
      pik_error(p, &token, "unrecognized token");
      break;
    }else if( sz+i>pIn->n ){
      token.n = pIn->n - i;
7533
7534
7535
7536
7537
7538
7539


7540
7541
7542
7543
7544
7545
7546
7559
7560
7561
7562
7563
7564
7565
7566
7567
7568
7569
7570
7571
7572
7573
7574







+
+







** input text and the rendered SVG for all files named on the command
** line.
*/
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"
7577
7578
7579
7580
7581
7582
7583

7584
7585
7586
7587
7588
7589
7590
7605
7606
7607
7608
7609
7610
7611
7612
7613
7614
7615
7616
7617
7618
7619







+







      }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;
        mFlags |= PIKCHR_PLAINTEXT_ERRORS;
      }else
      {
        fprintf(stderr,"unknown option: \"%s\"\n", argv[i]);
        usage(argv[0]);
      }
      continue;
    }
7601
7602
7603
7604
7605
7606
7607
7608

7609
7610
7611
7612
7613
7614
7615
7616
7617
7618
7619
7620
7621

7622
7623
7624
7625
7626
7627
7628
7629
7630
7631
7632
7633
7634
7635
7636
7637

7638
7639
7640




























































7641

7630
7631
7632
7633
7634
7635
7636

7637
7638
7639
7640
7641
7642
7643
7644
7645
7646
7647
7648
7649
7650
7651
7652
7653
7654
7655
7656
7657
7658
7659
7660
7661
7662
7663
7664
7665
7666

7667
7668
7669
7670
7671
7672
7673
7674
7675
7676
7677
7678
7679
7680
7681
7682
7683
7684
7685
7686
7687
7688
7689
7690
7691
7692
7693
7694
7695
7696
7697
7698
7699
7700
7701
7702
7703
7704
7705
7706
7707
7708
7709
7710
7711
7712
7713
7714
7715
7716
7717
7718
7719
7720
7721
7722
7723
7724
7725
7726
7727
7728
7729
7730

7731







-
+













+















-
+



+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
      fprintf(stderr, "cannot allocate space for file \"%s\"\n", argv[i]);
      fclose(in);
      continue;
    }
    sz = fread(zIn, 1, sz, in);
    fclose(in);
    zIn[sz] = 0;
    zOut = pikchr(zIn, "pikchr", 0, &w, &h);
    zOut = pikchr(zIn, "pikchr", mFlags, &w, &h);
    if( zOut==0 ){
      fprintf(stderr, "pikchr() returns NULL.  Out of memory?\n");
      if( !bDontStop ) exit(1);
    }else if( bSvgOnly ){
      printf("%s\n", zOut);
    }else{
      if( zHtmlHdr ){
        printf("%s", zHtmlHdr);
        zHtmlHdr = 0;
      }
      printf("<h1>File %s</h1>\n", argv[i]);
      if( w<0 ){
        printf("<p>ERROR</p>\n%s\n", zOut);
        exitCode = 1;
      }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);
    free(zIn);
  }
  if( !bSvgOnly ){
    printf("</body></html>\n");
  }
  return 0; 
  return exitCode; 
}
#endif /* PIKCHR_SHELL */

#ifdef PIKCHR_TCL
#include <tcl.h>
/*
** An interface to TCL
**
** TCL command:     pikchr $INPUTTEXT
**
** Returns a list of 3 elements which are the output text, the width, and
** the height.
**
** Register the "pikchr" command by invoking Pikchr_Init(Tcl_Interp*).  Or
** compile this source file as a shared library and load it using the
** "load" command of Tcl.
**
** Compile this source-code file into a shared library using a command
** similar to this:
**
**    gcc -c pikchr.so -DPIKCHR_TCL -shared pikchr.c
*/
static int pik_tcl_command(
  ClientData clientData, /* Not Used */
  Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
  int objc,              /* Number of arguments */
  Tcl_Obj *CONST objv[]  /* Command arguments */
){
  int w, h;              /* Width and height of the pikchr */
  const char *zIn;       /* Source text input */
  char *zOut;            /* SVG output text */
  Tcl_Obj *pRes;         /* The result TCL object */

  if( objc!=2 ){
    Tcl_WrongNumArgs(interp, 1, objv, "PIKCHR_SOURCE_TEXT");
    return TCL_ERROR;
  }
  zIn = Tcl_GetString(objv[1]);
  w = h = 0;
  zOut = pikchr(zIn, "pikchr", 0, &w, &h);
  if( zOut==0 ){
    return TCL_ERROR;  /* Out of memory */
  }
  pRes = Tcl_NewObj();
  Tcl_ListObjAppendElement(0, pRes, Tcl_NewStringObj(zOut, -1));
  free(zOut);
  Tcl_ListObjAppendElement(0, pRes, Tcl_NewIntObj(w));
  Tcl_ListObjAppendElement(0, pRes, Tcl_NewIntObj(h));
  Tcl_SetObjResult(interp, pRes);
  return TCL_OK;
}

/* Invoke this routine to register the "pikchr" command with the interpreter
** given in the argument */
int Pikchr_Init(Tcl_Interp *interp){
  Tcl_CreateObjCommand(interp, "pikchr", pik_tcl_command, 0, 0);
  return TCL_OK;
}


#endif /* PIKCHR_TCL */


#line 7666 "pikchr.c"
#line 7756 "pikchr.c"