Fossil SCM

Latest pikchr.c fixes a variable initialization problem and adds the xmlns attribute to the SVG markup.

drh 2020-09-21 14:21 trunk
Commit 7de85417dee9c28bd4ae8997f987b37dc7749c41d90d635725d2741dc7c84098
1 file changed +240 -239
+240 -239
--- src/pikchr.c
+++ src/pikchr.c
@@ -200,10 +200,11 @@
200200
201201
/* An object to hold a position in 2-D space */
202202
struct PPoint {
203203
PNum x, y; /* X and Y coordinates */
204204
};
205
+static const PPoint cZeroPoint = {0.0,0.0};
205206
206207
/* A bounding box */
207208
struct PBox {
208209
PPoint sw, ne; /* Lower-left and top-right corners */
209210
};
@@ -447,11 +448,11 @@
447448
static PElem *pik_assert(Pik*,PNum,PToken*,PNum);
448449
static PElem *pik_position_assert(Pik*,PPoint*,PToken*,PPoint*);
449450
static PNum pik_dist(PPoint*,PPoint*);
450451
451452
452
-#line 478 "pikchr.c"
453
+#line 479 "pikchr.c"
453454
/**************** End of %include directives **********************************/
454455
/* These constants specify the various numeric values for terminal symbols.
455456
***************** Begin token definitions *************************************/
456457
#ifndef T_ID
457458
#define T_ID 1
@@ -1648,22 +1649,22 @@
16481649
** inside the C code.
16491650
*/
16501651
/********* Begin destructor definitions ***************************************/
16511652
case 95: /* element_list */
16521653
{
1653
-#line 467 "pikchr.y"
1654
+#line 468 "pikchr.y"
16541655
pik_elist_free(p,(yypminor->yy56));
1655
-#line 1680 "pikchr.c"
1656
+#line 1681 "pikchr.c"
16561657
}
16571658
break;
16581659
case 96: /* element */
16591660
case 97: /* unnamed_element */
16601661
case 98: /* basetype */
16611662
{
1662
-#line 469 "pikchr.y"
1663
+#line 470 "pikchr.y"
16631664
pik_elem_free(p,(yypminor->yy226));
1664
-#line 1689 "pikchr.c"
1665
+#line 1690 "pikchr.c"
16651666
}
16661667
break;
16671668
/********* End destructor definitions *****************************************/
16681669
default: break; /* If no destructor action specified: do nothing */
16691670
}
@@ -1877,14 +1878,14 @@
18771878
#endif
18781879
while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
18791880
/* Here code is inserted which will execute if the parser
18801881
** stack every overflows */
18811882
/******** Begin %stack_overflow code ******************************************/
1882
-#line 501 "pikchr.y"
1883
+#line 502 "pikchr.y"
18831884
18841885
pik_error(p, 0, "parser stack overflow");
1885
-#line 1910 "pikchr.c"
1886
+#line 1911 "pikchr.c"
18861887
/******** End %stack_overflow code ********************************************/
18871888
pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
18881889
pik_parserCTX_STORE
18891890
}
18901891
@@ -2354,603 +2355,603 @@
23542355
** break;
23552356
*/
23562357
/********** Begin reduce actions **********************************************/
23572358
YYMINORTYPE yylhsminor;
23582359
case 0: /* document ::= element_list */
2359
-#line 505 "pikchr.y"
2360
+#line 506 "pikchr.y"
23602361
{pik_render(p,yymsp[0].minor.yy56);}
2361
-#line 2386 "pikchr.c"
2362
+#line 2387 "pikchr.c"
23622363
break;
23632364
case 1: /* element_list ::= element */
2364
-#line 508 "pikchr.y"
2365
+#line 509 "pikchr.y"
23652366
{ yylhsminor.yy56 = pik_elist_append(p,0,yymsp[0].minor.yy226); }
2366
-#line 2391 "pikchr.c"
2367
+#line 2392 "pikchr.c"
23672368
yymsp[0].minor.yy56 = yylhsminor.yy56;
23682369
break;
23692370
case 2: /* element_list ::= element_list EOL element */
2370
-#line 510 "pikchr.y"
2371
+#line 511 "pikchr.y"
23712372
{ yylhsminor.yy56 = pik_elist_append(p,yymsp[-2].minor.yy56,yymsp[0].minor.yy226); }
2372
-#line 2397 "pikchr.c"
2373
+#line 2398 "pikchr.c"
23732374
yymsp[-2].minor.yy56 = yylhsminor.yy56;
23742375
break;
23752376
case 3: /* element ::= */
2376
-#line 513 "pikchr.y"
2377
+#line 514 "pikchr.y"
23772378
{ yymsp[1].minor.yy226 = 0; }
2378
-#line 2403 "pikchr.c"
2379
+#line 2404 "pikchr.c"
23792380
break;
23802381
case 4: /* element ::= direction */
2381
-#line 514 "pikchr.y"
2382
+#line 515 "pikchr.y"
23822383
{ pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy226=0; }
2383
-#line 2408 "pikchr.c"
2384
+#line 2409 "pikchr.c"
23842385
yymsp[0].minor.yy226 = yylhsminor.yy226;
23852386
break;
23862387
case 5: /* element ::= lvalue ASSIGN rvalue */
2387
-#line 515 "pikchr.y"
2388
+#line 516 "pikchr.y"
23882389
{pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy257,&yymsp[-1].minor.yy0); yylhsminor.yy226=0;}
2389
-#line 2414 "pikchr.c"
2390
+#line 2415 "pikchr.c"
23902391
yymsp[-2].minor.yy226 = yylhsminor.yy226;
23912392
break;
23922393
case 6: /* element ::= PLACENAME COLON unnamed_element */
2393
-#line 517 "pikchr.y"
2394
+#line 518 "pikchr.y"
23942395
{ yylhsminor.yy226 = yymsp[0].minor.yy226; pik_elem_setname(p,yymsp[0].minor.yy226,&yymsp[-2].minor.yy0); }
2395
-#line 2420 "pikchr.c"
2396
+#line 2421 "pikchr.c"
23962397
yymsp[-2].minor.yy226 = yylhsminor.yy226;
23972398
break;
23982399
case 7: /* element ::= PLACENAME COLON position */
2399
-#line 519 "pikchr.y"
2400
+#line 520 "pikchr.y"
24002401
{ yylhsminor.yy226 = pik_elem_new(p,0,0,0);
24012402
if(yylhsminor.yy226){ yylhsminor.yy226->ptAt = yymsp[0].minor.yy175; pik_elem_setname(p,yylhsminor.yy226,&yymsp[-2].minor.yy0); }}
2402
-#line 2427 "pikchr.c"
2403
+#line 2428 "pikchr.c"
24032404
yymsp[-2].minor.yy226 = yylhsminor.yy226;
24042405
break;
24052406
case 8: /* element ::= unnamed_element */
2406
-#line 521 "pikchr.y"
2407
+#line 522 "pikchr.y"
24072408
{yylhsminor.yy226 = yymsp[0].minor.yy226;}
2408
-#line 2433 "pikchr.c"
2409
+#line 2434 "pikchr.c"
24092410
yymsp[0].minor.yy226 = yylhsminor.yy226;
24102411
break;
24112412
case 9: /* element ::= print prlist */
2412
-#line 522 "pikchr.y"
2413
+#line 523 "pikchr.y"
24132414
{pik_append(p,"<br>\n",5); yymsp[-1].minor.yy226=0;}
2414
-#line 2439 "pikchr.c"
2415
+#line 2440 "pikchr.c"
24152416
break;
24162417
case 10: /* element ::= ASSERT LP expr EQ expr RP */
2417
-#line 527 "pikchr.y"
2418
+#line 528 "pikchr.y"
24182419
{yymsp[-5].minor.yy226=pik_assert(p,yymsp[-3].minor.yy257,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy257);}
2419
-#line 2444 "pikchr.c"
2420
+#line 2445 "pikchr.c"
24202421
break;
24212422
case 11: /* element ::= ASSERT LP position EQ position RP */
2422
-#line 529 "pikchr.y"
2423
+#line 530 "pikchr.y"
24232424
{yymsp[-5].minor.yy226=pik_position_assert(p,&yymsp[-3].minor.yy175,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy175);}
2424
-#line 2449 "pikchr.c"
2425
+#line 2450 "pikchr.c"
24252426
break;
24262427
case 12: /* rvalue ::= PLACENAME */
2427
-#line 540 "pikchr.y"
2428
+#line 541 "pikchr.y"
24282429
{yylhsminor.yy257 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2429
-#line 2454 "pikchr.c"
2430
+#line 2455 "pikchr.c"
24302431
yymsp[0].minor.yy257 = yylhsminor.yy257;
24312432
break;
24322433
case 13: /* pritem ::= FILL */
24332434
case 14: /* pritem ::= COLOR */ yytestcase(yyruleno==14);
24342435
case 15: /* pritem ::= THICKNESS */ yytestcase(yyruleno==15);
2435
-#line 545 "pikchr.y"
2436
+#line 546 "pikchr.y"
24362437
{pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2437
-#line 2462 "pikchr.c"
2438
+#line 2463 "pikchr.c"
24382439
break;
24392440
case 16: /* pritem ::= rvalue */
2440
-#line 548 "pikchr.y"
2441
+#line 549 "pikchr.y"
24412442
{pik_append_num(p,"",yymsp[0].minor.yy257);}
2442
-#line 2467 "pikchr.c"
2443
+#line 2468 "pikchr.c"
24432444
break;
24442445
case 17: /* pritem ::= STRING */
2445
-#line 549 "pikchr.y"
2446
+#line 550 "pikchr.y"
24462447
{pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2447
-#line 2472 "pikchr.c"
2448
+#line 2473 "pikchr.c"
24482449
break;
24492450
case 18: /* prsep ::= COMMA */
2450
-#line 550 "pikchr.y"
2451
+#line 551 "pikchr.y"
24512452
{pik_append(p, " ", 1);}
2452
-#line 2477 "pikchr.c"
2453
+#line 2478 "pikchr.c"
24532454
break;
24542455
case 19: /* unnamed_element ::= basetype attribute_list */
2455
-#line 553 "pikchr.y"
2456
+#line 554 "pikchr.y"
24562457
{yylhsminor.yy226 = yymsp[-1].minor.yy226; pik_after_adding_attributes(p,yylhsminor.yy226);}
2457
-#line 2482 "pikchr.c"
2458
+#line 2483 "pikchr.c"
24582459
yymsp[-1].minor.yy226 = yylhsminor.yy226;
24592460
break;
24602461
case 20: /* basetype ::= CLASSNAME */
2461
-#line 555 "pikchr.y"
2462
+#line 556 "pikchr.y"
24622463
{yylhsminor.yy226 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2463
-#line 2488 "pikchr.c"
2464
+#line 2489 "pikchr.c"
24642465
yymsp[0].minor.yy226 = yylhsminor.yy226;
24652466
break;
24662467
case 21: /* basetype ::= STRING textposition */
2467
-#line 557 "pikchr.y"
2468
+#line 558 "pikchr.y"
24682469
{yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy116; yylhsminor.yy226 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2469
-#line 2494 "pikchr.c"
2470
+#line 2495 "pikchr.c"
24702471
yymsp[-1].minor.yy226 = yylhsminor.yy226;
24712472
break;
24722473
case 22: /* basetype ::= LB savelist element_list RB */
2473
-#line 559 "pikchr.y"
2474
+#line 560 "pikchr.y"
24742475
{ p->list = yymsp[-2].minor.yy56; yymsp[-3].minor.yy226 = pik_elem_new(p,0,0,yymsp[-1].minor.yy56); if(yymsp[-3].minor.yy226) yymsp[-3].minor.yy226->errTok = yymsp[0].minor.yy0; }
2475
-#line 2500 "pikchr.c"
2476
+#line 2501 "pikchr.c"
24762477
break;
24772478
case 23: /* savelist ::= */
2478
-#line 564 "pikchr.y"
2479
+#line 565 "pikchr.y"
24792480
{yymsp[1].minor.yy56 = p->list; p->list = 0;}
2480
-#line 2505 "pikchr.c"
2481
+#line 2506 "pikchr.c"
24812482
break;
24822483
case 24: /* relexpr ::= expr */
2483
-#line 571 "pikchr.y"
2484
+#line 572 "pikchr.y"
24842485
{yylhsminor.yy164.rAbs = yymsp[0].minor.yy257; yylhsminor.yy164.rRel = 0;}
2485
-#line 2510 "pikchr.c"
2486
+#line 2511 "pikchr.c"
24862487
yymsp[0].minor.yy164 = yylhsminor.yy164;
24872488
break;
24882489
case 25: /* relexpr ::= expr PERCENT */
2489
-#line 572 "pikchr.y"
2490
+#line 573 "pikchr.y"
24902491
{yylhsminor.yy164.rAbs = 0; yylhsminor.yy164.rRel = yymsp[-1].minor.yy257/100;}
2491
-#line 2516 "pikchr.c"
2492
+#line 2517 "pikchr.c"
24922493
yymsp[-1].minor.yy164 = yylhsminor.yy164;
24932494
break;
24942495
case 26: /* optrelexpr ::= */
2495
-#line 574 "pikchr.y"
2496
+#line 575 "pikchr.y"
24962497
{yymsp[1].minor.yy164.rAbs = 0; yymsp[1].minor.yy164.rRel = 1.0;}
2497
-#line 2522 "pikchr.c"
2498
+#line 2523 "pikchr.c"
24982499
break;
24992500
case 27: /* attribute_list ::= relexpr alist */
2500
-#line 576 "pikchr.y"
2501
+#line 577 "pikchr.y"
25012502
{pik_add_direction(p,0,&yymsp[-1].minor.yy164);}
2502
-#line 2527 "pikchr.c"
2503
+#line 2528 "pikchr.c"
25032504
break;
25042505
case 28: /* attribute ::= numproperty relexpr */
2505
-#line 580 "pikchr.y"
2506
+#line 581 "pikchr.y"
25062507
{ pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy164); }
2507
-#line 2532 "pikchr.c"
2508
+#line 2533 "pikchr.c"
25082509
break;
25092510
case 29: /* attribute ::= dashproperty expr */
2510
-#line 581 "pikchr.y"
2511
+#line 582 "pikchr.y"
25112512
{ pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy257); }
2512
-#line 2537 "pikchr.c"
2513
+#line 2538 "pikchr.c"
25132514
break;
25142515
case 30: /* attribute ::= dashproperty */
2515
-#line 582 "pikchr.y"
2516
+#line 583 "pikchr.y"
25162517
{ pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2517
-#line 2542 "pikchr.c"
2518
+#line 2543 "pikchr.c"
25182519
break;
25192520
case 31: /* attribute ::= colorproperty rvalue */
2520
-#line 583 "pikchr.y"
2521
+#line 584 "pikchr.y"
25212522
{ pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy257); }
2522
-#line 2547 "pikchr.c"
2523
+#line 2548 "pikchr.c"
25232524
break;
25242525
case 32: /* attribute ::= go direction optrelexpr */
2525
-#line 584 "pikchr.y"
2526
+#line 585 "pikchr.y"
25262527
{ pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy164);}
2527
-#line 2552 "pikchr.c"
2528
+#line 2553 "pikchr.c"
25282529
break;
25292530
case 33: /* attribute ::= go direction even position */
2530
-#line 585 "pikchr.y"
2531
+#line 586 "pikchr.y"
25312532
{pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy175);}
2532
-#line 2557 "pikchr.c"
2533
+#line 2558 "pikchr.c"
25332534
break;
25342535
case 34: /* attribute ::= CLOSE */
2535
-#line 586 "pikchr.y"
2536
+#line 587 "pikchr.y"
25362537
{ pik_close_path(p,&yymsp[0].minor.yy0); }
2537
-#line 2562 "pikchr.c"
2538
+#line 2563 "pikchr.c"
25382539
break;
25392540
case 35: /* attribute ::= CHOP */
2540
-#line 587 "pikchr.y"
2541
+#line 588 "pikchr.y"
25412542
{ p->cur->bChop = 1; }
2542
-#line 2567 "pikchr.c"
2543
+#line 2568 "pikchr.c"
25432544
break;
25442545
case 36: /* attribute ::= FROM position */
2545
-#line 588 "pikchr.y"
2546
+#line 589 "pikchr.y"
25462547
{ pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy175); }
2547
-#line 2572 "pikchr.c"
2548
+#line 2573 "pikchr.c"
25482549
break;
25492550
case 37: /* attribute ::= TO position */
2550
-#line 589 "pikchr.y"
2551
+#line 590 "pikchr.y"
25512552
{ pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy175); }
2552
-#line 2577 "pikchr.c"
2553
+#line 2578 "pikchr.c"
25532554
break;
25542555
case 38: /* attribute ::= THEN */
2555
-#line 590 "pikchr.y"
2556
+#line 591 "pikchr.y"
25562557
{ pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2557
-#line 2582 "pikchr.c"
2558
+#line 2583 "pikchr.c"
25582559
break;
25592560
case 39: /* attribute ::= THEN optrelexpr HEADING expr */
25602561
case 41: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==41);
2561
-#line 592 "pikchr.y"
2562
+#line 593 "pikchr.y"
25622563
{pik_move_hdg(p,&yymsp[-2].minor.yy164,&yymsp[-1].minor.yy0,yymsp[0].minor.yy257,0,&yymsp[-3].minor.yy0);}
2563
-#line 2588 "pikchr.c"
2564
+#line 2589 "pikchr.c"
25642565
break;
25652566
case 40: /* attribute ::= THEN optrelexpr EDGEPT */
25662567
case 42: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==42);
2567
-#line 593 "pikchr.y"
2568
+#line 594 "pikchr.y"
25682569
{pik_move_hdg(p,&yymsp[-1].minor.yy164,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2569
-#line 2594 "pikchr.c"
2570
+#line 2595 "pikchr.c"
25702571
break;
25712572
case 43: /* attribute ::= AT position */
2572
-#line 598 "pikchr.y"
2573
+#line 599 "pikchr.y"
25732574
{ pik_set_at(p,0,&yymsp[0].minor.yy175,&yymsp[-1].minor.yy0); }
2574
-#line 2599 "pikchr.c"
2575
+#line 2600 "pikchr.c"
25752576
break;
25762577
case 44: /* attribute ::= SAME */
2577
-#line 600 "pikchr.y"
2578
+#line 601 "pikchr.y"
25782579
{pik_same(p,0,&yymsp[0].minor.yy0);}
2579
-#line 2604 "pikchr.c"
2580
+#line 2605 "pikchr.c"
25802581
break;
25812582
case 45: /* attribute ::= SAME AS object */
2582
-#line 601 "pikchr.y"
2583
+#line 602 "pikchr.y"
25832584
{pik_same(p,yymsp[0].minor.yy226,&yymsp[-2].minor.yy0);}
2584
-#line 2609 "pikchr.c"
2585
+#line 2610 "pikchr.c"
25852586
break;
25862587
case 46: /* attribute ::= STRING textposition */
2587
-#line 602 "pikchr.y"
2588
+#line 603 "pikchr.y"
25882589
{pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy116);}
2589
-#line 2614 "pikchr.c"
2590
+#line 2615 "pikchr.c"
25902591
break;
25912592
case 47: /* attribute ::= FIT */
2592
-#line 603 "pikchr.y"
2593
+#line 604 "pikchr.y"
25932594
{pik_size_to_fit(p,&yymsp[0].minor.yy0); }
2594
-#line 2619 "pikchr.c"
2595
+#line 2620 "pikchr.c"
25952596
break;
25962597
case 48: /* attribute ::= BEHIND object */
2597
-#line 604 "pikchr.y"
2598
+#line 605 "pikchr.y"
25982599
{pik_behind(p,yymsp[0].minor.yy226);}
2599
-#line 2624 "pikchr.c"
2600
+#line 2625 "pikchr.c"
26002601
break;
26012602
case 49: /* withclause ::= DOT_E edge AT position */
26022603
case 50: /* withclause ::= edge AT position */ yytestcase(yyruleno==50);
2603
-#line 612 "pikchr.y"
2604
+#line 613 "pikchr.y"
26042605
{ pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy175,&yymsp[-1].minor.yy0); }
2605
-#line 2630 "pikchr.c"
2606
+#line 2631 "pikchr.c"
26062607
break;
26072608
case 51: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2608
-#line 616 "pikchr.y"
2609
+#line 617 "pikchr.y"
26092610
{yylhsminor.yy0 = yymsp[0].minor.yy0;}
2610
-#line 2635 "pikchr.c"
2611
+#line 2636 "pikchr.c"
26112612
yymsp[0].minor.yy0 = yylhsminor.yy0;
26122613
break;
26132614
case 52: /* boolproperty ::= CW */
2614
-#line 627 "pikchr.y"
2615
+#line 628 "pikchr.y"
26152616
{p->cur->cw = 1;}
2616
-#line 2641 "pikchr.c"
2617
+#line 2642 "pikchr.c"
26172618
break;
26182619
case 53: /* boolproperty ::= CCW */
2619
-#line 628 "pikchr.y"
2620
+#line 629 "pikchr.y"
26202621
{p->cur->cw = 0;}
2621
-#line 2646 "pikchr.c"
2622
+#line 2647 "pikchr.c"
26222623
break;
26232624
case 54: /* boolproperty ::= LARROW */
2624
-#line 629 "pikchr.y"
2625
+#line 630 "pikchr.y"
26252626
{p->cur->larrow=1; p->cur->rarrow=0; }
2626
-#line 2651 "pikchr.c"
2627
+#line 2652 "pikchr.c"
26272628
break;
26282629
case 55: /* boolproperty ::= RARROW */
2629
-#line 630 "pikchr.y"
2630
+#line 631 "pikchr.y"
26302631
{p->cur->larrow=0; p->cur->rarrow=1; }
2631
-#line 2656 "pikchr.c"
2632
+#line 2657 "pikchr.c"
26322633
break;
26332634
case 56: /* boolproperty ::= LRARROW */
2634
-#line 631 "pikchr.y"
2635
+#line 632 "pikchr.y"
26352636
{p->cur->larrow=1; p->cur->rarrow=1; }
2636
-#line 2661 "pikchr.c"
2637
+#line 2662 "pikchr.c"
26372638
break;
26382639
case 57: /* boolproperty ::= INVIS */
2639
-#line 632 "pikchr.y"
2640
+#line 633 "pikchr.y"
26402641
{p->cur->sw = 0.0;}
2641
-#line 2666 "pikchr.c"
2642
+#line 2667 "pikchr.c"
26422643
break;
26432644
case 58: /* boolproperty ::= THICK */
2644
-#line 633 "pikchr.y"
2645
+#line 634 "pikchr.y"
26452646
{p->cur->sw *= 1.5;}
2646
-#line 2671 "pikchr.c"
2647
+#line 2672 "pikchr.c"
26472648
break;
26482649
case 59: /* boolproperty ::= THIN */
2649
-#line 634 "pikchr.y"
2650
+#line 635 "pikchr.y"
26502651
{p->cur->sw *= 0.67;}
2651
-#line 2676 "pikchr.c"
2652
+#line 2677 "pikchr.c"
26522653
break;
26532654
case 60: /* textposition ::= */
2654
-#line 636 "pikchr.y"
2655
+#line 637 "pikchr.y"
26552656
{yymsp[1].minor.yy116 = 0;}
2656
-#line 2681 "pikchr.c"
2657
+#line 2682 "pikchr.c"
26572658
break;
26582659
case 61: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2659
-#line 639 "pikchr.y"
2660
+#line 640 "pikchr.y"
26602661
{yylhsminor.yy116 = pik_text_position(yymsp[-1].minor.yy116,&yymsp[0].minor.yy0);}
2661
-#line 2686 "pikchr.c"
2662
+#line 2687 "pikchr.c"
26622663
yymsp[-1].minor.yy116 = yylhsminor.yy116;
26632664
break;
26642665
case 62: /* position ::= expr COMMA expr */
2665
-#line 642 "pikchr.y"
2666
+#line 643 "pikchr.y"
26662667
{yylhsminor.yy175.x=yymsp[-2].minor.yy257; yylhsminor.yy175.y=yymsp[0].minor.yy257;}
2667
-#line 2692 "pikchr.c"
2668
+#line 2693 "pikchr.c"
26682669
yymsp[-2].minor.yy175 = yylhsminor.yy175;
26692670
break;
26702671
case 63: /* position ::= place PLUS expr COMMA expr */
2671
-#line 644 "pikchr.y"
2672
+#line 645 "pikchr.y"
26722673
{yylhsminor.yy175.x=yymsp[-4].minor.yy175.x+yymsp[-2].minor.yy257; yylhsminor.yy175.y=yymsp[-4].minor.yy175.y+yymsp[0].minor.yy257;}
2673
-#line 2698 "pikchr.c"
2674
+#line 2699 "pikchr.c"
26742675
yymsp[-4].minor.yy175 = yylhsminor.yy175;
26752676
break;
26762677
case 64: /* position ::= place MINUS expr COMMA expr */
2677
-#line 645 "pikchr.y"
2678
+#line 646 "pikchr.y"
26782679
{yylhsminor.yy175.x=yymsp[-4].minor.yy175.x-yymsp[-2].minor.yy257; yylhsminor.yy175.y=yymsp[-4].minor.yy175.y-yymsp[0].minor.yy257;}
2679
-#line 2704 "pikchr.c"
2680
+#line 2705 "pikchr.c"
26802681
yymsp[-4].minor.yy175 = yylhsminor.yy175;
26812682
break;
26822683
case 65: /* position ::= place PLUS LP expr COMMA expr RP */
2683
-#line 647 "pikchr.y"
2684
+#line 648 "pikchr.y"
26842685
{yylhsminor.yy175.x=yymsp[-6].minor.yy175.x+yymsp[-3].minor.yy257; yylhsminor.yy175.y=yymsp[-6].minor.yy175.y+yymsp[-1].minor.yy257;}
2685
-#line 2710 "pikchr.c"
2686
+#line 2711 "pikchr.c"
26862687
yymsp[-6].minor.yy175 = yylhsminor.yy175;
26872688
break;
26882689
case 66: /* position ::= place MINUS LP expr COMMA expr RP */
2689
-#line 649 "pikchr.y"
2690
+#line 650 "pikchr.y"
26902691
{yylhsminor.yy175.x=yymsp[-6].minor.yy175.x-yymsp[-3].minor.yy257; yylhsminor.yy175.y=yymsp[-6].minor.yy175.y-yymsp[-1].minor.yy257;}
2691
-#line 2716 "pikchr.c"
2692
+#line 2717 "pikchr.c"
26922693
yymsp[-6].minor.yy175 = yylhsminor.yy175;
26932694
break;
26942695
case 67: /* position ::= LP position COMMA position RP */
2695
-#line 650 "pikchr.y"
2696
+#line 651 "pikchr.y"
26962697
{yymsp[-4].minor.yy175.x=yymsp[-3].minor.yy175.x; yymsp[-4].minor.yy175.y=yymsp[-1].minor.yy175.y;}
2697
-#line 2722 "pikchr.c"
2698
+#line 2723 "pikchr.c"
26982699
break;
26992700
case 68: /* position ::= LP position RP */
2700
-#line 651 "pikchr.y"
2701
+#line 652 "pikchr.y"
27012702
{yymsp[-2].minor.yy175=yymsp[-1].minor.yy175;}
2702
-#line 2727 "pikchr.c"
2703
+#line 2728 "pikchr.c"
27032704
break;
27042705
case 69: /* position ::= expr between position AND position */
2705
-#line 653 "pikchr.y"
2706
+#line 654 "pikchr.y"
27062707
{yylhsminor.yy175 = pik_position_between(yymsp[-4].minor.yy257,yymsp[-2].minor.yy175,yymsp[0].minor.yy175);}
2707
-#line 2732 "pikchr.c"
2708
+#line 2733 "pikchr.c"
27082709
yymsp[-4].minor.yy175 = yylhsminor.yy175;
27092710
break;
27102711
case 70: /* position ::= expr LT position COMMA position GT */
2711
-#line 655 "pikchr.y"
2712
+#line 656 "pikchr.y"
27122713
{yylhsminor.yy175 = pik_position_between(yymsp[-5].minor.yy257,yymsp[-3].minor.yy175,yymsp[-1].minor.yy175);}
2713
-#line 2738 "pikchr.c"
2714
+#line 2739 "pikchr.c"
27142715
yymsp[-5].minor.yy175 = yylhsminor.yy175;
27152716
break;
27162717
case 71: /* position ::= expr ABOVE position */
2717
-#line 656 "pikchr.y"
2718
+#line 657 "pikchr.y"
27182719
{yylhsminor.yy175=yymsp[0].minor.yy175; yylhsminor.yy175.y += yymsp[-2].minor.yy257;}
2719
-#line 2744 "pikchr.c"
2720
+#line 2745 "pikchr.c"
27202721
yymsp[-2].minor.yy175 = yylhsminor.yy175;
27212722
break;
27222723
case 72: /* position ::= expr BELOW position */
2723
-#line 657 "pikchr.y"
2724
+#line 658 "pikchr.y"
27242725
{yylhsminor.yy175=yymsp[0].minor.yy175; yylhsminor.yy175.y -= yymsp[-2].minor.yy257;}
2725
-#line 2750 "pikchr.c"
2726
+#line 2751 "pikchr.c"
27262727
yymsp[-2].minor.yy175 = yylhsminor.yy175;
27272728
break;
27282729
case 73: /* position ::= expr LEFT OF position */
2729
-#line 658 "pikchr.y"
2730
+#line 659 "pikchr.y"
27302731
{yylhsminor.yy175=yymsp[0].minor.yy175; yylhsminor.yy175.x -= yymsp[-3].minor.yy257;}
2731
-#line 2756 "pikchr.c"
2732
+#line 2757 "pikchr.c"
27322733
yymsp[-3].minor.yy175 = yylhsminor.yy175;
27332734
break;
27342735
case 74: /* position ::= expr RIGHT OF position */
2735
-#line 659 "pikchr.y"
2736
+#line 660 "pikchr.y"
27362737
{yylhsminor.yy175=yymsp[0].minor.yy175; yylhsminor.yy175.x += yymsp[-3].minor.yy257;}
2737
-#line 2762 "pikchr.c"
2738
+#line 2763 "pikchr.c"
27382739
yymsp[-3].minor.yy175 = yylhsminor.yy175;
27392740
break;
27402741
case 75: /* position ::= expr ON HEADING EDGEPT OF position */
2741
-#line 661 "pikchr.y"
2742
+#line 662 "pikchr.y"
27422743
{yylhsminor.yy175 = pik_position_at_hdg(yymsp[-5].minor.yy257,&yymsp[-2].minor.yy0,yymsp[0].minor.yy175);}
2743
-#line 2768 "pikchr.c"
2744
+#line 2769 "pikchr.c"
27442745
yymsp[-5].minor.yy175 = yylhsminor.yy175;
27452746
break;
27462747
case 76: /* position ::= expr HEADING EDGEPT OF position */
2747
-#line 663 "pikchr.y"
2748
+#line 664 "pikchr.y"
27482749
{yylhsminor.yy175 = pik_position_at_hdg(yymsp[-4].minor.yy257,&yymsp[-2].minor.yy0,yymsp[0].minor.yy175);}
2749
-#line 2774 "pikchr.c"
2750
+#line 2775 "pikchr.c"
27502751
yymsp[-4].minor.yy175 = yylhsminor.yy175;
27512752
break;
27522753
case 77: /* position ::= expr EDGEPT OF position */
2753
-#line 665 "pikchr.y"
2754
+#line 666 "pikchr.y"
27542755
{yylhsminor.yy175 = pik_position_at_hdg(yymsp[-3].minor.yy257,&yymsp[-2].minor.yy0,yymsp[0].minor.yy175);}
2755
-#line 2780 "pikchr.c"
2756
+#line 2781 "pikchr.c"
27562757
yymsp[-3].minor.yy175 = yylhsminor.yy175;
27572758
break;
27582759
case 78: /* position ::= expr ON HEADING expr FROM position */
2759
-#line 667 "pikchr.y"
2760
+#line 668 "pikchr.y"
27602761
{yylhsminor.yy175 = pik_position_at_angle(yymsp[-5].minor.yy257,yymsp[-2].minor.yy257,yymsp[0].minor.yy175);}
2761
-#line 2786 "pikchr.c"
2762
+#line 2787 "pikchr.c"
27622763
yymsp[-5].minor.yy175 = yylhsminor.yy175;
27632764
break;
27642765
case 79: /* position ::= expr HEADING expr FROM position */
2765
-#line 669 "pikchr.y"
2766
+#line 670 "pikchr.y"
27662767
{yylhsminor.yy175 = pik_position_at_angle(yymsp[-4].minor.yy257,yymsp[-2].minor.yy257,yymsp[0].minor.yy175);}
2767
-#line 2792 "pikchr.c"
2768
+#line 2793 "pikchr.c"
27682769
yymsp[-4].minor.yy175 = yylhsminor.yy175;
27692770
break;
27702771
case 80: /* place ::= edge OF object */
2771
-#line 681 "pikchr.y"
2772
+#line 682 "pikchr.y"
27722773
{yylhsminor.yy175 = pik_place_of_elem(p,yymsp[0].minor.yy226,&yymsp[-2].minor.yy0);}
2773
-#line 2798 "pikchr.c"
2774
+#line 2799 "pikchr.c"
27742775
yymsp[-2].minor.yy175 = yylhsminor.yy175;
27752776
break;
27762777
case 81: /* place2 ::= object */
2777
-#line 682 "pikchr.y"
2778
+#line 683 "pikchr.y"
27782779
{yylhsminor.yy175 = pik_place_of_elem(p,yymsp[0].minor.yy226,0);}
2779
-#line 2804 "pikchr.c"
2780
+#line 2805 "pikchr.c"
27802781
yymsp[0].minor.yy175 = yylhsminor.yy175;
27812782
break;
27822783
case 82: /* place2 ::= object DOT_E edge */
2783
-#line 683 "pikchr.y"
2784
+#line 684 "pikchr.y"
27842785
{yylhsminor.yy175 = pik_place_of_elem(p,yymsp[-2].minor.yy226,&yymsp[0].minor.yy0);}
2785
-#line 2810 "pikchr.c"
2786
+#line 2811 "pikchr.c"
27862787
yymsp[-2].minor.yy175 = yylhsminor.yy175;
27872788
break;
27882789
case 83: /* place2 ::= NTH VERTEX OF object */
2789
-#line 684 "pikchr.y"
2790
+#line 685 "pikchr.y"
27902791
{yylhsminor.yy175 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy226);}
2791
-#line 2816 "pikchr.c"
2792
+#line 2817 "pikchr.c"
27922793
yymsp[-3].minor.yy175 = yylhsminor.yy175;
27932794
break;
27942795
case 84: /* object ::= nth */
2795
-#line 696 "pikchr.y"
2796
+#line 697 "pikchr.y"
27962797
{yylhsminor.yy226 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2797
-#line 2822 "pikchr.c"
2798
+#line 2823 "pikchr.c"
27982799
yymsp[0].minor.yy226 = yylhsminor.yy226;
27992800
break;
28002801
case 85: /* object ::= nth OF|IN object */
2801
-#line 697 "pikchr.y"
2802
+#line 698 "pikchr.y"
28022803
{yylhsminor.yy226 = pik_find_nth(p,yymsp[0].minor.yy226,&yymsp[-2].minor.yy0);}
2803
-#line 2828 "pikchr.c"
2804
+#line 2829 "pikchr.c"
28042805
yymsp[-2].minor.yy226 = yylhsminor.yy226;
28052806
break;
28062807
case 86: /* objectname ::= PLACENAME */
2807
-#line 699 "pikchr.y"
2808
+#line 700 "pikchr.y"
28082809
{yylhsminor.yy226 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2809
-#line 2834 "pikchr.c"
2810
+#line 2835 "pikchr.c"
28102811
yymsp[0].minor.yy226 = yylhsminor.yy226;
28112812
break;
28122813
case 87: /* objectname ::= objectname DOT_U PLACENAME */
2813
-#line 701 "pikchr.y"
2814
+#line 702 "pikchr.y"
28142815
{yylhsminor.yy226 = pik_find_byname(p,yymsp[-2].minor.yy226,&yymsp[0].minor.yy0);}
2815
-#line 2840 "pikchr.c"
2816
+#line 2841 "pikchr.c"
28162817
yymsp[-2].minor.yy226 = yylhsminor.yy226;
28172818
break;
28182819
case 88: /* nth ::= NTH CLASSNAME */
2819
-#line 703 "pikchr.y"
2820
+#line 704 "pikchr.y"
28202821
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2821
-#line 2846 "pikchr.c"
2822
+#line 2847 "pikchr.c"
28222823
yymsp[-1].minor.yy0 = yylhsminor.yy0;
28232824
break;
28242825
case 89: /* nth ::= NTH LAST CLASSNAME */
2825
-#line 704 "pikchr.y"
2826
+#line 705 "pikchr.y"
28262827
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2827
-#line 2852 "pikchr.c"
2828
+#line 2853 "pikchr.c"
28282829
yymsp[-2].minor.yy0 = yylhsminor.yy0;
28292830
break;
28302831
case 90: /* nth ::= LAST CLASSNAME */
2831
-#line 705 "pikchr.y"
2832
+#line 706 "pikchr.y"
28322833
{yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2833
-#line 2858 "pikchr.c"
2834
+#line 2859 "pikchr.c"
28342835
break;
28352836
case 91: /* nth ::= LAST */
2836
-#line 706 "pikchr.y"
2837
+#line 707 "pikchr.y"
28372838
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2838
-#line 2863 "pikchr.c"
2839
+#line 2864 "pikchr.c"
28392840
yymsp[0].minor.yy0 = yylhsminor.yy0;
28402841
break;
28412842
case 92: /* nth ::= NTH LB RB */
2842
-#line 707 "pikchr.y"
2843
+#line 708 "pikchr.y"
28432844
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2844
-#line 2869 "pikchr.c"
2845
+#line 2870 "pikchr.c"
28452846
yymsp[-2].minor.yy0 = yylhsminor.yy0;
28462847
break;
28472848
case 93: /* nth ::= NTH LAST LB RB */
2848
-#line 708 "pikchr.y"
2849
+#line 709 "pikchr.y"
28492850
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2850
-#line 2875 "pikchr.c"
2851
+#line 2876 "pikchr.c"
28512852
yymsp[-3].minor.yy0 = yylhsminor.yy0;
28522853
break;
28532854
case 94: /* nth ::= LAST LB RB */
2854
-#line 709 "pikchr.y"
2855
+#line 710 "pikchr.y"
28552856
{yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2856
-#line 2881 "pikchr.c"
2857
+#line 2882 "pikchr.c"
28572858
break;
28582859
case 95: /* expr ::= expr PLUS expr */
2859
-#line 711 "pikchr.y"
2860
+#line 712 "pikchr.y"
28602861
{yylhsminor.yy257=yymsp[-2].minor.yy257+yymsp[0].minor.yy257;}
2861
-#line 2886 "pikchr.c"
2862
+#line 2887 "pikchr.c"
28622863
yymsp[-2].minor.yy257 = yylhsminor.yy257;
28632864
break;
28642865
case 96: /* expr ::= expr MINUS expr */
2865
-#line 712 "pikchr.y"
2866
+#line 713 "pikchr.y"
28662867
{yylhsminor.yy257=yymsp[-2].minor.yy257-yymsp[0].minor.yy257;}
2867
-#line 2892 "pikchr.c"
2868
+#line 2893 "pikchr.c"
28682869
yymsp[-2].minor.yy257 = yylhsminor.yy257;
28692870
break;
28702871
case 97: /* expr ::= expr STAR expr */
2871
-#line 713 "pikchr.y"
2872
+#line 714 "pikchr.y"
28722873
{yylhsminor.yy257=yymsp[-2].minor.yy257*yymsp[0].minor.yy257;}
2873
-#line 2898 "pikchr.c"
2874
+#line 2899 "pikchr.c"
28742875
yymsp[-2].minor.yy257 = yylhsminor.yy257;
28752876
break;
28762877
case 98: /* expr ::= expr SLASH expr */
2877
-#line 714 "pikchr.y"
2878
+#line 715 "pikchr.y"
28782879
{
28792880
if( yymsp[0].minor.yy257==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy257 = 0.0; }
28802881
else{ yylhsminor.yy257 = yymsp[-2].minor.yy257/yymsp[0].minor.yy257; }
28812882
}
2882
-#line 2907 "pikchr.c"
2883
+#line 2908 "pikchr.c"
28832884
yymsp[-2].minor.yy257 = yylhsminor.yy257;
28842885
break;
28852886
case 99: /* expr ::= MINUS expr */
2886
-#line 718 "pikchr.y"
2887
+#line 719 "pikchr.y"
28872888
{yymsp[-1].minor.yy257=-yymsp[0].minor.yy257;}
2888
-#line 2913 "pikchr.c"
2889
+#line 2914 "pikchr.c"
28892890
break;
28902891
case 100: /* expr ::= PLUS expr */
2891
-#line 719 "pikchr.y"
2892
+#line 720 "pikchr.y"
28922893
{yymsp[-1].minor.yy257=yymsp[0].minor.yy257;}
2893
-#line 2918 "pikchr.c"
2894
+#line 2919 "pikchr.c"
28942895
break;
28952896
case 101: /* expr ::= LP expr RP */
2896
-#line 720 "pikchr.y"
2897
+#line 721 "pikchr.y"
28972898
{yymsp[-2].minor.yy257=yymsp[-1].minor.yy257;}
2898
-#line 2923 "pikchr.c"
2899
+#line 2924 "pikchr.c"
28992900
break;
29002901
case 102: /* expr ::= LP FILL|COLOR|THICKNESS RP */
2901
-#line 721 "pikchr.y"
2902
+#line 722 "pikchr.y"
29022903
{yymsp[-2].minor.yy257=pik_get_var(p,&yymsp[-1].minor.yy0);}
2903
-#line 2928 "pikchr.c"
2904
+#line 2929 "pikchr.c"
29042905
break;
29052906
case 103: /* expr ::= NUMBER */
2906
-#line 722 "pikchr.y"
2907
+#line 723 "pikchr.y"
29072908
{yylhsminor.yy257=pik_atof(&yymsp[0].minor.yy0);}
2908
-#line 2933 "pikchr.c"
2909
+#line 2934 "pikchr.c"
29092910
yymsp[0].minor.yy257 = yylhsminor.yy257;
29102911
break;
29112912
case 104: /* expr ::= ID */
2912
-#line 723 "pikchr.y"
2913
+#line 724 "pikchr.y"
29132914
{yylhsminor.yy257=pik_get_var(p,&yymsp[0].minor.yy0);}
2914
-#line 2939 "pikchr.c"
2915
+#line 2940 "pikchr.c"
29152916
yymsp[0].minor.yy257 = yylhsminor.yy257;
29162917
break;
29172918
case 105: /* expr ::= FUNC1 LP expr RP */
2918
-#line 724 "pikchr.y"
2919
+#line 725 "pikchr.y"
29192920
{yylhsminor.yy257 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy257,0.0);}
2920
-#line 2945 "pikchr.c"
2921
+#line 2946 "pikchr.c"
29212922
yymsp[-3].minor.yy257 = yylhsminor.yy257;
29222923
break;
29232924
case 106: /* expr ::= FUNC2 LP expr COMMA expr RP */
2924
-#line 725 "pikchr.y"
2925
+#line 726 "pikchr.y"
29252926
{yylhsminor.yy257 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy257,yymsp[-1].minor.yy257);}
2926
-#line 2951 "pikchr.c"
2927
+#line 2952 "pikchr.c"
29272928
yymsp[-5].minor.yy257 = yylhsminor.yy257;
29282929
break;
29292930
case 107: /* expr ::= DIST LP position COMMA position RP */
2930
-#line 726 "pikchr.y"
2931
+#line 727 "pikchr.y"
29312932
{yymsp[-5].minor.yy257 = pik_dist(&yymsp[-3].minor.yy175,&yymsp[-1].minor.yy175);}
2932
-#line 2957 "pikchr.c"
2933
+#line 2958 "pikchr.c"
29332934
break;
29342935
case 108: /* expr ::= place2 DOT_XY X */
2935
-#line 727 "pikchr.y"
2936
+#line 728 "pikchr.y"
29362937
{yylhsminor.yy257 = yymsp[-2].minor.yy175.x;}
2937
-#line 2962 "pikchr.c"
2938
+#line 2963 "pikchr.c"
29382939
yymsp[-2].minor.yy257 = yylhsminor.yy257;
29392940
break;
29402941
case 109: /* expr ::= place2 DOT_XY Y */
2941
-#line 728 "pikchr.y"
2942
+#line 729 "pikchr.y"
29422943
{yylhsminor.yy257 = yymsp[-2].minor.yy175.y;}
2943
-#line 2968 "pikchr.c"
2944
+#line 2969 "pikchr.c"
29442945
yymsp[-2].minor.yy257 = yylhsminor.yy257;
29452946
break;
29462947
case 110: /* expr ::= object DOT_L numproperty */
29472948
case 111: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==111);
29482949
case 112: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==112);
2949
-#line 729 "pikchr.y"
2950
+#line 730 "pikchr.y"
29502951
{yylhsminor.yy257=pik_property_of(yymsp[-2].minor.yy226,&yymsp[0].minor.yy0);}
2951
-#line 2976 "pikchr.c"
2952
+#line 2977 "pikchr.c"
29522953
yymsp[-2].minor.yy257 = yylhsminor.yy257;
29532954
break;
29542955
default:
29552956
/* (113) lvalue ::= ID */ yytestcase(yyruleno==113);
29562957
/* (114) lvalue ::= FILL */ yytestcase(yyruleno==114);
@@ -3049,19 +3050,19 @@
30493050
){
30503051
pik_parserARG_FETCH
30513052
pik_parserCTX_FETCH
30523053
#define TOKEN yyminor
30533054
/************ Begin %syntax_error code ****************************************/
3054
-#line 493 "pikchr.y"
3055
+#line 494 "pikchr.y"
30553056
30563057
if( TOKEN.z && TOKEN.z[0] ){
30573058
pik_error(p, &TOKEN, "syntax error");
30583059
}else{
30593060
pik_error(p, 0, "syntax error");
30603061
}
30613062
UNUSED_PARAMETER(yymajor);
3062
-#line 3087 "pikchr.c"
3063
+#line 3088 "pikchr.c"
30633064
/************ End %syntax_error code ******************************************/
30643065
pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
30653066
pik_parserCTX_STORE
30663067
}
30673068
@@ -3290,11 +3291,11 @@
32903291
#else
32913292
(void)iToken;
32923293
return 0;
32933294
#endif
32943295
}
3295
-#line 734 "pikchr.y"
3296
+#line 735 "pikchr.y"
32963297
32973298
32983299
32993300
/* Chart of the 140 official HTML color names with their
33003301
** corresponding RGB value.
@@ -3573,11 +3574,11 @@
35733574
pElem->rad = pik_value(p, "boxrad",6,0);
35743575
}
35753576
/* Return offset from the center of the box to the compass point
35763577
** given by parameter cp */
35773578
static PPoint boxOffset(Pik *p, PElem *pElem, int cp){
3578
- PPoint pt;
3579
+ PPoint pt = cZeroPoint;
35793580
PNum w2 = 0.5*pElem->w;
35803581
PNum h2 = 0.5*pElem->h;
35813582
PNum rad = pElem->rad;
35823583
PNum rx;
35833584
if( rad<=0.0 ){
@@ -3585,21 +3586,21 @@
35853586
}else{
35863587
if( rad>w2 ) rad = w2;
35873588
if( rad>h2 ) rad = h2;
35883589
rx = 0.29289321881345252392*rad;
35893590
}
3590
- pt.x = pt.y = 0.0;
35913591
switch( cp ){
3592
- case CP_C: pt.x = 0.0; pt.y = 0.0; break;
3592
+ case CP_C: break;
35933593
case CP_N: pt.x = 0.0; pt.y = h2; break;
35943594
case CP_NE: pt.x = w2-rx; pt.y = h2-rx; break;
35953595
case CP_E: pt.x = w2; pt.y = 0.0; break;
35963596
case CP_SE: pt.x = w2-rx; pt.y = rx-h2; break;
35973597
case CP_S: pt.x = 0.0; pt.y = -h2; break;
35983598
case CP_SW: pt.x = rx-w2; pt.y = rx-h2; break;
35993599
case CP_W: pt.x = -w2; pt.y = 0.0; break;
36003600
case CP_NW: pt.x = rx-w2; pt.y = h2-rx; break;
3601
+ default: assert(0);
36013602
}
36023603
UNUSED_PARAMETER(p);
36033604
return pt;
36043605
}
36053606
static PPoint boxChop(Pik *p, PElem *pElem, PPoint *pPt){
@@ -3789,24 +3790,25 @@
37893790
pik_append(p,"\" />\n", -1);
37903791
}
37913792
pik_append_txt(p, pElem, 0);
37923793
}
37933794
static PPoint cylinderOffset(Pik *p, PElem *pElem, int cp){
3794
- PPoint pt;
3795
+ PPoint pt = cZeroPoint;
37953796
PNum w2 = pElem->w*0.5;
37963797
PNum h1 = pElem->h*0.5;
37973798
PNum h2 = h1 - pElem->rad;
37983799
switch( cp ){
3799
- case CP_C: pt.x = 0.0; pt.y = 0.0; break;
3800
+ case CP_C: break;
38003801
case CP_N: pt.x = 0.0; pt.y = h1; break;
38013802
case CP_NE: pt.x = w2; pt.y = h2; break;
38023803
case CP_E: pt.x = w2; pt.y = 0.0; break;
38033804
case CP_SE: pt.x = w2; pt.y = -h2; break;
38043805
case CP_S: pt.x = 0.0; pt.y = -h1; break;
38053806
case CP_SW: pt.x = -w2; pt.y = -h2; break;
38063807
case CP_W: pt.x = -w2; pt.y = 0.0; break;
38073808
case CP_NW: pt.x = -w2; pt.y = h2; break;
3809
+ default: assert(0);
38083810
}
38093811
UNUSED_PARAMETER(p);
38103812
return pt;
38113813
}
38123814
@@ -3832,16 +3834,14 @@
38323834
pik_bbox_addellipse(&pElem->bbox, pElem->ptAt.x, pElem->ptAt.y,
38333835
pElem->rad, pElem->rad);
38343836
UNUSED_PARAMETER(p);
38353837
}
38363838
static PPoint dotOffset(Pik *p, PElem *pElem, int cp){
3837
- PPoint zero;
3838
- zero.x = zero.y = 0;
38393839
UNUSED_PARAMETER(p);
38403840
UNUSED_PARAMETER(pElem);
38413841
UNUSED_PARAMETER(cp);
3842
- return zero;
3842
+ return cZeroPoint;
38433843
}
38443844
static void dotRender(Pik *p, PElem *pElem){
38453845
PNum r = pElem->rad;
38463846
PPoint pt = pElem->ptAt;
38473847
if( pElem->sw>0.0 ){
@@ -3876,25 +3876,26 @@
38763876
chop.y = pElem->ptAt.y + 0.5*dy*pElem->h/dist;
38773877
UNUSED_PARAMETER(p);
38783878
return chop;
38793879
}
38803880
static PPoint ellipseOffset(Pik *p, PElem *pElem, int cp){
3881
- PPoint pt;
3881
+ PPoint pt = cZeroPoint;
38823882
PNum w = pElem->w*0.5;
38833883
PNum w2 = w*0.70710678118654747608;
38843884
PNum h = pElem->h*0.5;
38853885
PNum h2 = h*0.70710678118654747608;
38863886
switch( cp ){
3887
- case CP_C: pt.x = 0.0; pt.y = 0.0; break;
3887
+ case CP_C: break;
38883888
case CP_N: pt.x = 0.0; pt.y = h; break;
38893889
case CP_NE: pt.x = w2; pt.y = h2; break;
38903890
case CP_E: pt.x = w; pt.y = 0.0; break;
38913891
case CP_SE: pt.x = w2; pt.y = -h2; break;
38923892
case CP_S: pt.x = 0.0; pt.y = -h; break;
38933893
case CP_SW: pt.x = -w2; pt.y = -h2; break;
38943894
case CP_W: pt.x = -w; pt.y = 0.0; break;
38953895
case CP_NW: pt.x = -w2; pt.y = h2; break;
3896
+ default: assert(0);
38963897
}
38973898
UNUSED_PARAMETER(p);
38983899
return pt;
38993900
}
39003901
static void ellipseRender(Pik *p, PElem *pElem){
@@ -3919,29 +3920,30 @@
39193920
pElem->rad = pik_value(p, "filerad",7,0);
39203921
}
39213922
/* Return offset from the center of the file to the compass point
39223923
** given by parameter cp */
39233924
static PPoint fileOffset(Pik *p, PElem *pElem, int cp){
3924
- PPoint pt;
3925
+ PPoint pt = cZeroPoint;
39253926
PNum w2 = 0.5*pElem->w;
39263927
PNum h2 = 0.5*pElem->h;
39273928
PNum rx = pElem->rad;
39283929
PNum mn = w2<h2 ? w2 : h2;
39293930
if( rx>mn ) rx = mn;
39303931
if( rx<mn*0.25 ) rx = mn*0.25;
39313932
pt.x = pt.y = 0.0;
39323933
rx *= 0.5;
39333934
switch( cp ){
3934
- case CP_C: pt.x = 0.0; pt.y = 0.0; break;
3935
+ case CP_C: break;
39353936
case CP_N: pt.x = 0.0; pt.y = h2; break;
39363937
case CP_NE: pt.x = w2-rx; pt.y = h2-rx; break;
39373938
case CP_E: pt.x = w2; pt.y = 0.0; break;
39383939
case CP_SE: pt.x = w2; pt.y = -h2; break;
39393940
case CP_S: pt.x = 0.0; pt.y = -h2; break;
39403941
case CP_SW: pt.x = -w2; pt.y = -h2; break;
39413942
case CP_W: pt.x = -w2; pt.y = 0.0; break;
39423943
case CP_NW: pt.x = -w2; pt.y = h2; break;
3944
+ default: assert(0);
39433945
}
39443946
UNUSED_PARAMETER(p);
39453947
return pt;
39463948
}
39473949
static void fileFit(Pik *p, PElem *pElem, PNum w, PNum h){
@@ -5086,10 +5088,11 @@
50865088
p->cur = pNew;
50875089
p->nTPath = 1;
50885090
p->thenFlag = 0;
50895091
if( p->list==0 || p->list->n==0 ){
50905092
pNew->ptAt.x = pNew->ptAt.y = 0.0;
5093
+ pNew->eWith = CP_C;
50915094
}else{
50925095
PElem *pPrior = p->list->a[p->list->n-1];
50935096
pNew->ptAt = pPrior->ptExit;
50945097
switch( p->eDir ){
50955098
default: pNew->eWith = CP_W; break;
@@ -6135,14 +6138,12 @@
61356138
/* Return a "Place" associated with element pElem. If pEdge is NULL
61366139
** return the center of the object. Otherwise, return the corner
61376140
** described by pEdge.
61386141
*/
61396142
static PPoint pik_place_of_elem(Pik *p, PElem *pElem, PToken *pEdge){
6140
- PPoint pt;
6143
+ PPoint pt = cZeroPoint;
61416144
const PClass *pClass;
6142
- pt.x = 0.0;
6143
- pt.y = 0.0;
61446145
if( pElem==0 ) return pt;
61456146
if( pEdge==0 ){
61466147
return pElem->ptAt;
61476148
}
61486149
pClass = pElem->type;
@@ -6576,11 +6577,11 @@
65766577
p->bbox.ne.y += margin + pik_value(p,"topmargin",9,0);
65776578
p->bbox.sw.x -= margin + pik_value(p,"leftmargin",10,0);
65786579
p->bbox.sw.y -= margin + pik_value(p,"bottommargin",12,0);
65796580
65806581
/* Output the SVG */
6581
- pik_append(p, "<svg",4);
6582
+ pik_append(p, "<svg xmlns='http://www.w3.org/2000/svg'",-1);
65826583
if( p->zClass ){
65836584
pik_append(p, " class=\"", -1);
65846585
pik_append(p, p->zClass, -1);
65856586
pik_append(p, "\"", 1);
65866587
}
@@ -7283,6 +7284,6 @@
72837284
}
72847285
return 0;
72857286
}
72867287
#endif /* PIKCHR_SHELL */
72877288
7288
-#line 7313 "pikchr.c"
7289
+#line 7314 "pikchr.c"
72897290
--- src/pikchr.c
+++ src/pikchr.c
@@ -200,10 +200,11 @@
200
201 /* An object to hold a position in 2-D space */
202 struct PPoint {
203 PNum x, y; /* X and Y coordinates */
204 };
 
205
206 /* A bounding box */
207 struct PBox {
208 PPoint sw, ne; /* Lower-left and top-right corners */
209 };
@@ -447,11 +448,11 @@
447 static PElem *pik_assert(Pik*,PNum,PToken*,PNum);
448 static PElem *pik_position_assert(Pik*,PPoint*,PToken*,PPoint*);
449 static PNum pik_dist(PPoint*,PPoint*);
450
451
452 #line 478 "pikchr.c"
453 /**************** End of %include directives **********************************/
454 /* These constants specify the various numeric values for terminal symbols.
455 ***************** Begin token definitions *************************************/
456 #ifndef T_ID
457 #define T_ID 1
@@ -1648,22 +1649,22 @@
1648 ** inside the C code.
1649 */
1650 /********* Begin destructor definitions ***************************************/
1651 case 95: /* element_list */
1652 {
1653 #line 467 "pikchr.y"
1654 pik_elist_free(p,(yypminor->yy56));
1655 #line 1680 "pikchr.c"
1656 }
1657 break;
1658 case 96: /* element */
1659 case 97: /* unnamed_element */
1660 case 98: /* basetype */
1661 {
1662 #line 469 "pikchr.y"
1663 pik_elem_free(p,(yypminor->yy226));
1664 #line 1689 "pikchr.c"
1665 }
1666 break;
1667 /********* End destructor definitions *****************************************/
1668 default: break; /* If no destructor action specified: do nothing */
1669 }
@@ -1877,14 +1878,14 @@
1877 #endif
1878 while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
1879 /* Here code is inserted which will execute if the parser
1880 ** stack every overflows */
1881 /******** Begin %stack_overflow code ******************************************/
1882 #line 501 "pikchr.y"
1883
1884 pik_error(p, 0, "parser stack overflow");
1885 #line 1910 "pikchr.c"
1886 /******** End %stack_overflow code ********************************************/
1887 pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
1888 pik_parserCTX_STORE
1889 }
1890
@@ -2354,603 +2355,603 @@
2354 ** break;
2355 */
2356 /********** Begin reduce actions **********************************************/
2357 YYMINORTYPE yylhsminor;
2358 case 0: /* document ::= element_list */
2359 #line 505 "pikchr.y"
2360 {pik_render(p,yymsp[0].minor.yy56);}
2361 #line 2386 "pikchr.c"
2362 break;
2363 case 1: /* element_list ::= element */
2364 #line 508 "pikchr.y"
2365 { yylhsminor.yy56 = pik_elist_append(p,0,yymsp[0].minor.yy226); }
2366 #line 2391 "pikchr.c"
2367 yymsp[0].minor.yy56 = yylhsminor.yy56;
2368 break;
2369 case 2: /* element_list ::= element_list EOL element */
2370 #line 510 "pikchr.y"
2371 { yylhsminor.yy56 = pik_elist_append(p,yymsp[-2].minor.yy56,yymsp[0].minor.yy226); }
2372 #line 2397 "pikchr.c"
2373 yymsp[-2].minor.yy56 = yylhsminor.yy56;
2374 break;
2375 case 3: /* element ::= */
2376 #line 513 "pikchr.y"
2377 { yymsp[1].minor.yy226 = 0; }
2378 #line 2403 "pikchr.c"
2379 break;
2380 case 4: /* element ::= direction */
2381 #line 514 "pikchr.y"
2382 { pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy226=0; }
2383 #line 2408 "pikchr.c"
2384 yymsp[0].minor.yy226 = yylhsminor.yy226;
2385 break;
2386 case 5: /* element ::= lvalue ASSIGN rvalue */
2387 #line 515 "pikchr.y"
2388 {pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy257,&yymsp[-1].minor.yy0); yylhsminor.yy226=0;}
2389 #line 2414 "pikchr.c"
2390 yymsp[-2].minor.yy226 = yylhsminor.yy226;
2391 break;
2392 case 6: /* element ::= PLACENAME COLON unnamed_element */
2393 #line 517 "pikchr.y"
2394 { yylhsminor.yy226 = yymsp[0].minor.yy226; pik_elem_setname(p,yymsp[0].minor.yy226,&yymsp[-2].minor.yy0); }
2395 #line 2420 "pikchr.c"
2396 yymsp[-2].minor.yy226 = yylhsminor.yy226;
2397 break;
2398 case 7: /* element ::= PLACENAME COLON position */
2399 #line 519 "pikchr.y"
2400 { yylhsminor.yy226 = pik_elem_new(p,0,0,0);
2401 if(yylhsminor.yy226){ yylhsminor.yy226->ptAt = yymsp[0].minor.yy175; pik_elem_setname(p,yylhsminor.yy226,&yymsp[-2].minor.yy0); }}
2402 #line 2427 "pikchr.c"
2403 yymsp[-2].minor.yy226 = yylhsminor.yy226;
2404 break;
2405 case 8: /* element ::= unnamed_element */
2406 #line 521 "pikchr.y"
2407 {yylhsminor.yy226 = yymsp[0].minor.yy226;}
2408 #line 2433 "pikchr.c"
2409 yymsp[0].minor.yy226 = yylhsminor.yy226;
2410 break;
2411 case 9: /* element ::= print prlist */
2412 #line 522 "pikchr.y"
2413 {pik_append(p,"<br>\n",5); yymsp[-1].minor.yy226=0;}
2414 #line 2439 "pikchr.c"
2415 break;
2416 case 10: /* element ::= ASSERT LP expr EQ expr RP */
2417 #line 527 "pikchr.y"
2418 {yymsp[-5].minor.yy226=pik_assert(p,yymsp[-3].minor.yy257,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy257);}
2419 #line 2444 "pikchr.c"
2420 break;
2421 case 11: /* element ::= ASSERT LP position EQ position RP */
2422 #line 529 "pikchr.y"
2423 {yymsp[-5].minor.yy226=pik_position_assert(p,&yymsp[-3].minor.yy175,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy175);}
2424 #line 2449 "pikchr.c"
2425 break;
2426 case 12: /* rvalue ::= PLACENAME */
2427 #line 540 "pikchr.y"
2428 {yylhsminor.yy257 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2429 #line 2454 "pikchr.c"
2430 yymsp[0].minor.yy257 = yylhsminor.yy257;
2431 break;
2432 case 13: /* pritem ::= FILL */
2433 case 14: /* pritem ::= COLOR */ yytestcase(yyruleno==14);
2434 case 15: /* pritem ::= THICKNESS */ yytestcase(yyruleno==15);
2435 #line 545 "pikchr.y"
2436 {pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2437 #line 2462 "pikchr.c"
2438 break;
2439 case 16: /* pritem ::= rvalue */
2440 #line 548 "pikchr.y"
2441 {pik_append_num(p,"",yymsp[0].minor.yy257);}
2442 #line 2467 "pikchr.c"
2443 break;
2444 case 17: /* pritem ::= STRING */
2445 #line 549 "pikchr.y"
2446 {pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2447 #line 2472 "pikchr.c"
2448 break;
2449 case 18: /* prsep ::= COMMA */
2450 #line 550 "pikchr.y"
2451 {pik_append(p, " ", 1);}
2452 #line 2477 "pikchr.c"
2453 break;
2454 case 19: /* unnamed_element ::= basetype attribute_list */
2455 #line 553 "pikchr.y"
2456 {yylhsminor.yy226 = yymsp[-1].minor.yy226; pik_after_adding_attributes(p,yylhsminor.yy226);}
2457 #line 2482 "pikchr.c"
2458 yymsp[-1].minor.yy226 = yylhsminor.yy226;
2459 break;
2460 case 20: /* basetype ::= CLASSNAME */
2461 #line 555 "pikchr.y"
2462 {yylhsminor.yy226 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2463 #line 2488 "pikchr.c"
2464 yymsp[0].minor.yy226 = yylhsminor.yy226;
2465 break;
2466 case 21: /* basetype ::= STRING textposition */
2467 #line 557 "pikchr.y"
2468 {yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy116; yylhsminor.yy226 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2469 #line 2494 "pikchr.c"
2470 yymsp[-1].minor.yy226 = yylhsminor.yy226;
2471 break;
2472 case 22: /* basetype ::= LB savelist element_list RB */
2473 #line 559 "pikchr.y"
2474 { p->list = yymsp[-2].minor.yy56; yymsp[-3].minor.yy226 = pik_elem_new(p,0,0,yymsp[-1].minor.yy56); if(yymsp[-3].minor.yy226) yymsp[-3].minor.yy226->errTok = yymsp[0].minor.yy0; }
2475 #line 2500 "pikchr.c"
2476 break;
2477 case 23: /* savelist ::= */
2478 #line 564 "pikchr.y"
2479 {yymsp[1].minor.yy56 = p->list; p->list = 0;}
2480 #line 2505 "pikchr.c"
2481 break;
2482 case 24: /* relexpr ::= expr */
2483 #line 571 "pikchr.y"
2484 {yylhsminor.yy164.rAbs = yymsp[0].minor.yy257; yylhsminor.yy164.rRel = 0;}
2485 #line 2510 "pikchr.c"
2486 yymsp[0].minor.yy164 = yylhsminor.yy164;
2487 break;
2488 case 25: /* relexpr ::= expr PERCENT */
2489 #line 572 "pikchr.y"
2490 {yylhsminor.yy164.rAbs = 0; yylhsminor.yy164.rRel = yymsp[-1].minor.yy257/100;}
2491 #line 2516 "pikchr.c"
2492 yymsp[-1].minor.yy164 = yylhsminor.yy164;
2493 break;
2494 case 26: /* optrelexpr ::= */
2495 #line 574 "pikchr.y"
2496 {yymsp[1].minor.yy164.rAbs = 0; yymsp[1].minor.yy164.rRel = 1.0;}
2497 #line 2522 "pikchr.c"
2498 break;
2499 case 27: /* attribute_list ::= relexpr alist */
2500 #line 576 "pikchr.y"
2501 {pik_add_direction(p,0,&yymsp[-1].minor.yy164);}
2502 #line 2527 "pikchr.c"
2503 break;
2504 case 28: /* attribute ::= numproperty relexpr */
2505 #line 580 "pikchr.y"
2506 { pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy164); }
2507 #line 2532 "pikchr.c"
2508 break;
2509 case 29: /* attribute ::= dashproperty expr */
2510 #line 581 "pikchr.y"
2511 { pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy257); }
2512 #line 2537 "pikchr.c"
2513 break;
2514 case 30: /* attribute ::= dashproperty */
2515 #line 582 "pikchr.y"
2516 { pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2517 #line 2542 "pikchr.c"
2518 break;
2519 case 31: /* attribute ::= colorproperty rvalue */
2520 #line 583 "pikchr.y"
2521 { pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy257); }
2522 #line 2547 "pikchr.c"
2523 break;
2524 case 32: /* attribute ::= go direction optrelexpr */
2525 #line 584 "pikchr.y"
2526 { pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy164);}
2527 #line 2552 "pikchr.c"
2528 break;
2529 case 33: /* attribute ::= go direction even position */
2530 #line 585 "pikchr.y"
2531 {pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy175);}
2532 #line 2557 "pikchr.c"
2533 break;
2534 case 34: /* attribute ::= CLOSE */
2535 #line 586 "pikchr.y"
2536 { pik_close_path(p,&yymsp[0].minor.yy0); }
2537 #line 2562 "pikchr.c"
2538 break;
2539 case 35: /* attribute ::= CHOP */
2540 #line 587 "pikchr.y"
2541 { p->cur->bChop = 1; }
2542 #line 2567 "pikchr.c"
2543 break;
2544 case 36: /* attribute ::= FROM position */
2545 #line 588 "pikchr.y"
2546 { pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy175); }
2547 #line 2572 "pikchr.c"
2548 break;
2549 case 37: /* attribute ::= TO position */
2550 #line 589 "pikchr.y"
2551 { pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy175); }
2552 #line 2577 "pikchr.c"
2553 break;
2554 case 38: /* attribute ::= THEN */
2555 #line 590 "pikchr.y"
2556 { pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2557 #line 2582 "pikchr.c"
2558 break;
2559 case 39: /* attribute ::= THEN optrelexpr HEADING expr */
2560 case 41: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==41);
2561 #line 592 "pikchr.y"
2562 {pik_move_hdg(p,&yymsp[-2].minor.yy164,&yymsp[-1].minor.yy0,yymsp[0].minor.yy257,0,&yymsp[-3].minor.yy0);}
2563 #line 2588 "pikchr.c"
2564 break;
2565 case 40: /* attribute ::= THEN optrelexpr EDGEPT */
2566 case 42: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==42);
2567 #line 593 "pikchr.y"
2568 {pik_move_hdg(p,&yymsp[-1].minor.yy164,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2569 #line 2594 "pikchr.c"
2570 break;
2571 case 43: /* attribute ::= AT position */
2572 #line 598 "pikchr.y"
2573 { pik_set_at(p,0,&yymsp[0].minor.yy175,&yymsp[-1].minor.yy0); }
2574 #line 2599 "pikchr.c"
2575 break;
2576 case 44: /* attribute ::= SAME */
2577 #line 600 "pikchr.y"
2578 {pik_same(p,0,&yymsp[0].minor.yy0);}
2579 #line 2604 "pikchr.c"
2580 break;
2581 case 45: /* attribute ::= SAME AS object */
2582 #line 601 "pikchr.y"
2583 {pik_same(p,yymsp[0].minor.yy226,&yymsp[-2].minor.yy0);}
2584 #line 2609 "pikchr.c"
2585 break;
2586 case 46: /* attribute ::= STRING textposition */
2587 #line 602 "pikchr.y"
2588 {pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy116);}
2589 #line 2614 "pikchr.c"
2590 break;
2591 case 47: /* attribute ::= FIT */
2592 #line 603 "pikchr.y"
2593 {pik_size_to_fit(p,&yymsp[0].minor.yy0); }
2594 #line 2619 "pikchr.c"
2595 break;
2596 case 48: /* attribute ::= BEHIND object */
2597 #line 604 "pikchr.y"
2598 {pik_behind(p,yymsp[0].minor.yy226);}
2599 #line 2624 "pikchr.c"
2600 break;
2601 case 49: /* withclause ::= DOT_E edge AT position */
2602 case 50: /* withclause ::= edge AT position */ yytestcase(yyruleno==50);
2603 #line 612 "pikchr.y"
2604 { pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy175,&yymsp[-1].minor.yy0); }
2605 #line 2630 "pikchr.c"
2606 break;
2607 case 51: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2608 #line 616 "pikchr.y"
2609 {yylhsminor.yy0 = yymsp[0].minor.yy0;}
2610 #line 2635 "pikchr.c"
2611 yymsp[0].minor.yy0 = yylhsminor.yy0;
2612 break;
2613 case 52: /* boolproperty ::= CW */
2614 #line 627 "pikchr.y"
2615 {p->cur->cw = 1;}
2616 #line 2641 "pikchr.c"
2617 break;
2618 case 53: /* boolproperty ::= CCW */
2619 #line 628 "pikchr.y"
2620 {p->cur->cw = 0;}
2621 #line 2646 "pikchr.c"
2622 break;
2623 case 54: /* boolproperty ::= LARROW */
2624 #line 629 "pikchr.y"
2625 {p->cur->larrow=1; p->cur->rarrow=0; }
2626 #line 2651 "pikchr.c"
2627 break;
2628 case 55: /* boolproperty ::= RARROW */
2629 #line 630 "pikchr.y"
2630 {p->cur->larrow=0; p->cur->rarrow=1; }
2631 #line 2656 "pikchr.c"
2632 break;
2633 case 56: /* boolproperty ::= LRARROW */
2634 #line 631 "pikchr.y"
2635 {p->cur->larrow=1; p->cur->rarrow=1; }
2636 #line 2661 "pikchr.c"
2637 break;
2638 case 57: /* boolproperty ::= INVIS */
2639 #line 632 "pikchr.y"
2640 {p->cur->sw = 0.0;}
2641 #line 2666 "pikchr.c"
2642 break;
2643 case 58: /* boolproperty ::= THICK */
2644 #line 633 "pikchr.y"
2645 {p->cur->sw *= 1.5;}
2646 #line 2671 "pikchr.c"
2647 break;
2648 case 59: /* boolproperty ::= THIN */
2649 #line 634 "pikchr.y"
2650 {p->cur->sw *= 0.67;}
2651 #line 2676 "pikchr.c"
2652 break;
2653 case 60: /* textposition ::= */
2654 #line 636 "pikchr.y"
2655 {yymsp[1].minor.yy116 = 0;}
2656 #line 2681 "pikchr.c"
2657 break;
2658 case 61: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2659 #line 639 "pikchr.y"
2660 {yylhsminor.yy116 = pik_text_position(yymsp[-1].minor.yy116,&yymsp[0].minor.yy0);}
2661 #line 2686 "pikchr.c"
2662 yymsp[-1].minor.yy116 = yylhsminor.yy116;
2663 break;
2664 case 62: /* position ::= expr COMMA expr */
2665 #line 642 "pikchr.y"
2666 {yylhsminor.yy175.x=yymsp[-2].minor.yy257; yylhsminor.yy175.y=yymsp[0].minor.yy257;}
2667 #line 2692 "pikchr.c"
2668 yymsp[-2].minor.yy175 = yylhsminor.yy175;
2669 break;
2670 case 63: /* position ::= place PLUS expr COMMA expr */
2671 #line 644 "pikchr.y"
2672 {yylhsminor.yy175.x=yymsp[-4].minor.yy175.x+yymsp[-2].minor.yy257; yylhsminor.yy175.y=yymsp[-4].minor.yy175.y+yymsp[0].minor.yy257;}
2673 #line 2698 "pikchr.c"
2674 yymsp[-4].minor.yy175 = yylhsminor.yy175;
2675 break;
2676 case 64: /* position ::= place MINUS expr COMMA expr */
2677 #line 645 "pikchr.y"
2678 {yylhsminor.yy175.x=yymsp[-4].minor.yy175.x-yymsp[-2].minor.yy257; yylhsminor.yy175.y=yymsp[-4].minor.yy175.y-yymsp[0].minor.yy257;}
2679 #line 2704 "pikchr.c"
2680 yymsp[-4].minor.yy175 = yylhsminor.yy175;
2681 break;
2682 case 65: /* position ::= place PLUS LP expr COMMA expr RP */
2683 #line 647 "pikchr.y"
2684 {yylhsminor.yy175.x=yymsp[-6].minor.yy175.x+yymsp[-3].minor.yy257; yylhsminor.yy175.y=yymsp[-6].minor.yy175.y+yymsp[-1].minor.yy257;}
2685 #line 2710 "pikchr.c"
2686 yymsp[-6].minor.yy175 = yylhsminor.yy175;
2687 break;
2688 case 66: /* position ::= place MINUS LP expr COMMA expr RP */
2689 #line 649 "pikchr.y"
2690 {yylhsminor.yy175.x=yymsp[-6].minor.yy175.x-yymsp[-3].minor.yy257; yylhsminor.yy175.y=yymsp[-6].minor.yy175.y-yymsp[-1].minor.yy257;}
2691 #line 2716 "pikchr.c"
2692 yymsp[-6].minor.yy175 = yylhsminor.yy175;
2693 break;
2694 case 67: /* position ::= LP position COMMA position RP */
2695 #line 650 "pikchr.y"
2696 {yymsp[-4].minor.yy175.x=yymsp[-3].minor.yy175.x; yymsp[-4].minor.yy175.y=yymsp[-1].minor.yy175.y;}
2697 #line 2722 "pikchr.c"
2698 break;
2699 case 68: /* position ::= LP position RP */
2700 #line 651 "pikchr.y"
2701 {yymsp[-2].minor.yy175=yymsp[-1].minor.yy175;}
2702 #line 2727 "pikchr.c"
2703 break;
2704 case 69: /* position ::= expr between position AND position */
2705 #line 653 "pikchr.y"
2706 {yylhsminor.yy175 = pik_position_between(yymsp[-4].minor.yy257,yymsp[-2].minor.yy175,yymsp[0].minor.yy175);}
2707 #line 2732 "pikchr.c"
2708 yymsp[-4].minor.yy175 = yylhsminor.yy175;
2709 break;
2710 case 70: /* position ::= expr LT position COMMA position GT */
2711 #line 655 "pikchr.y"
2712 {yylhsminor.yy175 = pik_position_between(yymsp[-5].minor.yy257,yymsp[-3].minor.yy175,yymsp[-1].minor.yy175);}
2713 #line 2738 "pikchr.c"
2714 yymsp[-5].minor.yy175 = yylhsminor.yy175;
2715 break;
2716 case 71: /* position ::= expr ABOVE position */
2717 #line 656 "pikchr.y"
2718 {yylhsminor.yy175=yymsp[0].minor.yy175; yylhsminor.yy175.y += yymsp[-2].minor.yy257;}
2719 #line 2744 "pikchr.c"
2720 yymsp[-2].minor.yy175 = yylhsminor.yy175;
2721 break;
2722 case 72: /* position ::= expr BELOW position */
2723 #line 657 "pikchr.y"
2724 {yylhsminor.yy175=yymsp[0].minor.yy175; yylhsminor.yy175.y -= yymsp[-2].minor.yy257;}
2725 #line 2750 "pikchr.c"
2726 yymsp[-2].minor.yy175 = yylhsminor.yy175;
2727 break;
2728 case 73: /* position ::= expr LEFT OF position */
2729 #line 658 "pikchr.y"
2730 {yylhsminor.yy175=yymsp[0].minor.yy175; yylhsminor.yy175.x -= yymsp[-3].minor.yy257;}
2731 #line 2756 "pikchr.c"
2732 yymsp[-3].minor.yy175 = yylhsminor.yy175;
2733 break;
2734 case 74: /* position ::= expr RIGHT OF position */
2735 #line 659 "pikchr.y"
2736 {yylhsminor.yy175=yymsp[0].minor.yy175; yylhsminor.yy175.x += yymsp[-3].minor.yy257;}
2737 #line 2762 "pikchr.c"
2738 yymsp[-3].minor.yy175 = yylhsminor.yy175;
2739 break;
2740 case 75: /* position ::= expr ON HEADING EDGEPT OF position */
2741 #line 661 "pikchr.y"
2742 {yylhsminor.yy175 = pik_position_at_hdg(yymsp[-5].minor.yy257,&yymsp[-2].minor.yy0,yymsp[0].minor.yy175);}
2743 #line 2768 "pikchr.c"
2744 yymsp[-5].minor.yy175 = yylhsminor.yy175;
2745 break;
2746 case 76: /* position ::= expr HEADING EDGEPT OF position */
2747 #line 663 "pikchr.y"
2748 {yylhsminor.yy175 = pik_position_at_hdg(yymsp[-4].minor.yy257,&yymsp[-2].minor.yy0,yymsp[0].minor.yy175);}
2749 #line 2774 "pikchr.c"
2750 yymsp[-4].minor.yy175 = yylhsminor.yy175;
2751 break;
2752 case 77: /* position ::= expr EDGEPT OF position */
2753 #line 665 "pikchr.y"
2754 {yylhsminor.yy175 = pik_position_at_hdg(yymsp[-3].minor.yy257,&yymsp[-2].minor.yy0,yymsp[0].minor.yy175);}
2755 #line 2780 "pikchr.c"
2756 yymsp[-3].minor.yy175 = yylhsminor.yy175;
2757 break;
2758 case 78: /* position ::= expr ON HEADING expr FROM position */
2759 #line 667 "pikchr.y"
2760 {yylhsminor.yy175 = pik_position_at_angle(yymsp[-5].minor.yy257,yymsp[-2].minor.yy257,yymsp[0].minor.yy175);}
2761 #line 2786 "pikchr.c"
2762 yymsp[-5].minor.yy175 = yylhsminor.yy175;
2763 break;
2764 case 79: /* position ::= expr HEADING expr FROM position */
2765 #line 669 "pikchr.y"
2766 {yylhsminor.yy175 = pik_position_at_angle(yymsp[-4].minor.yy257,yymsp[-2].minor.yy257,yymsp[0].minor.yy175);}
2767 #line 2792 "pikchr.c"
2768 yymsp[-4].minor.yy175 = yylhsminor.yy175;
2769 break;
2770 case 80: /* place ::= edge OF object */
2771 #line 681 "pikchr.y"
2772 {yylhsminor.yy175 = pik_place_of_elem(p,yymsp[0].minor.yy226,&yymsp[-2].minor.yy0);}
2773 #line 2798 "pikchr.c"
2774 yymsp[-2].minor.yy175 = yylhsminor.yy175;
2775 break;
2776 case 81: /* place2 ::= object */
2777 #line 682 "pikchr.y"
2778 {yylhsminor.yy175 = pik_place_of_elem(p,yymsp[0].minor.yy226,0);}
2779 #line 2804 "pikchr.c"
2780 yymsp[0].minor.yy175 = yylhsminor.yy175;
2781 break;
2782 case 82: /* place2 ::= object DOT_E edge */
2783 #line 683 "pikchr.y"
2784 {yylhsminor.yy175 = pik_place_of_elem(p,yymsp[-2].minor.yy226,&yymsp[0].minor.yy0);}
2785 #line 2810 "pikchr.c"
2786 yymsp[-2].minor.yy175 = yylhsminor.yy175;
2787 break;
2788 case 83: /* place2 ::= NTH VERTEX OF object */
2789 #line 684 "pikchr.y"
2790 {yylhsminor.yy175 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy226);}
2791 #line 2816 "pikchr.c"
2792 yymsp[-3].minor.yy175 = yylhsminor.yy175;
2793 break;
2794 case 84: /* object ::= nth */
2795 #line 696 "pikchr.y"
2796 {yylhsminor.yy226 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2797 #line 2822 "pikchr.c"
2798 yymsp[0].minor.yy226 = yylhsminor.yy226;
2799 break;
2800 case 85: /* object ::= nth OF|IN object */
2801 #line 697 "pikchr.y"
2802 {yylhsminor.yy226 = pik_find_nth(p,yymsp[0].minor.yy226,&yymsp[-2].minor.yy0);}
2803 #line 2828 "pikchr.c"
2804 yymsp[-2].minor.yy226 = yylhsminor.yy226;
2805 break;
2806 case 86: /* objectname ::= PLACENAME */
2807 #line 699 "pikchr.y"
2808 {yylhsminor.yy226 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2809 #line 2834 "pikchr.c"
2810 yymsp[0].minor.yy226 = yylhsminor.yy226;
2811 break;
2812 case 87: /* objectname ::= objectname DOT_U PLACENAME */
2813 #line 701 "pikchr.y"
2814 {yylhsminor.yy226 = pik_find_byname(p,yymsp[-2].minor.yy226,&yymsp[0].minor.yy0);}
2815 #line 2840 "pikchr.c"
2816 yymsp[-2].minor.yy226 = yylhsminor.yy226;
2817 break;
2818 case 88: /* nth ::= NTH CLASSNAME */
2819 #line 703 "pikchr.y"
2820 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2821 #line 2846 "pikchr.c"
2822 yymsp[-1].minor.yy0 = yylhsminor.yy0;
2823 break;
2824 case 89: /* nth ::= NTH LAST CLASSNAME */
2825 #line 704 "pikchr.y"
2826 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2827 #line 2852 "pikchr.c"
2828 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2829 break;
2830 case 90: /* nth ::= LAST CLASSNAME */
2831 #line 705 "pikchr.y"
2832 {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2833 #line 2858 "pikchr.c"
2834 break;
2835 case 91: /* nth ::= LAST */
2836 #line 706 "pikchr.y"
2837 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2838 #line 2863 "pikchr.c"
2839 yymsp[0].minor.yy0 = yylhsminor.yy0;
2840 break;
2841 case 92: /* nth ::= NTH LB RB */
2842 #line 707 "pikchr.y"
2843 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2844 #line 2869 "pikchr.c"
2845 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2846 break;
2847 case 93: /* nth ::= NTH LAST LB RB */
2848 #line 708 "pikchr.y"
2849 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2850 #line 2875 "pikchr.c"
2851 yymsp[-3].minor.yy0 = yylhsminor.yy0;
2852 break;
2853 case 94: /* nth ::= LAST LB RB */
2854 #line 709 "pikchr.y"
2855 {yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2856 #line 2881 "pikchr.c"
2857 break;
2858 case 95: /* expr ::= expr PLUS expr */
2859 #line 711 "pikchr.y"
2860 {yylhsminor.yy257=yymsp[-2].minor.yy257+yymsp[0].minor.yy257;}
2861 #line 2886 "pikchr.c"
2862 yymsp[-2].minor.yy257 = yylhsminor.yy257;
2863 break;
2864 case 96: /* expr ::= expr MINUS expr */
2865 #line 712 "pikchr.y"
2866 {yylhsminor.yy257=yymsp[-2].minor.yy257-yymsp[0].minor.yy257;}
2867 #line 2892 "pikchr.c"
2868 yymsp[-2].minor.yy257 = yylhsminor.yy257;
2869 break;
2870 case 97: /* expr ::= expr STAR expr */
2871 #line 713 "pikchr.y"
2872 {yylhsminor.yy257=yymsp[-2].minor.yy257*yymsp[0].minor.yy257;}
2873 #line 2898 "pikchr.c"
2874 yymsp[-2].minor.yy257 = yylhsminor.yy257;
2875 break;
2876 case 98: /* expr ::= expr SLASH expr */
2877 #line 714 "pikchr.y"
2878 {
2879 if( yymsp[0].minor.yy257==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy257 = 0.0; }
2880 else{ yylhsminor.yy257 = yymsp[-2].minor.yy257/yymsp[0].minor.yy257; }
2881 }
2882 #line 2907 "pikchr.c"
2883 yymsp[-2].minor.yy257 = yylhsminor.yy257;
2884 break;
2885 case 99: /* expr ::= MINUS expr */
2886 #line 718 "pikchr.y"
2887 {yymsp[-1].minor.yy257=-yymsp[0].minor.yy257;}
2888 #line 2913 "pikchr.c"
2889 break;
2890 case 100: /* expr ::= PLUS expr */
2891 #line 719 "pikchr.y"
2892 {yymsp[-1].minor.yy257=yymsp[0].minor.yy257;}
2893 #line 2918 "pikchr.c"
2894 break;
2895 case 101: /* expr ::= LP expr RP */
2896 #line 720 "pikchr.y"
2897 {yymsp[-2].minor.yy257=yymsp[-1].minor.yy257;}
2898 #line 2923 "pikchr.c"
2899 break;
2900 case 102: /* expr ::= LP FILL|COLOR|THICKNESS RP */
2901 #line 721 "pikchr.y"
2902 {yymsp[-2].minor.yy257=pik_get_var(p,&yymsp[-1].minor.yy0);}
2903 #line 2928 "pikchr.c"
2904 break;
2905 case 103: /* expr ::= NUMBER */
2906 #line 722 "pikchr.y"
2907 {yylhsminor.yy257=pik_atof(&yymsp[0].minor.yy0);}
2908 #line 2933 "pikchr.c"
2909 yymsp[0].minor.yy257 = yylhsminor.yy257;
2910 break;
2911 case 104: /* expr ::= ID */
2912 #line 723 "pikchr.y"
2913 {yylhsminor.yy257=pik_get_var(p,&yymsp[0].minor.yy0);}
2914 #line 2939 "pikchr.c"
2915 yymsp[0].minor.yy257 = yylhsminor.yy257;
2916 break;
2917 case 105: /* expr ::= FUNC1 LP expr RP */
2918 #line 724 "pikchr.y"
2919 {yylhsminor.yy257 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy257,0.0);}
2920 #line 2945 "pikchr.c"
2921 yymsp[-3].minor.yy257 = yylhsminor.yy257;
2922 break;
2923 case 106: /* expr ::= FUNC2 LP expr COMMA expr RP */
2924 #line 725 "pikchr.y"
2925 {yylhsminor.yy257 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy257,yymsp[-1].minor.yy257);}
2926 #line 2951 "pikchr.c"
2927 yymsp[-5].minor.yy257 = yylhsminor.yy257;
2928 break;
2929 case 107: /* expr ::= DIST LP position COMMA position RP */
2930 #line 726 "pikchr.y"
2931 {yymsp[-5].minor.yy257 = pik_dist(&yymsp[-3].minor.yy175,&yymsp[-1].minor.yy175);}
2932 #line 2957 "pikchr.c"
2933 break;
2934 case 108: /* expr ::= place2 DOT_XY X */
2935 #line 727 "pikchr.y"
2936 {yylhsminor.yy257 = yymsp[-2].minor.yy175.x;}
2937 #line 2962 "pikchr.c"
2938 yymsp[-2].minor.yy257 = yylhsminor.yy257;
2939 break;
2940 case 109: /* expr ::= place2 DOT_XY Y */
2941 #line 728 "pikchr.y"
2942 {yylhsminor.yy257 = yymsp[-2].minor.yy175.y;}
2943 #line 2968 "pikchr.c"
2944 yymsp[-2].minor.yy257 = yylhsminor.yy257;
2945 break;
2946 case 110: /* expr ::= object DOT_L numproperty */
2947 case 111: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==111);
2948 case 112: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==112);
2949 #line 729 "pikchr.y"
2950 {yylhsminor.yy257=pik_property_of(yymsp[-2].minor.yy226,&yymsp[0].minor.yy0);}
2951 #line 2976 "pikchr.c"
2952 yymsp[-2].minor.yy257 = yylhsminor.yy257;
2953 break;
2954 default:
2955 /* (113) lvalue ::= ID */ yytestcase(yyruleno==113);
2956 /* (114) lvalue ::= FILL */ yytestcase(yyruleno==114);
@@ -3049,19 +3050,19 @@
3049 ){
3050 pik_parserARG_FETCH
3051 pik_parserCTX_FETCH
3052 #define TOKEN yyminor
3053 /************ Begin %syntax_error code ****************************************/
3054 #line 493 "pikchr.y"
3055
3056 if( TOKEN.z && TOKEN.z[0] ){
3057 pik_error(p, &TOKEN, "syntax error");
3058 }else{
3059 pik_error(p, 0, "syntax error");
3060 }
3061 UNUSED_PARAMETER(yymajor);
3062 #line 3087 "pikchr.c"
3063 /************ End %syntax_error code ******************************************/
3064 pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
3065 pik_parserCTX_STORE
3066 }
3067
@@ -3290,11 +3291,11 @@
3290 #else
3291 (void)iToken;
3292 return 0;
3293 #endif
3294 }
3295 #line 734 "pikchr.y"
3296
3297
3298
3299 /* Chart of the 140 official HTML color names with their
3300 ** corresponding RGB value.
@@ -3573,11 +3574,11 @@
3573 pElem->rad = pik_value(p, "boxrad",6,0);
3574 }
3575 /* Return offset from the center of the box to the compass point
3576 ** given by parameter cp */
3577 static PPoint boxOffset(Pik *p, PElem *pElem, int cp){
3578 PPoint pt;
3579 PNum w2 = 0.5*pElem->w;
3580 PNum h2 = 0.5*pElem->h;
3581 PNum rad = pElem->rad;
3582 PNum rx;
3583 if( rad<=0.0 ){
@@ -3585,21 +3586,21 @@
3585 }else{
3586 if( rad>w2 ) rad = w2;
3587 if( rad>h2 ) rad = h2;
3588 rx = 0.29289321881345252392*rad;
3589 }
3590 pt.x = pt.y = 0.0;
3591 switch( cp ){
3592 case CP_C: pt.x = 0.0; pt.y = 0.0; break;
3593 case CP_N: pt.x = 0.0; pt.y = h2; break;
3594 case CP_NE: pt.x = w2-rx; pt.y = h2-rx; break;
3595 case CP_E: pt.x = w2; pt.y = 0.0; break;
3596 case CP_SE: pt.x = w2-rx; pt.y = rx-h2; break;
3597 case CP_S: pt.x = 0.0; pt.y = -h2; break;
3598 case CP_SW: pt.x = rx-w2; pt.y = rx-h2; break;
3599 case CP_W: pt.x = -w2; pt.y = 0.0; break;
3600 case CP_NW: pt.x = rx-w2; pt.y = h2-rx; break;
 
3601 }
3602 UNUSED_PARAMETER(p);
3603 return pt;
3604 }
3605 static PPoint boxChop(Pik *p, PElem *pElem, PPoint *pPt){
@@ -3789,24 +3790,25 @@
3789 pik_append(p,"\" />\n", -1);
3790 }
3791 pik_append_txt(p, pElem, 0);
3792 }
3793 static PPoint cylinderOffset(Pik *p, PElem *pElem, int cp){
3794 PPoint pt;
3795 PNum w2 = pElem->w*0.5;
3796 PNum h1 = pElem->h*0.5;
3797 PNum h2 = h1 - pElem->rad;
3798 switch( cp ){
3799 case CP_C: pt.x = 0.0; pt.y = 0.0; break;
3800 case CP_N: pt.x = 0.0; pt.y = h1; break;
3801 case CP_NE: pt.x = w2; pt.y = h2; break;
3802 case CP_E: pt.x = w2; pt.y = 0.0; break;
3803 case CP_SE: pt.x = w2; pt.y = -h2; break;
3804 case CP_S: pt.x = 0.0; pt.y = -h1; break;
3805 case CP_SW: pt.x = -w2; pt.y = -h2; break;
3806 case CP_W: pt.x = -w2; pt.y = 0.0; break;
3807 case CP_NW: pt.x = -w2; pt.y = h2; break;
 
3808 }
3809 UNUSED_PARAMETER(p);
3810 return pt;
3811 }
3812
@@ -3832,16 +3834,14 @@
3832 pik_bbox_addellipse(&pElem->bbox, pElem->ptAt.x, pElem->ptAt.y,
3833 pElem->rad, pElem->rad);
3834 UNUSED_PARAMETER(p);
3835 }
3836 static PPoint dotOffset(Pik *p, PElem *pElem, int cp){
3837 PPoint zero;
3838 zero.x = zero.y = 0;
3839 UNUSED_PARAMETER(p);
3840 UNUSED_PARAMETER(pElem);
3841 UNUSED_PARAMETER(cp);
3842 return zero;
3843 }
3844 static void dotRender(Pik *p, PElem *pElem){
3845 PNum r = pElem->rad;
3846 PPoint pt = pElem->ptAt;
3847 if( pElem->sw>0.0 ){
@@ -3876,25 +3876,26 @@
3876 chop.y = pElem->ptAt.y + 0.5*dy*pElem->h/dist;
3877 UNUSED_PARAMETER(p);
3878 return chop;
3879 }
3880 static PPoint ellipseOffset(Pik *p, PElem *pElem, int cp){
3881 PPoint pt;
3882 PNum w = pElem->w*0.5;
3883 PNum w2 = w*0.70710678118654747608;
3884 PNum h = pElem->h*0.5;
3885 PNum h2 = h*0.70710678118654747608;
3886 switch( cp ){
3887 case CP_C: pt.x = 0.0; pt.y = 0.0; break;
3888 case CP_N: pt.x = 0.0; pt.y = h; break;
3889 case CP_NE: pt.x = w2; pt.y = h2; break;
3890 case CP_E: pt.x = w; pt.y = 0.0; break;
3891 case CP_SE: pt.x = w2; pt.y = -h2; break;
3892 case CP_S: pt.x = 0.0; pt.y = -h; break;
3893 case CP_SW: pt.x = -w2; pt.y = -h2; break;
3894 case CP_W: pt.x = -w; pt.y = 0.0; break;
3895 case CP_NW: pt.x = -w2; pt.y = h2; break;
 
3896 }
3897 UNUSED_PARAMETER(p);
3898 return pt;
3899 }
3900 static void ellipseRender(Pik *p, PElem *pElem){
@@ -3919,29 +3920,30 @@
3919 pElem->rad = pik_value(p, "filerad",7,0);
3920 }
3921 /* Return offset from the center of the file to the compass point
3922 ** given by parameter cp */
3923 static PPoint fileOffset(Pik *p, PElem *pElem, int cp){
3924 PPoint pt;
3925 PNum w2 = 0.5*pElem->w;
3926 PNum h2 = 0.5*pElem->h;
3927 PNum rx = pElem->rad;
3928 PNum mn = w2<h2 ? w2 : h2;
3929 if( rx>mn ) rx = mn;
3930 if( rx<mn*0.25 ) rx = mn*0.25;
3931 pt.x = pt.y = 0.0;
3932 rx *= 0.5;
3933 switch( cp ){
3934 case CP_C: pt.x = 0.0; pt.y = 0.0; break;
3935 case CP_N: pt.x = 0.0; pt.y = h2; break;
3936 case CP_NE: pt.x = w2-rx; pt.y = h2-rx; break;
3937 case CP_E: pt.x = w2; pt.y = 0.0; break;
3938 case CP_SE: pt.x = w2; pt.y = -h2; break;
3939 case CP_S: pt.x = 0.0; pt.y = -h2; break;
3940 case CP_SW: pt.x = -w2; pt.y = -h2; break;
3941 case CP_W: pt.x = -w2; pt.y = 0.0; break;
3942 case CP_NW: pt.x = -w2; pt.y = h2; break;
 
3943 }
3944 UNUSED_PARAMETER(p);
3945 return pt;
3946 }
3947 static void fileFit(Pik *p, PElem *pElem, PNum w, PNum h){
@@ -5086,10 +5088,11 @@
5086 p->cur = pNew;
5087 p->nTPath = 1;
5088 p->thenFlag = 0;
5089 if( p->list==0 || p->list->n==0 ){
5090 pNew->ptAt.x = pNew->ptAt.y = 0.0;
 
5091 }else{
5092 PElem *pPrior = p->list->a[p->list->n-1];
5093 pNew->ptAt = pPrior->ptExit;
5094 switch( p->eDir ){
5095 default: pNew->eWith = CP_W; break;
@@ -6135,14 +6138,12 @@
6135 /* Return a "Place" associated with element pElem. If pEdge is NULL
6136 ** return the center of the object. Otherwise, return the corner
6137 ** described by pEdge.
6138 */
6139 static PPoint pik_place_of_elem(Pik *p, PElem *pElem, PToken *pEdge){
6140 PPoint pt;
6141 const PClass *pClass;
6142 pt.x = 0.0;
6143 pt.y = 0.0;
6144 if( pElem==0 ) return pt;
6145 if( pEdge==0 ){
6146 return pElem->ptAt;
6147 }
6148 pClass = pElem->type;
@@ -6576,11 +6577,11 @@
6576 p->bbox.ne.y += margin + pik_value(p,"topmargin",9,0);
6577 p->bbox.sw.x -= margin + pik_value(p,"leftmargin",10,0);
6578 p->bbox.sw.y -= margin + pik_value(p,"bottommargin",12,0);
6579
6580 /* Output the SVG */
6581 pik_append(p, "<svg",4);
6582 if( p->zClass ){
6583 pik_append(p, " class=\"", -1);
6584 pik_append(p, p->zClass, -1);
6585 pik_append(p, "\"", 1);
6586 }
@@ -7283,6 +7284,6 @@
7283 }
7284 return 0;
7285 }
7286 #endif /* PIKCHR_SHELL */
7287
7288 #line 7313 "pikchr.c"
7289
--- src/pikchr.c
+++ src/pikchr.c
@@ -200,10 +200,11 @@
200
201 /* An object to hold a position in 2-D space */
202 struct PPoint {
203 PNum x, y; /* X and Y coordinates */
204 };
205 static const PPoint cZeroPoint = {0.0,0.0};
206
207 /* A bounding box */
208 struct PBox {
209 PPoint sw, ne; /* Lower-left and top-right corners */
210 };
@@ -447,11 +448,11 @@
448 static PElem *pik_assert(Pik*,PNum,PToken*,PNum);
449 static PElem *pik_position_assert(Pik*,PPoint*,PToken*,PPoint*);
450 static PNum pik_dist(PPoint*,PPoint*);
451
452
453 #line 479 "pikchr.c"
454 /**************** End of %include directives **********************************/
455 /* These constants specify the various numeric values for terminal symbols.
456 ***************** Begin token definitions *************************************/
457 #ifndef T_ID
458 #define T_ID 1
@@ -1648,22 +1649,22 @@
1649 ** inside the C code.
1650 */
1651 /********* Begin destructor definitions ***************************************/
1652 case 95: /* element_list */
1653 {
1654 #line 468 "pikchr.y"
1655 pik_elist_free(p,(yypminor->yy56));
1656 #line 1681 "pikchr.c"
1657 }
1658 break;
1659 case 96: /* element */
1660 case 97: /* unnamed_element */
1661 case 98: /* basetype */
1662 {
1663 #line 470 "pikchr.y"
1664 pik_elem_free(p,(yypminor->yy226));
1665 #line 1690 "pikchr.c"
1666 }
1667 break;
1668 /********* End destructor definitions *****************************************/
1669 default: break; /* If no destructor action specified: do nothing */
1670 }
@@ -1877,14 +1878,14 @@
1878 #endif
1879 while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
1880 /* Here code is inserted which will execute if the parser
1881 ** stack every overflows */
1882 /******** Begin %stack_overflow code ******************************************/
1883 #line 502 "pikchr.y"
1884
1885 pik_error(p, 0, "parser stack overflow");
1886 #line 1911 "pikchr.c"
1887 /******** End %stack_overflow code ********************************************/
1888 pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
1889 pik_parserCTX_STORE
1890 }
1891
@@ -2354,603 +2355,603 @@
2355 ** break;
2356 */
2357 /********** Begin reduce actions **********************************************/
2358 YYMINORTYPE yylhsminor;
2359 case 0: /* document ::= element_list */
2360 #line 506 "pikchr.y"
2361 {pik_render(p,yymsp[0].minor.yy56);}
2362 #line 2387 "pikchr.c"
2363 break;
2364 case 1: /* element_list ::= element */
2365 #line 509 "pikchr.y"
2366 { yylhsminor.yy56 = pik_elist_append(p,0,yymsp[0].minor.yy226); }
2367 #line 2392 "pikchr.c"
2368 yymsp[0].minor.yy56 = yylhsminor.yy56;
2369 break;
2370 case 2: /* element_list ::= element_list EOL element */
2371 #line 511 "pikchr.y"
2372 { yylhsminor.yy56 = pik_elist_append(p,yymsp[-2].minor.yy56,yymsp[0].minor.yy226); }
2373 #line 2398 "pikchr.c"
2374 yymsp[-2].minor.yy56 = yylhsminor.yy56;
2375 break;
2376 case 3: /* element ::= */
2377 #line 514 "pikchr.y"
2378 { yymsp[1].minor.yy226 = 0; }
2379 #line 2404 "pikchr.c"
2380 break;
2381 case 4: /* element ::= direction */
2382 #line 515 "pikchr.y"
2383 { pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy226=0; }
2384 #line 2409 "pikchr.c"
2385 yymsp[0].minor.yy226 = yylhsminor.yy226;
2386 break;
2387 case 5: /* element ::= lvalue ASSIGN rvalue */
2388 #line 516 "pikchr.y"
2389 {pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy257,&yymsp[-1].minor.yy0); yylhsminor.yy226=0;}
2390 #line 2415 "pikchr.c"
2391 yymsp[-2].minor.yy226 = yylhsminor.yy226;
2392 break;
2393 case 6: /* element ::= PLACENAME COLON unnamed_element */
2394 #line 518 "pikchr.y"
2395 { yylhsminor.yy226 = yymsp[0].minor.yy226; pik_elem_setname(p,yymsp[0].minor.yy226,&yymsp[-2].minor.yy0); }
2396 #line 2421 "pikchr.c"
2397 yymsp[-2].minor.yy226 = yylhsminor.yy226;
2398 break;
2399 case 7: /* element ::= PLACENAME COLON position */
2400 #line 520 "pikchr.y"
2401 { yylhsminor.yy226 = pik_elem_new(p,0,0,0);
2402 if(yylhsminor.yy226){ yylhsminor.yy226->ptAt = yymsp[0].minor.yy175; pik_elem_setname(p,yylhsminor.yy226,&yymsp[-2].minor.yy0); }}
2403 #line 2428 "pikchr.c"
2404 yymsp[-2].minor.yy226 = yylhsminor.yy226;
2405 break;
2406 case 8: /* element ::= unnamed_element */
2407 #line 522 "pikchr.y"
2408 {yylhsminor.yy226 = yymsp[0].minor.yy226;}
2409 #line 2434 "pikchr.c"
2410 yymsp[0].minor.yy226 = yylhsminor.yy226;
2411 break;
2412 case 9: /* element ::= print prlist */
2413 #line 523 "pikchr.y"
2414 {pik_append(p,"<br>\n",5); yymsp[-1].minor.yy226=0;}
2415 #line 2440 "pikchr.c"
2416 break;
2417 case 10: /* element ::= ASSERT LP expr EQ expr RP */
2418 #line 528 "pikchr.y"
2419 {yymsp[-5].minor.yy226=pik_assert(p,yymsp[-3].minor.yy257,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy257);}
2420 #line 2445 "pikchr.c"
2421 break;
2422 case 11: /* element ::= ASSERT LP position EQ position RP */
2423 #line 530 "pikchr.y"
2424 {yymsp[-5].minor.yy226=pik_position_assert(p,&yymsp[-3].minor.yy175,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy175);}
2425 #line 2450 "pikchr.c"
2426 break;
2427 case 12: /* rvalue ::= PLACENAME */
2428 #line 541 "pikchr.y"
2429 {yylhsminor.yy257 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2430 #line 2455 "pikchr.c"
2431 yymsp[0].minor.yy257 = yylhsminor.yy257;
2432 break;
2433 case 13: /* pritem ::= FILL */
2434 case 14: /* pritem ::= COLOR */ yytestcase(yyruleno==14);
2435 case 15: /* pritem ::= THICKNESS */ yytestcase(yyruleno==15);
2436 #line 546 "pikchr.y"
2437 {pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2438 #line 2463 "pikchr.c"
2439 break;
2440 case 16: /* pritem ::= rvalue */
2441 #line 549 "pikchr.y"
2442 {pik_append_num(p,"",yymsp[0].minor.yy257);}
2443 #line 2468 "pikchr.c"
2444 break;
2445 case 17: /* pritem ::= STRING */
2446 #line 550 "pikchr.y"
2447 {pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2448 #line 2473 "pikchr.c"
2449 break;
2450 case 18: /* prsep ::= COMMA */
2451 #line 551 "pikchr.y"
2452 {pik_append(p, " ", 1);}
2453 #line 2478 "pikchr.c"
2454 break;
2455 case 19: /* unnamed_element ::= basetype attribute_list */
2456 #line 554 "pikchr.y"
2457 {yylhsminor.yy226 = yymsp[-1].minor.yy226; pik_after_adding_attributes(p,yylhsminor.yy226);}
2458 #line 2483 "pikchr.c"
2459 yymsp[-1].minor.yy226 = yylhsminor.yy226;
2460 break;
2461 case 20: /* basetype ::= CLASSNAME */
2462 #line 556 "pikchr.y"
2463 {yylhsminor.yy226 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2464 #line 2489 "pikchr.c"
2465 yymsp[0].minor.yy226 = yylhsminor.yy226;
2466 break;
2467 case 21: /* basetype ::= STRING textposition */
2468 #line 558 "pikchr.y"
2469 {yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy116; yylhsminor.yy226 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2470 #line 2495 "pikchr.c"
2471 yymsp[-1].minor.yy226 = yylhsminor.yy226;
2472 break;
2473 case 22: /* basetype ::= LB savelist element_list RB */
2474 #line 560 "pikchr.y"
2475 { p->list = yymsp[-2].minor.yy56; yymsp[-3].minor.yy226 = pik_elem_new(p,0,0,yymsp[-1].minor.yy56); if(yymsp[-3].minor.yy226) yymsp[-3].minor.yy226->errTok = yymsp[0].minor.yy0; }
2476 #line 2501 "pikchr.c"
2477 break;
2478 case 23: /* savelist ::= */
2479 #line 565 "pikchr.y"
2480 {yymsp[1].minor.yy56 = p->list; p->list = 0;}
2481 #line 2506 "pikchr.c"
2482 break;
2483 case 24: /* relexpr ::= expr */
2484 #line 572 "pikchr.y"
2485 {yylhsminor.yy164.rAbs = yymsp[0].minor.yy257; yylhsminor.yy164.rRel = 0;}
2486 #line 2511 "pikchr.c"
2487 yymsp[0].minor.yy164 = yylhsminor.yy164;
2488 break;
2489 case 25: /* relexpr ::= expr PERCENT */
2490 #line 573 "pikchr.y"
2491 {yylhsminor.yy164.rAbs = 0; yylhsminor.yy164.rRel = yymsp[-1].minor.yy257/100;}
2492 #line 2517 "pikchr.c"
2493 yymsp[-1].minor.yy164 = yylhsminor.yy164;
2494 break;
2495 case 26: /* optrelexpr ::= */
2496 #line 575 "pikchr.y"
2497 {yymsp[1].minor.yy164.rAbs = 0; yymsp[1].minor.yy164.rRel = 1.0;}
2498 #line 2523 "pikchr.c"
2499 break;
2500 case 27: /* attribute_list ::= relexpr alist */
2501 #line 577 "pikchr.y"
2502 {pik_add_direction(p,0,&yymsp[-1].minor.yy164);}
2503 #line 2528 "pikchr.c"
2504 break;
2505 case 28: /* attribute ::= numproperty relexpr */
2506 #line 581 "pikchr.y"
2507 { pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy164); }
2508 #line 2533 "pikchr.c"
2509 break;
2510 case 29: /* attribute ::= dashproperty expr */
2511 #line 582 "pikchr.y"
2512 { pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy257); }
2513 #line 2538 "pikchr.c"
2514 break;
2515 case 30: /* attribute ::= dashproperty */
2516 #line 583 "pikchr.y"
2517 { pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2518 #line 2543 "pikchr.c"
2519 break;
2520 case 31: /* attribute ::= colorproperty rvalue */
2521 #line 584 "pikchr.y"
2522 { pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy257); }
2523 #line 2548 "pikchr.c"
2524 break;
2525 case 32: /* attribute ::= go direction optrelexpr */
2526 #line 585 "pikchr.y"
2527 { pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy164);}
2528 #line 2553 "pikchr.c"
2529 break;
2530 case 33: /* attribute ::= go direction even position */
2531 #line 586 "pikchr.y"
2532 {pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy175);}
2533 #line 2558 "pikchr.c"
2534 break;
2535 case 34: /* attribute ::= CLOSE */
2536 #line 587 "pikchr.y"
2537 { pik_close_path(p,&yymsp[0].minor.yy0); }
2538 #line 2563 "pikchr.c"
2539 break;
2540 case 35: /* attribute ::= CHOP */
2541 #line 588 "pikchr.y"
2542 { p->cur->bChop = 1; }
2543 #line 2568 "pikchr.c"
2544 break;
2545 case 36: /* attribute ::= FROM position */
2546 #line 589 "pikchr.y"
2547 { pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy175); }
2548 #line 2573 "pikchr.c"
2549 break;
2550 case 37: /* attribute ::= TO position */
2551 #line 590 "pikchr.y"
2552 { pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy175); }
2553 #line 2578 "pikchr.c"
2554 break;
2555 case 38: /* attribute ::= THEN */
2556 #line 591 "pikchr.y"
2557 { pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2558 #line 2583 "pikchr.c"
2559 break;
2560 case 39: /* attribute ::= THEN optrelexpr HEADING expr */
2561 case 41: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==41);
2562 #line 593 "pikchr.y"
2563 {pik_move_hdg(p,&yymsp[-2].minor.yy164,&yymsp[-1].minor.yy0,yymsp[0].minor.yy257,0,&yymsp[-3].minor.yy0);}
2564 #line 2589 "pikchr.c"
2565 break;
2566 case 40: /* attribute ::= THEN optrelexpr EDGEPT */
2567 case 42: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==42);
2568 #line 594 "pikchr.y"
2569 {pik_move_hdg(p,&yymsp[-1].minor.yy164,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2570 #line 2595 "pikchr.c"
2571 break;
2572 case 43: /* attribute ::= AT position */
2573 #line 599 "pikchr.y"
2574 { pik_set_at(p,0,&yymsp[0].minor.yy175,&yymsp[-1].minor.yy0); }
2575 #line 2600 "pikchr.c"
2576 break;
2577 case 44: /* attribute ::= SAME */
2578 #line 601 "pikchr.y"
2579 {pik_same(p,0,&yymsp[0].minor.yy0);}
2580 #line 2605 "pikchr.c"
2581 break;
2582 case 45: /* attribute ::= SAME AS object */
2583 #line 602 "pikchr.y"
2584 {pik_same(p,yymsp[0].minor.yy226,&yymsp[-2].minor.yy0);}
2585 #line 2610 "pikchr.c"
2586 break;
2587 case 46: /* attribute ::= STRING textposition */
2588 #line 603 "pikchr.y"
2589 {pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy116);}
2590 #line 2615 "pikchr.c"
2591 break;
2592 case 47: /* attribute ::= FIT */
2593 #line 604 "pikchr.y"
2594 {pik_size_to_fit(p,&yymsp[0].minor.yy0); }
2595 #line 2620 "pikchr.c"
2596 break;
2597 case 48: /* attribute ::= BEHIND object */
2598 #line 605 "pikchr.y"
2599 {pik_behind(p,yymsp[0].minor.yy226);}
2600 #line 2625 "pikchr.c"
2601 break;
2602 case 49: /* withclause ::= DOT_E edge AT position */
2603 case 50: /* withclause ::= edge AT position */ yytestcase(yyruleno==50);
2604 #line 613 "pikchr.y"
2605 { pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy175,&yymsp[-1].minor.yy0); }
2606 #line 2631 "pikchr.c"
2607 break;
2608 case 51: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2609 #line 617 "pikchr.y"
2610 {yylhsminor.yy0 = yymsp[0].minor.yy0;}
2611 #line 2636 "pikchr.c"
2612 yymsp[0].minor.yy0 = yylhsminor.yy0;
2613 break;
2614 case 52: /* boolproperty ::= CW */
2615 #line 628 "pikchr.y"
2616 {p->cur->cw = 1;}
2617 #line 2642 "pikchr.c"
2618 break;
2619 case 53: /* boolproperty ::= CCW */
2620 #line 629 "pikchr.y"
2621 {p->cur->cw = 0;}
2622 #line 2647 "pikchr.c"
2623 break;
2624 case 54: /* boolproperty ::= LARROW */
2625 #line 630 "pikchr.y"
2626 {p->cur->larrow=1; p->cur->rarrow=0; }
2627 #line 2652 "pikchr.c"
2628 break;
2629 case 55: /* boolproperty ::= RARROW */
2630 #line 631 "pikchr.y"
2631 {p->cur->larrow=0; p->cur->rarrow=1; }
2632 #line 2657 "pikchr.c"
2633 break;
2634 case 56: /* boolproperty ::= LRARROW */
2635 #line 632 "pikchr.y"
2636 {p->cur->larrow=1; p->cur->rarrow=1; }
2637 #line 2662 "pikchr.c"
2638 break;
2639 case 57: /* boolproperty ::= INVIS */
2640 #line 633 "pikchr.y"
2641 {p->cur->sw = 0.0;}
2642 #line 2667 "pikchr.c"
2643 break;
2644 case 58: /* boolproperty ::= THICK */
2645 #line 634 "pikchr.y"
2646 {p->cur->sw *= 1.5;}
2647 #line 2672 "pikchr.c"
2648 break;
2649 case 59: /* boolproperty ::= THIN */
2650 #line 635 "pikchr.y"
2651 {p->cur->sw *= 0.67;}
2652 #line 2677 "pikchr.c"
2653 break;
2654 case 60: /* textposition ::= */
2655 #line 637 "pikchr.y"
2656 {yymsp[1].minor.yy116 = 0;}
2657 #line 2682 "pikchr.c"
2658 break;
2659 case 61: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2660 #line 640 "pikchr.y"
2661 {yylhsminor.yy116 = pik_text_position(yymsp[-1].minor.yy116,&yymsp[0].minor.yy0);}
2662 #line 2687 "pikchr.c"
2663 yymsp[-1].minor.yy116 = yylhsminor.yy116;
2664 break;
2665 case 62: /* position ::= expr COMMA expr */
2666 #line 643 "pikchr.y"
2667 {yylhsminor.yy175.x=yymsp[-2].minor.yy257; yylhsminor.yy175.y=yymsp[0].minor.yy257;}
2668 #line 2693 "pikchr.c"
2669 yymsp[-2].minor.yy175 = yylhsminor.yy175;
2670 break;
2671 case 63: /* position ::= place PLUS expr COMMA expr */
2672 #line 645 "pikchr.y"
2673 {yylhsminor.yy175.x=yymsp[-4].minor.yy175.x+yymsp[-2].minor.yy257; yylhsminor.yy175.y=yymsp[-4].minor.yy175.y+yymsp[0].minor.yy257;}
2674 #line 2699 "pikchr.c"
2675 yymsp[-4].minor.yy175 = yylhsminor.yy175;
2676 break;
2677 case 64: /* position ::= place MINUS expr COMMA expr */
2678 #line 646 "pikchr.y"
2679 {yylhsminor.yy175.x=yymsp[-4].minor.yy175.x-yymsp[-2].minor.yy257; yylhsminor.yy175.y=yymsp[-4].minor.yy175.y-yymsp[0].minor.yy257;}
2680 #line 2705 "pikchr.c"
2681 yymsp[-4].minor.yy175 = yylhsminor.yy175;
2682 break;
2683 case 65: /* position ::= place PLUS LP expr COMMA expr RP */
2684 #line 648 "pikchr.y"
2685 {yylhsminor.yy175.x=yymsp[-6].minor.yy175.x+yymsp[-3].minor.yy257; yylhsminor.yy175.y=yymsp[-6].minor.yy175.y+yymsp[-1].minor.yy257;}
2686 #line 2711 "pikchr.c"
2687 yymsp[-6].minor.yy175 = yylhsminor.yy175;
2688 break;
2689 case 66: /* position ::= place MINUS LP expr COMMA expr RP */
2690 #line 650 "pikchr.y"
2691 {yylhsminor.yy175.x=yymsp[-6].minor.yy175.x-yymsp[-3].minor.yy257; yylhsminor.yy175.y=yymsp[-6].minor.yy175.y-yymsp[-1].minor.yy257;}
2692 #line 2717 "pikchr.c"
2693 yymsp[-6].minor.yy175 = yylhsminor.yy175;
2694 break;
2695 case 67: /* position ::= LP position COMMA position RP */
2696 #line 651 "pikchr.y"
2697 {yymsp[-4].minor.yy175.x=yymsp[-3].minor.yy175.x; yymsp[-4].minor.yy175.y=yymsp[-1].minor.yy175.y;}
2698 #line 2723 "pikchr.c"
2699 break;
2700 case 68: /* position ::= LP position RP */
2701 #line 652 "pikchr.y"
2702 {yymsp[-2].minor.yy175=yymsp[-1].minor.yy175;}
2703 #line 2728 "pikchr.c"
2704 break;
2705 case 69: /* position ::= expr between position AND position */
2706 #line 654 "pikchr.y"
2707 {yylhsminor.yy175 = pik_position_between(yymsp[-4].minor.yy257,yymsp[-2].minor.yy175,yymsp[0].minor.yy175);}
2708 #line 2733 "pikchr.c"
2709 yymsp[-4].minor.yy175 = yylhsminor.yy175;
2710 break;
2711 case 70: /* position ::= expr LT position COMMA position GT */
2712 #line 656 "pikchr.y"
2713 {yylhsminor.yy175 = pik_position_between(yymsp[-5].minor.yy257,yymsp[-3].minor.yy175,yymsp[-1].minor.yy175);}
2714 #line 2739 "pikchr.c"
2715 yymsp[-5].minor.yy175 = yylhsminor.yy175;
2716 break;
2717 case 71: /* position ::= expr ABOVE position */
2718 #line 657 "pikchr.y"
2719 {yylhsminor.yy175=yymsp[0].minor.yy175; yylhsminor.yy175.y += yymsp[-2].minor.yy257;}
2720 #line 2745 "pikchr.c"
2721 yymsp[-2].minor.yy175 = yylhsminor.yy175;
2722 break;
2723 case 72: /* position ::= expr BELOW position */
2724 #line 658 "pikchr.y"
2725 {yylhsminor.yy175=yymsp[0].minor.yy175; yylhsminor.yy175.y -= yymsp[-2].minor.yy257;}
2726 #line 2751 "pikchr.c"
2727 yymsp[-2].minor.yy175 = yylhsminor.yy175;
2728 break;
2729 case 73: /* position ::= expr LEFT OF position */
2730 #line 659 "pikchr.y"
2731 {yylhsminor.yy175=yymsp[0].minor.yy175; yylhsminor.yy175.x -= yymsp[-3].minor.yy257;}
2732 #line 2757 "pikchr.c"
2733 yymsp[-3].minor.yy175 = yylhsminor.yy175;
2734 break;
2735 case 74: /* position ::= expr RIGHT OF position */
2736 #line 660 "pikchr.y"
2737 {yylhsminor.yy175=yymsp[0].minor.yy175; yylhsminor.yy175.x += yymsp[-3].minor.yy257;}
2738 #line 2763 "pikchr.c"
2739 yymsp[-3].minor.yy175 = yylhsminor.yy175;
2740 break;
2741 case 75: /* position ::= expr ON HEADING EDGEPT OF position */
2742 #line 662 "pikchr.y"
2743 {yylhsminor.yy175 = pik_position_at_hdg(yymsp[-5].minor.yy257,&yymsp[-2].minor.yy0,yymsp[0].minor.yy175);}
2744 #line 2769 "pikchr.c"
2745 yymsp[-5].minor.yy175 = yylhsminor.yy175;
2746 break;
2747 case 76: /* position ::= expr HEADING EDGEPT OF position */
2748 #line 664 "pikchr.y"
2749 {yylhsminor.yy175 = pik_position_at_hdg(yymsp[-4].minor.yy257,&yymsp[-2].minor.yy0,yymsp[0].minor.yy175);}
2750 #line 2775 "pikchr.c"
2751 yymsp[-4].minor.yy175 = yylhsminor.yy175;
2752 break;
2753 case 77: /* position ::= expr EDGEPT OF position */
2754 #line 666 "pikchr.y"
2755 {yylhsminor.yy175 = pik_position_at_hdg(yymsp[-3].minor.yy257,&yymsp[-2].minor.yy0,yymsp[0].minor.yy175);}
2756 #line 2781 "pikchr.c"
2757 yymsp[-3].minor.yy175 = yylhsminor.yy175;
2758 break;
2759 case 78: /* position ::= expr ON HEADING expr FROM position */
2760 #line 668 "pikchr.y"
2761 {yylhsminor.yy175 = pik_position_at_angle(yymsp[-5].minor.yy257,yymsp[-2].minor.yy257,yymsp[0].minor.yy175);}
2762 #line 2787 "pikchr.c"
2763 yymsp[-5].minor.yy175 = yylhsminor.yy175;
2764 break;
2765 case 79: /* position ::= expr HEADING expr FROM position */
2766 #line 670 "pikchr.y"
2767 {yylhsminor.yy175 = pik_position_at_angle(yymsp[-4].minor.yy257,yymsp[-2].minor.yy257,yymsp[0].minor.yy175);}
2768 #line 2793 "pikchr.c"
2769 yymsp[-4].minor.yy175 = yylhsminor.yy175;
2770 break;
2771 case 80: /* place ::= edge OF object */
2772 #line 682 "pikchr.y"
2773 {yylhsminor.yy175 = pik_place_of_elem(p,yymsp[0].minor.yy226,&yymsp[-2].minor.yy0);}
2774 #line 2799 "pikchr.c"
2775 yymsp[-2].minor.yy175 = yylhsminor.yy175;
2776 break;
2777 case 81: /* place2 ::= object */
2778 #line 683 "pikchr.y"
2779 {yylhsminor.yy175 = pik_place_of_elem(p,yymsp[0].minor.yy226,0);}
2780 #line 2805 "pikchr.c"
2781 yymsp[0].minor.yy175 = yylhsminor.yy175;
2782 break;
2783 case 82: /* place2 ::= object DOT_E edge */
2784 #line 684 "pikchr.y"
2785 {yylhsminor.yy175 = pik_place_of_elem(p,yymsp[-2].minor.yy226,&yymsp[0].minor.yy0);}
2786 #line 2811 "pikchr.c"
2787 yymsp[-2].minor.yy175 = yylhsminor.yy175;
2788 break;
2789 case 83: /* place2 ::= NTH VERTEX OF object */
2790 #line 685 "pikchr.y"
2791 {yylhsminor.yy175 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy226);}
2792 #line 2817 "pikchr.c"
2793 yymsp[-3].minor.yy175 = yylhsminor.yy175;
2794 break;
2795 case 84: /* object ::= nth */
2796 #line 697 "pikchr.y"
2797 {yylhsminor.yy226 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2798 #line 2823 "pikchr.c"
2799 yymsp[0].minor.yy226 = yylhsminor.yy226;
2800 break;
2801 case 85: /* object ::= nth OF|IN object */
2802 #line 698 "pikchr.y"
2803 {yylhsminor.yy226 = pik_find_nth(p,yymsp[0].minor.yy226,&yymsp[-2].minor.yy0);}
2804 #line 2829 "pikchr.c"
2805 yymsp[-2].minor.yy226 = yylhsminor.yy226;
2806 break;
2807 case 86: /* objectname ::= PLACENAME */
2808 #line 700 "pikchr.y"
2809 {yylhsminor.yy226 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2810 #line 2835 "pikchr.c"
2811 yymsp[0].minor.yy226 = yylhsminor.yy226;
2812 break;
2813 case 87: /* objectname ::= objectname DOT_U PLACENAME */
2814 #line 702 "pikchr.y"
2815 {yylhsminor.yy226 = pik_find_byname(p,yymsp[-2].minor.yy226,&yymsp[0].minor.yy0);}
2816 #line 2841 "pikchr.c"
2817 yymsp[-2].minor.yy226 = yylhsminor.yy226;
2818 break;
2819 case 88: /* nth ::= NTH CLASSNAME */
2820 #line 704 "pikchr.y"
2821 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2822 #line 2847 "pikchr.c"
2823 yymsp[-1].minor.yy0 = yylhsminor.yy0;
2824 break;
2825 case 89: /* nth ::= NTH LAST CLASSNAME */
2826 #line 705 "pikchr.y"
2827 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2828 #line 2853 "pikchr.c"
2829 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2830 break;
2831 case 90: /* nth ::= LAST CLASSNAME */
2832 #line 706 "pikchr.y"
2833 {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2834 #line 2859 "pikchr.c"
2835 break;
2836 case 91: /* nth ::= LAST */
2837 #line 707 "pikchr.y"
2838 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2839 #line 2864 "pikchr.c"
2840 yymsp[0].minor.yy0 = yylhsminor.yy0;
2841 break;
2842 case 92: /* nth ::= NTH LB RB */
2843 #line 708 "pikchr.y"
2844 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2845 #line 2870 "pikchr.c"
2846 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2847 break;
2848 case 93: /* nth ::= NTH LAST LB RB */
2849 #line 709 "pikchr.y"
2850 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2851 #line 2876 "pikchr.c"
2852 yymsp[-3].minor.yy0 = yylhsminor.yy0;
2853 break;
2854 case 94: /* nth ::= LAST LB RB */
2855 #line 710 "pikchr.y"
2856 {yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2857 #line 2882 "pikchr.c"
2858 break;
2859 case 95: /* expr ::= expr PLUS expr */
2860 #line 712 "pikchr.y"
2861 {yylhsminor.yy257=yymsp[-2].minor.yy257+yymsp[0].minor.yy257;}
2862 #line 2887 "pikchr.c"
2863 yymsp[-2].minor.yy257 = yylhsminor.yy257;
2864 break;
2865 case 96: /* expr ::= expr MINUS expr */
2866 #line 713 "pikchr.y"
2867 {yylhsminor.yy257=yymsp[-2].minor.yy257-yymsp[0].minor.yy257;}
2868 #line 2893 "pikchr.c"
2869 yymsp[-2].minor.yy257 = yylhsminor.yy257;
2870 break;
2871 case 97: /* expr ::= expr STAR expr */
2872 #line 714 "pikchr.y"
2873 {yylhsminor.yy257=yymsp[-2].minor.yy257*yymsp[0].minor.yy257;}
2874 #line 2899 "pikchr.c"
2875 yymsp[-2].minor.yy257 = yylhsminor.yy257;
2876 break;
2877 case 98: /* expr ::= expr SLASH expr */
2878 #line 715 "pikchr.y"
2879 {
2880 if( yymsp[0].minor.yy257==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy257 = 0.0; }
2881 else{ yylhsminor.yy257 = yymsp[-2].minor.yy257/yymsp[0].minor.yy257; }
2882 }
2883 #line 2908 "pikchr.c"
2884 yymsp[-2].minor.yy257 = yylhsminor.yy257;
2885 break;
2886 case 99: /* expr ::= MINUS expr */
2887 #line 719 "pikchr.y"
2888 {yymsp[-1].minor.yy257=-yymsp[0].minor.yy257;}
2889 #line 2914 "pikchr.c"
2890 break;
2891 case 100: /* expr ::= PLUS expr */
2892 #line 720 "pikchr.y"
2893 {yymsp[-1].minor.yy257=yymsp[0].minor.yy257;}
2894 #line 2919 "pikchr.c"
2895 break;
2896 case 101: /* expr ::= LP expr RP */
2897 #line 721 "pikchr.y"
2898 {yymsp[-2].minor.yy257=yymsp[-1].minor.yy257;}
2899 #line 2924 "pikchr.c"
2900 break;
2901 case 102: /* expr ::= LP FILL|COLOR|THICKNESS RP */
2902 #line 722 "pikchr.y"
2903 {yymsp[-2].minor.yy257=pik_get_var(p,&yymsp[-1].minor.yy0);}
2904 #line 2929 "pikchr.c"
2905 break;
2906 case 103: /* expr ::= NUMBER */
2907 #line 723 "pikchr.y"
2908 {yylhsminor.yy257=pik_atof(&yymsp[0].minor.yy0);}
2909 #line 2934 "pikchr.c"
2910 yymsp[0].minor.yy257 = yylhsminor.yy257;
2911 break;
2912 case 104: /* expr ::= ID */
2913 #line 724 "pikchr.y"
2914 {yylhsminor.yy257=pik_get_var(p,&yymsp[0].minor.yy0);}
2915 #line 2940 "pikchr.c"
2916 yymsp[0].minor.yy257 = yylhsminor.yy257;
2917 break;
2918 case 105: /* expr ::= FUNC1 LP expr RP */
2919 #line 725 "pikchr.y"
2920 {yylhsminor.yy257 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy257,0.0);}
2921 #line 2946 "pikchr.c"
2922 yymsp[-3].minor.yy257 = yylhsminor.yy257;
2923 break;
2924 case 106: /* expr ::= FUNC2 LP expr COMMA expr RP */
2925 #line 726 "pikchr.y"
2926 {yylhsminor.yy257 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy257,yymsp[-1].minor.yy257);}
2927 #line 2952 "pikchr.c"
2928 yymsp[-5].minor.yy257 = yylhsminor.yy257;
2929 break;
2930 case 107: /* expr ::= DIST LP position COMMA position RP */
2931 #line 727 "pikchr.y"
2932 {yymsp[-5].minor.yy257 = pik_dist(&yymsp[-3].minor.yy175,&yymsp[-1].minor.yy175);}
2933 #line 2958 "pikchr.c"
2934 break;
2935 case 108: /* expr ::= place2 DOT_XY X */
2936 #line 728 "pikchr.y"
2937 {yylhsminor.yy257 = yymsp[-2].minor.yy175.x;}
2938 #line 2963 "pikchr.c"
2939 yymsp[-2].minor.yy257 = yylhsminor.yy257;
2940 break;
2941 case 109: /* expr ::= place2 DOT_XY Y */
2942 #line 729 "pikchr.y"
2943 {yylhsminor.yy257 = yymsp[-2].minor.yy175.y;}
2944 #line 2969 "pikchr.c"
2945 yymsp[-2].minor.yy257 = yylhsminor.yy257;
2946 break;
2947 case 110: /* expr ::= object DOT_L numproperty */
2948 case 111: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==111);
2949 case 112: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==112);
2950 #line 730 "pikchr.y"
2951 {yylhsminor.yy257=pik_property_of(yymsp[-2].minor.yy226,&yymsp[0].minor.yy0);}
2952 #line 2977 "pikchr.c"
2953 yymsp[-2].minor.yy257 = yylhsminor.yy257;
2954 break;
2955 default:
2956 /* (113) lvalue ::= ID */ yytestcase(yyruleno==113);
2957 /* (114) lvalue ::= FILL */ yytestcase(yyruleno==114);
@@ -3049,19 +3050,19 @@
3050 ){
3051 pik_parserARG_FETCH
3052 pik_parserCTX_FETCH
3053 #define TOKEN yyminor
3054 /************ Begin %syntax_error code ****************************************/
3055 #line 494 "pikchr.y"
3056
3057 if( TOKEN.z && TOKEN.z[0] ){
3058 pik_error(p, &TOKEN, "syntax error");
3059 }else{
3060 pik_error(p, 0, "syntax error");
3061 }
3062 UNUSED_PARAMETER(yymajor);
3063 #line 3088 "pikchr.c"
3064 /************ End %syntax_error code ******************************************/
3065 pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
3066 pik_parserCTX_STORE
3067 }
3068
@@ -3290,11 +3291,11 @@
3291 #else
3292 (void)iToken;
3293 return 0;
3294 #endif
3295 }
3296 #line 735 "pikchr.y"
3297
3298
3299
3300 /* Chart of the 140 official HTML color names with their
3301 ** corresponding RGB value.
@@ -3573,11 +3574,11 @@
3574 pElem->rad = pik_value(p, "boxrad",6,0);
3575 }
3576 /* Return offset from the center of the box to the compass point
3577 ** given by parameter cp */
3578 static PPoint boxOffset(Pik *p, PElem *pElem, int cp){
3579 PPoint pt = cZeroPoint;
3580 PNum w2 = 0.5*pElem->w;
3581 PNum h2 = 0.5*pElem->h;
3582 PNum rad = pElem->rad;
3583 PNum rx;
3584 if( rad<=0.0 ){
@@ -3585,21 +3586,21 @@
3586 }else{
3587 if( rad>w2 ) rad = w2;
3588 if( rad>h2 ) rad = h2;
3589 rx = 0.29289321881345252392*rad;
3590 }
 
3591 switch( cp ){
3592 case CP_C: break;
3593 case CP_N: pt.x = 0.0; pt.y = h2; break;
3594 case CP_NE: pt.x = w2-rx; pt.y = h2-rx; break;
3595 case CP_E: pt.x = w2; pt.y = 0.0; break;
3596 case CP_SE: pt.x = w2-rx; pt.y = rx-h2; break;
3597 case CP_S: pt.x = 0.0; pt.y = -h2; break;
3598 case CP_SW: pt.x = rx-w2; pt.y = rx-h2; break;
3599 case CP_W: pt.x = -w2; pt.y = 0.0; break;
3600 case CP_NW: pt.x = rx-w2; pt.y = h2-rx; break;
3601 default: assert(0);
3602 }
3603 UNUSED_PARAMETER(p);
3604 return pt;
3605 }
3606 static PPoint boxChop(Pik *p, PElem *pElem, PPoint *pPt){
@@ -3789,24 +3790,25 @@
3790 pik_append(p,"\" />\n", -1);
3791 }
3792 pik_append_txt(p, pElem, 0);
3793 }
3794 static PPoint cylinderOffset(Pik *p, PElem *pElem, int cp){
3795 PPoint pt = cZeroPoint;
3796 PNum w2 = pElem->w*0.5;
3797 PNum h1 = pElem->h*0.5;
3798 PNum h2 = h1 - pElem->rad;
3799 switch( cp ){
3800 case CP_C: break;
3801 case CP_N: pt.x = 0.0; pt.y = h1; break;
3802 case CP_NE: pt.x = w2; pt.y = h2; break;
3803 case CP_E: pt.x = w2; pt.y = 0.0; break;
3804 case CP_SE: pt.x = w2; pt.y = -h2; break;
3805 case CP_S: pt.x = 0.0; pt.y = -h1; break;
3806 case CP_SW: pt.x = -w2; pt.y = -h2; break;
3807 case CP_W: pt.x = -w2; pt.y = 0.0; break;
3808 case CP_NW: pt.x = -w2; pt.y = h2; break;
3809 default: assert(0);
3810 }
3811 UNUSED_PARAMETER(p);
3812 return pt;
3813 }
3814
@@ -3832,16 +3834,14 @@
3834 pik_bbox_addellipse(&pElem->bbox, pElem->ptAt.x, pElem->ptAt.y,
3835 pElem->rad, pElem->rad);
3836 UNUSED_PARAMETER(p);
3837 }
3838 static PPoint dotOffset(Pik *p, PElem *pElem, int cp){
 
 
3839 UNUSED_PARAMETER(p);
3840 UNUSED_PARAMETER(pElem);
3841 UNUSED_PARAMETER(cp);
3842 return cZeroPoint;
3843 }
3844 static void dotRender(Pik *p, PElem *pElem){
3845 PNum r = pElem->rad;
3846 PPoint pt = pElem->ptAt;
3847 if( pElem->sw>0.0 ){
@@ -3876,25 +3876,26 @@
3876 chop.y = pElem->ptAt.y + 0.5*dy*pElem->h/dist;
3877 UNUSED_PARAMETER(p);
3878 return chop;
3879 }
3880 static PPoint ellipseOffset(Pik *p, PElem *pElem, int cp){
3881 PPoint pt = cZeroPoint;
3882 PNum w = pElem->w*0.5;
3883 PNum w2 = w*0.70710678118654747608;
3884 PNum h = pElem->h*0.5;
3885 PNum h2 = h*0.70710678118654747608;
3886 switch( cp ){
3887 case CP_C: break;
3888 case CP_N: pt.x = 0.0; pt.y = h; break;
3889 case CP_NE: pt.x = w2; pt.y = h2; break;
3890 case CP_E: pt.x = w; pt.y = 0.0; break;
3891 case CP_SE: pt.x = w2; pt.y = -h2; break;
3892 case CP_S: pt.x = 0.0; pt.y = -h; break;
3893 case CP_SW: pt.x = -w2; pt.y = -h2; break;
3894 case CP_W: pt.x = -w; pt.y = 0.0; break;
3895 case CP_NW: pt.x = -w2; pt.y = h2; break;
3896 default: assert(0);
3897 }
3898 UNUSED_PARAMETER(p);
3899 return pt;
3900 }
3901 static void ellipseRender(Pik *p, PElem *pElem){
@@ -3919,29 +3920,30 @@
3920 pElem->rad = pik_value(p, "filerad",7,0);
3921 }
3922 /* Return offset from the center of the file to the compass point
3923 ** given by parameter cp */
3924 static PPoint fileOffset(Pik *p, PElem *pElem, int cp){
3925 PPoint pt = cZeroPoint;
3926 PNum w2 = 0.5*pElem->w;
3927 PNum h2 = 0.5*pElem->h;
3928 PNum rx = pElem->rad;
3929 PNum mn = w2<h2 ? w2 : h2;
3930 if( rx>mn ) rx = mn;
3931 if( rx<mn*0.25 ) rx = mn*0.25;
3932 pt.x = pt.y = 0.0;
3933 rx *= 0.5;
3934 switch( cp ){
3935 case CP_C: break;
3936 case CP_N: pt.x = 0.0; pt.y = h2; break;
3937 case CP_NE: pt.x = w2-rx; pt.y = h2-rx; break;
3938 case CP_E: pt.x = w2; pt.y = 0.0; break;
3939 case CP_SE: pt.x = w2; pt.y = -h2; break;
3940 case CP_S: pt.x = 0.0; pt.y = -h2; break;
3941 case CP_SW: pt.x = -w2; pt.y = -h2; break;
3942 case CP_W: pt.x = -w2; pt.y = 0.0; break;
3943 case CP_NW: pt.x = -w2; pt.y = h2; break;
3944 default: assert(0);
3945 }
3946 UNUSED_PARAMETER(p);
3947 return pt;
3948 }
3949 static void fileFit(Pik *p, PElem *pElem, PNum w, PNum h){
@@ -5086,10 +5088,11 @@
5088 p->cur = pNew;
5089 p->nTPath = 1;
5090 p->thenFlag = 0;
5091 if( p->list==0 || p->list->n==0 ){
5092 pNew->ptAt.x = pNew->ptAt.y = 0.0;
5093 pNew->eWith = CP_C;
5094 }else{
5095 PElem *pPrior = p->list->a[p->list->n-1];
5096 pNew->ptAt = pPrior->ptExit;
5097 switch( p->eDir ){
5098 default: pNew->eWith = CP_W; break;
@@ -6135,14 +6138,12 @@
6138 /* Return a "Place" associated with element pElem. If pEdge is NULL
6139 ** return the center of the object. Otherwise, return the corner
6140 ** described by pEdge.
6141 */
6142 static PPoint pik_place_of_elem(Pik *p, PElem *pElem, PToken *pEdge){
6143 PPoint pt = cZeroPoint;
6144 const PClass *pClass;
 
 
6145 if( pElem==0 ) return pt;
6146 if( pEdge==0 ){
6147 return pElem->ptAt;
6148 }
6149 pClass = pElem->type;
@@ -6576,11 +6577,11 @@
6577 p->bbox.ne.y += margin + pik_value(p,"topmargin",9,0);
6578 p->bbox.sw.x -= margin + pik_value(p,"leftmargin",10,0);
6579 p->bbox.sw.y -= margin + pik_value(p,"bottommargin",12,0);
6580
6581 /* Output the SVG */
6582 pik_append(p, "<svg xmlns='http://www.w3.org/2000/svg'",-1);
6583 if( p->zClass ){
6584 pik_append(p, " class=\"", -1);
6585 pik_append(p, p->zClass, -1);
6586 pik_append(p, "\"", 1);
6587 }
@@ -7283,6 +7284,6 @@
7284 }
7285 return 0;
7286 }
7287 #endif /* PIKCHR_SHELL */
7288
7289 #line 7314 "pikchr.c"
7290

Keyboard Shortcuts

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