Fossil SCM

Merged trunk changes in

wyoung 2020-10-08 04:11 fossil-as-blockchain merge
Commit 95203913c0cf229843b9a9cde2ff7f358b8802aa77dadf469040db516409f76a
+327 -237
--- src/pikchr.c
+++ src/pikchr.c
@@ -373,10 +373,15 @@
373373
/* Error contexts */
374374
unsigned int nCtx; /* Number of error contexts */
375375
PToken aCtx[10]; /* Nested error contexts */
376376
};
377377
378
+/* Include PIKCHR_PLAINTEXT_ERRORS among the bits of mFlags on the 3rd
379
+** argument to pikchr() in order to cause error message text to come out
380
+** as text/plain instead of as text/html
381
+*/
382
+#define PIKCHR_PLAINTEXT_ERRORS 0x0001
378383
379384
/*
380385
** The behavior of an object class is defined by an instance of
381386
** this structure. This is the "virtual method" table.
382387
*/
@@ -463,11 +468,11 @@
463468
static PObj *pik_position_assert(Pik*,PPoint*,PToken*,PPoint*);
464469
static PNum pik_dist(PPoint*,PPoint*);
465470
static void pik_add_macro(Pik*,PToken *pId,PToken *pCode);
466471
467472
468
-#line 494 "pikchr.c"
473
+#line 499 "pikchr.c"
469474
/**************** End of %include directives **********************************/
470475
/* These constants specify the various numeric values for terminal symbols.
471476
***************** Begin token definitions *************************************/
472477
#ifndef T_ID
473478
#define T_ID 1
@@ -1680,22 +1685,22 @@
16801685
** inside the C code.
16811686
*/
16821687
/********* Begin destructor definitions ***************************************/
16831688
case 98: /* statement_list */
16841689
{
1685
-#line 483 "pikchr.y"
1690
+#line 488 "pikchr.y"
16861691
pik_elist_free(p,(yypminor->yy119));
1687
-#line 1712 "pikchr.c"
1692
+#line 1717 "pikchr.c"
16881693
}
16891694
break;
16901695
case 99: /* statement */
16911696
case 100: /* unnamed_statement */
16921697
case 101: /* basetype */
16931698
{
1694
-#line 485 "pikchr.y"
1699
+#line 490 "pikchr.y"
16951700
pik_elem_free(p,(yypminor->yy38));
1696
-#line 1721 "pikchr.c"
1701
+#line 1726 "pikchr.c"
16971702
}
16981703
break;
16991704
/********* End destructor definitions *****************************************/
17001705
default: break; /* If no destructor action specified: do nothing */
17011706
}
@@ -1909,14 +1914,14 @@
19091914
#endif
19101915
while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
19111916
/* Here code is inserted which will execute if the parser
19121917
** stack every overflows */
19131918
/******** Begin %stack_overflow code ******************************************/
1914
-#line 517 "pikchr.y"
1919
+#line 522 "pikchr.y"
19151920
19161921
pik_error(p, 0, "parser stack overflow");
1917
-#line 1942 "pikchr.c"
1922
+#line 1947 "pikchr.c"
19181923
/******** End %stack_overflow code ********************************************/
19191924
pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
19201925
pik_parserCTX_STORE
19211926
}
19221927
@@ -2390,614 +2395,614 @@
23902395
** break;
23912396
*/
23922397
/********** Begin reduce actions **********************************************/
23932398
YYMINORTYPE yylhsminor;
23942399
case 0: /* document ::= statement_list */
2395
-#line 521 "pikchr.y"
2400
+#line 526 "pikchr.y"
23962401
{pik_render(p,yymsp[0].minor.yy119);}
2397
-#line 2422 "pikchr.c"
2402
+#line 2427 "pikchr.c"
23982403
break;
23992404
case 1: /* statement_list ::= statement */
2400
-#line 524 "pikchr.y"
2405
+#line 529 "pikchr.y"
24012406
{ yylhsminor.yy119 = pik_elist_append(p,0,yymsp[0].minor.yy38); }
2402
-#line 2427 "pikchr.c"
2407
+#line 2432 "pikchr.c"
24032408
yymsp[0].minor.yy119 = yylhsminor.yy119;
24042409
break;
24052410
case 2: /* statement_list ::= statement_list EOL statement */
2406
-#line 526 "pikchr.y"
2411
+#line 531 "pikchr.y"
24072412
{ yylhsminor.yy119 = pik_elist_append(p,yymsp[-2].minor.yy119,yymsp[0].minor.yy38); }
2408
-#line 2433 "pikchr.c"
2413
+#line 2438 "pikchr.c"
24092414
yymsp[-2].minor.yy119 = yylhsminor.yy119;
24102415
break;
24112416
case 3: /* statement ::= */
2412
-#line 529 "pikchr.y"
2417
+#line 534 "pikchr.y"
24132418
{ yymsp[1].minor.yy38 = 0; }
2414
-#line 2439 "pikchr.c"
2419
+#line 2444 "pikchr.c"
24152420
break;
24162421
case 4: /* statement ::= direction */
2417
-#line 530 "pikchr.y"
2422
+#line 535 "pikchr.y"
24182423
{ pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy38=0; }
2419
-#line 2444 "pikchr.c"
2424
+#line 2449 "pikchr.c"
24202425
yymsp[0].minor.yy38 = yylhsminor.yy38;
24212426
break;
24222427
case 5: /* statement ::= lvalue ASSIGN rvalue */
2423
-#line 531 "pikchr.y"
2428
+#line 536 "pikchr.y"
24242429
{pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy265,&yymsp[-1].minor.yy0); yylhsminor.yy38=0;}
2425
-#line 2450 "pikchr.c"
2430
+#line 2455 "pikchr.c"
24262431
yymsp[-2].minor.yy38 = yylhsminor.yy38;
24272432
break;
24282433
case 6: /* statement ::= PLACENAME COLON unnamed_statement */
2429
-#line 533 "pikchr.y"
2434
+#line 538 "pikchr.y"
24302435
{ yylhsminor.yy38 = yymsp[0].minor.yy38; pik_elem_setname(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0); }
2431
-#line 2456 "pikchr.c"
2436
+#line 2461 "pikchr.c"
24322437
yymsp[-2].minor.yy38 = yylhsminor.yy38;
24332438
break;
24342439
case 7: /* statement ::= PLACENAME COLON position */
2435
-#line 535 "pikchr.y"
2440
+#line 540 "pikchr.y"
24362441
{ yylhsminor.yy38 = pik_elem_new(p,0,0,0);
24372442
if(yylhsminor.yy38){ yylhsminor.yy38->ptAt = yymsp[0].minor.yy43; pik_elem_setname(p,yylhsminor.yy38,&yymsp[-2].minor.yy0); }}
2438
-#line 2463 "pikchr.c"
2443
+#line 2468 "pikchr.c"
24392444
yymsp[-2].minor.yy38 = yylhsminor.yy38;
24402445
break;
24412446
case 8: /* statement ::= unnamed_statement */
2442
-#line 537 "pikchr.y"
2447
+#line 542 "pikchr.y"
24432448
{yylhsminor.yy38 = yymsp[0].minor.yy38;}
2444
-#line 2469 "pikchr.c"
2449
+#line 2474 "pikchr.c"
24452450
yymsp[0].minor.yy38 = yylhsminor.yy38;
24462451
break;
24472452
case 9: /* statement ::= print prlist */
2448
-#line 538 "pikchr.y"
2453
+#line 543 "pikchr.y"
24492454
{pik_append(p,"<br>\n",5); yymsp[-1].minor.yy38=0;}
2450
-#line 2475 "pikchr.c"
2455
+#line 2480 "pikchr.c"
24512456
break;
24522457
case 10: /* statement ::= ASSERT LP expr EQ expr RP */
2453
-#line 543 "pikchr.y"
2458
+#line 548 "pikchr.y"
24542459
{yymsp[-5].minor.yy38=pik_assert(p,yymsp[-3].minor.yy265,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy265);}
2455
-#line 2480 "pikchr.c"
2460
+#line 2485 "pikchr.c"
24562461
break;
24572462
case 11: /* statement ::= ASSERT LP position EQ position RP */
2458
-#line 545 "pikchr.y"
2463
+#line 550 "pikchr.y"
24592464
{yymsp[-5].minor.yy38=pik_position_assert(p,&yymsp[-3].minor.yy43,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy43);}
2460
-#line 2485 "pikchr.c"
2465
+#line 2490 "pikchr.c"
24612466
break;
24622467
case 12: /* statement ::= DEFINE ID CODEBLOCK */
2463
-#line 546 "pikchr.y"
2468
+#line 551 "pikchr.y"
24642469
{yymsp[-2].minor.yy38=0; pik_add_macro(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
2465
-#line 2490 "pikchr.c"
2470
+#line 2495 "pikchr.c"
24662471
break;
24672472
case 13: /* rvalue ::= PLACENAME */
2468
-#line 557 "pikchr.y"
2473
+#line 562 "pikchr.y"
24692474
{yylhsminor.yy265 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2470
-#line 2495 "pikchr.c"
2475
+#line 2500 "pikchr.c"
24712476
yymsp[0].minor.yy265 = yylhsminor.yy265;
24722477
break;
24732478
case 14: /* pritem ::= FILL */
24742479
case 15: /* pritem ::= COLOR */ yytestcase(yyruleno==15);
24752480
case 16: /* pritem ::= THICKNESS */ yytestcase(yyruleno==16);
2476
-#line 562 "pikchr.y"
2481
+#line 567 "pikchr.y"
24772482
{pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2478
-#line 2503 "pikchr.c"
2483
+#line 2508 "pikchr.c"
24792484
break;
24802485
case 17: /* pritem ::= rvalue */
2481
-#line 565 "pikchr.y"
2486
+#line 570 "pikchr.y"
24822487
{pik_append_num(p,"",yymsp[0].minor.yy265);}
2483
-#line 2508 "pikchr.c"
2488
+#line 2513 "pikchr.c"
24842489
break;
24852490
case 18: /* pritem ::= STRING */
2486
-#line 566 "pikchr.y"
2491
+#line 571 "pikchr.y"
24872492
{pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2488
-#line 2513 "pikchr.c"
2493
+#line 2518 "pikchr.c"
24892494
break;
24902495
case 19: /* prsep ::= COMMA */
2491
-#line 567 "pikchr.y"
2496
+#line 572 "pikchr.y"
24922497
{pik_append(p, " ", 1);}
2493
-#line 2518 "pikchr.c"
2498
+#line 2523 "pikchr.c"
24942499
break;
24952500
case 20: /* unnamed_statement ::= basetype attribute_list */
2496
-#line 570 "pikchr.y"
2501
+#line 575 "pikchr.y"
24972502
{yylhsminor.yy38 = yymsp[-1].minor.yy38; pik_after_adding_attributes(p,yylhsminor.yy38);}
2498
-#line 2523 "pikchr.c"
2503
+#line 2528 "pikchr.c"
24992504
yymsp[-1].minor.yy38 = yylhsminor.yy38;
25002505
break;
25012506
case 21: /* basetype ::= CLASSNAME */
2502
-#line 572 "pikchr.y"
2507
+#line 577 "pikchr.y"
25032508
{yylhsminor.yy38 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2504
-#line 2529 "pikchr.c"
2509
+#line 2534 "pikchr.c"
25052510
yymsp[0].minor.yy38 = yylhsminor.yy38;
25062511
break;
25072512
case 22: /* basetype ::= STRING textposition */
2508
-#line 574 "pikchr.y"
2513
+#line 579 "pikchr.y"
25092514
{yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy196; yylhsminor.yy38 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2510
-#line 2535 "pikchr.c"
2515
+#line 2540 "pikchr.c"
25112516
yymsp[-1].minor.yy38 = yylhsminor.yy38;
25122517
break;
25132518
case 23: /* basetype ::= LB savelist statement_list RB */
2514
-#line 576 "pikchr.y"
2519
+#line 581 "pikchr.y"
25152520
{ 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; }
2516
-#line 2541 "pikchr.c"
2521
+#line 2546 "pikchr.c"
25172522
break;
25182523
case 24: /* savelist ::= */
2519
-#line 581 "pikchr.y"
2524
+#line 586 "pikchr.y"
25202525
{yymsp[1].minor.yy119 = p->list; p->list = 0;}
2521
-#line 2546 "pikchr.c"
2526
+#line 2551 "pikchr.c"
25222527
break;
25232528
case 25: /* relexpr ::= expr */
2524
-#line 588 "pikchr.y"
2529
+#line 593 "pikchr.y"
25252530
{yylhsminor.yy200.rAbs = yymsp[0].minor.yy265; yylhsminor.yy200.rRel = 0;}
2526
-#line 2551 "pikchr.c"
2531
+#line 2556 "pikchr.c"
25272532
yymsp[0].minor.yy200 = yylhsminor.yy200;
25282533
break;
25292534
case 26: /* relexpr ::= expr PERCENT */
2530
-#line 589 "pikchr.y"
2535
+#line 594 "pikchr.y"
25312536
{yylhsminor.yy200.rAbs = 0; yylhsminor.yy200.rRel = yymsp[-1].minor.yy265/100;}
2532
-#line 2557 "pikchr.c"
2537
+#line 2562 "pikchr.c"
25332538
yymsp[-1].minor.yy200 = yylhsminor.yy200;
25342539
break;
25352540
case 27: /* optrelexpr ::= */
2536
-#line 591 "pikchr.y"
2541
+#line 596 "pikchr.y"
25372542
{yymsp[1].minor.yy200.rAbs = 0; yymsp[1].minor.yy200.rRel = 1.0;}
2538
-#line 2563 "pikchr.c"
2543
+#line 2568 "pikchr.c"
25392544
break;
25402545
case 28: /* attribute_list ::= relexpr alist */
2541
-#line 593 "pikchr.y"
2546
+#line 598 "pikchr.y"
25422547
{pik_add_direction(p,0,&yymsp[-1].minor.yy200);}
2543
-#line 2568 "pikchr.c"
2548
+#line 2573 "pikchr.c"
25442549
break;
25452550
case 29: /* attribute ::= numproperty relexpr */
2546
-#line 597 "pikchr.y"
2551
+#line 602 "pikchr.y"
25472552
{ pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy200); }
2548
-#line 2573 "pikchr.c"
2553
+#line 2578 "pikchr.c"
25492554
break;
25502555
case 30: /* attribute ::= dashproperty expr */
2551
-#line 598 "pikchr.y"
2556
+#line 603 "pikchr.y"
25522557
{ pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy265); }
2553
-#line 2578 "pikchr.c"
2558
+#line 2583 "pikchr.c"
25542559
break;
25552560
case 31: /* attribute ::= dashproperty */
2556
-#line 599 "pikchr.y"
2561
+#line 604 "pikchr.y"
25572562
{ pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2558
-#line 2583 "pikchr.c"
2563
+#line 2588 "pikchr.c"
25592564
break;
25602565
case 32: /* attribute ::= colorproperty rvalue */
2561
-#line 600 "pikchr.y"
2566
+#line 605 "pikchr.y"
25622567
{ pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy265); }
2563
-#line 2588 "pikchr.c"
2568
+#line 2593 "pikchr.c"
25642569
break;
25652570
case 33: /* attribute ::= go direction optrelexpr */
2566
-#line 601 "pikchr.y"
2571
+#line 606 "pikchr.y"
25672572
{ pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy200);}
2568
-#line 2593 "pikchr.c"
2573
+#line 2598 "pikchr.c"
25692574
break;
25702575
case 34: /* attribute ::= go direction even position */
2571
-#line 602 "pikchr.y"
2576
+#line 607 "pikchr.y"
25722577
{pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy43);}
2573
-#line 2598 "pikchr.c"
2578
+#line 2603 "pikchr.c"
25742579
break;
25752580
case 35: /* attribute ::= CLOSE */
2576
-#line 603 "pikchr.y"
2581
+#line 608 "pikchr.y"
25772582
{ pik_close_path(p,&yymsp[0].minor.yy0); }
2578
-#line 2603 "pikchr.c"
2583
+#line 2608 "pikchr.c"
25792584
break;
25802585
case 36: /* attribute ::= CHOP */
2581
-#line 604 "pikchr.y"
2586
+#line 609 "pikchr.y"
25822587
{ p->cur->bChop = 1; }
2583
-#line 2608 "pikchr.c"
2588
+#line 2613 "pikchr.c"
25842589
break;
25852590
case 37: /* attribute ::= FROM position */
2586
-#line 605 "pikchr.y"
2591
+#line 610 "pikchr.y"
25872592
{ pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy43); }
2588
-#line 2613 "pikchr.c"
2593
+#line 2618 "pikchr.c"
25892594
break;
25902595
case 38: /* attribute ::= TO position */
2591
-#line 606 "pikchr.y"
2596
+#line 611 "pikchr.y"
25922597
{ pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy43); }
2593
-#line 2618 "pikchr.c"
2598
+#line 2623 "pikchr.c"
25942599
break;
25952600
case 39: /* attribute ::= THEN */
2596
-#line 607 "pikchr.y"
2601
+#line 612 "pikchr.y"
25972602
{ pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2598
-#line 2623 "pikchr.c"
2603
+#line 2628 "pikchr.c"
25992604
break;
26002605
case 40: /* attribute ::= THEN optrelexpr HEADING expr */
26012606
case 42: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==42);
2602
-#line 609 "pikchr.y"
2607
+#line 614 "pikchr.y"
26032608
{pik_move_hdg(p,&yymsp[-2].minor.yy200,&yymsp[-1].minor.yy0,yymsp[0].minor.yy265,0,&yymsp[-3].minor.yy0);}
2604
-#line 2629 "pikchr.c"
2609
+#line 2634 "pikchr.c"
26052610
break;
26062611
case 41: /* attribute ::= THEN optrelexpr EDGEPT */
26072612
case 43: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==43);
2608
-#line 610 "pikchr.y"
2613
+#line 615 "pikchr.y"
26092614
{pik_move_hdg(p,&yymsp[-1].minor.yy200,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2610
-#line 2635 "pikchr.c"
2615
+#line 2640 "pikchr.c"
26112616
break;
26122617
case 44: /* attribute ::= AT position */
2613
-#line 615 "pikchr.y"
2618
+#line 620 "pikchr.y"
26142619
{ pik_set_at(p,0,&yymsp[0].minor.yy43,&yymsp[-1].minor.yy0); }
2615
-#line 2640 "pikchr.c"
2620
+#line 2645 "pikchr.c"
26162621
break;
26172622
case 45: /* attribute ::= SAME */
2618
-#line 617 "pikchr.y"
2623
+#line 622 "pikchr.y"
26192624
{pik_same(p,0,&yymsp[0].minor.yy0);}
2620
-#line 2645 "pikchr.c"
2625
+#line 2650 "pikchr.c"
26212626
break;
26222627
case 46: /* attribute ::= SAME AS object */
2623
-#line 618 "pikchr.y"
2628
+#line 623 "pikchr.y"
26242629
{pik_same(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2625
-#line 2650 "pikchr.c"
2630
+#line 2655 "pikchr.c"
26262631
break;
26272632
case 47: /* attribute ::= STRING textposition */
2628
-#line 619 "pikchr.y"
2633
+#line 624 "pikchr.y"
26292634
{pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy196);}
2630
-#line 2655 "pikchr.c"
2635
+#line 2660 "pikchr.c"
26312636
break;
26322637
case 48: /* attribute ::= FIT */
2633
-#line 620 "pikchr.y"
2638
+#line 625 "pikchr.y"
26342639
{pik_size_to_fit(p,&yymsp[0].minor.yy0,3); }
2635
-#line 2660 "pikchr.c"
2640
+#line 2665 "pikchr.c"
26362641
break;
26372642
case 49: /* attribute ::= BEHIND object */
2638
-#line 621 "pikchr.y"
2643
+#line 626 "pikchr.y"
26392644
{pik_behind(p,yymsp[0].minor.yy38);}
2640
-#line 2665 "pikchr.c"
2645
+#line 2670 "pikchr.c"
26412646
break;
26422647
case 50: /* withclause ::= DOT_E edge AT position */
26432648
case 51: /* withclause ::= edge AT position */ yytestcase(yyruleno==51);
2644
-#line 629 "pikchr.y"
2649
+#line 634 "pikchr.y"
26452650
{ pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy43,&yymsp[-1].minor.yy0); }
2646
-#line 2671 "pikchr.c"
2651
+#line 2676 "pikchr.c"
26472652
break;
26482653
case 52: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2649
-#line 633 "pikchr.y"
2654
+#line 638 "pikchr.y"
26502655
{yylhsminor.yy0 = yymsp[0].minor.yy0;}
2651
-#line 2676 "pikchr.c"
2656
+#line 2681 "pikchr.c"
26522657
yymsp[0].minor.yy0 = yylhsminor.yy0;
26532658
break;
26542659
case 53: /* boolproperty ::= CW */
2655
-#line 644 "pikchr.y"
2660
+#line 649 "pikchr.y"
26562661
{p->cur->cw = 1;}
2657
-#line 2682 "pikchr.c"
2662
+#line 2687 "pikchr.c"
26582663
break;
26592664
case 54: /* boolproperty ::= CCW */
2660
-#line 645 "pikchr.y"
2665
+#line 650 "pikchr.y"
26612666
{p->cur->cw = 0;}
2662
-#line 2687 "pikchr.c"
2667
+#line 2692 "pikchr.c"
26632668
break;
26642669
case 55: /* boolproperty ::= LARROW */
2665
-#line 646 "pikchr.y"
2670
+#line 651 "pikchr.y"
26662671
{p->cur->larrow=1; p->cur->rarrow=0; }
2667
-#line 2692 "pikchr.c"
2672
+#line 2697 "pikchr.c"
26682673
break;
26692674
case 56: /* boolproperty ::= RARROW */
2670
-#line 647 "pikchr.y"
2675
+#line 652 "pikchr.y"
26712676
{p->cur->larrow=0; p->cur->rarrow=1; }
2672
-#line 2697 "pikchr.c"
2677
+#line 2702 "pikchr.c"
26732678
break;
26742679
case 57: /* boolproperty ::= LRARROW */
2675
-#line 648 "pikchr.y"
2680
+#line 653 "pikchr.y"
26762681
{p->cur->larrow=1; p->cur->rarrow=1; }
2677
-#line 2702 "pikchr.c"
2682
+#line 2707 "pikchr.c"
26782683
break;
26792684
case 58: /* boolproperty ::= INVIS */
2680
-#line 649 "pikchr.y"
2685
+#line 654 "pikchr.y"
26812686
{p->cur->sw = 0.0;}
2682
-#line 2707 "pikchr.c"
2687
+#line 2712 "pikchr.c"
26832688
break;
26842689
case 59: /* boolproperty ::= THICK */
2685
-#line 650 "pikchr.y"
2690
+#line 655 "pikchr.y"
26862691
{p->cur->sw *= 1.5;}
2687
-#line 2712 "pikchr.c"
2692
+#line 2717 "pikchr.c"
26882693
break;
26892694
case 60: /* boolproperty ::= THIN */
2690
-#line 651 "pikchr.y"
2695
+#line 656 "pikchr.y"
26912696
{p->cur->sw *= 0.67;}
2692
-#line 2717 "pikchr.c"
2697
+#line 2722 "pikchr.c"
26932698
break;
26942699
case 61: /* boolproperty ::= SOLID */
2695
-#line 652 "pikchr.y"
2700
+#line 657 "pikchr.y"
26962701
{p->cur->sw = pik_value(p,"thickness",9,0);
26972702
p->cur->dotted = p->cur->dashed = 0.0;}
2698
-#line 2723 "pikchr.c"
2703
+#line 2728 "pikchr.c"
26992704
break;
27002705
case 62: /* textposition ::= */
2701
-#line 655 "pikchr.y"
2706
+#line 660 "pikchr.y"
27022707
{yymsp[1].minor.yy196 = 0;}
2703
-#line 2728 "pikchr.c"
2708
+#line 2733 "pikchr.c"
27042709
break;
27052710
case 63: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2706
-#line 658 "pikchr.y"
2711
+#line 663 "pikchr.y"
27072712
{yylhsminor.yy196 = pik_text_position(yymsp[-1].minor.yy196,&yymsp[0].minor.yy0);}
2708
-#line 2733 "pikchr.c"
2713
+#line 2738 "pikchr.c"
27092714
yymsp[-1].minor.yy196 = yylhsminor.yy196;
27102715
break;
27112716
case 64: /* position ::= expr COMMA expr */
2712
-#line 661 "pikchr.y"
2717
+#line 666 "pikchr.y"
27132718
{yylhsminor.yy43.x=yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[0].minor.yy265;}
2714
-#line 2739 "pikchr.c"
2719
+#line 2744 "pikchr.c"
27152720
yymsp[-2].minor.yy43 = yylhsminor.yy43;
27162721
break;
27172722
case 65: /* position ::= place PLUS expr COMMA expr */
2718
-#line 663 "pikchr.y"
2723
+#line 668 "pikchr.y"
27192724
{yylhsminor.yy43.x=yymsp[-4].minor.yy43.x+yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[-4].minor.yy43.y+yymsp[0].minor.yy265;}
2720
-#line 2745 "pikchr.c"
2725
+#line 2750 "pikchr.c"
27212726
yymsp[-4].minor.yy43 = yylhsminor.yy43;
27222727
break;
27232728
case 66: /* position ::= place MINUS expr COMMA expr */
2724
-#line 664 "pikchr.y"
2729
+#line 669 "pikchr.y"
27252730
{yylhsminor.yy43.x=yymsp[-4].minor.yy43.x-yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[-4].minor.yy43.y-yymsp[0].minor.yy265;}
2726
-#line 2751 "pikchr.c"
2731
+#line 2756 "pikchr.c"
27272732
yymsp[-4].minor.yy43 = yylhsminor.yy43;
27282733
break;
27292734
case 67: /* position ::= place PLUS LP expr COMMA expr RP */
2730
-#line 666 "pikchr.y"
2735
+#line 671 "pikchr.y"
27312736
{yylhsminor.yy43.x=yymsp[-6].minor.yy43.x+yymsp[-3].minor.yy265; yylhsminor.yy43.y=yymsp[-6].minor.yy43.y+yymsp[-1].minor.yy265;}
2732
-#line 2757 "pikchr.c"
2737
+#line 2762 "pikchr.c"
27332738
yymsp[-6].minor.yy43 = yylhsminor.yy43;
27342739
break;
27352740
case 68: /* position ::= place MINUS LP expr COMMA expr RP */
2736
-#line 668 "pikchr.y"
2741
+#line 673 "pikchr.y"
27372742
{yylhsminor.yy43.x=yymsp[-6].minor.yy43.x-yymsp[-3].minor.yy265; yylhsminor.yy43.y=yymsp[-6].minor.yy43.y-yymsp[-1].minor.yy265;}
2738
-#line 2763 "pikchr.c"
2743
+#line 2768 "pikchr.c"
27392744
yymsp[-6].minor.yy43 = yylhsminor.yy43;
27402745
break;
27412746
case 69: /* position ::= LP position COMMA position RP */
2742
-#line 669 "pikchr.y"
2747
+#line 674 "pikchr.y"
27432748
{yymsp[-4].minor.yy43.x=yymsp[-3].minor.yy43.x; yymsp[-4].minor.yy43.y=yymsp[-1].minor.yy43.y;}
2744
-#line 2769 "pikchr.c"
2749
+#line 2774 "pikchr.c"
27452750
break;
27462751
case 70: /* position ::= LP position RP */
2747
-#line 670 "pikchr.y"
2752
+#line 675 "pikchr.y"
27482753
{yymsp[-2].minor.yy43=yymsp[-1].minor.yy43;}
2749
-#line 2774 "pikchr.c"
2754
+#line 2779 "pikchr.c"
27502755
break;
27512756
case 71: /* position ::= expr between position AND position */
2752
-#line 672 "pikchr.y"
2757
+#line 677 "pikchr.y"
27532758
{yylhsminor.yy43 = pik_position_between(yymsp[-4].minor.yy265,yymsp[-2].minor.yy43,yymsp[0].minor.yy43);}
2754
-#line 2779 "pikchr.c"
2759
+#line 2784 "pikchr.c"
27552760
yymsp[-4].minor.yy43 = yylhsminor.yy43;
27562761
break;
27572762
case 72: /* position ::= expr LT position COMMA position GT */
2758
-#line 674 "pikchr.y"
2763
+#line 679 "pikchr.y"
27592764
{yylhsminor.yy43 = pik_position_between(yymsp[-5].minor.yy265,yymsp[-3].minor.yy43,yymsp[-1].minor.yy43);}
2760
-#line 2785 "pikchr.c"
2765
+#line 2790 "pikchr.c"
27612766
yymsp[-5].minor.yy43 = yylhsminor.yy43;
27622767
break;
27632768
case 73: /* position ::= expr ABOVE position */
2764
-#line 675 "pikchr.y"
2769
+#line 680 "pikchr.y"
27652770
{yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.y += yymsp[-2].minor.yy265;}
2766
-#line 2791 "pikchr.c"
2771
+#line 2796 "pikchr.c"
27672772
yymsp[-2].minor.yy43 = yylhsminor.yy43;
27682773
break;
27692774
case 74: /* position ::= expr BELOW position */
2770
-#line 676 "pikchr.y"
2775
+#line 681 "pikchr.y"
27712776
{yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.y -= yymsp[-2].minor.yy265;}
2772
-#line 2797 "pikchr.c"
2777
+#line 2802 "pikchr.c"
27732778
yymsp[-2].minor.yy43 = yylhsminor.yy43;
27742779
break;
27752780
case 75: /* position ::= expr LEFT OF position */
2776
-#line 677 "pikchr.y"
2781
+#line 682 "pikchr.y"
27772782
{yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.x -= yymsp[-3].minor.yy265;}
2778
-#line 2803 "pikchr.c"
2783
+#line 2808 "pikchr.c"
27792784
yymsp[-3].minor.yy43 = yylhsminor.yy43;
27802785
break;
27812786
case 76: /* position ::= expr RIGHT OF position */
2782
-#line 678 "pikchr.y"
2787
+#line 683 "pikchr.y"
27832788
{yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.x += yymsp[-3].minor.yy265;}
2784
-#line 2809 "pikchr.c"
2789
+#line 2814 "pikchr.c"
27852790
yymsp[-3].minor.yy43 = yylhsminor.yy43;
27862791
break;
27872792
case 77: /* position ::= expr ON HEADING EDGEPT OF position */
2788
-#line 680 "pikchr.y"
2793
+#line 685 "pikchr.y"
27892794
{yylhsminor.yy43 = pik_position_at_hdg(yymsp[-5].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2790
-#line 2815 "pikchr.c"
2795
+#line 2820 "pikchr.c"
27912796
yymsp[-5].minor.yy43 = yylhsminor.yy43;
27922797
break;
27932798
case 78: /* position ::= expr HEADING EDGEPT OF position */
2794
-#line 682 "pikchr.y"
2799
+#line 687 "pikchr.y"
27952800
{yylhsminor.yy43 = pik_position_at_hdg(yymsp[-4].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2796
-#line 2821 "pikchr.c"
2801
+#line 2826 "pikchr.c"
27972802
yymsp[-4].minor.yy43 = yylhsminor.yy43;
27982803
break;
27992804
case 79: /* position ::= expr EDGEPT OF position */
2800
-#line 684 "pikchr.y"
2805
+#line 689 "pikchr.y"
28012806
{yylhsminor.yy43 = pik_position_at_hdg(yymsp[-3].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2802
-#line 2827 "pikchr.c"
2807
+#line 2832 "pikchr.c"
28032808
yymsp[-3].minor.yy43 = yylhsminor.yy43;
28042809
break;
28052810
case 80: /* position ::= expr ON HEADING expr FROM position */
2806
-#line 686 "pikchr.y"
2811
+#line 691 "pikchr.y"
28072812
{yylhsminor.yy43 = pik_position_at_angle(yymsp[-5].minor.yy265,yymsp[-2].minor.yy265,yymsp[0].minor.yy43);}
2808
-#line 2833 "pikchr.c"
2813
+#line 2838 "pikchr.c"
28092814
yymsp[-5].minor.yy43 = yylhsminor.yy43;
28102815
break;
28112816
case 81: /* position ::= expr HEADING expr FROM position */
2812
-#line 688 "pikchr.y"
2817
+#line 693 "pikchr.y"
28132818
{yylhsminor.yy43 = pik_position_at_angle(yymsp[-4].minor.yy265,yymsp[-2].minor.yy265,yymsp[0].minor.yy43);}
2814
-#line 2839 "pikchr.c"
2819
+#line 2844 "pikchr.c"
28152820
yymsp[-4].minor.yy43 = yylhsminor.yy43;
28162821
break;
28172822
case 82: /* place ::= edge OF object */
2818
-#line 700 "pikchr.y"
2823
+#line 705 "pikchr.y"
28192824
{yylhsminor.yy43 = pik_place_of_elem(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2820
-#line 2845 "pikchr.c"
2825
+#line 2850 "pikchr.c"
28212826
yymsp[-2].minor.yy43 = yylhsminor.yy43;
28222827
break;
28232828
case 83: /* place2 ::= object */
2824
-#line 701 "pikchr.y"
2829
+#line 706 "pikchr.y"
28252830
{yylhsminor.yy43 = pik_place_of_elem(p,yymsp[0].minor.yy38,0);}
2826
-#line 2851 "pikchr.c"
2831
+#line 2856 "pikchr.c"
28272832
yymsp[0].minor.yy43 = yylhsminor.yy43;
28282833
break;
28292834
case 84: /* place2 ::= object DOT_E edge */
2830
-#line 702 "pikchr.y"
2835
+#line 707 "pikchr.y"
28312836
{yylhsminor.yy43 = pik_place_of_elem(p,yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
2832
-#line 2857 "pikchr.c"
2837
+#line 2862 "pikchr.c"
28332838
yymsp[-2].minor.yy43 = yylhsminor.yy43;
28342839
break;
28352840
case 85: /* place2 ::= NTH VERTEX OF object */
2836
-#line 703 "pikchr.y"
2841
+#line 708 "pikchr.y"
28372842
{yylhsminor.yy43 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy38);}
2838
-#line 2863 "pikchr.c"
2843
+#line 2868 "pikchr.c"
28392844
yymsp[-3].minor.yy43 = yylhsminor.yy43;
28402845
break;
28412846
case 86: /* object ::= nth */
2842
-#line 715 "pikchr.y"
2847
+#line 720 "pikchr.y"
28432848
{yylhsminor.yy38 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2844
-#line 2869 "pikchr.c"
2849
+#line 2874 "pikchr.c"
28452850
yymsp[0].minor.yy38 = yylhsminor.yy38;
28462851
break;
28472852
case 87: /* object ::= nth OF|IN object */
2848
-#line 716 "pikchr.y"
2853
+#line 721 "pikchr.y"
28492854
{yylhsminor.yy38 = pik_find_nth(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2850
-#line 2875 "pikchr.c"
2855
+#line 2880 "pikchr.c"
28512856
yymsp[-2].minor.yy38 = yylhsminor.yy38;
28522857
break;
28532858
case 88: /* objectname ::= PLACENAME */
2854
-#line 718 "pikchr.y"
2859
+#line 723 "pikchr.y"
28552860
{yylhsminor.yy38 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2856
-#line 2881 "pikchr.c"
2861
+#line 2886 "pikchr.c"
28572862
yymsp[0].minor.yy38 = yylhsminor.yy38;
28582863
break;
28592864
case 89: /* objectname ::= objectname DOT_U PLACENAME */
2860
-#line 720 "pikchr.y"
2865
+#line 725 "pikchr.y"
28612866
{yylhsminor.yy38 = pik_find_byname(p,yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
2862
-#line 2887 "pikchr.c"
2867
+#line 2892 "pikchr.c"
28632868
yymsp[-2].minor.yy38 = yylhsminor.yy38;
28642869
break;
28652870
case 90: /* nth ::= NTH CLASSNAME */
2866
-#line 722 "pikchr.y"
2871
+#line 727 "pikchr.y"
28672872
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2868
-#line 2893 "pikchr.c"
2873
+#line 2898 "pikchr.c"
28692874
yymsp[-1].minor.yy0 = yylhsminor.yy0;
28702875
break;
28712876
case 91: /* nth ::= NTH LAST CLASSNAME */
2872
-#line 723 "pikchr.y"
2877
+#line 728 "pikchr.y"
28732878
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2874
-#line 2899 "pikchr.c"
2879
+#line 2904 "pikchr.c"
28752880
yymsp[-2].minor.yy0 = yylhsminor.yy0;
28762881
break;
28772882
case 92: /* nth ::= LAST CLASSNAME */
2878
-#line 724 "pikchr.y"
2883
+#line 729 "pikchr.y"
28792884
{yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2880
-#line 2905 "pikchr.c"
2885
+#line 2910 "pikchr.c"
28812886
break;
28822887
case 93: /* nth ::= LAST */
2883
-#line 725 "pikchr.y"
2888
+#line 730 "pikchr.y"
28842889
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2885
-#line 2910 "pikchr.c"
2890
+#line 2915 "pikchr.c"
28862891
yymsp[0].minor.yy0 = yylhsminor.yy0;
28872892
break;
28882893
case 94: /* nth ::= NTH LB RB */
2889
-#line 726 "pikchr.y"
2894
+#line 731 "pikchr.y"
28902895
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2891
-#line 2916 "pikchr.c"
2896
+#line 2921 "pikchr.c"
28922897
yymsp[-2].minor.yy0 = yylhsminor.yy0;
28932898
break;
28942899
case 95: /* nth ::= NTH LAST LB RB */
2895
-#line 727 "pikchr.y"
2900
+#line 732 "pikchr.y"
28962901
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2897
-#line 2922 "pikchr.c"
2902
+#line 2927 "pikchr.c"
28982903
yymsp[-3].minor.yy0 = yylhsminor.yy0;
28992904
break;
29002905
case 96: /* nth ::= LAST LB RB */
2901
-#line 728 "pikchr.y"
2906
+#line 733 "pikchr.y"
29022907
{yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2903
-#line 2928 "pikchr.c"
2908
+#line 2933 "pikchr.c"
29042909
break;
29052910
case 97: /* expr ::= expr PLUS expr */
2906
-#line 730 "pikchr.y"
2911
+#line 735 "pikchr.y"
29072912
{yylhsminor.yy265=yymsp[-2].minor.yy265+yymsp[0].minor.yy265;}
2908
-#line 2933 "pikchr.c"
2913
+#line 2938 "pikchr.c"
29092914
yymsp[-2].minor.yy265 = yylhsminor.yy265;
29102915
break;
29112916
case 98: /* expr ::= expr MINUS expr */
2912
-#line 731 "pikchr.y"
2917
+#line 736 "pikchr.y"
29132918
{yylhsminor.yy265=yymsp[-2].minor.yy265-yymsp[0].minor.yy265;}
2914
-#line 2939 "pikchr.c"
2919
+#line 2944 "pikchr.c"
29152920
yymsp[-2].minor.yy265 = yylhsminor.yy265;
29162921
break;
29172922
case 99: /* expr ::= expr STAR expr */
2918
-#line 732 "pikchr.y"
2923
+#line 737 "pikchr.y"
29192924
{yylhsminor.yy265=yymsp[-2].minor.yy265*yymsp[0].minor.yy265;}
2920
-#line 2945 "pikchr.c"
2925
+#line 2950 "pikchr.c"
29212926
yymsp[-2].minor.yy265 = yylhsminor.yy265;
29222927
break;
29232928
case 100: /* expr ::= expr SLASH expr */
2924
-#line 733 "pikchr.y"
2929
+#line 738 "pikchr.y"
29252930
{
29262931
if( yymsp[0].minor.yy265==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy265 = 0.0; }
29272932
else{ yylhsminor.yy265 = yymsp[-2].minor.yy265/yymsp[0].minor.yy265; }
29282933
}
2929
-#line 2954 "pikchr.c"
2934
+#line 2959 "pikchr.c"
29302935
yymsp[-2].minor.yy265 = yylhsminor.yy265;
29312936
break;
29322937
case 101: /* expr ::= MINUS expr */
2933
-#line 737 "pikchr.y"
2938
+#line 742 "pikchr.y"
29342939
{yymsp[-1].minor.yy265=-yymsp[0].minor.yy265;}
2935
-#line 2960 "pikchr.c"
2940
+#line 2965 "pikchr.c"
29362941
break;
29372942
case 102: /* expr ::= PLUS expr */
2938
-#line 738 "pikchr.y"
2943
+#line 743 "pikchr.y"
29392944
{yymsp[-1].minor.yy265=yymsp[0].minor.yy265;}
2940
-#line 2965 "pikchr.c"
2945
+#line 2970 "pikchr.c"
29412946
break;
29422947
case 103: /* expr ::= LP expr RP */
2943
-#line 739 "pikchr.y"
2948
+#line 744 "pikchr.y"
29442949
{yymsp[-2].minor.yy265=yymsp[-1].minor.yy265;}
2945
-#line 2970 "pikchr.c"
2950
+#line 2975 "pikchr.c"
29462951
break;
29472952
case 104: /* expr ::= LP FILL|COLOR|THICKNESS RP */
2948
-#line 740 "pikchr.y"
2953
+#line 745 "pikchr.y"
29492954
{yymsp[-2].minor.yy265=pik_get_var(p,&yymsp[-1].minor.yy0);}
2950
-#line 2975 "pikchr.c"
2955
+#line 2980 "pikchr.c"
29512956
break;
29522957
case 105: /* expr ::= NUMBER */
2953
-#line 741 "pikchr.y"
2958
+#line 746 "pikchr.y"
29542959
{yylhsminor.yy265=pik_atof(&yymsp[0].minor.yy0);}
2955
-#line 2980 "pikchr.c"
2960
+#line 2985 "pikchr.c"
29562961
yymsp[0].minor.yy265 = yylhsminor.yy265;
29572962
break;
29582963
case 106: /* expr ::= ID */
2959
-#line 742 "pikchr.y"
2964
+#line 747 "pikchr.y"
29602965
{yylhsminor.yy265=pik_get_var(p,&yymsp[0].minor.yy0);}
2961
-#line 2986 "pikchr.c"
2966
+#line 2991 "pikchr.c"
29622967
yymsp[0].minor.yy265 = yylhsminor.yy265;
29632968
break;
29642969
case 107: /* expr ::= FUNC1 LP expr RP */
2965
-#line 743 "pikchr.y"
2970
+#line 748 "pikchr.y"
29662971
{yylhsminor.yy265 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy265,0.0);}
2967
-#line 2992 "pikchr.c"
2972
+#line 2997 "pikchr.c"
29682973
yymsp[-3].minor.yy265 = yylhsminor.yy265;
29692974
break;
29702975
case 108: /* expr ::= FUNC2 LP expr COMMA expr RP */
2971
-#line 744 "pikchr.y"
2976
+#line 749 "pikchr.y"
29722977
{yylhsminor.yy265 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy265,yymsp[-1].minor.yy265);}
2973
-#line 2998 "pikchr.c"
2978
+#line 3003 "pikchr.c"
29742979
yymsp[-5].minor.yy265 = yylhsminor.yy265;
29752980
break;
29762981
case 109: /* expr ::= DIST LP position COMMA position RP */
2977
-#line 745 "pikchr.y"
2982
+#line 750 "pikchr.y"
29782983
{yymsp[-5].minor.yy265 = pik_dist(&yymsp[-3].minor.yy43,&yymsp[-1].minor.yy43);}
2979
-#line 3004 "pikchr.c"
2984
+#line 3009 "pikchr.c"
29802985
break;
29812986
case 110: /* expr ::= place2 DOT_XY X */
2982
-#line 746 "pikchr.y"
2987
+#line 751 "pikchr.y"
29832988
{yylhsminor.yy265 = yymsp[-2].minor.yy43.x;}
2984
-#line 3009 "pikchr.c"
2989
+#line 3014 "pikchr.c"
29852990
yymsp[-2].minor.yy265 = yylhsminor.yy265;
29862991
break;
29872992
case 111: /* expr ::= place2 DOT_XY Y */
2988
-#line 747 "pikchr.y"
2993
+#line 752 "pikchr.y"
29892994
{yylhsminor.yy265 = yymsp[-2].minor.yy43.y;}
2990
-#line 3015 "pikchr.c"
2995
+#line 3020 "pikchr.c"
29912996
yymsp[-2].minor.yy265 = yylhsminor.yy265;
29922997
break;
29932998
case 112: /* expr ::= object DOT_L numproperty */
29942999
case 113: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==113);
29953000
case 114: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==114);
2996
-#line 748 "pikchr.y"
3001
+#line 753 "pikchr.y"
29973002
{yylhsminor.yy265=pik_property_of(yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
2998
-#line 3023 "pikchr.c"
3003
+#line 3028 "pikchr.c"
29993004
yymsp[-2].minor.yy265 = yylhsminor.yy265;
30003005
break;
30013006
default:
30023007
/* (115) lvalue ::= ID */ yytestcase(yyruleno==115);
30033008
/* (116) lvalue ::= FILL */ yytestcase(yyruleno==116);
@@ -3096,19 +3101,19 @@
30963101
){
30973102
pik_parserARG_FETCH
30983103
pik_parserCTX_FETCH
30993104
#define TOKEN yyminor
31003105
/************ Begin %syntax_error code ****************************************/
3101
-#line 509 "pikchr.y"
3106
+#line 514 "pikchr.y"
31023107
31033108
if( TOKEN.z && TOKEN.z[0] ){
31043109
pik_error(p, &TOKEN, "syntax error");
31053110
}else{
31063111
pik_error(p, 0, "syntax error");
31073112
}
31083113
UNUSED_PARAMETER(yymajor);
3109
-#line 3134 "pikchr.c"
3114
+#line 3139 "pikchr.c"
31103115
/************ End %syntax_error code ******************************************/
31113116
pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
31123117
pik_parserCTX_STORE
31133118
}
31143119
@@ -3337,11 +3342,11 @@
33373342
#else
33383343
(void)iToken;
33393344
return 0;
33403345
#endif
33413346
}
3342
-#line 753 "pikchr.y"
3347
+#line 758 "pikchr.y"
33433348
33443349
33453350
33463351
/* Chart of the 140 official HTML color names with their
33473352
** corresponding RGB value.
@@ -4508,10 +4513,23 @@
45084513
n -= i;
45094514
zText += i;
45104515
i = 0;
45114516
}
45124517
}
4518
+
4519
+/*
4520
+** Append error message text. This is either a raw append, or an append
4521
+** with HTML escapes, depending on whether the PIKCHR_PLAINTEXT_ERRORS flag
4522
+** is set.
4523
+*/
4524
+static void pik_append_errtxt(Pik *p, const char *zText, int n){
4525
+ if( p->mFlags & PIKCHR_PLAINTEXT_ERRORS ){
4526
+ pik_append(p, zText, n);
4527
+ }else{
4528
+ pik_append_text(p, zText, n, 0);
4529
+ }
4530
+}
45134531
45144532
/* Append a PNum value
45154533
*/
45164534
static void pik_append_num(Pik *p, const char *z,PNum v){
45174535
char buf[100];
@@ -4894,11 +4912,11 @@
48944912
while( iFirstLineno<=iLineno ){
48954913
snprintf(zLineno,sizeof(zLineno)-1,"/* %4d */ ", iFirstLineno++);
48964914
zLineno[sizeof(zLineno)-1] = 0;
48974915
pik_append(p, zLineno, -1);
48984916
for(i=iStart; p->sIn.z[i]!=0 && p->sIn.z[i]!='\n'; i++){}
4899
- pik_append_text(p, p->sIn.z+iStart, i-iStart, 0);
4917
+ pik_append_errtxt(p, p->sIn.z+iStart, i-iStart);
49004918
iStart = i+1;
49014919
pik_append(p, "\n", 1);
49024920
}
49034921
for(iErrCol=0, i=iErrPt; i>0 && p->sIn.z[i]!='\n'; iErrCol++, i--){}
49044922
for(i=0; i<iErrCol+11; i++){ pik_append(p, " ", 1); }
@@ -4918,28 +4936,36 @@
49184936
int i;
49194937
if( p==0 ) return;
49204938
if( p->nErr ) return;
49214939
p->nErr++;
49224940
if( zMsg==0 ){
4923
- pik_append(p, "\n<div><p>Out of memory</p></div>\n", -1);
4941
+ if( p->mFlags & PIKCHR_PLAINTEXT_ERRORS ){
4942
+ pik_append(p, "\nOut of memory\n", -1);
4943
+ }else{
4944
+ pik_append(p, "\n<div><p>Out of memory</p></div>\n", -1);
4945
+ }
49244946
return;
49254947
}
49264948
if( pErr==0 ){
49274949
pik_append(p, "\n", 1);
4928
- pik_append_text(p, zMsg, -1, 0);
4950
+ pik_append_errtxt(p, zMsg, -1);
49294951
return;
49304952
}
4931
- pik_append(p, "<div><pre>\n", -1);
4953
+ if( (p->mFlags & PIKCHR_PLAINTEXT_ERRORS)==0 ){
4954
+ pik_append(p, "<div><pre>\n", -1);
4955
+ }
49324956
pik_error_context(p, pErr, 5);
49334957
pik_append(p, "ERROR: ", -1);
4934
- pik_append_text(p, zMsg, -1, 0);
4958
+ pik_append_errtxt(p, zMsg, -1);
49354959
pik_append(p, "\n", 1);
49364960
for(i=p->nCtx-1; i>=0; i--){
49374961
pik_append(p, "Called from:\n", -1);
49384962
pik_error_context(p, &p->aCtx[i], 0);
49394963
}
4940
- pik_append(p, "</pre></div>\n", -1);
4964
+ if( (p->mFlags & PIKCHR_PLAINTEXT_ERRORS)==0 ){
4965
+ pik_append(p, "</pre></div>\n", -1);
4966
+ }
49414967
}
49424968
49434969
/*
49444970
** Process an "assert( e1 == e2 )" statement. Always return NULL.
49454971
*/
@@ -7353,13 +7379,13 @@
73537379
token.eEdge = 0;
73547380
token.z = pIn->z + i;
73557381
sz = pik_token_length(&token, 1);
73567382
if( token.eType==T_WHITESPACE ){
73577383
/* no-op */
7358
- }else if( sz>1000 ){
7384
+ }else if( sz>50000 ){
73597385
token.n = 1;
7360
- pik_error(p, &token, "token is too long - max length 1000 bytes");
7386
+ pik_error(p, &token, "token is too long - max length 50000 bytes");
73617387
break;
73627388
}else if( token.eType==T_ERROR ){
73637389
token.n = (unsigned short)(sz & 0xffff);
73647390
pik_error(p, &token, "unrecognized token");
73657391
break;
@@ -7535,10 +7561,12 @@
75357561
*/
75367562
int main(int argc, char **argv){
75377563
int i;
75387564
int bSvgOnly = 0; /* Output SVG only. No HTML wrapper */
75397565
int bDontStop = 0; /* Continue in spite of errors */
7566
+ int exitCode = 0; /* What to return */
7567
+ int mFlags = 0; /* mFlags argument to pikchr() */
75407568
const char *zHtmlHdr =
75417569
"<!DOCTYPE html>\n"
75427570
"<html lang=\"en-US\">\n"
75437571
"<head>\n<title>PIKCHR Test</title>\n"
75447572
"<style>\n"
@@ -7579,10 +7607,11 @@
75797607
if( zHtmlHdr==0 ){
75807608
fprintf(stderr, "the \"%s\" option must come first\n",argv[i]);
75817609
exit(1);
75827610
}
75837611
bSvgOnly = 1;
7612
+ mFlags |= PIKCHR_PLAINTEXT_ERRORS;
75847613
}else
75857614
{
75867615
fprintf(stderr,"unknown option: \"%s\"\n", argv[i]);
75877616
usage(argv[0]);
75887617
}
@@ -7603,11 +7632,11 @@
76037632
continue;
76047633
}
76057634
sz = fread(zIn, 1, sz, in);
76067635
fclose(in);
76077636
zIn[sz] = 0;
7608
- zOut = pikchr(zIn, "pikchr", 0, &w, &h);
7637
+ zOut = pikchr(zIn, "pikchr", mFlags, &w, &h);
76097638
if( zOut==0 ){
76107639
fprintf(stderr, "pikchr() returns NULL. Out of memory?\n");
76117640
if( !bDontStop ) exit(1);
76127641
}else if( bSvgOnly ){
76137642
printf("%s\n", zOut);
@@ -7617,10 +7646,11 @@
76177646
zHtmlHdr = 0;
76187647
}
76197648
printf("<h1>File %s</h1>\n", argv[i]);
76207649
if( w<0 ){
76217650
printf("<p>ERROR</p>\n%s\n", zOut);
7651
+ exitCode = 1;
76227652
}else{
76237653
printf("<div id=\"svg-%d\" onclick=\"toggleHidden('svg-%d')\">\n",i,i);
76247654
printf("<div style='border:3px solid lightgray;max-width:%dpx;'>\n",w);
76257655
printf("%s</div>\n", zOut);
76267656
printf("<pre class='hidden'>");
@@ -7632,10 +7662,70 @@
76327662
free(zIn);
76337663
}
76347664
if( !bSvgOnly ){
76357665
printf("</body></html>\n");
76367666
}
7637
- return 0;
7667
+ return exitCode;
76387668
}
76397669
#endif /* PIKCHR_SHELL */
76407670
7641
-#line 7666 "pikchr.c"
7671
+#ifdef PIKCHR_TCL
7672
+#include <tcl.h>
7673
+/*
7674
+** An interface to TCL
7675
+**
7676
+** TCL command: pikchr $INPUTTEXT
7677
+**
7678
+** Returns a list of 3 elements which are the output text, the width, and
7679
+** the height.
7680
+**
7681
+** Register the "pikchr" command by invoking Pikchr_Init(Tcl_Interp*). Or
7682
+** compile this source file as a shared library and load it using the
7683
+** "load" command of Tcl.
7684
+**
7685
+** Compile this source-code file into a shared library using a command
7686
+** similar to this:
7687
+**
7688
+** gcc -c pikchr.so -DPIKCHR_TCL -shared pikchr.c
7689
+*/
7690
+static int pik_tcl_command(
7691
+ ClientData clientData, /* Not Used */
7692
+ Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
7693
+ int objc, /* Number of arguments */
7694
+ Tcl_Obj *CONST objv[] /* Command arguments */
7695
+){
7696
+ int w, h; /* Width and height of the pikchr */
7697
+ const char *zIn; /* Source text input */
7698
+ char *zOut; /* SVG output text */
7699
+ Tcl_Obj *pRes; /* The result TCL object */
7700
+
7701
+ if( objc!=2 ){
7702
+ Tcl_WrongNumArgs(interp, 1, objv, "PIKCHR_SOURCE_TEXT");
7703
+ return TCL_ERROR;
7704
+ }
7705
+ zIn = Tcl_GetString(objv[1]);
7706
+ w = h = 0;
7707
+ zOut = pikchr(zIn, "pikchr", 0, &w, &h);
7708
+ if( zOut==0 ){
7709
+ return TCL_ERROR; /* Out of memory */
7710
+ }
7711
+ pRes = Tcl_NewObj();
7712
+ Tcl_ListObjAppendElement(0, pRes, Tcl_NewStringObj(zOut, -1));
7713
+ free(zOut);
7714
+ Tcl_ListObjAppendElement(0, pRes, Tcl_NewIntObj(w));
7715
+ Tcl_ListObjAppendElement(0, pRes, Tcl_NewIntObj(h));
7716
+ Tcl_SetObjResult(interp, pRes);
7717
+ return TCL_OK;
7718
+}
7719
+
7720
+/* Invoke this routine to register the "pikchr" command with the interpreter
7721
+** given in the argument */
7722
+int Pikchr_Init(Tcl_Interp *interp){
7723
+ Tcl_CreateObjCommand(interp, "pikchr", pik_tcl_command, 0, 0);
7724
+ return TCL_OK;
7725
+}
7726
+
7727
+
7728
+#endif /* PIKCHR_TCL */
7729
+
7730
+
7731
+#line 7756 "pikchr.c"
76427732
--- src/pikchr.c
+++ src/pikchr.c
@@ -373,10 +373,15 @@
373 /* Error contexts */
374 unsigned int nCtx; /* Number of error contexts */
375 PToken aCtx[10]; /* Nested error contexts */
376 };
377
 
 
 
 
 
378
379 /*
380 ** The behavior of an object class is defined by an instance of
381 ** this structure. This is the "virtual method" table.
382 */
@@ -463,11 +468,11 @@
463 static PObj *pik_position_assert(Pik*,PPoint*,PToken*,PPoint*);
464 static PNum pik_dist(PPoint*,PPoint*);
465 static void pik_add_macro(Pik*,PToken *pId,PToken *pCode);
466
467
468 #line 494 "pikchr.c"
469 /**************** End of %include directives **********************************/
470 /* These constants specify the various numeric values for terminal symbols.
471 ***************** Begin token definitions *************************************/
472 #ifndef T_ID
473 #define T_ID 1
@@ -1680,22 +1685,22 @@
1680 ** inside the C code.
1681 */
1682 /********* Begin destructor definitions ***************************************/
1683 case 98: /* statement_list */
1684 {
1685 #line 483 "pikchr.y"
1686 pik_elist_free(p,(yypminor->yy119));
1687 #line 1712 "pikchr.c"
1688 }
1689 break;
1690 case 99: /* statement */
1691 case 100: /* unnamed_statement */
1692 case 101: /* basetype */
1693 {
1694 #line 485 "pikchr.y"
1695 pik_elem_free(p,(yypminor->yy38));
1696 #line 1721 "pikchr.c"
1697 }
1698 break;
1699 /********* End destructor definitions *****************************************/
1700 default: break; /* If no destructor action specified: do nothing */
1701 }
@@ -1909,14 +1914,14 @@
1909 #endif
1910 while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
1911 /* Here code is inserted which will execute if the parser
1912 ** stack every overflows */
1913 /******** Begin %stack_overflow code ******************************************/
1914 #line 517 "pikchr.y"
1915
1916 pik_error(p, 0, "parser stack overflow");
1917 #line 1942 "pikchr.c"
1918 /******** End %stack_overflow code ********************************************/
1919 pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
1920 pik_parserCTX_STORE
1921 }
1922
@@ -2390,614 +2395,614 @@
2390 ** break;
2391 */
2392 /********** Begin reduce actions **********************************************/
2393 YYMINORTYPE yylhsminor;
2394 case 0: /* document ::= statement_list */
2395 #line 521 "pikchr.y"
2396 {pik_render(p,yymsp[0].minor.yy119);}
2397 #line 2422 "pikchr.c"
2398 break;
2399 case 1: /* statement_list ::= statement */
2400 #line 524 "pikchr.y"
2401 { yylhsminor.yy119 = pik_elist_append(p,0,yymsp[0].minor.yy38); }
2402 #line 2427 "pikchr.c"
2403 yymsp[0].minor.yy119 = yylhsminor.yy119;
2404 break;
2405 case 2: /* statement_list ::= statement_list EOL statement */
2406 #line 526 "pikchr.y"
2407 { yylhsminor.yy119 = pik_elist_append(p,yymsp[-2].minor.yy119,yymsp[0].minor.yy38); }
2408 #line 2433 "pikchr.c"
2409 yymsp[-2].minor.yy119 = yylhsminor.yy119;
2410 break;
2411 case 3: /* statement ::= */
2412 #line 529 "pikchr.y"
2413 { yymsp[1].minor.yy38 = 0; }
2414 #line 2439 "pikchr.c"
2415 break;
2416 case 4: /* statement ::= direction */
2417 #line 530 "pikchr.y"
2418 { pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy38=0; }
2419 #line 2444 "pikchr.c"
2420 yymsp[0].minor.yy38 = yylhsminor.yy38;
2421 break;
2422 case 5: /* statement ::= lvalue ASSIGN rvalue */
2423 #line 531 "pikchr.y"
2424 {pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy265,&yymsp[-1].minor.yy0); yylhsminor.yy38=0;}
2425 #line 2450 "pikchr.c"
2426 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2427 break;
2428 case 6: /* statement ::= PLACENAME COLON unnamed_statement */
2429 #line 533 "pikchr.y"
2430 { yylhsminor.yy38 = yymsp[0].minor.yy38; pik_elem_setname(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0); }
2431 #line 2456 "pikchr.c"
2432 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2433 break;
2434 case 7: /* statement ::= PLACENAME COLON position */
2435 #line 535 "pikchr.y"
2436 { yylhsminor.yy38 = pik_elem_new(p,0,0,0);
2437 if(yylhsminor.yy38){ yylhsminor.yy38->ptAt = yymsp[0].minor.yy43; pik_elem_setname(p,yylhsminor.yy38,&yymsp[-2].minor.yy0); }}
2438 #line 2463 "pikchr.c"
2439 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2440 break;
2441 case 8: /* statement ::= unnamed_statement */
2442 #line 537 "pikchr.y"
2443 {yylhsminor.yy38 = yymsp[0].minor.yy38;}
2444 #line 2469 "pikchr.c"
2445 yymsp[0].minor.yy38 = yylhsminor.yy38;
2446 break;
2447 case 9: /* statement ::= print prlist */
2448 #line 538 "pikchr.y"
2449 {pik_append(p,"<br>\n",5); yymsp[-1].minor.yy38=0;}
2450 #line 2475 "pikchr.c"
2451 break;
2452 case 10: /* statement ::= ASSERT LP expr EQ expr RP */
2453 #line 543 "pikchr.y"
2454 {yymsp[-5].minor.yy38=pik_assert(p,yymsp[-3].minor.yy265,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy265);}
2455 #line 2480 "pikchr.c"
2456 break;
2457 case 11: /* statement ::= ASSERT LP position EQ position RP */
2458 #line 545 "pikchr.y"
2459 {yymsp[-5].minor.yy38=pik_position_assert(p,&yymsp[-3].minor.yy43,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy43);}
2460 #line 2485 "pikchr.c"
2461 break;
2462 case 12: /* statement ::= DEFINE ID CODEBLOCK */
2463 #line 546 "pikchr.y"
2464 {yymsp[-2].minor.yy38=0; pik_add_macro(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
2465 #line 2490 "pikchr.c"
2466 break;
2467 case 13: /* rvalue ::= PLACENAME */
2468 #line 557 "pikchr.y"
2469 {yylhsminor.yy265 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2470 #line 2495 "pikchr.c"
2471 yymsp[0].minor.yy265 = yylhsminor.yy265;
2472 break;
2473 case 14: /* pritem ::= FILL */
2474 case 15: /* pritem ::= COLOR */ yytestcase(yyruleno==15);
2475 case 16: /* pritem ::= THICKNESS */ yytestcase(yyruleno==16);
2476 #line 562 "pikchr.y"
2477 {pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2478 #line 2503 "pikchr.c"
2479 break;
2480 case 17: /* pritem ::= rvalue */
2481 #line 565 "pikchr.y"
2482 {pik_append_num(p,"",yymsp[0].minor.yy265);}
2483 #line 2508 "pikchr.c"
2484 break;
2485 case 18: /* pritem ::= STRING */
2486 #line 566 "pikchr.y"
2487 {pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2488 #line 2513 "pikchr.c"
2489 break;
2490 case 19: /* prsep ::= COMMA */
2491 #line 567 "pikchr.y"
2492 {pik_append(p, " ", 1);}
2493 #line 2518 "pikchr.c"
2494 break;
2495 case 20: /* unnamed_statement ::= basetype attribute_list */
2496 #line 570 "pikchr.y"
2497 {yylhsminor.yy38 = yymsp[-1].minor.yy38; pik_after_adding_attributes(p,yylhsminor.yy38);}
2498 #line 2523 "pikchr.c"
2499 yymsp[-1].minor.yy38 = yylhsminor.yy38;
2500 break;
2501 case 21: /* basetype ::= CLASSNAME */
2502 #line 572 "pikchr.y"
2503 {yylhsminor.yy38 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2504 #line 2529 "pikchr.c"
2505 yymsp[0].minor.yy38 = yylhsminor.yy38;
2506 break;
2507 case 22: /* basetype ::= STRING textposition */
2508 #line 574 "pikchr.y"
2509 {yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy196; yylhsminor.yy38 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2510 #line 2535 "pikchr.c"
2511 yymsp[-1].minor.yy38 = yylhsminor.yy38;
2512 break;
2513 case 23: /* basetype ::= LB savelist statement_list RB */
2514 #line 576 "pikchr.y"
2515 { 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; }
2516 #line 2541 "pikchr.c"
2517 break;
2518 case 24: /* savelist ::= */
2519 #line 581 "pikchr.y"
2520 {yymsp[1].minor.yy119 = p->list; p->list = 0;}
2521 #line 2546 "pikchr.c"
2522 break;
2523 case 25: /* relexpr ::= expr */
2524 #line 588 "pikchr.y"
2525 {yylhsminor.yy200.rAbs = yymsp[0].minor.yy265; yylhsminor.yy200.rRel = 0;}
2526 #line 2551 "pikchr.c"
2527 yymsp[0].minor.yy200 = yylhsminor.yy200;
2528 break;
2529 case 26: /* relexpr ::= expr PERCENT */
2530 #line 589 "pikchr.y"
2531 {yylhsminor.yy200.rAbs = 0; yylhsminor.yy200.rRel = yymsp[-1].minor.yy265/100;}
2532 #line 2557 "pikchr.c"
2533 yymsp[-1].minor.yy200 = yylhsminor.yy200;
2534 break;
2535 case 27: /* optrelexpr ::= */
2536 #line 591 "pikchr.y"
2537 {yymsp[1].minor.yy200.rAbs = 0; yymsp[1].minor.yy200.rRel = 1.0;}
2538 #line 2563 "pikchr.c"
2539 break;
2540 case 28: /* attribute_list ::= relexpr alist */
2541 #line 593 "pikchr.y"
2542 {pik_add_direction(p,0,&yymsp[-1].minor.yy200);}
2543 #line 2568 "pikchr.c"
2544 break;
2545 case 29: /* attribute ::= numproperty relexpr */
2546 #line 597 "pikchr.y"
2547 { pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy200); }
2548 #line 2573 "pikchr.c"
2549 break;
2550 case 30: /* attribute ::= dashproperty expr */
2551 #line 598 "pikchr.y"
2552 { pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy265); }
2553 #line 2578 "pikchr.c"
2554 break;
2555 case 31: /* attribute ::= dashproperty */
2556 #line 599 "pikchr.y"
2557 { pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2558 #line 2583 "pikchr.c"
2559 break;
2560 case 32: /* attribute ::= colorproperty rvalue */
2561 #line 600 "pikchr.y"
2562 { pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy265); }
2563 #line 2588 "pikchr.c"
2564 break;
2565 case 33: /* attribute ::= go direction optrelexpr */
2566 #line 601 "pikchr.y"
2567 { pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy200);}
2568 #line 2593 "pikchr.c"
2569 break;
2570 case 34: /* attribute ::= go direction even position */
2571 #line 602 "pikchr.y"
2572 {pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy43);}
2573 #line 2598 "pikchr.c"
2574 break;
2575 case 35: /* attribute ::= CLOSE */
2576 #line 603 "pikchr.y"
2577 { pik_close_path(p,&yymsp[0].minor.yy0); }
2578 #line 2603 "pikchr.c"
2579 break;
2580 case 36: /* attribute ::= CHOP */
2581 #line 604 "pikchr.y"
2582 { p->cur->bChop = 1; }
2583 #line 2608 "pikchr.c"
2584 break;
2585 case 37: /* attribute ::= FROM position */
2586 #line 605 "pikchr.y"
2587 { pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy43); }
2588 #line 2613 "pikchr.c"
2589 break;
2590 case 38: /* attribute ::= TO position */
2591 #line 606 "pikchr.y"
2592 { pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy43); }
2593 #line 2618 "pikchr.c"
2594 break;
2595 case 39: /* attribute ::= THEN */
2596 #line 607 "pikchr.y"
2597 { pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2598 #line 2623 "pikchr.c"
2599 break;
2600 case 40: /* attribute ::= THEN optrelexpr HEADING expr */
2601 case 42: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==42);
2602 #line 609 "pikchr.y"
2603 {pik_move_hdg(p,&yymsp[-2].minor.yy200,&yymsp[-1].minor.yy0,yymsp[0].minor.yy265,0,&yymsp[-3].minor.yy0);}
2604 #line 2629 "pikchr.c"
2605 break;
2606 case 41: /* attribute ::= THEN optrelexpr EDGEPT */
2607 case 43: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==43);
2608 #line 610 "pikchr.y"
2609 {pik_move_hdg(p,&yymsp[-1].minor.yy200,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2610 #line 2635 "pikchr.c"
2611 break;
2612 case 44: /* attribute ::= AT position */
2613 #line 615 "pikchr.y"
2614 { pik_set_at(p,0,&yymsp[0].minor.yy43,&yymsp[-1].minor.yy0); }
2615 #line 2640 "pikchr.c"
2616 break;
2617 case 45: /* attribute ::= SAME */
2618 #line 617 "pikchr.y"
2619 {pik_same(p,0,&yymsp[0].minor.yy0);}
2620 #line 2645 "pikchr.c"
2621 break;
2622 case 46: /* attribute ::= SAME AS object */
2623 #line 618 "pikchr.y"
2624 {pik_same(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2625 #line 2650 "pikchr.c"
2626 break;
2627 case 47: /* attribute ::= STRING textposition */
2628 #line 619 "pikchr.y"
2629 {pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy196);}
2630 #line 2655 "pikchr.c"
2631 break;
2632 case 48: /* attribute ::= FIT */
2633 #line 620 "pikchr.y"
2634 {pik_size_to_fit(p,&yymsp[0].minor.yy0,3); }
2635 #line 2660 "pikchr.c"
2636 break;
2637 case 49: /* attribute ::= BEHIND object */
2638 #line 621 "pikchr.y"
2639 {pik_behind(p,yymsp[0].minor.yy38);}
2640 #line 2665 "pikchr.c"
2641 break;
2642 case 50: /* withclause ::= DOT_E edge AT position */
2643 case 51: /* withclause ::= edge AT position */ yytestcase(yyruleno==51);
2644 #line 629 "pikchr.y"
2645 { pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy43,&yymsp[-1].minor.yy0); }
2646 #line 2671 "pikchr.c"
2647 break;
2648 case 52: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2649 #line 633 "pikchr.y"
2650 {yylhsminor.yy0 = yymsp[0].minor.yy0;}
2651 #line 2676 "pikchr.c"
2652 yymsp[0].minor.yy0 = yylhsminor.yy0;
2653 break;
2654 case 53: /* boolproperty ::= CW */
2655 #line 644 "pikchr.y"
2656 {p->cur->cw = 1;}
2657 #line 2682 "pikchr.c"
2658 break;
2659 case 54: /* boolproperty ::= CCW */
2660 #line 645 "pikchr.y"
2661 {p->cur->cw = 0;}
2662 #line 2687 "pikchr.c"
2663 break;
2664 case 55: /* boolproperty ::= LARROW */
2665 #line 646 "pikchr.y"
2666 {p->cur->larrow=1; p->cur->rarrow=0; }
2667 #line 2692 "pikchr.c"
2668 break;
2669 case 56: /* boolproperty ::= RARROW */
2670 #line 647 "pikchr.y"
2671 {p->cur->larrow=0; p->cur->rarrow=1; }
2672 #line 2697 "pikchr.c"
2673 break;
2674 case 57: /* boolproperty ::= LRARROW */
2675 #line 648 "pikchr.y"
2676 {p->cur->larrow=1; p->cur->rarrow=1; }
2677 #line 2702 "pikchr.c"
2678 break;
2679 case 58: /* boolproperty ::= INVIS */
2680 #line 649 "pikchr.y"
2681 {p->cur->sw = 0.0;}
2682 #line 2707 "pikchr.c"
2683 break;
2684 case 59: /* boolproperty ::= THICK */
2685 #line 650 "pikchr.y"
2686 {p->cur->sw *= 1.5;}
2687 #line 2712 "pikchr.c"
2688 break;
2689 case 60: /* boolproperty ::= THIN */
2690 #line 651 "pikchr.y"
2691 {p->cur->sw *= 0.67;}
2692 #line 2717 "pikchr.c"
2693 break;
2694 case 61: /* boolproperty ::= SOLID */
2695 #line 652 "pikchr.y"
2696 {p->cur->sw = pik_value(p,"thickness",9,0);
2697 p->cur->dotted = p->cur->dashed = 0.0;}
2698 #line 2723 "pikchr.c"
2699 break;
2700 case 62: /* textposition ::= */
2701 #line 655 "pikchr.y"
2702 {yymsp[1].minor.yy196 = 0;}
2703 #line 2728 "pikchr.c"
2704 break;
2705 case 63: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2706 #line 658 "pikchr.y"
2707 {yylhsminor.yy196 = pik_text_position(yymsp[-1].minor.yy196,&yymsp[0].minor.yy0);}
2708 #line 2733 "pikchr.c"
2709 yymsp[-1].minor.yy196 = yylhsminor.yy196;
2710 break;
2711 case 64: /* position ::= expr COMMA expr */
2712 #line 661 "pikchr.y"
2713 {yylhsminor.yy43.x=yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[0].minor.yy265;}
2714 #line 2739 "pikchr.c"
2715 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2716 break;
2717 case 65: /* position ::= place PLUS expr COMMA expr */
2718 #line 663 "pikchr.y"
2719 {yylhsminor.yy43.x=yymsp[-4].minor.yy43.x+yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[-4].minor.yy43.y+yymsp[0].minor.yy265;}
2720 #line 2745 "pikchr.c"
2721 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2722 break;
2723 case 66: /* position ::= place MINUS expr COMMA expr */
2724 #line 664 "pikchr.y"
2725 {yylhsminor.yy43.x=yymsp[-4].minor.yy43.x-yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[-4].minor.yy43.y-yymsp[0].minor.yy265;}
2726 #line 2751 "pikchr.c"
2727 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2728 break;
2729 case 67: /* position ::= place PLUS LP expr COMMA expr RP */
2730 #line 666 "pikchr.y"
2731 {yylhsminor.yy43.x=yymsp[-6].minor.yy43.x+yymsp[-3].minor.yy265; yylhsminor.yy43.y=yymsp[-6].minor.yy43.y+yymsp[-1].minor.yy265;}
2732 #line 2757 "pikchr.c"
2733 yymsp[-6].minor.yy43 = yylhsminor.yy43;
2734 break;
2735 case 68: /* position ::= place MINUS LP expr COMMA expr RP */
2736 #line 668 "pikchr.y"
2737 {yylhsminor.yy43.x=yymsp[-6].minor.yy43.x-yymsp[-3].minor.yy265; yylhsminor.yy43.y=yymsp[-6].minor.yy43.y-yymsp[-1].minor.yy265;}
2738 #line 2763 "pikchr.c"
2739 yymsp[-6].minor.yy43 = yylhsminor.yy43;
2740 break;
2741 case 69: /* position ::= LP position COMMA position RP */
2742 #line 669 "pikchr.y"
2743 {yymsp[-4].minor.yy43.x=yymsp[-3].minor.yy43.x; yymsp[-4].minor.yy43.y=yymsp[-1].minor.yy43.y;}
2744 #line 2769 "pikchr.c"
2745 break;
2746 case 70: /* position ::= LP position RP */
2747 #line 670 "pikchr.y"
2748 {yymsp[-2].minor.yy43=yymsp[-1].minor.yy43;}
2749 #line 2774 "pikchr.c"
2750 break;
2751 case 71: /* position ::= expr between position AND position */
2752 #line 672 "pikchr.y"
2753 {yylhsminor.yy43 = pik_position_between(yymsp[-4].minor.yy265,yymsp[-2].minor.yy43,yymsp[0].minor.yy43);}
2754 #line 2779 "pikchr.c"
2755 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2756 break;
2757 case 72: /* position ::= expr LT position COMMA position GT */
2758 #line 674 "pikchr.y"
2759 {yylhsminor.yy43 = pik_position_between(yymsp[-5].minor.yy265,yymsp[-3].minor.yy43,yymsp[-1].minor.yy43);}
2760 #line 2785 "pikchr.c"
2761 yymsp[-5].minor.yy43 = yylhsminor.yy43;
2762 break;
2763 case 73: /* position ::= expr ABOVE position */
2764 #line 675 "pikchr.y"
2765 {yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.y += yymsp[-2].minor.yy265;}
2766 #line 2791 "pikchr.c"
2767 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2768 break;
2769 case 74: /* position ::= expr BELOW position */
2770 #line 676 "pikchr.y"
2771 {yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.y -= yymsp[-2].minor.yy265;}
2772 #line 2797 "pikchr.c"
2773 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2774 break;
2775 case 75: /* position ::= expr LEFT OF position */
2776 #line 677 "pikchr.y"
2777 {yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.x -= yymsp[-3].minor.yy265;}
2778 #line 2803 "pikchr.c"
2779 yymsp[-3].minor.yy43 = yylhsminor.yy43;
2780 break;
2781 case 76: /* position ::= expr RIGHT OF position */
2782 #line 678 "pikchr.y"
2783 {yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.x += yymsp[-3].minor.yy265;}
2784 #line 2809 "pikchr.c"
2785 yymsp[-3].minor.yy43 = yylhsminor.yy43;
2786 break;
2787 case 77: /* position ::= expr ON HEADING EDGEPT OF position */
2788 #line 680 "pikchr.y"
2789 {yylhsminor.yy43 = pik_position_at_hdg(yymsp[-5].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2790 #line 2815 "pikchr.c"
2791 yymsp[-5].minor.yy43 = yylhsminor.yy43;
2792 break;
2793 case 78: /* position ::= expr HEADING EDGEPT OF position */
2794 #line 682 "pikchr.y"
2795 {yylhsminor.yy43 = pik_position_at_hdg(yymsp[-4].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2796 #line 2821 "pikchr.c"
2797 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2798 break;
2799 case 79: /* position ::= expr EDGEPT OF position */
2800 #line 684 "pikchr.y"
2801 {yylhsminor.yy43 = pik_position_at_hdg(yymsp[-3].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2802 #line 2827 "pikchr.c"
2803 yymsp[-3].minor.yy43 = yylhsminor.yy43;
2804 break;
2805 case 80: /* position ::= expr ON HEADING expr FROM position */
2806 #line 686 "pikchr.y"
2807 {yylhsminor.yy43 = pik_position_at_angle(yymsp[-5].minor.yy265,yymsp[-2].minor.yy265,yymsp[0].minor.yy43);}
2808 #line 2833 "pikchr.c"
2809 yymsp[-5].minor.yy43 = yylhsminor.yy43;
2810 break;
2811 case 81: /* position ::= expr HEADING expr FROM position */
2812 #line 688 "pikchr.y"
2813 {yylhsminor.yy43 = pik_position_at_angle(yymsp[-4].minor.yy265,yymsp[-2].minor.yy265,yymsp[0].minor.yy43);}
2814 #line 2839 "pikchr.c"
2815 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2816 break;
2817 case 82: /* place ::= edge OF object */
2818 #line 700 "pikchr.y"
2819 {yylhsminor.yy43 = pik_place_of_elem(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2820 #line 2845 "pikchr.c"
2821 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2822 break;
2823 case 83: /* place2 ::= object */
2824 #line 701 "pikchr.y"
2825 {yylhsminor.yy43 = pik_place_of_elem(p,yymsp[0].minor.yy38,0);}
2826 #line 2851 "pikchr.c"
2827 yymsp[0].minor.yy43 = yylhsminor.yy43;
2828 break;
2829 case 84: /* place2 ::= object DOT_E edge */
2830 #line 702 "pikchr.y"
2831 {yylhsminor.yy43 = pik_place_of_elem(p,yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
2832 #line 2857 "pikchr.c"
2833 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2834 break;
2835 case 85: /* place2 ::= NTH VERTEX OF object */
2836 #line 703 "pikchr.y"
2837 {yylhsminor.yy43 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy38);}
2838 #line 2863 "pikchr.c"
2839 yymsp[-3].minor.yy43 = yylhsminor.yy43;
2840 break;
2841 case 86: /* object ::= nth */
2842 #line 715 "pikchr.y"
2843 {yylhsminor.yy38 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2844 #line 2869 "pikchr.c"
2845 yymsp[0].minor.yy38 = yylhsminor.yy38;
2846 break;
2847 case 87: /* object ::= nth OF|IN object */
2848 #line 716 "pikchr.y"
2849 {yylhsminor.yy38 = pik_find_nth(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2850 #line 2875 "pikchr.c"
2851 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2852 break;
2853 case 88: /* objectname ::= PLACENAME */
2854 #line 718 "pikchr.y"
2855 {yylhsminor.yy38 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2856 #line 2881 "pikchr.c"
2857 yymsp[0].minor.yy38 = yylhsminor.yy38;
2858 break;
2859 case 89: /* objectname ::= objectname DOT_U PLACENAME */
2860 #line 720 "pikchr.y"
2861 {yylhsminor.yy38 = pik_find_byname(p,yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
2862 #line 2887 "pikchr.c"
2863 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2864 break;
2865 case 90: /* nth ::= NTH CLASSNAME */
2866 #line 722 "pikchr.y"
2867 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2868 #line 2893 "pikchr.c"
2869 yymsp[-1].minor.yy0 = yylhsminor.yy0;
2870 break;
2871 case 91: /* nth ::= NTH LAST CLASSNAME */
2872 #line 723 "pikchr.y"
2873 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2874 #line 2899 "pikchr.c"
2875 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2876 break;
2877 case 92: /* nth ::= LAST CLASSNAME */
2878 #line 724 "pikchr.y"
2879 {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2880 #line 2905 "pikchr.c"
2881 break;
2882 case 93: /* nth ::= LAST */
2883 #line 725 "pikchr.y"
2884 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2885 #line 2910 "pikchr.c"
2886 yymsp[0].minor.yy0 = yylhsminor.yy0;
2887 break;
2888 case 94: /* nth ::= NTH LB RB */
2889 #line 726 "pikchr.y"
2890 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2891 #line 2916 "pikchr.c"
2892 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2893 break;
2894 case 95: /* nth ::= NTH LAST LB RB */
2895 #line 727 "pikchr.y"
2896 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2897 #line 2922 "pikchr.c"
2898 yymsp[-3].minor.yy0 = yylhsminor.yy0;
2899 break;
2900 case 96: /* nth ::= LAST LB RB */
2901 #line 728 "pikchr.y"
2902 {yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2903 #line 2928 "pikchr.c"
2904 break;
2905 case 97: /* expr ::= expr PLUS expr */
2906 #line 730 "pikchr.y"
2907 {yylhsminor.yy265=yymsp[-2].minor.yy265+yymsp[0].minor.yy265;}
2908 #line 2933 "pikchr.c"
2909 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2910 break;
2911 case 98: /* expr ::= expr MINUS expr */
2912 #line 731 "pikchr.y"
2913 {yylhsminor.yy265=yymsp[-2].minor.yy265-yymsp[0].minor.yy265;}
2914 #line 2939 "pikchr.c"
2915 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2916 break;
2917 case 99: /* expr ::= expr STAR expr */
2918 #line 732 "pikchr.y"
2919 {yylhsminor.yy265=yymsp[-2].minor.yy265*yymsp[0].minor.yy265;}
2920 #line 2945 "pikchr.c"
2921 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2922 break;
2923 case 100: /* expr ::= expr SLASH expr */
2924 #line 733 "pikchr.y"
2925 {
2926 if( yymsp[0].minor.yy265==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy265 = 0.0; }
2927 else{ yylhsminor.yy265 = yymsp[-2].minor.yy265/yymsp[0].minor.yy265; }
2928 }
2929 #line 2954 "pikchr.c"
2930 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2931 break;
2932 case 101: /* expr ::= MINUS expr */
2933 #line 737 "pikchr.y"
2934 {yymsp[-1].minor.yy265=-yymsp[0].minor.yy265;}
2935 #line 2960 "pikchr.c"
2936 break;
2937 case 102: /* expr ::= PLUS expr */
2938 #line 738 "pikchr.y"
2939 {yymsp[-1].minor.yy265=yymsp[0].minor.yy265;}
2940 #line 2965 "pikchr.c"
2941 break;
2942 case 103: /* expr ::= LP expr RP */
2943 #line 739 "pikchr.y"
2944 {yymsp[-2].minor.yy265=yymsp[-1].minor.yy265;}
2945 #line 2970 "pikchr.c"
2946 break;
2947 case 104: /* expr ::= LP FILL|COLOR|THICKNESS RP */
2948 #line 740 "pikchr.y"
2949 {yymsp[-2].minor.yy265=pik_get_var(p,&yymsp[-1].minor.yy0);}
2950 #line 2975 "pikchr.c"
2951 break;
2952 case 105: /* expr ::= NUMBER */
2953 #line 741 "pikchr.y"
2954 {yylhsminor.yy265=pik_atof(&yymsp[0].minor.yy0);}
2955 #line 2980 "pikchr.c"
2956 yymsp[0].minor.yy265 = yylhsminor.yy265;
2957 break;
2958 case 106: /* expr ::= ID */
2959 #line 742 "pikchr.y"
2960 {yylhsminor.yy265=pik_get_var(p,&yymsp[0].minor.yy0);}
2961 #line 2986 "pikchr.c"
2962 yymsp[0].minor.yy265 = yylhsminor.yy265;
2963 break;
2964 case 107: /* expr ::= FUNC1 LP expr RP */
2965 #line 743 "pikchr.y"
2966 {yylhsminor.yy265 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy265,0.0);}
2967 #line 2992 "pikchr.c"
2968 yymsp[-3].minor.yy265 = yylhsminor.yy265;
2969 break;
2970 case 108: /* expr ::= FUNC2 LP expr COMMA expr RP */
2971 #line 744 "pikchr.y"
2972 {yylhsminor.yy265 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy265,yymsp[-1].minor.yy265);}
2973 #line 2998 "pikchr.c"
2974 yymsp[-5].minor.yy265 = yylhsminor.yy265;
2975 break;
2976 case 109: /* expr ::= DIST LP position COMMA position RP */
2977 #line 745 "pikchr.y"
2978 {yymsp[-5].minor.yy265 = pik_dist(&yymsp[-3].minor.yy43,&yymsp[-1].minor.yy43);}
2979 #line 3004 "pikchr.c"
2980 break;
2981 case 110: /* expr ::= place2 DOT_XY X */
2982 #line 746 "pikchr.y"
2983 {yylhsminor.yy265 = yymsp[-2].minor.yy43.x;}
2984 #line 3009 "pikchr.c"
2985 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2986 break;
2987 case 111: /* expr ::= place2 DOT_XY Y */
2988 #line 747 "pikchr.y"
2989 {yylhsminor.yy265 = yymsp[-2].minor.yy43.y;}
2990 #line 3015 "pikchr.c"
2991 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2992 break;
2993 case 112: /* expr ::= object DOT_L numproperty */
2994 case 113: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==113);
2995 case 114: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==114);
2996 #line 748 "pikchr.y"
2997 {yylhsminor.yy265=pik_property_of(yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
2998 #line 3023 "pikchr.c"
2999 yymsp[-2].minor.yy265 = yylhsminor.yy265;
3000 break;
3001 default:
3002 /* (115) lvalue ::= ID */ yytestcase(yyruleno==115);
3003 /* (116) lvalue ::= FILL */ yytestcase(yyruleno==116);
@@ -3096,19 +3101,19 @@
3096 ){
3097 pik_parserARG_FETCH
3098 pik_parserCTX_FETCH
3099 #define TOKEN yyminor
3100 /************ Begin %syntax_error code ****************************************/
3101 #line 509 "pikchr.y"
3102
3103 if( TOKEN.z && TOKEN.z[0] ){
3104 pik_error(p, &TOKEN, "syntax error");
3105 }else{
3106 pik_error(p, 0, "syntax error");
3107 }
3108 UNUSED_PARAMETER(yymajor);
3109 #line 3134 "pikchr.c"
3110 /************ End %syntax_error code ******************************************/
3111 pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
3112 pik_parserCTX_STORE
3113 }
3114
@@ -3337,11 +3342,11 @@
3337 #else
3338 (void)iToken;
3339 return 0;
3340 #endif
3341 }
3342 #line 753 "pikchr.y"
3343
3344
3345
3346 /* Chart of the 140 official HTML color names with their
3347 ** corresponding RGB value.
@@ -4508,10 +4513,23 @@
4508 n -= i;
4509 zText += i;
4510 i = 0;
4511 }
4512 }
 
 
 
 
 
 
 
 
 
 
 
 
 
4513
4514 /* Append a PNum value
4515 */
4516 static void pik_append_num(Pik *p, const char *z,PNum v){
4517 char buf[100];
@@ -4894,11 +4912,11 @@
4894 while( iFirstLineno<=iLineno ){
4895 snprintf(zLineno,sizeof(zLineno)-1,"/* %4d */ ", iFirstLineno++);
4896 zLineno[sizeof(zLineno)-1] = 0;
4897 pik_append(p, zLineno, -1);
4898 for(i=iStart; p->sIn.z[i]!=0 && p->sIn.z[i]!='\n'; i++){}
4899 pik_append_text(p, p->sIn.z+iStart, i-iStart, 0);
4900 iStart = i+1;
4901 pik_append(p, "\n", 1);
4902 }
4903 for(iErrCol=0, i=iErrPt; i>0 && p->sIn.z[i]!='\n'; iErrCol++, i--){}
4904 for(i=0; i<iErrCol+11; i++){ pik_append(p, " ", 1); }
@@ -4918,28 +4936,36 @@
4918 int i;
4919 if( p==0 ) return;
4920 if( p->nErr ) return;
4921 p->nErr++;
4922 if( zMsg==0 ){
4923 pik_append(p, "\n<div><p>Out of memory</p></div>\n", -1);
 
 
 
 
4924 return;
4925 }
4926 if( pErr==0 ){
4927 pik_append(p, "\n", 1);
4928 pik_append_text(p, zMsg, -1, 0);
4929 return;
4930 }
4931 pik_append(p, "<div><pre>\n", -1);
 
 
4932 pik_error_context(p, pErr, 5);
4933 pik_append(p, "ERROR: ", -1);
4934 pik_append_text(p, zMsg, -1, 0);
4935 pik_append(p, "\n", 1);
4936 for(i=p->nCtx-1; i>=0; i--){
4937 pik_append(p, "Called from:\n", -1);
4938 pik_error_context(p, &p->aCtx[i], 0);
4939 }
4940 pik_append(p, "</pre></div>\n", -1);
 
 
4941 }
4942
4943 /*
4944 ** Process an "assert( e1 == e2 )" statement. Always return NULL.
4945 */
@@ -7353,13 +7379,13 @@
7353 token.eEdge = 0;
7354 token.z = pIn->z + i;
7355 sz = pik_token_length(&token, 1);
7356 if( token.eType==T_WHITESPACE ){
7357 /* no-op */
7358 }else if( sz>1000 ){
7359 token.n = 1;
7360 pik_error(p, &token, "token is too long - max length 1000 bytes");
7361 break;
7362 }else if( token.eType==T_ERROR ){
7363 token.n = (unsigned short)(sz & 0xffff);
7364 pik_error(p, &token, "unrecognized token");
7365 break;
@@ -7535,10 +7561,12 @@
7535 */
7536 int main(int argc, char **argv){
7537 int i;
7538 int bSvgOnly = 0; /* Output SVG only. No HTML wrapper */
7539 int bDontStop = 0; /* Continue in spite of errors */
 
 
7540 const char *zHtmlHdr =
7541 "<!DOCTYPE html>\n"
7542 "<html lang=\"en-US\">\n"
7543 "<head>\n<title>PIKCHR Test</title>\n"
7544 "<style>\n"
@@ -7579,10 +7607,11 @@
7579 if( zHtmlHdr==0 ){
7580 fprintf(stderr, "the \"%s\" option must come first\n",argv[i]);
7581 exit(1);
7582 }
7583 bSvgOnly = 1;
 
7584 }else
7585 {
7586 fprintf(stderr,"unknown option: \"%s\"\n", argv[i]);
7587 usage(argv[0]);
7588 }
@@ -7603,11 +7632,11 @@
7603 continue;
7604 }
7605 sz = fread(zIn, 1, sz, in);
7606 fclose(in);
7607 zIn[sz] = 0;
7608 zOut = pikchr(zIn, "pikchr", 0, &w, &h);
7609 if( zOut==0 ){
7610 fprintf(stderr, "pikchr() returns NULL. Out of memory?\n");
7611 if( !bDontStop ) exit(1);
7612 }else if( bSvgOnly ){
7613 printf("%s\n", zOut);
@@ -7617,10 +7646,11 @@
7617 zHtmlHdr = 0;
7618 }
7619 printf("<h1>File %s</h1>\n", argv[i]);
7620 if( w<0 ){
7621 printf("<p>ERROR</p>\n%s\n", zOut);
 
7622 }else{
7623 printf("<div id=\"svg-%d\" onclick=\"toggleHidden('svg-%d')\">\n",i,i);
7624 printf("<div style='border:3px solid lightgray;max-width:%dpx;'>\n",w);
7625 printf("%s</div>\n", zOut);
7626 printf("<pre class='hidden'>");
@@ -7632,10 +7662,70 @@
7632 free(zIn);
7633 }
7634 if( !bSvgOnly ){
7635 printf("</body></html>\n");
7636 }
7637 return 0;
7638 }
7639 #endif /* PIKCHR_SHELL */
7640
7641 #line 7666 "pikchr.c"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7642
--- src/pikchr.c
+++ src/pikchr.c
@@ -373,10 +373,15 @@
373 /* Error contexts */
374 unsigned int nCtx; /* Number of error contexts */
375 PToken aCtx[10]; /* Nested error contexts */
376 };
377
378 /* Include PIKCHR_PLAINTEXT_ERRORS among the bits of mFlags on the 3rd
379 ** argument to pikchr() in order to cause error message text to come out
380 ** as text/plain instead of as text/html
381 */
382 #define PIKCHR_PLAINTEXT_ERRORS 0x0001
383
384 /*
385 ** The behavior of an object class is defined by an instance of
386 ** this structure. This is the "virtual method" table.
387 */
@@ -463,11 +468,11 @@
468 static PObj *pik_position_assert(Pik*,PPoint*,PToken*,PPoint*);
469 static PNum pik_dist(PPoint*,PPoint*);
470 static void pik_add_macro(Pik*,PToken *pId,PToken *pCode);
471
472
473 #line 499 "pikchr.c"
474 /**************** End of %include directives **********************************/
475 /* These constants specify the various numeric values for terminal symbols.
476 ***************** Begin token definitions *************************************/
477 #ifndef T_ID
478 #define T_ID 1
@@ -1680,22 +1685,22 @@
1685 ** inside the C code.
1686 */
1687 /********* Begin destructor definitions ***************************************/
1688 case 98: /* statement_list */
1689 {
1690 #line 488 "pikchr.y"
1691 pik_elist_free(p,(yypminor->yy119));
1692 #line 1717 "pikchr.c"
1693 }
1694 break;
1695 case 99: /* statement */
1696 case 100: /* unnamed_statement */
1697 case 101: /* basetype */
1698 {
1699 #line 490 "pikchr.y"
1700 pik_elem_free(p,(yypminor->yy38));
1701 #line 1726 "pikchr.c"
1702 }
1703 break;
1704 /********* End destructor definitions *****************************************/
1705 default: break; /* If no destructor action specified: do nothing */
1706 }
@@ -1909,14 +1914,14 @@
1914 #endif
1915 while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
1916 /* Here code is inserted which will execute if the parser
1917 ** stack every overflows */
1918 /******** Begin %stack_overflow code ******************************************/
1919 #line 522 "pikchr.y"
1920
1921 pik_error(p, 0, "parser stack overflow");
1922 #line 1947 "pikchr.c"
1923 /******** End %stack_overflow code ********************************************/
1924 pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
1925 pik_parserCTX_STORE
1926 }
1927
@@ -2390,614 +2395,614 @@
2395 ** break;
2396 */
2397 /********** Begin reduce actions **********************************************/
2398 YYMINORTYPE yylhsminor;
2399 case 0: /* document ::= statement_list */
2400 #line 526 "pikchr.y"
2401 {pik_render(p,yymsp[0].minor.yy119);}
2402 #line 2427 "pikchr.c"
2403 break;
2404 case 1: /* statement_list ::= statement */
2405 #line 529 "pikchr.y"
2406 { yylhsminor.yy119 = pik_elist_append(p,0,yymsp[0].minor.yy38); }
2407 #line 2432 "pikchr.c"
2408 yymsp[0].minor.yy119 = yylhsminor.yy119;
2409 break;
2410 case 2: /* statement_list ::= statement_list EOL statement */
2411 #line 531 "pikchr.y"
2412 { yylhsminor.yy119 = pik_elist_append(p,yymsp[-2].minor.yy119,yymsp[0].minor.yy38); }
2413 #line 2438 "pikchr.c"
2414 yymsp[-2].minor.yy119 = yylhsminor.yy119;
2415 break;
2416 case 3: /* statement ::= */
2417 #line 534 "pikchr.y"
2418 { yymsp[1].minor.yy38 = 0; }
2419 #line 2444 "pikchr.c"
2420 break;
2421 case 4: /* statement ::= direction */
2422 #line 535 "pikchr.y"
2423 { pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy38=0; }
2424 #line 2449 "pikchr.c"
2425 yymsp[0].minor.yy38 = yylhsminor.yy38;
2426 break;
2427 case 5: /* statement ::= lvalue ASSIGN rvalue */
2428 #line 536 "pikchr.y"
2429 {pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy265,&yymsp[-1].minor.yy0); yylhsminor.yy38=0;}
2430 #line 2455 "pikchr.c"
2431 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2432 break;
2433 case 6: /* statement ::= PLACENAME COLON unnamed_statement */
2434 #line 538 "pikchr.y"
2435 { yylhsminor.yy38 = yymsp[0].minor.yy38; pik_elem_setname(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0); }
2436 #line 2461 "pikchr.c"
2437 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2438 break;
2439 case 7: /* statement ::= PLACENAME COLON position */
2440 #line 540 "pikchr.y"
2441 { yylhsminor.yy38 = pik_elem_new(p,0,0,0);
2442 if(yylhsminor.yy38){ yylhsminor.yy38->ptAt = yymsp[0].minor.yy43; pik_elem_setname(p,yylhsminor.yy38,&yymsp[-2].minor.yy0); }}
2443 #line 2468 "pikchr.c"
2444 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2445 break;
2446 case 8: /* statement ::= unnamed_statement */
2447 #line 542 "pikchr.y"
2448 {yylhsminor.yy38 = yymsp[0].minor.yy38;}
2449 #line 2474 "pikchr.c"
2450 yymsp[0].minor.yy38 = yylhsminor.yy38;
2451 break;
2452 case 9: /* statement ::= print prlist */
2453 #line 543 "pikchr.y"
2454 {pik_append(p,"<br>\n",5); yymsp[-1].minor.yy38=0;}
2455 #line 2480 "pikchr.c"
2456 break;
2457 case 10: /* statement ::= ASSERT LP expr EQ expr RP */
2458 #line 548 "pikchr.y"
2459 {yymsp[-5].minor.yy38=pik_assert(p,yymsp[-3].minor.yy265,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy265);}
2460 #line 2485 "pikchr.c"
2461 break;
2462 case 11: /* statement ::= ASSERT LP position EQ position RP */
2463 #line 550 "pikchr.y"
2464 {yymsp[-5].minor.yy38=pik_position_assert(p,&yymsp[-3].minor.yy43,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy43);}
2465 #line 2490 "pikchr.c"
2466 break;
2467 case 12: /* statement ::= DEFINE ID CODEBLOCK */
2468 #line 551 "pikchr.y"
2469 {yymsp[-2].minor.yy38=0; pik_add_macro(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
2470 #line 2495 "pikchr.c"
2471 break;
2472 case 13: /* rvalue ::= PLACENAME */
2473 #line 562 "pikchr.y"
2474 {yylhsminor.yy265 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2475 #line 2500 "pikchr.c"
2476 yymsp[0].minor.yy265 = yylhsminor.yy265;
2477 break;
2478 case 14: /* pritem ::= FILL */
2479 case 15: /* pritem ::= COLOR */ yytestcase(yyruleno==15);
2480 case 16: /* pritem ::= THICKNESS */ yytestcase(yyruleno==16);
2481 #line 567 "pikchr.y"
2482 {pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2483 #line 2508 "pikchr.c"
2484 break;
2485 case 17: /* pritem ::= rvalue */
2486 #line 570 "pikchr.y"
2487 {pik_append_num(p,"",yymsp[0].minor.yy265);}
2488 #line 2513 "pikchr.c"
2489 break;
2490 case 18: /* pritem ::= STRING */
2491 #line 571 "pikchr.y"
2492 {pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2493 #line 2518 "pikchr.c"
2494 break;
2495 case 19: /* prsep ::= COMMA */
2496 #line 572 "pikchr.y"
2497 {pik_append(p, " ", 1);}
2498 #line 2523 "pikchr.c"
2499 break;
2500 case 20: /* unnamed_statement ::= basetype attribute_list */
2501 #line 575 "pikchr.y"
2502 {yylhsminor.yy38 = yymsp[-1].minor.yy38; pik_after_adding_attributes(p,yylhsminor.yy38);}
2503 #line 2528 "pikchr.c"
2504 yymsp[-1].minor.yy38 = yylhsminor.yy38;
2505 break;
2506 case 21: /* basetype ::= CLASSNAME */
2507 #line 577 "pikchr.y"
2508 {yylhsminor.yy38 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2509 #line 2534 "pikchr.c"
2510 yymsp[0].minor.yy38 = yylhsminor.yy38;
2511 break;
2512 case 22: /* basetype ::= STRING textposition */
2513 #line 579 "pikchr.y"
2514 {yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy196; yylhsminor.yy38 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2515 #line 2540 "pikchr.c"
2516 yymsp[-1].minor.yy38 = yylhsminor.yy38;
2517 break;
2518 case 23: /* basetype ::= LB savelist statement_list RB */
2519 #line 581 "pikchr.y"
2520 { p->list = yymsp[-2].minor.yy119; yymsp[-3].minor.yy38 = pik_elem_new(p,0,0,yymsp[-1].minor.yy119); if(yymsp[-3].minor.yy38) yymsp[-3].minor.yy38->errTok = yymsp[0].minor.yy0; }
2521 #line 2546 "pikchr.c"
2522 break;
2523 case 24: /* savelist ::= */
2524 #line 586 "pikchr.y"
2525 {yymsp[1].minor.yy119 = p->list; p->list = 0;}
2526 #line 2551 "pikchr.c"
2527 break;
2528 case 25: /* relexpr ::= expr */
2529 #line 593 "pikchr.y"
2530 {yylhsminor.yy200.rAbs = yymsp[0].minor.yy265; yylhsminor.yy200.rRel = 0;}
2531 #line 2556 "pikchr.c"
2532 yymsp[0].minor.yy200 = yylhsminor.yy200;
2533 break;
2534 case 26: /* relexpr ::= expr PERCENT */
2535 #line 594 "pikchr.y"
2536 {yylhsminor.yy200.rAbs = 0; yylhsminor.yy200.rRel = yymsp[-1].minor.yy265/100;}
2537 #line 2562 "pikchr.c"
2538 yymsp[-1].minor.yy200 = yylhsminor.yy200;
2539 break;
2540 case 27: /* optrelexpr ::= */
2541 #line 596 "pikchr.y"
2542 {yymsp[1].minor.yy200.rAbs = 0; yymsp[1].minor.yy200.rRel = 1.0;}
2543 #line 2568 "pikchr.c"
2544 break;
2545 case 28: /* attribute_list ::= relexpr alist */
2546 #line 598 "pikchr.y"
2547 {pik_add_direction(p,0,&yymsp[-1].minor.yy200);}
2548 #line 2573 "pikchr.c"
2549 break;
2550 case 29: /* attribute ::= numproperty relexpr */
2551 #line 602 "pikchr.y"
2552 { pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy200); }
2553 #line 2578 "pikchr.c"
2554 break;
2555 case 30: /* attribute ::= dashproperty expr */
2556 #line 603 "pikchr.y"
2557 { pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy265); }
2558 #line 2583 "pikchr.c"
2559 break;
2560 case 31: /* attribute ::= dashproperty */
2561 #line 604 "pikchr.y"
2562 { pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2563 #line 2588 "pikchr.c"
2564 break;
2565 case 32: /* attribute ::= colorproperty rvalue */
2566 #line 605 "pikchr.y"
2567 { pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy265); }
2568 #line 2593 "pikchr.c"
2569 break;
2570 case 33: /* attribute ::= go direction optrelexpr */
2571 #line 606 "pikchr.y"
2572 { pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy200);}
2573 #line 2598 "pikchr.c"
2574 break;
2575 case 34: /* attribute ::= go direction even position */
2576 #line 607 "pikchr.y"
2577 {pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy43);}
2578 #line 2603 "pikchr.c"
2579 break;
2580 case 35: /* attribute ::= CLOSE */
2581 #line 608 "pikchr.y"
2582 { pik_close_path(p,&yymsp[0].minor.yy0); }
2583 #line 2608 "pikchr.c"
2584 break;
2585 case 36: /* attribute ::= CHOP */
2586 #line 609 "pikchr.y"
2587 { p->cur->bChop = 1; }
2588 #line 2613 "pikchr.c"
2589 break;
2590 case 37: /* attribute ::= FROM position */
2591 #line 610 "pikchr.y"
2592 { pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy43); }
2593 #line 2618 "pikchr.c"
2594 break;
2595 case 38: /* attribute ::= TO position */
2596 #line 611 "pikchr.y"
2597 { pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy43); }
2598 #line 2623 "pikchr.c"
2599 break;
2600 case 39: /* attribute ::= THEN */
2601 #line 612 "pikchr.y"
2602 { pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2603 #line 2628 "pikchr.c"
2604 break;
2605 case 40: /* attribute ::= THEN optrelexpr HEADING expr */
2606 case 42: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==42);
2607 #line 614 "pikchr.y"
2608 {pik_move_hdg(p,&yymsp[-2].minor.yy200,&yymsp[-1].minor.yy0,yymsp[0].minor.yy265,0,&yymsp[-3].minor.yy0);}
2609 #line 2634 "pikchr.c"
2610 break;
2611 case 41: /* attribute ::= THEN optrelexpr EDGEPT */
2612 case 43: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==43);
2613 #line 615 "pikchr.y"
2614 {pik_move_hdg(p,&yymsp[-1].minor.yy200,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2615 #line 2640 "pikchr.c"
2616 break;
2617 case 44: /* attribute ::= AT position */
2618 #line 620 "pikchr.y"
2619 { pik_set_at(p,0,&yymsp[0].minor.yy43,&yymsp[-1].minor.yy0); }
2620 #line 2645 "pikchr.c"
2621 break;
2622 case 45: /* attribute ::= SAME */
2623 #line 622 "pikchr.y"
2624 {pik_same(p,0,&yymsp[0].minor.yy0);}
2625 #line 2650 "pikchr.c"
2626 break;
2627 case 46: /* attribute ::= SAME AS object */
2628 #line 623 "pikchr.y"
2629 {pik_same(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2630 #line 2655 "pikchr.c"
2631 break;
2632 case 47: /* attribute ::= STRING textposition */
2633 #line 624 "pikchr.y"
2634 {pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy196);}
2635 #line 2660 "pikchr.c"
2636 break;
2637 case 48: /* attribute ::= FIT */
2638 #line 625 "pikchr.y"
2639 {pik_size_to_fit(p,&yymsp[0].minor.yy0,3); }
2640 #line 2665 "pikchr.c"
2641 break;
2642 case 49: /* attribute ::= BEHIND object */
2643 #line 626 "pikchr.y"
2644 {pik_behind(p,yymsp[0].minor.yy38);}
2645 #line 2670 "pikchr.c"
2646 break;
2647 case 50: /* withclause ::= DOT_E edge AT position */
2648 case 51: /* withclause ::= edge AT position */ yytestcase(yyruleno==51);
2649 #line 634 "pikchr.y"
2650 { pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy43,&yymsp[-1].minor.yy0); }
2651 #line 2676 "pikchr.c"
2652 break;
2653 case 52: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2654 #line 638 "pikchr.y"
2655 {yylhsminor.yy0 = yymsp[0].minor.yy0;}
2656 #line 2681 "pikchr.c"
2657 yymsp[0].minor.yy0 = yylhsminor.yy0;
2658 break;
2659 case 53: /* boolproperty ::= CW */
2660 #line 649 "pikchr.y"
2661 {p->cur->cw = 1;}
2662 #line 2687 "pikchr.c"
2663 break;
2664 case 54: /* boolproperty ::= CCW */
2665 #line 650 "pikchr.y"
2666 {p->cur->cw = 0;}
2667 #line 2692 "pikchr.c"
2668 break;
2669 case 55: /* boolproperty ::= LARROW */
2670 #line 651 "pikchr.y"
2671 {p->cur->larrow=1; p->cur->rarrow=0; }
2672 #line 2697 "pikchr.c"
2673 break;
2674 case 56: /* boolproperty ::= RARROW */
2675 #line 652 "pikchr.y"
2676 {p->cur->larrow=0; p->cur->rarrow=1; }
2677 #line 2702 "pikchr.c"
2678 break;
2679 case 57: /* boolproperty ::= LRARROW */
2680 #line 653 "pikchr.y"
2681 {p->cur->larrow=1; p->cur->rarrow=1; }
2682 #line 2707 "pikchr.c"
2683 break;
2684 case 58: /* boolproperty ::= INVIS */
2685 #line 654 "pikchr.y"
2686 {p->cur->sw = 0.0;}
2687 #line 2712 "pikchr.c"
2688 break;
2689 case 59: /* boolproperty ::= THICK */
2690 #line 655 "pikchr.y"
2691 {p->cur->sw *= 1.5;}
2692 #line 2717 "pikchr.c"
2693 break;
2694 case 60: /* boolproperty ::= THIN */
2695 #line 656 "pikchr.y"
2696 {p->cur->sw *= 0.67;}
2697 #line 2722 "pikchr.c"
2698 break;
2699 case 61: /* boolproperty ::= SOLID */
2700 #line 657 "pikchr.y"
2701 {p->cur->sw = pik_value(p,"thickness",9,0);
2702 p->cur->dotted = p->cur->dashed = 0.0;}
2703 #line 2728 "pikchr.c"
2704 break;
2705 case 62: /* textposition ::= */
2706 #line 660 "pikchr.y"
2707 {yymsp[1].minor.yy196 = 0;}
2708 #line 2733 "pikchr.c"
2709 break;
2710 case 63: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2711 #line 663 "pikchr.y"
2712 {yylhsminor.yy196 = pik_text_position(yymsp[-1].minor.yy196,&yymsp[0].minor.yy0);}
2713 #line 2738 "pikchr.c"
2714 yymsp[-1].minor.yy196 = yylhsminor.yy196;
2715 break;
2716 case 64: /* position ::= expr COMMA expr */
2717 #line 666 "pikchr.y"
2718 {yylhsminor.yy43.x=yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[0].minor.yy265;}
2719 #line 2744 "pikchr.c"
2720 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2721 break;
2722 case 65: /* position ::= place PLUS expr COMMA expr */
2723 #line 668 "pikchr.y"
2724 {yylhsminor.yy43.x=yymsp[-4].minor.yy43.x+yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[-4].minor.yy43.y+yymsp[0].minor.yy265;}
2725 #line 2750 "pikchr.c"
2726 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2727 break;
2728 case 66: /* position ::= place MINUS expr COMMA expr */
2729 #line 669 "pikchr.y"
2730 {yylhsminor.yy43.x=yymsp[-4].minor.yy43.x-yymsp[-2].minor.yy265; yylhsminor.yy43.y=yymsp[-4].minor.yy43.y-yymsp[0].minor.yy265;}
2731 #line 2756 "pikchr.c"
2732 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2733 break;
2734 case 67: /* position ::= place PLUS LP expr COMMA expr RP */
2735 #line 671 "pikchr.y"
2736 {yylhsminor.yy43.x=yymsp[-6].minor.yy43.x+yymsp[-3].minor.yy265; yylhsminor.yy43.y=yymsp[-6].minor.yy43.y+yymsp[-1].minor.yy265;}
2737 #line 2762 "pikchr.c"
2738 yymsp[-6].minor.yy43 = yylhsminor.yy43;
2739 break;
2740 case 68: /* position ::= place MINUS LP expr COMMA expr RP */
2741 #line 673 "pikchr.y"
2742 {yylhsminor.yy43.x=yymsp[-6].minor.yy43.x-yymsp[-3].minor.yy265; yylhsminor.yy43.y=yymsp[-6].minor.yy43.y-yymsp[-1].minor.yy265;}
2743 #line 2768 "pikchr.c"
2744 yymsp[-6].minor.yy43 = yylhsminor.yy43;
2745 break;
2746 case 69: /* position ::= LP position COMMA position RP */
2747 #line 674 "pikchr.y"
2748 {yymsp[-4].minor.yy43.x=yymsp[-3].minor.yy43.x; yymsp[-4].minor.yy43.y=yymsp[-1].minor.yy43.y;}
2749 #line 2774 "pikchr.c"
2750 break;
2751 case 70: /* position ::= LP position RP */
2752 #line 675 "pikchr.y"
2753 {yymsp[-2].minor.yy43=yymsp[-1].minor.yy43;}
2754 #line 2779 "pikchr.c"
2755 break;
2756 case 71: /* position ::= expr between position AND position */
2757 #line 677 "pikchr.y"
2758 {yylhsminor.yy43 = pik_position_between(yymsp[-4].minor.yy265,yymsp[-2].minor.yy43,yymsp[0].minor.yy43);}
2759 #line 2784 "pikchr.c"
2760 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2761 break;
2762 case 72: /* position ::= expr LT position COMMA position GT */
2763 #line 679 "pikchr.y"
2764 {yylhsminor.yy43 = pik_position_between(yymsp[-5].minor.yy265,yymsp[-3].minor.yy43,yymsp[-1].minor.yy43);}
2765 #line 2790 "pikchr.c"
2766 yymsp[-5].minor.yy43 = yylhsminor.yy43;
2767 break;
2768 case 73: /* position ::= expr ABOVE position */
2769 #line 680 "pikchr.y"
2770 {yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.y += yymsp[-2].minor.yy265;}
2771 #line 2796 "pikchr.c"
2772 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2773 break;
2774 case 74: /* position ::= expr BELOW position */
2775 #line 681 "pikchr.y"
2776 {yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.y -= yymsp[-2].minor.yy265;}
2777 #line 2802 "pikchr.c"
2778 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2779 break;
2780 case 75: /* position ::= expr LEFT OF position */
2781 #line 682 "pikchr.y"
2782 {yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.x -= yymsp[-3].minor.yy265;}
2783 #line 2808 "pikchr.c"
2784 yymsp[-3].minor.yy43 = yylhsminor.yy43;
2785 break;
2786 case 76: /* position ::= expr RIGHT OF position */
2787 #line 683 "pikchr.y"
2788 {yylhsminor.yy43=yymsp[0].minor.yy43; yylhsminor.yy43.x += yymsp[-3].minor.yy265;}
2789 #line 2814 "pikchr.c"
2790 yymsp[-3].minor.yy43 = yylhsminor.yy43;
2791 break;
2792 case 77: /* position ::= expr ON HEADING EDGEPT OF position */
2793 #line 685 "pikchr.y"
2794 {yylhsminor.yy43 = pik_position_at_hdg(yymsp[-5].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2795 #line 2820 "pikchr.c"
2796 yymsp[-5].minor.yy43 = yylhsminor.yy43;
2797 break;
2798 case 78: /* position ::= expr HEADING EDGEPT OF position */
2799 #line 687 "pikchr.y"
2800 {yylhsminor.yy43 = pik_position_at_hdg(yymsp[-4].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2801 #line 2826 "pikchr.c"
2802 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2803 break;
2804 case 79: /* position ::= expr EDGEPT OF position */
2805 #line 689 "pikchr.y"
2806 {yylhsminor.yy43 = pik_position_at_hdg(yymsp[-3].minor.yy265,&yymsp[-2].minor.yy0,yymsp[0].minor.yy43);}
2807 #line 2832 "pikchr.c"
2808 yymsp[-3].minor.yy43 = yylhsminor.yy43;
2809 break;
2810 case 80: /* position ::= expr ON HEADING expr FROM position */
2811 #line 691 "pikchr.y"
2812 {yylhsminor.yy43 = pik_position_at_angle(yymsp[-5].minor.yy265,yymsp[-2].minor.yy265,yymsp[0].minor.yy43);}
2813 #line 2838 "pikchr.c"
2814 yymsp[-5].minor.yy43 = yylhsminor.yy43;
2815 break;
2816 case 81: /* position ::= expr HEADING expr FROM position */
2817 #line 693 "pikchr.y"
2818 {yylhsminor.yy43 = pik_position_at_angle(yymsp[-4].minor.yy265,yymsp[-2].minor.yy265,yymsp[0].minor.yy43);}
2819 #line 2844 "pikchr.c"
2820 yymsp[-4].minor.yy43 = yylhsminor.yy43;
2821 break;
2822 case 82: /* place ::= edge OF object */
2823 #line 705 "pikchr.y"
2824 {yylhsminor.yy43 = pik_place_of_elem(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2825 #line 2850 "pikchr.c"
2826 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2827 break;
2828 case 83: /* place2 ::= object */
2829 #line 706 "pikchr.y"
2830 {yylhsminor.yy43 = pik_place_of_elem(p,yymsp[0].minor.yy38,0);}
2831 #line 2856 "pikchr.c"
2832 yymsp[0].minor.yy43 = yylhsminor.yy43;
2833 break;
2834 case 84: /* place2 ::= object DOT_E edge */
2835 #line 707 "pikchr.y"
2836 {yylhsminor.yy43 = pik_place_of_elem(p,yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
2837 #line 2862 "pikchr.c"
2838 yymsp[-2].minor.yy43 = yylhsminor.yy43;
2839 break;
2840 case 85: /* place2 ::= NTH VERTEX OF object */
2841 #line 708 "pikchr.y"
2842 {yylhsminor.yy43 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy38);}
2843 #line 2868 "pikchr.c"
2844 yymsp[-3].minor.yy43 = yylhsminor.yy43;
2845 break;
2846 case 86: /* object ::= nth */
2847 #line 720 "pikchr.y"
2848 {yylhsminor.yy38 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2849 #line 2874 "pikchr.c"
2850 yymsp[0].minor.yy38 = yylhsminor.yy38;
2851 break;
2852 case 87: /* object ::= nth OF|IN object */
2853 #line 721 "pikchr.y"
2854 {yylhsminor.yy38 = pik_find_nth(p,yymsp[0].minor.yy38,&yymsp[-2].minor.yy0);}
2855 #line 2880 "pikchr.c"
2856 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2857 break;
2858 case 88: /* objectname ::= PLACENAME */
2859 #line 723 "pikchr.y"
2860 {yylhsminor.yy38 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2861 #line 2886 "pikchr.c"
2862 yymsp[0].minor.yy38 = yylhsminor.yy38;
2863 break;
2864 case 89: /* objectname ::= objectname DOT_U PLACENAME */
2865 #line 725 "pikchr.y"
2866 {yylhsminor.yy38 = pik_find_byname(p,yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
2867 #line 2892 "pikchr.c"
2868 yymsp[-2].minor.yy38 = yylhsminor.yy38;
2869 break;
2870 case 90: /* nth ::= NTH CLASSNAME */
2871 #line 727 "pikchr.y"
2872 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2873 #line 2898 "pikchr.c"
2874 yymsp[-1].minor.yy0 = yylhsminor.yy0;
2875 break;
2876 case 91: /* nth ::= NTH LAST CLASSNAME */
2877 #line 728 "pikchr.y"
2878 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2879 #line 2904 "pikchr.c"
2880 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2881 break;
2882 case 92: /* nth ::= LAST CLASSNAME */
2883 #line 729 "pikchr.y"
2884 {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2885 #line 2910 "pikchr.c"
2886 break;
2887 case 93: /* nth ::= LAST */
2888 #line 730 "pikchr.y"
2889 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2890 #line 2915 "pikchr.c"
2891 yymsp[0].minor.yy0 = yylhsminor.yy0;
2892 break;
2893 case 94: /* nth ::= NTH LB RB */
2894 #line 731 "pikchr.y"
2895 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2896 #line 2921 "pikchr.c"
2897 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2898 break;
2899 case 95: /* nth ::= NTH LAST LB RB */
2900 #line 732 "pikchr.y"
2901 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2902 #line 2927 "pikchr.c"
2903 yymsp[-3].minor.yy0 = yylhsminor.yy0;
2904 break;
2905 case 96: /* nth ::= LAST LB RB */
2906 #line 733 "pikchr.y"
2907 {yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2908 #line 2933 "pikchr.c"
2909 break;
2910 case 97: /* expr ::= expr PLUS expr */
2911 #line 735 "pikchr.y"
2912 {yylhsminor.yy265=yymsp[-2].minor.yy265+yymsp[0].minor.yy265;}
2913 #line 2938 "pikchr.c"
2914 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2915 break;
2916 case 98: /* expr ::= expr MINUS expr */
2917 #line 736 "pikchr.y"
2918 {yylhsminor.yy265=yymsp[-2].minor.yy265-yymsp[0].minor.yy265;}
2919 #line 2944 "pikchr.c"
2920 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2921 break;
2922 case 99: /* expr ::= expr STAR expr */
2923 #line 737 "pikchr.y"
2924 {yylhsminor.yy265=yymsp[-2].minor.yy265*yymsp[0].minor.yy265;}
2925 #line 2950 "pikchr.c"
2926 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2927 break;
2928 case 100: /* expr ::= expr SLASH expr */
2929 #line 738 "pikchr.y"
2930 {
2931 if( yymsp[0].minor.yy265==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy265 = 0.0; }
2932 else{ yylhsminor.yy265 = yymsp[-2].minor.yy265/yymsp[0].minor.yy265; }
2933 }
2934 #line 2959 "pikchr.c"
2935 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2936 break;
2937 case 101: /* expr ::= MINUS expr */
2938 #line 742 "pikchr.y"
2939 {yymsp[-1].minor.yy265=-yymsp[0].minor.yy265;}
2940 #line 2965 "pikchr.c"
2941 break;
2942 case 102: /* expr ::= PLUS expr */
2943 #line 743 "pikchr.y"
2944 {yymsp[-1].minor.yy265=yymsp[0].minor.yy265;}
2945 #line 2970 "pikchr.c"
2946 break;
2947 case 103: /* expr ::= LP expr RP */
2948 #line 744 "pikchr.y"
2949 {yymsp[-2].minor.yy265=yymsp[-1].minor.yy265;}
2950 #line 2975 "pikchr.c"
2951 break;
2952 case 104: /* expr ::= LP FILL|COLOR|THICKNESS RP */
2953 #line 745 "pikchr.y"
2954 {yymsp[-2].minor.yy265=pik_get_var(p,&yymsp[-1].minor.yy0);}
2955 #line 2980 "pikchr.c"
2956 break;
2957 case 105: /* expr ::= NUMBER */
2958 #line 746 "pikchr.y"
2959 {yylhsminor.yy265=pik_atof(&yymsp[0].minor.yy0);}
2960 #line 2985 "pikchr.c"
2961 yymsp[0].minor.yy265 = yylhsminor.yy265;
2962 break;
2963 case 106: /* expr ::= ID */
2964 #line 747 "pikchr.y"
2965 {yylhsminor.yy265=pik_get_var(p,&yymsp[0].minor.yy0);}
2966 #line 2991 "pikchr.c"
2967 yymsp[0].minor.yy265 = yylhsminor.yy265;
2968 break;
2969 case 107: /* expr ::= FUNC1 LP expr RP */
2970 #line 748 "pikchr.y"
2971 {yylhsminor.yy265 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy265,0.0);}
2972 #line 2997 "pikchr.c"
2973 yymsp[-3].minor.yy265 = yylhsminor.yy265;
2974 break;
2975 case 108: /* expr ::= FUNC2 LP expr COMMA expr RP */
2976 #line 749 "pikchr.y"
2977 {yylhsminor.yy265 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy265,yymsp[-1].minor.yy265);}
2978 #line 3003 "pikchr.c"
2979 yymsp[-5].minor.yy265 = yylhsminor.yy265;
2980 break;
2981 case 109: /* expr ::= DIST LP position COMMA position RP */
2982 #line 750 "pikchr.y"
2983 {yymsp[-5].minor.yy265 = pik_dist(&yymsp[-3].minor.yy43,&yymsp[-1].minor.yy43);}
2984 #line 3009 "pikchr.c"
2985 break;
2986 case 110: /* expr ::= place2 DOT_XY X */
2987 #line 751 "pikchr.y"
2988 {yylhsminor.yy265 = yymsp[-2].minor.yy43.x;}
2989 #line 3014 "pikchr.c"
2990 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2991 break;
2992 case 111: /* expr ::= place2 DOT_XY Y */
2993 #line 752 "pikchr.y"
2994 {yylhsminor.yy265 = yymsp[-2].minor.yy43.y;}
2995 #line 3020 "pikchr.c"
2996 yymsp[-2].minor.yy265 = yylhsminor.yy265;
2997 break;
2998 case 112: /* expr ::= object DOT_L numproperty */
2999 case 113: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==113);
3000 case 114: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==114);
3001 #line 753 "pikchr.y"
3002 {yylhsminor.yy265=pik_property_of(yymsp[-2].minor.yy38,&yymsp[0].minor.yy0);}
3003 #line 3028 "pikchr.c"
3004 yymsp[-2].minor.yy265 = yylhsminor.yy265;
3005 break;
3006 default:
3007 /* (115) lvalue ::= ID */ yytestcase(yyruleno==115);
3008 /* (116) lvalue ::= FILL */ yytestcase(yyruleno==116);
@@ -3096,19 +3101,19 @@
3101 ){
3102 pik_parserARG_FETCH
3103 pik_parserCTX_FETCH
3104 #define TOKEN yyminor
3105 /************ Begin %syntax_error code ****************************************/
3106 #line 514 "pikchr.y"
3107
3108 if( TOKEN.z && TOKEN.z[0] ){
3109 pik_error(p, &TOKEN, "syntax error");
3110 }else{
3111 pik_error(p, 0, "syntax error");
3112 }
3113 UNUSED_PARAMETER(yymajor);
3114 #line 3139 "pikchr.c"
3115 /************ End %syntax_error code ******************************************/
3116 pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
3117 pik_parserCTX_STORE
3118 }
3119
@@ -3337,11 +3342,11 @@
3342 #else
3343 (void)iToken;
3344 return 0;
3345 #endif
3346 }
3347 #line 758 "pikchr.y"
3348
3349
3350
3351 /* Chart of the 140 official HTML color names with their
3352 ** corresponding RGB value.
@@ -4508,10 +4513,23 @@
4513 n -= i;
4514 zText += i;
4515 i = 0;
4516 }
4517 }
4518
4519 /*
4520 ** Append error message text. This is either a raw append, or an append
4521 ** with HTML escapes, depending on whether the PIKCHR_PLAINTEXT_ERRORS flag
4522 ** is set.
4523 */
4524 static void pik_append_errtxt(Pik *p, const char *zText, int n){
4525 if( p->mFlags & PIKCHR_PLAINTEXT_ERRORS ){
4526 pik_append(p, zText, n);
4527 }else{
4528 pik_append_text(p, zText, n, 0);
4529 }
4530 }
4531
4532 /* Append a PNum value
4533 */
4534 static void pik_append_num(Pik *p, const char *z,PNum v){
4535 char buf[100];
@@ -4894,11 +4912,11 @@
4912 while( iFirstLineno<=iLineno ){
4913 snprintf(zLineno,sizeof(zLineno)-1,"/* %4d */ ", iFirstLineno++);
4914 zLineno[sizeof(zLineno)-1] = 0;
4915 pik_append(p, zLineno, -1);
4916 for(i=iStart; p->sIn.z[i]!=0 && p->sIn.z[i]!='\n'; i++){}
4917 pik_append_errtxt(p, p->sIn.z+iStart, i-iStart);
4918 iStart = i+1;
4919 pik_append(p, "\n", 1);
4920 }
4921 for(iErrCol=0, i=iErrPt; i>0 && p->sIn.z[i]!='\n'; iErrCol++, i--){}
4922 for(i=0; i<iErrCol+11; i++){ pik_append(p, " ", 1); }
@@ -4918,28 +4936,36 @@
4936 int i;
4937 if( p==0 ) return;
4938 if( p->nErr ) return;
4939 p->nErr++;
4940 if( zMsg==0 ){
4941 if( p->mFlags & PIKCHR_PLAINTEXT_ERRORS ){
4942 pik_append(p, "\nOut of memory\n", -1);
4943 }else{
4944 pik_append(p, "\n<div><p>Out of memory</p></div>\n", -1);
4945 }
4946 return;
4947 }
4948 if( pErr==0 ){
4949 pik_append(p, "\n", 1);
4950 pik_append_errtxt(p, zMsg, -1);
4951 return;
4952 }
4953 if( (p->mFlags & PIKCHR_PLAINTEXT_ERRORS)==0 ){
4954 pik_append(p, "<div><pre>\n", -1);
4955 }
4956 pik_error_context(p, pErr, 5);
4957 pik_append(p, "ERROR: ", -1);
4958 pik_append_errtxt(p, zMsg, -1);
4959 pik_append(p, "\n", 1);
4960 for(i=p->nCtx-1; i>=0; i--){
4961 pik_append(p, "Called from:\n", -1);
4962 pik_error_context(p, &p->aCtx[i], 0);
4963 }
4964 if( (p->mFlags & PIKCHR_PLAINTEXT_ERRORS)==0 ){
4965 pik_append(p, "</pre></div>\n", -1);
4966 }
4967 }
4968
4969 /*
4970 ** Process an "assert( e1 == e2 )" statement. Always return NULL.
4971 */
@@ -7353,13 +7379,13 @@
7379 token.eEdge = 0;
7380 token.z = pIn->z + i;
7381 sz = pik_token_length(&token, 1);
7382 if( token.eType==T_WHITESPACE ){
7383 /* no-op */
7384 }else if( sz>50000 ){
7385 token.n = 1;
7386 pik_error(p, &token, "token is too long - max length 50000 bytes");
7387 break;
7388 }else if( token.eType==T_ERROR ){
7389 token.n = (unsigned short)(sz & 0xffff);
7390 pik_error(p, &token, "unrecognized token");
7391 break;
@@ -7535,10 +7561,12 @@
7561 */
7562 int main(int argc, char **argv){
7563 int i;
7564 int bSvgOnly = 0; /* Output SVG only. No HTML wrapper */
7565 int bDontStop = 0; /* Continue in spite of errors */
7566 int exitCode = 0; /* What to return */
7567 int mFlags = 0; /* mFlags argument to pikchr() */
7568 const char *zHtmlHdr =
7569 "<!DOCTYPE html>\n"
7570 "<html lang=\"en-US\">\n"
7571 "<head>\n<title>PIKCHR Test</title>\n"
7572 "<style>\n"
@@ -7579,10 +7607,11 @@
7607 if( zHtmlHdr==0 ){
7608 fprintf(stderr, "the \"%s\" option must come first\n",argv[i]);
7609 exit(1);
7610 }
7611 bSvgOnly = 1;
7612 mFlags |= PIKCHR_PLAINTEXT_ERRORS;
7613 }else
7614 {
7615 fprintf(stderr,"unknown option: \"%s\"\n", argv[i]);
7616 usage(argv[0]);
7617 }
@@ -7603,11 +7632,11 @@
7632 continue;
7633 }
7634 sz = fread(zIn, 1, sz, in);
7635 fclose(in);
7636 zIn[sz] = 0;
7637 zOut = pikchr(zIn, "pikchr", mFlags, &w, &h);
7638 if( zOut==0 ){
7639 fprintf(stderr, "pikchr() returns NULL. Out of memory?\n");
7640 if( !bDontStop ) exit(1);
7641 }else if( bSvgOnly ){
7642 printf("%s\n", zOut);
@@ -7617,10 +7646,11 @@
7646 zHtmlHdr = 0;
7647 }
7648 printf("<h1>File %s</h1>\n", argv[i]);
7649 if( w<0 ){
7650 printf("<p>ERROR</p>\n%s\n", zOut);
7651 exitCode = 1;
7652 }else{
7653 printf("<div id=\"svg-%d\" onclick=\"toggleHidden('svg-%d')\">\n",i,i);
7654 printf("<div style='border:3px solid lightgray;max-width:%dpx;'>\n",w);
7655 printf("%s</div>\n", zOut);
7656 printf("<pre class='hidden'>");
@@ -7632,10 +7662,70 @@
7662 free(zIn);
7663 }
7664 if( !bSvgOnly ){
7665 printf("</body></html>\n");
7666 }
7667 return exitCode;
7668 }
7669 #endif /* PIKCHR_SHELL */
7670
7671 #ifdef PIKCHR_TCL
7672 #include <tcl.h>
7673 /*
7674 ** An interface to TCL
7675 **
7676 ** TCL command: pikchr $INPUTTEXT
7677 **
7678 ** Returns a list of 3 elements which are the output text, the width, and
7679 ** the height.
7680 **
7681 ** Register the "pikchr" command by invoking Pikchr_Init(Tcl_Interp*). Or
7682 ** compile this source file as a shared library and load it using the
7683 ** "load" command of Tcl.
7684 **
7685 ** Compile this source-code file into a shared library using a command
7686 ** similar to this:
7687 **
7688 ** gcc -c pikchr.so -DPIKCHR_TCL -shared pikchr.c
7689 */
7690 static int pik_tcl_command(
7691 ClientData clientData, /* Not Used */
7692 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
7693 int objc, /* Number of arguments */
7694 Tcl_Obj *CONST objv[] /* Command arguments */
7695 ){
7696 int w, h; /* Width and height of the pikchr */
7697 const char *zIn; /* Source text input */
7698 char *zOut; /* SVG output text */
7699 Tcl_Obj *pRes; /* The result TCL object */
7700
7701 if( objc!=2 ){
7702 Tcl_WrongNumArgs(interp, 1, objv, "PIKCHR_SOURCE_TEXT");
7703 return TCL_ERROR;
7704 }
7705 zIn = Tcl_GetString(objv[1]);
7706 w = h = 0;
7707 zOut = pikchr(zIn, "pikchr", 0, &w, &h);
7708 if( zOut==0 ){
7709 return TCL_ERROR; /* Out of memory */
7710 }
7711 pRes = Tcl_NewObj();
7712 Tcl_ListObjAppendElement(0, pRes, Tcl_NewStringObj(zOut, -1));
7713 free(zOut);
7714 Tcl_ListObjAppendElement(0, pRes, Tcl_NewIntObj(w));
7715 Tcl_ListObjAppendElement(0, pRes, Tcl_NewIntObj(h));
7716 Tcl_SetObjResult(interp, pRes);
7717 return TCL_OK;
7718 }
7719
7720 /* Invoke this routine to register the "pikchr" command with the interpreter
7721 ** given in the argument */
7722 int Pikchr_Init(Tcl_Interp *interp){
7723 Tcl_CreateObjCommand(interp, "pikchr", pik_tcl_command, 0, 0);
7724 return TCL_OK;
7725 }
7726
7727
7728 #endif /* PIKCHR_TCL */
7729
7730
7731 #line 7756 "pikchr.c"
7732
--- src/pikchrshow.c
+++ src/pikchrshow.c
@@ -158,11 +158,13 @@
158158
blob_append(pOut, blob_str(&bIn), blob_size(&bIn));
159159
}else{
160160
int w = 0, h = 0;
161161
const char * zContent = blob_str(&bIn);
162162
char *zOut;
163
- zOut = pikchr(zContent, "pikchr", 0, &w, &h);
163
+ zOut = pikchr(zContent, "pikchr",
164
+ 0x01/*==>PIKCHR_PLAINTEXT_ERRORS*/,
165
+ &w, &h);
164166
if( w>0 && h>0 ){
165167
const char * zClassToggle = "";
166168
const char * zClassSource = "";
167169
const char * zWrapperClass = "";
168170
if(PIKCHR_PROCESS_DIV & pikFlags){
@@ -187,11 +189,11 @@
187189
pikFlags |= PIKCHR_PROCESS_SRC;
188190
}else if(PIKCHR_PROCESS_DIV_SOURCE & pikFlags){
189191
zClassSource = " source";
190192
pikFlags |= PIKCHR_PROCESS_SRC;
191193
}
192
- blob_appendf(pOut,"<div class='pikchr-wrapper "
194
+ blob_appendf(pOut,"<div class='pikchr-wrapper"
193195
"%s%s%s'>"
194196
"<div class=\"pikchr-svg\" "
195197
"style=\"max-width:%dpx\">\n",
196198
zWrapperClass/*safe-for-%s*/,
197199
zClassToggle/*safe-for-%s*/,
@@ -250,11 +252,12 @@
250252
if( !g.perm.RdWiki && !g.perm.Read && !g.perm.RdForum ){
251253
cgi_redirectf("%R/login?g=%R/pikchrshow");
252254
}
253255
zContent = PD("content",P("p"));
254256
if(P("ajax")!=0){
255
- /* Called from the JS-side preview updater. */
257
+ /* Called from the JS-side preview updater.
258
+ TODO: respond with JSON instead.*/
256259
cgi_set_content_type("text/html");
257260
if(zContent && *zContent){
258261
Blob out = empty_blob;
259262
const int isErr =
260263
pikchr_process(zContent, pikFlags, 0, &out);
@@ -487,22 +490,22 @@
487490
zOutfile = g.argv[3];
488491
}
489492
blob_read_from_file(&bIn, zInfile, ExtFILE);
490493
if(fTh1){
491494
db_find_and_open_repository(OPEN_ANY_SCHEMA | OPEN_OK_NOT_FOUND, 0)
492
- /* ^^^ needed for certain TH1 functions to work */;;
495
+ /* ^^^ needed for certain TH1 functions to work */;
493496
pikFlags |= PIKCHR_PROCESS_TH1;
494497
if(fNosvg) pikFlags |= PIKCHR_PROCESS_TH1_NOSVG;
495498
}
496499
isErr = pikchr_process(blob_str(&bIn), pikFlags,
497500
fTh1 ? fThFlags : 0, &bOut);
498501
if(isErr){
499
- /*fossil_print("ERROR: raw input:\n%b\n", &bIn);*/
500
- fossil_fatal("%s ERROR: %b", 1==isErr ? "TH1" : "pikchr",
502
+ fossil_fatal("%s ERROR:%c%b", 1==isErr ? "TH1" : "pikchr",
503
+ 1==isErr ? ' ' : '\n',
501504
&bOut);
502505
}else{
503506
blob_write_to_file(&bOut, zOutfile);
504507
}
505508
Th_PrintTraceLog();
506509
blob_reset(&bIn);
507510
blob_reset(&bOut);
508511
}
509512
--- src/pikchrshow.c
+++ src/pikchrshow.c
@@ -158,11 +158,13 @@
158 blob_append(pOut, blob_str(&bIn), blob_size(&bIn));
159 }else{
160 int w = 0, h = 0;
161 const char * zContent = blob_str(&bIn);
162 char *zOut;
163 zOut = pikchr(zContent, "pikchr", 0, &w, &h);
 
 
164 if( w>0 && h>0 ){
165 const char * zClassToggle = "";
166 const char * zClassSource = "";
167 const char * zWrapperClass = "";
168 if(PIKCHR_PROCESS_DIV & pikFlags){
@@ -187,11 +189,11 @@
187 pikFlags |= PIKCHR_PROCESS_SRC;
188 }else if(PIKCHR_PROCESS_DIV_SOURCE & pikFlags){
189 zClassSource = " source";
190 pikFlags |= PIKCHR_PROCESS_SRC;
191 }
192 blob_appendf(pOut,"<div class='pikchr-wrapper "
193 "%s%s%s'>"
194 "<div class=\"pikchr-svg\" "
195 "style=\"max-width:%dpx\">\n",
196 zWrapperClass/*safe-for-%s*/,
197 zClassToggle/*safe-for-%s*/,
@@ -250,11 +252,12 @@
250 if( !g.perm.RdWiki && !g.perm.Read && !g.perm.RdForum ){
251 cgi_redirectf("%R/login?g=%R/pikchrshow");
252 }
253 zContent = PD("content",P("p"));
254 if(P("ajax")!=0){
255 /* Called from the JS-side preview updater. */
 
256 cgi_set_content_type("text/html");
257 if(zContent && *zContent){
258 Blob out = empty_blob;
259 const int isErr =
260 pikchr_process(zContent, pikFlags, 0, &out);
@@ -487,22 +490,22 @@
487 zOutfile = g.argv[3];
488 }
489 blob_read_from_file(&bIn, zInfile, ExtFILE);
490 if(fTh1){
491 db_find_and_open_repository(OPEN_ANY_SCHEMA | OPEN_OK_NOT_FOUND, 0)
492 /* ^^^ needed for certain TH1 functions to work */;;
493 pikFlags |= PIKCHR_PROCESS_TH1;
494 if(fNosvg) pikFlags |= PIKCHR_PROCESS_TH1_NOSVG;
495 }
496 isErr = pikchr_process(blob_str(&bIn), pikFlags,
497 fTh1 ? fThFlags : 0, &bOut);
498 if(isErr){
499 /*fossil_print("ERROR: raw input:\n%b\n", &bIn);*/
500 fossil_fatal("%s ERROR: %b", 1==isErr ? "TH1" : "pikchr",
501 &bOut);
502 }else{
503 blob_write_to_file(&bOut, zOutfile);
504 }
505 Th_PrintTraceLog();
506 blob_reset(&bIn);
507 blob_reset(&bOut);
508 }
509
--- src/pikchrshow.c
+++ src/pikchrshow.c
@@ -158,11 +158,13 @@
158 blob_append(pOut, blob_str(&bIn), blob_size(&bIn));
159 }else{
160 int w = 0, h = 0;
161 const char * zContent = blob_str(&bIn);
162 char *zOut;
163 zOut = pikchr(zContent, "pikchr",
164 0x01/*==>PIKCHR_PLAINTEXT_ERRORS*/,
165 &w, &h);
166 if( w>0 && h>0 ){
167 const char * zClassToggle = "";
168 const char * zClassSource = "";
169 const char * zWrapperClass = "";
170 if(PIKCHR_PROCESS_DIV & pikFlags){
@@ -187,11 +189,11 @@
189 pikFlags |= PIKCHR_PROCESS_SRC;
190 }else if(PIKCHR_PROCESS_DIV_SOURCE & pikFlags){
191 zClassSource = " source";
192 pikFlags |= PIKCHR_PROCESS_SRC;
193 }
194 blob_appendf(pOut,"<div class='pikchr-wrapper"
195 "%s%s%s'>"
196 "<div class=\"pikchr-svg\" "
197 "style=\"max-width:%dpx\">\n",
198 zWrapperClass/*safe-for-%s*/,
199 zClassToggle/*safe-for-%s*/,
@@ -250,11 +252,12 @@
252 if( !g.perm.RdWiki && !g.perm.Read && !g.perm.RdForum ){
253 cgi_redirectf("%R/login?g=%R/pikchrshow");
254 }
255 zContent = PD("content",P("p"));
256 if(P("ajax")!=0){
257 /* Called from the JS-side preview updater.
258 TODO: respond with JSON instead.*/
259 cgi_set_content_type("text/html");
260 if(zContent && *zContent){
261 Blob out = empty_blob;
262 const int isErr =
263 pikchr_process(zContent, pikFlags, 0, &out);
@@ -487,22 +490,22 @@
490 zOutfile = g.argv[3];
491 }
492 blob_read_from_file(&bIn, zInfile, ExtFILE);
493 if(fTh1){
494 db_find_and_open_repository(OPEN_ANY_SCHEMA | OPEN_OK_NOT_FOUND, 0)
495 /* ^^^ needed for certain TH1 functions to work */;
496 pikFlags |= PIKCHR_PROCESS_TH1;
497 if(fNosvg) pikFlags |= PIKCHR_PROCESS_TH1_NOSVG;
498 }
499 isErr = pikchr_process(blob_str(&bIn), pikFlags,
500 fTh1 ? fThFlags : 0, &bOut);
501 if(isErr){
502 fossil_fatal("%s ERROR:%c%b", 1==isErr ? "TH1" : "pikchr",
503 1==isErr ? ' ' : '\n',
504 &bOut);
505 }else{
506 blob_write_to_file(&bOut, zOutfile);
507 }
508 Th_PrintTraceLog();
509 blob_reset(&bIn);
510 blob_reset(&bOut);
511 }
512
--- www/cap-theorem.md
+++ www/cap-theorem.md
@@ -11,10 +11,11 @@
1111
[cap]: https://en.wikipedia.org/wiki/CAP_theorem
1212
[sol]: https://en.wikipedia.org/wiki/Speed_of_light
1313
[tut]: https://www.ibm.com/cloud/learn/cap-theorem
1414
1515
16
+<a id="ap"></a>
1617
## Fossil Is an AP-Mode System
1718
1819
As with all common [DVCSes][dvcs], Fossil is an AP-mode system, meaning
1920
that your local clone isn’t necessarily consistent with all other clones
2021
(C), but the system is always available for use (A) and
@@ -31,10 +32,11 @@
3132
There’s no getting around the CAP theorem!
3233
3334
[dvcs]: https://en.wikipedia.org/wiki/Distributed_version_control
3435
3536
37
+<a id="ca"></a>
3638
## CA-Mode Fossil
3739
3840
What would it mean to redesign Fossil to be CA-mode?
3941
4042
It means we get a system that is always consistent (C) and available (A)
@@ -77,10 +79,11 @@
7779
[CVS]: https://en.wikipedia.org/wiki/Concurrent_Versions_System
7880
[Kafka]: https://engineering.linkedin.com/kafka/intra-cluster-replication-apache-kafka
7981
[svn]: https://en.wikipedia.org/wiki/Apache_Subversion
8082
8183
84
+<a id="cp"></a>
8285
## CP-Mode Fossil
8386
8487
What if we modify our CA-mode system above with “warm spares”? We can
8588
say that commits must go to all of the spares as well as the active
8689
servers, but a loss of one active server requires that one warm spare
8790
--- www/cap-theorem.md
+++ www/cap-theorem.md
@@ -11,10 +11,11 @@
11 [cap]: https://en.wikipedia.org/wiki/CAP_theorem
12 [sol]: https://en.wikipedia.org/wiki/Speed_of_light
13 [tut]: https://www.ibm.com/cloud/learn/cap-theorem
14
15
 
16 ## Fossil Is an AP-Mode System
17
18 As with all common [DVCSes][dvcs], Fossil is an AP-mode system, meaning
19 that your local clone isn’t necessarily consistent with all other clones
20 (C), but the system is always available for use (A) and
@@ -31,10 +32,11 @@
31 There’s no getting around the CAP theorem!
32
33 [dvcs]: https://en.wikipedia.org/wiki/Distributed_version_control
34
35
 
36 ## CA-Mode Fossil
37
38 What would it mean to redesign Fossil to be CA-mode?
39
40 It means we get a system that is always consistent (C) and available (A)
@@ -77,10 +79,11 @@
77 [CVS]: https://en.wikipedia.org/wiki/Concurrent_Versions_System
78 [Kafka]: https://engineering.linkedin.com/kafka/intra-cluster-replication-apache-kafka
79 [svn]: https://en.wikipedia.org/wiki/Apache_Subversion
80
81
 
82 ## CP-Mode Fossil
83
84 What if we modify our CA-mode system above with “warm spares”? We can
85 say that commits must go to all of the spares as well as the active
86 servers, but a loss of one active server requires that one warm spare
87
--- www/cap-theorem.md
+++ www/cap-theorem.md
@@ -11,10 +11,11 @@
11 [cap]: https://en.wikipedia.org/wiki/CAP_theorem
12 [sol]: https://en.wikipedia.org/wiki/Speed_of_light
13 [tut]: https://www.ibm.com/cloud/learn/cap-theorem
14
15
16 <a id="ap"></a>
17 ## Fossil Is an AP-Mode System
18
19 As with all common [DVCSes][dvcs], Fossil is an AP-mode system, meaning
20 that your local clone isn’t necessarily consistent with all other clones
21 (C), but the system is always available for use (A) and
@@ -31,10 +32,11 @@
32 There’s no getting around the CAP theorem!
33
34 [dvcs]: https://en.wikipedia.org/wiki/Distributed_version_control
35
36
37 <a id="ca"></a>
38 ## CA-Mode Fossil
39
40 What would it mean to redesign Fossil to be CA-mode?
41
42 It means we get a system that is always consistent (C) and available (A)
@@ -77,10 +79,11 @@
79 [CVS]: https://en.wikipedia.org/wiki/Concurrent_Versions_System
80 [Kafka]: https://engineering.linkedin.com/kafka/intra-cluster-replication-apache-kafka
81 [svn]: https://en.wikipedia.org/wiki/Apache_Subversion
82
83
84 <a id="cp"></a>
85 ## CP-Mode Fossil
86
87 What if we modify our CA-mode system above with “warm spares”? We can
88 say that commits must go to all of the spares as well as the active
89 servers, but a loss of one active server requires that one warm spare
90

Keyboard Shortcuts

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