Fossil SCM

New pikchr.c file that fixes alignment of chopped lines.

drh 2020-09-16 19:01 trunk
Commit 7c28d11d9ad2dc13a3b291a04972923bcd5f4a6a75af0caa4f7bc9c5249143c8
1 file changed +302 -298
+302 -298
--- src/pikchr.c
+++ src/pikchr.c
@@ -124,10 +124,14 @@
124124
#include <assert.h>
125125
#define count(X) (sizeof(X)/sizeof(X[0]))
126126
#ifndef M_PI
127127
# define M_PI 3.1415926535897932385
128128
#endif
129
+
130
+/* Tag intentionally unused parameters with this macro to prevent
131
+** compiler warnings with -Wextra */
132
+#define UNUSED_PARAMETER(X) (void)(X)
129133
130134
typedef struct Pik Pik; /* Complete parsing context */
131135
typedef struct PToken PToken; /* A single token */
132136
typedef struct PElem PElem; /* A single diagram object or "element" */
133137
typedef struct PEList PEList; /* A list of elements */
@@ -397,11 +401,11 @@
397401
static void pik_append_arc(Pik*,PNum,PNum,PNum,PNum);
398402
static void pik_append_clr(Pik*,const char*,PNum,const char*);
399403
static void pik_append_style(Pik*,PElem*);
400404
static void pik_append_txt(Pik*,PElem*, PBox*);
401405
static void pik_draw_arrowhead(Pik*,PPoint*pFrom,PPoint*pTo,PElem*);
402
-static void pik_chop(Pik*,PPoint*pFrom,PPoint*pTo,PNum);
406
+static void pik_chop(PPoint*pFrom,PPoint*pTo,PNum);
403407
static void pik_error(Pik*,PToken*,const char*);
404408
static void pik_elist_free(Pik*,PEList*);
405409
static void pik_elem_free(Pik*,PElem*);
406410
static void pik_render(Pik*,PEList*);
407411
static PEList *pik_elist_append(Pik*,PEList*,PElem*);
@@ -410,11 +414,11 @@
410414
static void pik_elem_setname(Pik*,PElem*,PToken*);
411415
static void pik_set_var(Pik*,PToken*,PNum,PToken*);
412416
static PNum pik_value(Pik*,const char*,int,int*);
413417
static PNum pik_lookup_color(Pik*,PToken*);
414418
static PNum pik_get_var(Pik*,PToken*);
415
-static PNum pik_atof(Pik*,PToken*);
419
+static PNum pik_atof(PToken*);
416420
static void pik_after_adding_attributes(Pik*,PElem*);
417421
static void pik_elem_move(PElem*,PNum dx, PNum dy);
418422
static void pik_elist_move(PEList*,PNum dx, PNum dy);
419423
static void pik_set_numprop(Pik*,PToken*,PRel*);
420424
static void pik_set_clrprop(Pik*,PToken*,PNum);
@@ -437,26 +441,26 @@
437441
static void pik_bbox_add_xy(PBox*,PNum,PNum);
438442
static void pik_bbox_addellipse(PBox*,PNum x,PNum y,PNum rx,PNum ry);
439443
static void pik_add_txt(Pik*,PToken*,int);
440444
static int pik_text_length(const PToken *pToken);
441445
static void pik_size_to_fit(Pik*,PToken*);
442
-static int pik_text_position(Pik*,int,PToken*);
443
-static PNum pik_property_of(Pik*,PElem*,PToken*);
446
+static int pik_text_position(int,PToken*);
447
+static PNum pik_property_of(PElem*,PToken*);
444448
static PNum pik_func(Pik*,PToken*,PNum,PNum);
445
-static PPoint pik_position_between(Pik *p, PNum x, PPoint p1, PPoint p2);
446
-static PPoint pik_position_at_angle(Pik *p, PNum dist, PNum r, PPoint pt);
447
-static PPoint pik_position_at_hdg(Pik *p, PNum dist, PToken *pD, PPoint pt);
449
+static PPoint pik_position_between(PNum x, PPoint p1, PPoint p2);
450
+static PPoint pik_position_at_angle(PNum dist, PNum r, PPoint pt);
451
+static PPoint pik_position_at_hdg(PNum dist, PToken *pD, PPoint pt);
448452
static void pik_same(Pik *p, PElem*, PToken*);
449453
static PPoint pik_nth_vertex(Pik *p, PToken *pNth, PToken *pErr, PElem *pElem);
450
-static PToken pik_next_semantic_token(Pik *p, PToken *pThis);
454
+static PToken pik_next_semantic_token(PToken *pThis);
451455
static void pik_compute_layout_settings(Pik*);
452456
static void pik_behind(Pik*,PElem*);
453457
static PElem *pik_assert(Pik*,PNum,PToken*,PNum);
454458
static PElem *pik_place_assert(Pik*,PPoint*,PToken*,PPoint*);
455459
456460
457
-#line 483 "pikchr.c"
461
+#line 487 "pikchr.c"
458462
/**************** End of %include directives **********************************/
459463
/* These constants specify the various numeric values for terminal symbols.
460464
***************** Begin token definitions *************************************/
461465
#ifndef T_ID
462466
#define T_ID 1
@@ -1628,22 +1632,22 @@
16281632
** inside the C code.
16291633
*/
16301634
/********* Begin destructor definitions ***************************************/
16311635
case 94: /* element_list */
16321636
{
1633
-#line 472 "pikchr.y"
1637
+#line 476 "pikchr.y"
16341638
pik_elist_free(p,(yypminor->yy72));
1635
-#line 1660 "pikchr.c"
1639
+#line 1664 "pikchr.c"
16361640
}
16371641
break;
16381642
case 95: /* element */
16391643
case 96: /* unnamed_element */
16401644
case 97: /* basetype */
16411645
{
1642
-#line 474 "pikchr.y"
1646
+#line 478 "pikchr.y"
16431647
pik_elem_free(p,(yypminor->yy254));
1644
-#line 1669 "pikchr.c"
1648
+#line 1673 "pikchr.c"
16451649
}
16461650
break;
16471651
/********* End destructor definitions *****************************************/
16481652
default: break; /* If no destructor action specified: do nothing */
16491653
}
@@ -1806,11 +1810,11 @@
18061810
}
18071811
}
18081812
#endif /* YYWILDCARD */
18091813
return yy_default[stateno];
18101814
}else{
1811
- assert( i>=0 && i<sizeof(yy_action)/sizeof(yy_action[0]) );
1815
+ assert( i>=0 && i<(int)(sizeof(yy_action)/sizeof(yy_action[0])) );
18121816
return yy_action[i];
18131817
}
18141818
}while(1);
18151819
}
18161820
@@ -1857,14 +1861,14 @@
18571861
#endif
18581862
while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
18591863
/* Here code is inserted which will execute if the parser
18601864
** stack every overflows */
18611865
/******** Begin %stack_overflow code ******************************************/
1862
-#line 505 "pikchr.y"
1866
+#line 510 "pikchr.y"
18631867
18641868
pik_error(p, 0, "parser stack overflow");
1865
-#line 1890 "pikchr.c"
1869
+#line 1894 "pikchr.c"
18661870
/******** End %stack_overflow code ********************************************/
18671871
pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
18681872
pik_parserCTX_STORE
18691873
}
18701874
@@ -2329,593 +2333,593 @@
23292333
** break;
23302334
*/
23312335
/********** Begin reduce actions **********************************************/
23322336
YYMINORTYPE yylhsminor;
23332337
case 0: /* document ::= element_list */
2334
-#line 509 "pikchr.y"
2338
+#line 514 "pikchr.y"
23352339
{pik_render(p,yymsp[0].minor.yy72);}
2336
-#line 2361 "pikchr.c"
2340
+#line 2365 "pikchr.c"
23372341
break;
23382342
case 1: /* element_list ::= element */
2339
-#line 512 "pikchr.y"
2343
+#line 517 "pikchr.y"
23402344
{ yylhsminor.yy72 = pik_elist_append(p,0,yymsp[0].minor.yy254); }
2341
-#line 2366 "pikchr.c"
2345
+#line 2370 "pikchr.c"
23422346
yymsp[0].minor.yy72 = yylhsminor.yy72;
23432347
break;
23442348
case 2: /* element_list ::= element_list EOL element */
2345
-#line 514 "pikchr.y"
2349
+#line 519 "pikchr.y"
23462350
{ yylhsminor.yy72 = pik_elist_append(p,yymsp[-2].minor.yy72,yymsp[0].minor.yy254); }
2347
-#line 2372 "pikchr.c"
2351
+#line 2376 "pikchr.c"
23482352
yymsp[-2].minor.yy72 = yylhsminor.yy72;
23492353
break;
23502354
case 3: /* element ::= */
2351
-#line 517 "pikchr.y"
2355
+#line 522 "pikchr.y"
23522356
{ yymsp[1].minor.yy254 = 0; }
2353
-#line 2378 "pikchr.c"
2357
+#line 2382 "pikchr.c"
23542358
break;
23552359
case 4: /* element ::= direction */
2356
-#line 518 "pikchr.y"
2360
+#line 523 "pikchr.y"
23572361
{ pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy254=0; }
2358
-#line 2383 "pikchr.c"
2362
+#line 2387 "pikchr.c"
23592363
yymsp[0].minor.yy254 = yylhsminor.yy254;
23602364
break;
23612365
case 5: /* element ::= lvalue ASSIGN rvalue */
2362
-#line 519 "pikchr.y"
2366
+#line 524 "pikchr.y"
23632367
{pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy73,&yymsp[-1].minor.yy0); yylhsminor.yy254=0;}
2364
-#line 2389 "pikchr.c"
2368
+#line 2393 "pikchr.c"
23652369
yymsp[-2].minor.yy254 = yylhsminor.yy254;
23662370
break;
23672371
case 6: /* element ::= PLACENAME COLON unnamed_element */
2368
-#line 521 "pikchr.y"
2372
+#line 526 "pikchr.y"
23692373
{ yylhsminor.yy254 = yymsp[0].minor.yy254; pik_elem_setname(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0); }
2370
-#line 2395 "pikchr.c"
2374
+#line 2399 "pikchr.c"
23712375
yymsp[-2].minor.yy254 = yylhsminor.yy254;
23722376
break;
23732377
case 7: /* element ::= PLACENAME COLON position */
2374
-#line 523 "pikchr.y"
2378
+#line 528 "pikchr.y"
23752379
{ yylhsminor.yy254 = pik_elem_new(p,0,0,0);
23762380
if(yylhsminor.yy254){ yylhsminor.yy254->ptAt = yymsp[0].minor.yy139; pik_elem_setname(p,yylhsminor.yy254,&yymsp[-2].minor.yy0); }}
2377
-#line 2402 "pikchr.c"
2381
+#line 2406 "pikchr.c"
23782382
yymsp[-2].minor.yy254 = yylhsminor.yy254;
23792383
break;
23802384
case 8: /* element ::= unnamed_element */
2381
-#line 525 "pikchr.y"
2385
+#line 530 "pikchr.y"
23822386
{yylhsminor.yy254 = yymsp[0].minor.yy254;}
2383
-#line 2408 "pikchr.c"
2387
+#line 2412 "pikchr.c"
23842388
yymsp[0].minor.yy254 = yylhsminor.yy254;
23852389
break;
23862390
case 9: /* element ::= print prlist */
2387
-#line 526 "pikchr.y"
2391
+#line 531 "pikchr.y"
23882392
{pik_append(p,"<br>\n",5); yymsp[-1].minor.yy254=0;}
2389
-#line 2414 "pikchr.c"
2393
+#line 2418 "pikchr.c"
23902394
break;
23912395
case 10: /* element ::= ASSERT LP expr EQ expr RP */
2392
-#line 531 "pikchr.y"
2396
+#line 536 "pikchr.y"
23932397
{yymsp[-5].minor.yy254=pik_assert(p,yymsp[-3].minor.yy73,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy73);}
2394
-#line 2419 "pikchr.c"
2398
+#line 2423 "pikchr.c"
23952399
break;
23962400
case 11: /* element ::= ASSERT LP place EQ place RP */
2397
-#line 533 "pikchr.y"
2401
+#line 538 "pikchr.y"
23982402
{yymsp[-5].minor.yy254=pik_place_assert(p,&yymsp[-3].minor.yy139,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy139);}
2399
-#line 2424 "pikchr.c"
2403
+#line 2428 "pikchr.c"
24002404
break;
24012405
case 12: /* rvalue ::= PLACENAME */
2402
-#line 544 "pikchr.y"
2406
+#line 549 "pikchr.y"
24032407
{yylhsminor.yy73 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2404
-#line 2429 "pikchr.c"
2408
+#line 2433 "pikchr.c"
24052409
yymsp[0].minor.yy73 = yylhsminor.yy73;
24062410
break;
24072411
case 13: /* pritem ::= FILL */
24082412
case 14: /* pritem ::= COLOR */ yytestcase(yyruleno==14);
24092413
case 15: /* pritem ::= THICKNESS */ yytestcase(yyruleno==15);
2410
-#line 549 "pikchr.y"
2414
+#line 554 "pikchr.y"
24112415
{pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2412
-#line 2437 "pikchr.c"
2416
+#line 2441 "pikchr.c"
24132417
break;
24142418
case 16: /* pritem ::= rvalue */
2415
-#line 552 "pikchr.y"
2419
+#line 557 "pikchr.y"
24162420
{pik_append_num(p,"",yymsp[0].minor.yy73);}
2417
-#line 2442 "pikchr.c"
2421
+#line 2446 "pikchr.c"
24182422
break;
24192423
case 17: /* pritem ::= STRING */
2420
-#line 553 "pikchr.y"
2424
+#line 558 "pikchr.y"
24212425
{pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2422
-#line 2447 "pikchr.c"
2426
+#line 2451 "pikchr.c"
24232427
break;
24242428
case 18: /* prsep ::= COMMA */
2425
-#line 554 "pikchr.y"
2429
+#line 559 "pikchr.y"
24262430
{pik_append(p, " ", 1);}
2427
-#line 2452 "pikchr.c"
2431
+#line 2456 "pikchr.c"
24282432
break;
24292433
case 19: /* unnamed_element ::= basetype attribute_list */
2430
-#line 557 "pikchr.y"
2434
+#line 562 "pikchr.y"
24312435
{yylhsminor.yy254 = yymsp[-1].minor.yy254; pik_after_adding_attributes(p,yylhsminor.yy254);}
2432
-#line 2457 "pikchr.c"
2436
+#line 2461 "pikchr.c"
24332437
yymsp[-1].minor.yy254 = yylhsminor.yy254;
24342438
break;
24352439
case 20: /* basetype ::= CLASSNAME */
2436
-#line 559 "pikchr.y"
2440
+#line 564 "pikchr.y"
24372441
{yylhsminor.yy254 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2438
-#line 2463 "pikchr.c"
2442
+#line 2467 "pikchr.c"
24392443
yymsp[0].minor.yy254 = yylhsminor.yy254;
24402444
break;
24412445
case 21: /* basetype ::= STRING textposition */
2442
-#line 561 "pikchr.y"
2446
+#line 566 "pikchr.y"
24432447
{yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy74; yylhsminor.yy254 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2444
-#line 2469 "pikchr.c"
2448
+#line 2473 "pikchr.c"
24452449
yymsp[-1].minor.yy254 = yylhsminor.yy254;
24462450
break;
24472451
case 22: /* basetype ::= LB savelist element_list RB */
2448
-#line 563 "pikchr.y"
2452
+#line 568 "pikchr.y"
24492453
{ p->list = yymsp[-2].minor.yy72; yymsp[-3].minor.yy254 = pik_elem_new(p,0,0,yymsp[-1].minor.yy72); if(yymsp[-3].minor.yy254) yymsp[-3].minor.yy254->errTok = yymsp[0].minor.yy0; }
2450
-#line 2475 "pikchr.c"
2454
+#line 2479 "pikchr.c"
24512455
break;
24522456
case 23: /* savelist ::= */
2453
-#line 568 "pikchr.y"
2457
+#line 573 "pikchr.y"
24542458
{yymsp[1].minor.yy72 = p->list; p->list = 0;}
2455
-#line 2480 "pikchr.c"
2459
+#line 2484 "pikchr.c"
24562460
break;
24572461
case 24: /* relexpr ::= expr */
2458
-#line 575 "pikchr.y"
2462
+#line 580 "pikchr.y"
24592463
{yylhsminor.yy60.rAbs = yymsp[0].minor.yy73; yylhsminor.yy60.rRel = 0;}
2460
-#line 2485 "pikchr.c"
2464
+#line 2489 "pikchr.c"
24612465
yymsp[0].minor.yy60 = yylhsminor.yy60;
24622466
break;
24632467
case 25: /* relexpr ::= expr PERCENT */
2464
-#line 576 "pikchr.y"
2468
+#line 581 "pikchr.y"
24652469
{yylhsminor.yy60.rAbs = 0; yylhsminor.yy60.rRel = yymsp[-1].minor.yy73/100;}
2466
-#line 2491 "pikchr.c"
2470
+#line 2495 "pikchr.c"
24672471
yymsp[-1].minor.yy60 = yylhsminor.yy60;
24682472
break;
24692473
case 26: /* optrelexpr ::= */
2470
-#line 578 "pikchr.y"
2474
+#line 583 "pikchr.y"
24712475
{yymsp[1].minor.yy60.rAbs = 0; yymsp[1].minor.yy60.rRel = 1.0;}
2472
-#line 2497 "pikchr.c"
2476
+#line 2501 "pikchr.c"
24732477
break;
24742478
case 27: /* attribute_list ::= relexpr alist */
2475
-#line 580 "pikchr.y"
2479
+#line 585 "pikchr.y"
24762480
{pik_add_direction(p,0,&yymsp[-1].minor.yy60);}
2477
-#line 2502 "pikchr.c"
2481
+#line 2506 "pikchr.c"
24782482
break;
24792483
case 28: /* attribute ::= numproperty relexpr */
2480
-#line 584 "pikchr.y"
2484
+#line 589 "pikchr.y"
24812485
{ pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy60); }
2482
-#line 2507 "pikchr.c"
2486
+#line 2511 "pikchr.c"
24832487
break;
24842488
case 29: /* attribute ::= dashproperty expr */
2485
-#line 585 "pikchr.y"
2489
+#line 590 "pikchr.y"
24862490
{ pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy73); }
2487
-#line 2512 "pikchr.c"
2491
+#line 2516 "pikchr.c"
24882492
break;
24892493
case 30: /* attribute ::= dashproperty */
2490
-#line 586 "pikchr.y"
2494
+#line 591 "pikchr.y"
24912495
{ pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2492
-#line 2517 "pikchr.c"
2496
+#line 2521 "pikchr.c"
24932497
break;
24942498
case 31: /* attribute ::= colorproperty rvalue */
2495
-#line 587 "pikchr.y"
2499
+#line 592 "pikchr.y"
24962500
{ pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy73); }
2497
-#line 2522 "pikchr.c"
2501
+#line 2526 "pikchr.c"
24982502
break;
24992503
case 32: /* attribute ::= go direction optrelexpr */
2500
-#line 588 "pikchr.y"
2504
+#line 593 "pikchr.y"
25012505
{ pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy60);}
2502
-#line 2527 "pikchr.c"
2506
+#line 2531 "pikchr.c"
25032507
break;
25042508
case 33: /* attribute ::= go direction even position */
2505
-#line 589 "pikchr.y"
2509
+#line 594 "pikchr.y"
25062510
{pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy139);}
2507
-#line 2532 "pikchr.c"
2511
+#line 2536 "pikchr.c"
25082512
break;
25092513
case 34: /* attribute ::= CLOSE */
2510
-#line 590 "pikchr.y"
2514
+#line 595 "pikchr.y"
25112515
{ pik_close_path(p,&yymsp[0].minor.yy0); }
2512
-#line 2537 "pikchr.c"
2516
+#line 2541 "pikchr.c"
25132517
break;
25142518
case 35: /* attribute ::= CHOP */
2515
-#line 591 "pikchr.y"
2519
+#line 596 "pikchr.y"
25162520
{ p->cur->bChop = 1; }
2517
-#line 2542 "pikchr.c"
2521
+#line 2546 "pikchr.c"
25182522
break;
25192523
case 36: /* attribute ::= FROM position */
2520
-#line 592 "pikchr.y"
2524
+#line 597 "pikchr.y"
25212525
{ pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy139); }
2522
-#line 2547 "pikchr.c"
2526
+#line 2551 "pikchr.c"
25232527
break;
25242528
case 37: /* attribute ::= TO position */
2525
-#line 593 "pikchr.y"
2529
+#line 598 "pikchr.y"
25262530
{ pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy139); }
2527
-#line 2552 "pikchr.c"
2531
+#line 2556 "pikchr.c"
25282532
break;
25292533
case 38: /* attribute ::= THEN */
2530
-#line 594 "pikchr.y"
2534
+#line 599 "pikchr.y"
25312535
{ pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2532
-#line 2557 "pikchr.c"
2536
+#line 2561 "pikchr.c"
25332537
break;
25342538
case 39: /* attribute ::= THEN optrelexpr HEADING expr */
25352539
case 41: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==41);
2536
-#line 596 "pikchr.y"
2540
+#line 601 "pikchr.y"
25372541
{pik_move_hdg(p,&yymsp[-2].minor.yy60,&yymsp[-1].minor.yy0,yymsp[0].minor.yy73,0,&yymsp[-3].minor.yy0);}
2538
-#line 2563 "pikchr.c"
2542
+#line 2567 "pikchr.c"
25392543
break;
25402544
case 40: /* attribute ::= THEN optrelexpr EDGEPT */
25412545
case 42: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==42);
2542
-#line 597 "pikchr.y"
2546
+#line 602 "pikchr.y"
25432547
{pik_move_hdg(p,&yymsp[-1].minor.yy60,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2544
-#line 2569 "pikchr.c"
2548
+#line 2573 "pikchr.c"
25452549
break;
25462550
case 43: /* attribute ::= AT position */
2547
-#line 602 "pikchr.y"
2551
+#line 607 "pikchr.y"
25482552
{ pik_set_at(p,0,&yymsp[0].minor.yy139,&yymsp[-1].minor.yy0); }
2549
-#line 2574 "pikchr.c"
2553
+#line 2578 "pikchr.c"
25502554
break;
25512555
case 44: /* attribute ::= SAME */
2552
-#line 604 "pikchr.y"
2556
+#line 609 "pikchr.y"
25532557
{pik_same(p,0,&yymsp[0].minor.yy0);}
2554
-#line 2579 "pikchr.c"
2558
+#line 2583 "pikchr.c"
25552559
break;
25562560
case 45: /* attribute ::= SAME AS object */
2557
-#line 605 "pikchr.y"
2561
+#line 610 "pikchr.y"
25582562
{pik_same(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0);}
2559
-#line 2584 "pikchr.c"
2563
+#line 2588 "pikchr.c"
25602564
break;
25612565
case 46: /* attribute ::= STRING textposition */
2562
-#line 606 "pikchr.y"
2566
+#line 611 "pikchr.y"
25632567
{pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy74);}
2564
-#line 2589 "pikchr.c"
2568
+#line 2593 "pikchr.c"
25652569
break;
25662570
case 47: /* attribute ::= FIT */
2567
-#line 607 "pikchr.y"
2571
+#line 612 "pikchr.y"
25682572
{pik_size_to_fit(p,&yymsp[0].minor.yy0); }
2569
-#line 2594 "pikchr.c"
2573
+#line 2598 "pikchr.c"
25702574
break;
25712575
case 48: /* attribute ::= BEHIND object */
2572
-#line 608 "pikchr.y"
2576
+#line 613 "pikchr.y"
25732577
{pik_behind(p,yymsp[0].minor.yy254);}
2574
-#line 2599 "pikchr.c"
2578
+#line 2603 "pikchr.c"
25752579
break;
25762580
case 49: /* withclause ::= DOT_E edge AT position */
25772581
case 50: /* withclause ::= edge AT position */ yytestcase(yyruleno==50);
2578
-#line 616 "pikchr.y"
2582
+#line 621 "pikchr.y"
25792583
{ pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy139,&yymsp[-1].minor.yy0); }
2580
-#line 2605 "pikchr.c"
2584
+#line 2609 "pikchr.c"
25812585
break;
25822586
case 51: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2583
-#line 620 "pikchr.y"
2587
+#line 625 "pikchr.y"
25842588
{yylhsminor.yy0 = yymsp[0].minor.yy0;}
2585
-#line 2610 "pikchr.c"
2589
+#line 2614 "pikchr.c"
25862590
yymsp[0].minor.yy0 = yylhsminor.yy0;
25872591
break;
25882592
case 52: /* boolproperty ::= CW */
2589
-#line 631 "pikchr.y"
2593
+#line 636 "pikchr.y"
25902594
{p->cur->cw = 1;}
2591
-#line 2616 "pikchr.c"
2595
+#line 2620 "pikchr.c"
25922596
break;
25932597
case 53: /* boolproperty ::= CCW */
2594
-#line 632 "pikchr.y"
2598
+#line 637 "pikchr.y"
25952599
{p->cur->cw = 0;}
2596
-#line 2621 "pikchr.c"
2600
+#line 2625 "pikchr.c"
25972601
break;
25982602
case 54: /* boolproperty ::= LARROW */
2599
-#line 633 "pikchr.y"
2603
+#line 638 "pikchr.y"
26002604
{p->cur->larrow=1; p->cur->rarrow=0; }
2601
-#line 2626 "pikchr.c"
2605
+#line 2630 "pikchr.c"
26022606
break;
26032607
case 55: /* boolproperty ::= RARROW */
2604
-#line 634 "pikchr.y"
2608
+#line 639 "pikchr.y"
26052609
{p->cur->larrow=0; p->cur->rarrow=1; }
2606
-#line 2631 "pikchr.c"
2610
+#line 2635 "pikchr.c"
26072611
break;
26082612
case 56: /* boolproperty ::= LRARROW */
2609
-#line 635 "pikchr.y"
2613
+#line 640 "pikchr.y"
26102614
{p->cur->larrow=1; p->cur->rarrow=1; }
2611
-#line 2636 "pikchr.c"
2615
+#line 2640 "pikchr.c"
26122616
break;
26132617
case 57: /* boolproperty ::= INVIS */
2614
-#line 636 "pikchr.y"
2618
+#line 641 "pikchr.y"
26152619
{p->cur->sw = 0.0;}
2616
-#line 2641 "pikchr.c"
2620
+#line 2645 "pikchr.c"
26172621
break;
26182622
case 58: /* boolproperty ::= THICK */
2619
-#line 637 "pikchr.y"
2623
+#line 642 "pikchr.y"
26202624
{p->cur->sw *= 1.5;}
2621
-#line 2646 "pikchr.c"
2625
+#line 2650 "pikchr.c"
26222626
break;
26232627
case 59: /* boolproperty ::= THIN */
2624
-#line 638 "pikchr.y"
2628
+#line 643 "pikchr.y"
26252629
{p->cur->sw *= 0.67;}
2626
-#line 2651 "pikchr.c"
2630
+#line 2655 "pikchr.c"
26272631
break;
26282632
case 60: /* textposition ::= */
2629
-#line 640 "pikchr.y"
2633
+#line 645 "pikchr.y"
26302634
{yymsp[1].minor.yy74 = 0;}
2631
-#line 2656 "pikchr.c"
2635
+#line 2660 "pikchr.c"
26322636
break;
26332637
case 61: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2634
-#line 643 "pikchr.y"
2635
-{yylhsminor.yy74 = pik_text_position(p,yymsp[-1].minor.yy74,&yymsp[0].minor.yy0);}
2636
-#line 2661 "pikchr.c"
2638
+#line 648 "pikchr.y"
2639
+{yylhsminor.yy74 = pik_text_position(yymsp[-1].minor.yy74,&yymsp[0].minor.yy0);}
2640
+#line 2665 "pikchr.c"
26372641
yymsp[-1].minor.yy74 = yylhsminor.yy74;
26382642
break;
26392643
case 62: /* position ::= expr COMMA expr */
2640
-#line 646 "pikchr.y"
2644
+#line 651 "pikchr.y"
26412645
{yylhsminor.yy139.x=yymsp[-2].minor.yy73; yylhsminor.yy139.y=yymsp[0].minor.yy73;}
2642
-#line 2667 "pikchr.c"
2646
+#line 2671 "pikchr.c"
26432647
yymsp[-2].minor.yy139 = yylhsminor.yy139;
26442648
break;
26452649
case 63: /* position ::= place PLUS expr COMMA expr */
2646
-#line 648 "pikchr.y"
2650
+#line 653 "pikchr.y"
26472651
{yylhsminor.yy139.x=yymsp[-4].minor.yy139.x+yymsp[-2].minor.yy73; yylhsminor.yy139.y=yymsp[-4].minor.yy139.y+yymsp[0].minor.yy73;}
2648
-#line 2673 "pikchr.c"
2652
+#line 2677 "pikchr.c"
26492653
yymsp[-4].minor.yy139 = yylhsminor.yy139;
26502654
break;
26512655
case 64: /* position ::= place MINUS expr COMMA expr */
2652
-#line 649 "pikchr.y"
2656
+#line 654 "pikchr.y"
26532657
{yylhsminor.yy139.x=yymsp[-4].minor.yy139.x-yymsp[-2].minor.yy73; yylhsminor.yy139.y=yymsp[-4].minor.yy139.y-yymsp[0].minor.yy73;}
2654
-#line 2679 "pikchr.c"
2658
+#line 2683 "pikchr.c"
26552659
yymsp[-4].minor.yy139 = yylhsminor.yy139;
26562660
break;
26572661
case 65: /* position ::= place PLUS LP expr COMMA expr RP */
2658
-#line 651 "pikchr.y"
2662
+#line 656 "pikchr.y"
26592663
{yylhsminor.yy139.x=yymsp[-6].minor.yy139.x+yymsp[-3].minor.yy73; yylhsminor.yy139.y=yymsp[-6].minor.yy139.y+yymsp[-1].minor.yy73;}
2660
-#line 2685 "pikchr.c"
2664
+#line 2689 "pikchr.c"
26612665
yymsp[-6].minor.yy139 = yylhsminor.yy139;
26622666
break;
26632667
case 66: /* position ::= place MINUS LP expr COMMA expr RP */
2664
-#line 653 "pikchr.y"
2668
+#line 658 "pikchr.y"
26652669
{yylhsminor.yy139.x=yymsp[-6].minor.yy139.x-yymsp[-3].minor.yy73; yylhsminor.yy139.y=yymsp[-6].minor.yy139.y-yymsp[-1].minor.yy73;}
2666
-#line 2691 "pikchr.c"
2670
+#line 2695 "pikchr.c"
26672671
yymsp[-6].minor.yy139 = yylhsminor.yy139;
26682672
break;
26692673
case 67: /* position ::= LP position COMMA position RP */
2670
-#line 654 "pikchr.y"
2674
+#line 659 "pikchr.y"
26712675
{yymsp[-4].minor.yy139.x=yymsp[-3].minor.yy139.x; yymsp[-4].minor.yy139.y=yymsp[-1].minor.yy139.y;}
2672
-#line 2697 "pikchr.c"
2676
+#line 2701 "pikchr.c"
26732677
break;
26742678
case 68: /* position ::= LP position RP */
2675
-#line 655 "pikchr.y"
2679
+#line 660 "pikchr.y"
26762680
{yymsp[-2].minor.yy139=yymsp[-1].minor.yy139;}
2677
-#line 2702 "pikchr.c"
2681
+#line 2706 "pikchr.c"
26782682
break;
26792683
case 69: /* position ::= expr between position AND position */
2680
-#line 657 "pikchr.y"
2681
-{yylhsminor.yy139 = pik_position_between(p,yymsp[-4].minor.yy73,yymsp[-2].minor.yy139,yymsp[0].minor.yy139);}
2682
-#line 2707 "pikchr.c"
2684
+#line 662 "pikchr.y"
2685
+{yylhsminor.yy139 = pik_position_between(yymsp[-4].minor.yy73,yymsp[-2].minor.yy139,yymsp[0].minor.yy139);}
2686
+#line 2711 "pikchr.c"
26832687
yymsp[-4].minor.yy139 = yylhsminor.yy139;
26842688
break;
26852689
case 70: /* position ::= expr LT position COMMA position GT */
2686
-#line 659 "pikchr.y"
2687
-{yylhsminor.yy139 = pik_position_between(p,yymsp[-5].minor.yy73,yymsp[-3].minor.yy139,yymsp[-1].minor.yy139);}
2688
-#line 2713 "pikchr.c"
2690
+#line 664 "pikchr.y"
2691
+{yylhsminor.yy139 = pik_position_between(yymsp[-5].minor.yy73,yymsp[-3].minor.yy139,yymsp[-1].minor.yy139);}
2692
+#line 2717 "pikchr.c"
26892693
yymsp[-5].minor.yy139 = yylhsminor.yy139;
26902694
break;
26912695
case 71: /* position ::= expr ABOVE position */
2692
-#line 660 "pikchr.y"
2696
+#line 665 "pikchr.y"
26932697
{yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.y += yymsp[-2].minor.yy73;}
2694
-#line 2719 "pikchr.c"
2698
+#line 2723 "pikchr.c"
26952699
yymsp[-2].minor.yy139 = yylhsminor.yy139;
26962700
break;
26972701
case 72: /* position ::= expr BELOW position */
2698
-#line 661 "pikchr.y"
2702
+#line 666 "pikchr.y"
26992703
{yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.y -= yymsp[-2].minor.yy73;}
2700
-#line 2725 "pikchr.c"
2704
+#line 2729 "pikchr.c"
27012705
yymsp[-2].minor.yy139 = yylhsminor.yy139;
27022706
break;
27032707
case 73: /* position ::= expr LEFT OF position */
2704
-#line 662 "pikchr.y"
2708
+#line 667 "pikchr.y"
27052709
{yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.x -= yymsp[-3].minor.yy73;}
2706
-#line 2731 "pikchr.c"
2710
+#line 2735 "pikchr.c"
27072711
yymsp[-3].minor.yy139 = yylhsminor.yy139;
27082712
break;
27092713
case 74: /* position ::= expr RIGHT OF position */
2710
-#line 663 "pikchr.y"
2714
+#line 668 "pikchr.y"
27112715
{yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.x += yymsp[-3].minor.yy73;}
2712
-#line 2737 "pikchr.c"
2716
+#line 2741 "pikchr.c"
27132717
yymsp[-3].minor.yy139 = yylhsminor.yy139;
27142718
break;
27152719
case 75: /* position ::= expr ON HEADING EDGEPT OF position */
2716
-#line 665 "pikchr.y"
2717
-{yylhsminor.yy139 = pik_position_at_hdg(p,yymsp[-5].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);}
2718
-#line 2743 "pikchr.c"
2720
+#line 670 "pikchr.y"
2721
+{yylhsminor.yy139 = pik_position_at_hdg(yymsp[-5].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);}
2722
+#line 2747 "pikchr.c"
27192723
yymsp[-5].minor.yy139 = yylhsminor.yy139;
27202724
break;
27212725
case 76: /* position ::= expr HEADING EDGEPT OF position */
2722
-#line 667 "pikchr.y"
2723
-{yylhsminor.yy139 = pik_position_at_hdg(p,yymsp[-4].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);}
2724
-#line 2749 "pikchr.c"
2726
+#line 672 "pikchr.y"
2727
+{yylhsminor.yy139 = pik_position_at_hdg(yymsp[-4].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);}
2728
+#line 2753 "pikchr.c"
27252729
yymsp[-4].minor.yy139 = yylhsminor.yy139;
27262730
break;
27272731
case 77: /* position ::= expr EDGEPT OF position */
2728
-#line 669 "pikchr.y"
2729
-{yylhsminor.yy139 = pik_position_at_hdg(p,yymsp[-3].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);}
2730
-#line 2755 "pikchr.c"
2732
+#line 674 "pikchr.y"
2733
+{yylhsminor.yy139 = pik_position_at_hdg(yymsp[-3].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);}
2734
+#line 2759 "pikchr.c"
27312735
yymsp[-3].minor.yy139 = yylhsminor.yy139;
27322736
break;
27332737
case 78: /* position ::= expr ON HEADING expr FROM position */
2734
-#line 671 "pikchr.y"
2735
-{yylhsminor.yy139 = pik_position_at_angle(p,yymsp[-5].minor.yy73,yymsp[-2].minor.yy73,yymsp[0].minor.yy139);}
2736
-#line 2761 "pikchr.c"
2738
+#line 676 "pikchr.y"
2739
+{yylhsminor.yy139 = pik_position_at_angle(yymsp[-5].minor.yy73,yymsp[-2].minor.yy73,yymsp[0].minor.yy139);}
2740
+#line 2765 "pikchr.c"
27372741
yymsp[-5].minor.yy139 = yylhsminor.yy139;
27382742
break;
27392743
case 79: /* position ::= expr HEADING expr FROM position */
2740
-#line 673 "pikchr.y"
2741
-{yylhsminor.yy139 = pik_position_at_angle(p,yymsp[-4].minor.yy73,yymsp[-2].minor.yy73,yymsp[0].minor.yy139);}
2742
-#line 2767 "pikchr.c"
2744
+#line 678 "pikchr.y"
2745
+{yylhsminor.yy139 = pik_position_at_angle(yymsp[-4].minor.yy73,yymsp[-2].minor.yy73,yymsp[0].minor.yy139);}
2746
+#line 2771 "pikchr.c"
27432747
yymsp[-4].minor.yy139 = yylhsminor.yy139;
27442748
break;
27452749
case 80: /* place ::= edge OF object */
2746
-#line 685 "pikchr.y"
2750
+#line 690 "pikchr.y"
27472751
{yylhsminor.yy139 = pik_place_of_elem(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0);}
2748
-#line 2773 "pikchr.c"
2752
+#line 2777 "pikchr.c"
27492753
yymsp[-2].minor.yy139 = yylhsminor.yy139;
27502754
break;
27512755
case 81: /* place2 ::= object */
2752
-#line 686 "pikchr.y"
2756
+#line 691 "pikchr.y"
27532757
{yylhsminor.yy139 = pik_place_of_elem(p,yymsp[0].minor.yy254,0);}
2754
-#line 2779 "pikchr.c"
2758
+#line 2783 "pikchr.c"
27552759
yymsp[0].minor.yy139 = yylhsminor.yy139;
27562760
break;
27572761
case 82: /* place2 ::= object DOT_E edge */
2758
-#line 687 "pikchr.y"
2762
+#line 692 "pikchr.y"
27592763
{yylhsminor.yy139 = pik_place_of_elem(p,yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);}
2760
-#line 2785 "pikchr.c"
2764
+#line 2789 "pikchr.c"
27612765
yymsp[-2].minor.yy139 = yylhsminor.yy139;
27622766
break;
27632767
case 83: /* place2 ::= NTH VERTEX OF object */
2764
-#line 688 "pikchr.y"
2768
+#line 693 "pikchr.y"
27652769
{yylhsminor.yy139 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy254);}
2766
-#line 2791 "pikchr.c"
2770
+#line 2795 "pikchr.c"
27672771
yymsp[-3].minor.yy139 = yylhsminor.yy139;
27682772
break;
27692773
case 84: /* object ::= nth */
2770
-#line 700 "pikchr.y"
2774
+#line 705 "pikchr.y"
27712775
{yylhsminor.yy254 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2772
-#line 2797 "pikchr.c"
2776
+#line 2801 "pikchr.c"
27732777
yymsp[0].minor.yy254 = yylhsminor.yy254;
27742778
break;
27752779
case 85: /* object ::= nth OF|IN object */
2776
-#line 701 "pikchr.y"
2780
+#line 706 "pikchr.y"
27772781
{yylhsminor.yy254 = pik_find_nth(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0);}
2778
-#line 2803 "pikchr.c"
2782
+#line 2807 "pikchr.c"
27792783
yymsp[-2].minor.yy254 = yylhsminor.yy254;
27802784
break;
27812785
case 86: /* objectname ::= PLACENAME */
2782
-#line 703 "pikchr.y"
2786
+#line 708 "pikchr.y"
27832787
{yylhsminor.yy254 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2784
-#line 2809 "pikchr.c"
2788
+#line 2813 "pikchr.c"
27852789
yymsp[0].minor.yy254 = yylhsminor.yy254;
27862790
break;
27872791
case 87: /* objectname ::= objectname DOT_U PLACENAME */
2788
-#line 705 "pikchr.y"
2792
+#line 710 "pikchr.y"
27892793
{yylhsminor.yy254 = pik_find_byname(p,yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);}
2790
-#line 2815 "pikchr.c"
2794
+#line 2819 "pikchr.c"
27912795
yymsp[-2].minor.yy254 = yylhsminor.yy254;
27922796
break;
27932797
case 88: /* nth ::= NTH CLASSNAME */
2794
-#line 707 "pikchr.y"
2798
+#line 712 "pikchr.y"
27952799
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2796
-#line 2821 "pikchr.c"
2800
+#line 2825 "pikchr.c"
27972801
yymsp[-1].minor.yy0 = yylhsminor.yy0;
27982802
break;
27992803
case 89: /* nth ::= NTH LAST CLASSNAME */
2800
-#line 708 "pikchr.y"
2804
+#line 713 "pikchr.y"
28012805
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2802
-#line 2827 "pikchr.c"
2806
+#line 2831 "pikchr.c"
28032807
yymsp[-2].minor.yy0 = yylhsminor.yy0;
28042808
break;
28052809
case 90: /* nth ::= LAST CLASSNAME */
2806
-#line 709 "pikchr.y"
2810
+#line 714 "pikchr.y"
28072811
{yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2808
-#line 2833 "pikchr.c"
2812
+#line 2837 "pikchr.c"
28092813
break;
28102814
case 91: /* nth ::= LAST */
2811
-#line 710 "pikchr.y"
2815
+#line 715 "pikchr.y"
28122816
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2813
-#line 2838 "pikchr.c"
2817
+#line 2842 "pikchr.c"
28142818
yymsp[0].minor.yy0 = yylhsminor.yy0;
28152819
break;
28162820
case 92: /* nth ::= NTH LB RB */
2817
-#line 711 "pikchr.y"
2821
+#line 716 "pikchr.y"
28182822
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2819
-#line 2844 "pikchr.c"
2823
+#line 2848 "pikchr.c"
28202824
yymsp[-2].minor.yy0 = yylhsminor.yy0;
28212825
break;
28222826
case 93: /* nth ::= NTH LAST LB RB */
2823
-#line 712 "pikchr.y"
2827
+#line 717 "pikchr.y"
28242828
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2825
-#line 2850 "pikchr.c"
2829
+#line 2854 "pikchr.c"
28262830
yymsp[-3].minor.yy0 = yylhsminor.yy0;
28272831
break;
28282832
case 94: /* nth ::= LAST LB RB */
2829
-#line 713 "pikchr.y"
2833
+#line 718 "pikchr.y"
28302834
{yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2831
-#line 2856 "pikchr.c"
2835
+#line 2860 "pikchr.c"
28322836
break;
28332837
case 95: /* expr ::= expr PLUS expr */
2834
-#line 715 "pikchr.y"
2838
+#line 720 "pikchr.y"
28352839
{yylhsminor.yy73=yymsp[-2].minor.yy73+yymsp[0].minor.yy73;}
2836
-#line 2861 "pikchr.c"
2840
+#line 2865 "pikchr.c"
28372841
yymsp[-2].minor.yy73 = yylhsminor.yy73;
28382842
break;
28392843
case 96: /* expr ::= expr MINUS expr */
2840
-#line 716 "pikchr.y"
2844
+#line 721 "pikchr.y"
28412845
{yylhsminor.yy73=yymsp[-2].minor.yy73-yymsp[0].minor.yy73;}
2842
-#line 2867 "pikchr.c"
2846
+#line 2871 "pikchr.c"
28432847
yymsp[-2].minor.yy73 = yylhsminor.yy73;
28442848
break;
28452849
case 97: /* expr ::= expr STAR expr */
2846
-#line 717 "pikchr.y"
2850
+#line 722 "pikchr.y"
28472851
{yylhsminor.yy73=yymsp[-2].minor.yy73*yymsp[0].minor.yy73;}
2848
-#line 2873 "pikchr.c"
2852
+#line 2877 "pikchr.c"
28492853
yymsp[-2].minor.yy73 = yylhsminor.yy73;
28502854
break;
28512855
case 98: /* expr ::= expr SLASH expr */
2852
-#line 718 "pikchr.y"
2856
+#line 723 "pikchr.y"
28532857
{
28542858
if( yymsp[0].minor.yy73==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy73 = 0.0; }
28552859
else{ yylhsminor.yy73 = yymsp[-2].minor.yy73/yymsp[0].minor.yy73; }
28562860
}
2857
-#line 2882 "pikchr.c"
2861
+#line 2886 "pikchr.c"
28582862
yymsp[-2].minor.yy73 = yylhsminor.yy73;
28592863
break;
28602864
case 99: /* expr ::= MINUS expr */
2861
-#line 722 "pikchr.y"
2865
+#line 727 "pikchr.y"
28622866
{yymsp[-1].minor.yy73=-yymsp[0].minor.yy73;}
2863
-#line 2888 "pikchr.c"
2867
+#line 2892 "pikchr.c"
28642868
break;
28652869
case 100: /* expr ::= PLUS expr */
2866
-#line 723 "pikchr.y"
2870
+#line 728 "pikchr.y"
28672871
{yymsp[-1].minor.yy73=yymsp[0].minor.yy73;}
2868
-#line 2893 "pikchr.c"
2872
+#line 2897 "pikchr.c"
28692873
break;
28702874
case 101: /* expr ::= LP expr RP */
2871
-#line 724 "pikchr.y"
2875
+#line 729 "pikchr.y"
28722876
{yymsp[-2].minor.yy73=yymsp[-1].minor.yy73;}
2873
-#line 2898 "pikchr.c"
2877
+#line 2902 "pikchr.c"
28742878
break;
28752879
case 102: /* expr ::= NUMBER */
2876
-#line 725 "pikchr.y"
2877
-{yylhsminor.yy73=pik_atof(p,&yymsp[0].minor.yy0);}
2878
-#line 2903 "pikchr.c"
2880
+#line 730 "pikchr.y"
2881
+{yylhsminor.yy73=pik_atof(&yymsp[0].minor.yy0);}
2882
+#line 2907 "pikchr.c"
28792883
yymsp[0].minor.yy73 = yylhsminor.yy73;
28802884
break;
28812885
case 103: /* expr ::= ID */
2882
-#line 726 "pikchr.y"
2886
+#line 731 "pikchr.y"
28832887
{yylhsminor.yy73=pik_get_var(p,&yymsp[0].minor.yy0);}
2884
-#line 2909 "pikchr.c"
2888
+#line 2913 "pikchr.c"
28852889
yymsp[0].minor.yy73 = yylhsminor.yy73;
28862890
break;
28872891
case 104: /* expr ::= FUNC1 LP expr RP */
2888
-#line 727 "pikchr.y"
2892
+#line 732 "pikchr.y"
28892893
{yylhsminor.yy73 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy73,0.0);}
2890
-#line 2915 "pikchr.c"
2894
+#line 2919 "pikchr.c"
28912895
yymsp[-3].minor.yy73 = yylhsminor.yy73;
28922896
break;
28932897
case 105: /* expr ::= FUNC2 LP expr COMMA expr RP */
2894
-#line 728 "pikchr.y"
2898
+#line 733 "pikchr.y"
28952899
{yylhsminor.yy73 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy73,yymsp[-1].minor.yy73);}
2896
-#line 2921 "pikchr.c"
2900
+#line 2925 "pikchr.c"
28972901
yymsp[-5].minor.yy73 = yylhsminor.yy73;
28982902
break;
28992903
case 106: /* expr ::= place2 DOT_XY X */
2900
-#line 729 "pikchr.y"
2904
+#line 734 "pikchr.y"
29012905
{yylhsminor.yy73 = yymsp[-2].minor.yy139.x;}
2902
-#line 2927 "pikchr.c"
2906
+#line 2931 "pikchr.c"
29032907
yymsp[-2].minor.yy73 = yylhsminor.yy73;
29042908
break;
29052909
case 107: /* expr ::= place2 DOT_XY Y */
2906
-#line 730 "pikchr.y"
2910
+#line 735 "pikchr.y"
29072911
{yylhsminor.yy73 = yymsp[-2].minor.yy139.y;}
2908
-#line 2933 "pikchr.c"
2912
+#line 2937 "pikchr.c"
29092913
yymsp[-2].minor.yy73 = yylhsminor.yy73;
29102914
break;
29112915
case 108: /* expr ::= object DOT_L numproperty */
29122916
case 109: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==109);
29132917
case 110: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==110);
2914
-#line 731 "pikchr.y"
2915
-{yylhsminor.yy73=pik_property_of(p,yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);}
2916
-#line 2941 "pikchr.c"
2918
+#line 736 "pikchr.y"
2919
+{yylhsminor.yy73=pik_property_of(yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);}
2920
+#line 2945 "pikchr.c"
29172921
yymsp[-2].minor.yy73 = yylhsminor.yy73;
29182922
break;
29192923
default:
29202924
/* (111) lvalue ::= ID */ yytestcase(yyruleno==111);
29212925
/* (112) lvalue ::= FILL */ yytestcase(yyruleno==112);
@@ -3014,18 +3018,19 @@
30143018
){
30153019
pik_parserARG_FETCH
30163020
pik_parserCTX_FETCH
30173021
#define TOKEN yyminor
30183022
/************ Begin %syntax_error code ****************************************/
3019
-#line 498 "pikchr.y"
3023
+#line 502 "pikchr.y"
30203024
30213025
if( TOKEN.z && TOKEN.z[0] ){
30223026
pik_error(p, &TOKEN, "syntax error");
30233027
}else{
30243028
pik_error(p, 0, "syntax error");
30253029
}
3026
-#line 3051 "pikchr.c"
3030
+ UNUSED_PARAMETER(yymajor);
3031
+#line 3056 "pikchr.c"
30273032
/************ End %syntax_error code ******************************************/
30283033
pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
30293034
pik_parserCTX_STORE
30303035
}
30313036
@@ -3254,11 +3259,11 @@
32543259
#else
32553260
(void)iToken;
32563261
return 0;
32573262
#endif
32583263
}
3259
-#line 736 "pikchr.y"
3264
+#line 741 "pikchr.y"
32603265
32613266
32623267
32633268
/* Chart of the 140 official HTML color names with their
32643269
** corresponding RGB value.
@@ -3534,33 +3539,10 @@
35343539
static void boxInit(Pik *p, PElem *pElem){
35353540
pElem->w = pik_value(p, "boxwid",6,0);
35363541
pElem->h = pik_value(p, "boxht",5,0);
35373542
pElem->rad = pik_value(p, "boxrad",6,0);
35383543
}
3539
-/* Translate the CP_START and CP_END reference points into the
3540
-** corresponding compass point based on the direction.
3541
-*/
3542
-static int boxTranslateEndPoint(PElem *pElem, int cp){
3543
-#if 0
3544
- if( cp==CP_START ){
3545
- switch( pElem->inDir ){
3546
- case DIR_RIGHT: cp = CP_W; break;
3547
- case DIR_DOWN: cp = CP_N; break;
3548
- case DIR_LEFT: cp = CP_E; break;
3549
- case DIR_UP: cp = CP_S; break;
3550
- }
3551
- }else if( cp==CP_END ){
3552
- switch( pElem->outDir ){
3553
- case DIR_RIGHT: cp = CP_E; break;
3554
- case DIR_DOWN: cp = CP_S; break;
3555
- case DIR_LEFT: cp = CP_W; break;
3556
- case DIR_UP: cp = CP_N; break;
3557
- }
3558
- }
3559
-#endif
3560
- return cp;
3561
-}
35623544
/* Return offset from the center of the box to the compass point
35633545
** given by parameter cp */
35643546
static PPoint boxOffset(Pik *p, PElem *pElem, int cp){
35653547
PPoint pt;
35663548
PNum w2 = 0.5*pElem->w;
@@ -3573,11 +3555,11 @@
35733555
if( rad>w2 ) rad = w2;
35743556
if( rad>h2 ) rad = h2;
35753557
rx = 0.29289321881345252392*rad;
35763558
}
35773559
pt.x = pt.y = 0.0;
3578
- switch( boxTranslateEndPoint(pElem,cp) ){
3560
+ switch( cp ){
35793561
case CP_C: pt.x = 0.0; pt.y = 0.0; break;
35803562
case CP_N: pt.x = 0.0; pt.y = h2; break;
35813563
case CP_NE: pt.x = w2-rx; pt.y = h2-rx; break;
35823564
case CP_E: pt.x = w2; pt.y = 0.0; break;
35833565
case CP_SE: pt.x = w2-rx; pt.y = rx-h2; break;
@@ -3584,10 +3566,11 @@
35843566
case CP_S: pt.x = 0.0; pt.y = -h2; break;
35853567
case CP_SW: pt.x = rx-w2; pt.y = rx-h2; break;
35863568
case CP_W: pt.x = -w2; pt.y = 0.0; break;
35873569
case CP_NW: pt.x = rx-w2; pt.y = h2-rx; break;
35883570
}
3571
+ UNUSED_PARAMETER(p);
35893572
return pt;
35903573
}
35913574
static PPoint boxChop(Pik *p, PElem *pElem, PPoint *pPt){
35923575
PNum dx, dy;
35933576
int cp = CP_C;
@@ -3627,10 +3610,11 @@
36273610
return chop;
36283611
}
36293612
static void boxFit(Pik *p, PElem *pElem, PNum w, PNum h){
36303613
if( w>0 ) pElem->w = w;
36313614
if( h>0 ) pElem->h = h;
3615
+ UNUSED_PARAMETER(p);
36323616
}
36333617
static void boxRender(Pik *p, PElem *pElem){
36343618
PNum w2 = 0.5*pElem->w;
36353619
PNum h2 = 0.5*pElem->h;
36363620
PNum rad = pElem->rad;
@@ -3704,19 +3688,21 @@
37043688
case T_HEIGHT:
37053689
pElem->w = pElem->h;
37063690
pElem->rad = 0.5*pElem->w;
37073691
break;
37083692
}
3693
+ UNUSED_PARAMETER(p);
37093694
}
37103695
static PPoint circleChop(Pik *p, PElem *pElem, PPoint *pPt){
37113696
PPoint chop;
37123697
PNum dx = pPt->x - pElem->ptAt.x;
37133698
PNum dy = pPt->y - pElem->ptAt.y;
37143699
PNum dist = hypot(dx,dy);
37153700
if( dist<pElem->rad ) return pElem->ptAt;
37163701
chop.x = pElem->ptAt.x + dx*pElem->rad/dist;
37173702
chop.y = pElem->ptAt.y + dy*pElem->rad/dist;
3703
+ UNUSED_PARAMETER(p);
37183704
return chop;
37193705
}
37203706
static void circleFit(Pik *p, PElem *pElem, PNum w, PNum h){
37213707
PNum mx = 0.0;
37223708
if( w>0 ) mx = w;
@@ -3726,10 +3712,11 @@
37263712
}
37273713
if( mx>0.0 ){
37283714
pElem->rad = 0.5*mx;
37293715
pElem->w = pElem->h = mx;
37303716
}
3717
+ UNUSED_PARAMETER(p);
37313718
}
37323719
37333720
static void circleRender(Pik *p, PElem *pElem){
37343721
PNum r = pElem->rad;
37353722
PPoint pt = pElem->ptAt;
@@ -3770,11 +3757,11 @@
37703757
static PPoint cylinderOffset(Pik *p, PElem *pElem, int cp){
37713758
PPoint pt;
37723759
PNum w2 = pElem->w*0.5;
37733760
PNum h1 = pElem->h*0.5;
37743761
PNum h2 = h1 - pElem->rad;
3775
- switch( boxTranslateEndPoint(pElem,cp) ){
3762
+ switch( cp ){
37763763
case CP_C: pt.x = 0.0; pt.y = 0.0; break;
37773764
case CP_N: pt.x = 0.0; pt.y = h1; break;
37783765
case CP_NE: pt.x = w2; pt.y = h2; break;
37793766
case CP_E: pt.x = w2; pt.y = 0.0; break;
37803767
case CP_SE: pt.x = w2; pt.y = -h2; break;
@@ -3781,10 +3768,11 @@
37813768
case CP_S: pt.x = 0.0; pt.y = -h1; break;
37823769
case CP_SW: pt.x = -w2; pt.y = -h2; break;
37833770
case CP_W: pt.x = -w2; pt.y = 0.0; break;
37843771
case CP_NW: pt.x = -w2; pt.y = h2; break;
37853772
}
3773
+ UNUSED_PARAMETER(p);
37863774
return pt;
37873775
}
37883776
37893777
/* Methods for the "dot" class */
37903778
static void dotInit(Pik *p, PElem *pElem){
@@ -3799,19 +3787,24 @@
37993787
break;
38003788
case T_FILL:
38013789
pElem->color = pElem->fill;
38023790
break;
38033791
}
3792
+ UNUSED_PARAMETER(p);
38043793
}
38053794
static void dotCheck(Pik *p, PElem *pElem){
38063795
pElem->w = pElem->h = 0;
38073796
pik_bbox_addellipse(&pElem->bbox, pElem->ptAt.x, pElem->ptAt.y,
38083797
pElem->rad, pElem->rad);
3798
+ UNUSED_PARAMETER(p);
38093799
}
38103800
static PPoint dotOffset(Pik *p, PElem *pElem, int cp){
38113801
PPoint zero;
38123802
zero.x = zero.y = 0;
3803
+ UNUSED_PARAMETER(p);
3804
+ UNUSED_PARAMETER(pElem);
3805
+ UNUSED_PARAMETER(cp);
38133806
return zero;
38143807
}
38153808
static void dotRender(Pik *p, PElem *pElem){
38163809
PNum r = pElem->rad;
38173810
PPoint pt = pElem->ptAt;
@@ -3843,19 +3836,20 @@
38433836
dq = dx*s;
38443837
dist = hypot(dq,dy);
38453838
if( dist<pElem->h ) return pElem->ptAt;
38463839
chop.x = pElem->ptAt.x + 0.5*dq*pElem->h/(dist*s);
38473840
chop.y = pElem->ptAt.y + 0.5*dy*pElem->h/dist;
3841
+ UNUSED_PARAMETER(p);
38483842
return chop;
38493843
}
38503844
static PPoint ellipseOffset(Pik *p, PElem *pElem, int cp){
38513845
PPoint pt;
38523846
PNum w = pElem->w*0.5;
38533847
PNum w2 = w*0.70710678118654747608;
38543848
PNum h = pElem->h*0.5;
38553849
PNum h2 = h*0.70710678118654747608;
3856
- switch( boxTranslateEndPoint(pElem,cp) ){
3850
+ switch( cp ){
38573851
case CP_C: pt.x = 0.0; pt.y = 0.0; break;
38583852
case CP_N: pt.x = 0.0; pt.y = h; break;
38593853
case CP_NE: pt.x = w2; pt.y = h2; break;
38603854
case CP_E: pt.x = w; pt.y = 0.0; break;
38613855
case CP_SE: pt.x = w2; pt.y = -h2; break;
@@ -3862,10 +3856,11 @@
38623856
case CP_S: pt.x = 0.0; pt.y = -h; break;
38633857
case CP_SW: pt.x = -w2; pt.y = -h2; break;
38643858
case CP_W: pt.x = -w; pt.y = 0.0; break;
38653859
case CP_NW: pt.x = -w2; pt.y = h2; break;
38663860
}
3861
+ UNUSED_PARAMETER(p);
38673862
return pt;
38683863
}
38693864
static void ellipseRender(Pik *p, PElem *pElem){
38703865
PNum w = pElem->w;
38713866
PNum h = pElem->h;
@@ -3897,11 +3892,11 @@
38973892
PNum mn = w2<h2 ? w2 : h2;
38983893
if( rx>mn ) rx = mn;
38993894
if( rx<mn*0.25 ) rx = mn*0.25;
39003895
pt.x = pt.y = 0.0;
39013896
rx *= 0.5;
3902
- switch( boxTranslateEndPoint(pElem,cp) ){
3897
+ switch( cp ){
39033898
case CP_C: pt.x = 0.0; pt.y = 0.0; break;
39043899
case CP_N: pt.x = 0.0; pt.y = h2; break;
39053900
case CP_NE: pt.x = w2-rx; pt.y = h2-rx; break;
39063901
case CP_E: pt.x = w2; pt.y = 0.0; break;
39073902
case CP_SE: pt.x = w2; pt.y = -h2; break;
@@ -3908,15 +3903,17 @@
39083903
case CP_S: pt.x = 0.0; pt.y = -h2; break;
39093904
case CP_SW: pt.x = -w2; pt.y = -h2; break;
39103905
case CP_W: pt.x = -w2; pt.y = 0.0; break;
39113906
case CP_NW: pt.x = -w2; pt.y = h2; break;
39123907
}
3908
+ UNUSED_PARAMETER(p);
39133909
return pt;
39143910
}
39153911
static void fileFit(Pik *p, PElem *pElem, PNum w, PNum h){
39163912
if( w>0 ) pElem->w = w;
39173913
if( h>0 ) pElem->h = h + 2*pElem->rad;
3914
+ UNUSED_PARAMETER(p);
39183915
}
39193916
static void fileRender(Pik *p, PElem *pElem){
39203917
PNum w2 = 0.5*pElem->w;
39213918
PNum h2 = 0.5*pElem->h;
39223919
PNum rad = pElem->rad;
@@ -3950,11 +3947,10 @@
39503947
pElem->h = pik_value(p, "lineht",6,0);
39513948
pElem->rad = pik_value(p, "linerad",7,0);
39523949
pElem->fill = -1.0;
39533950
}
39543951
static PPoint lineOffset(Pik *p, PElem *pElem, int cp){
3955
-
39563952
#if 0
39573953
/* In legacy PIC, the .center of an unclosed line is half way between
39583954
** its .start and .end. */
39593955
if( cp==CP_C && !pElem->bClose ){
39603956
PPoint out;
@@ -3961,11 +3957,10 @@
39613957
out.x = 0.5*(pElem->ptEnter.x + pElem->ptExit.x) - pElem->ptAt.x;
39623958
out.y = 0.5*(pElem->ptEnter.x + pElem->ptExit.y) - pElem->ptAt.y;
39633959
return out;
39643960
}
39653961
#endif
3966
-
39673962
return boxOffset(p,pElem,cp);
39683963
}
39693964
static void lineRender(Pik *p, PElem *pElem){
39703965
int i;
39713966
if( pElem->sw>0.0 ){
@@ -4001,24 +3996,29 @@
40013996
pElem->color = -1.0;
40023997
pElem->sw = -1.0;
40033998
}
40043999
static void moveRender(Pik *p, PElem *pElem){
40054000
/* No-op */
4001
+ UNUSED_PARAMETER(p);
4002
+ UNUSED_PARAMETER(pElem);
40064003
}
40074004
40084005
/* Methods for the "oval" class */
40094006
static void ovalInit(Pik *p, PElem *pElem){
40104007
pElem->h = pik_value(p, "ovalht",6,0);
40114008
pElem->w = pik_value(p, "ovalwid",7,0);
40124009
pElem->rad = 0.5*(pElem->h<pElem->w?pElem->h:pElem->w);
40134010
}
40144011
static void ovalNumProp(Pik *p, PElem *pElem, PToken *pId){
4012
+ UNUSED_PARAMETER(p);
4013
+ UNUSED_PARAMETER(pId);
40154014
/* Always adjust the radius to be half of the smaller of
40164015
** the width and height. */
40174016
pElem->rad = 0.5*(pElem->h<pElem->w?pElem->h:pElem->w);
40184017
}
40194018
static void ovalFit(Pik *p, PElem *pElem, PNum w, PNum h){
4019
+ UNUSED_PARAMETER(p);
40204020
if( w>0 ) pElem->w = w;
40214021
if( h>0 ) pElem->h = h;
40224022
if( pElem->w<pElem->h ) pElem->w = pElem->h;
40234023
}
40244024
@@ -4114,10 +4114,11 @@
41144114
41154115
/* Methods for the "sublist" class */
41164116
static void sublistInit(Pik *p, PElem *pElem){
41174117
PEList *pList = pElem->pSublist;
41184118
int i;
4119
+ UNUSED_PARAMETER(p);
41194120
pik_bbox_init(&pElem->bbox);
41204121
for(i=0; i<pList->n; i++){
41214122
pik_bbox_addbox(&pElem->bbox, &pList->a[i]->bbox);
41224123
}
41234124
pElem->w = pElem->bbox.ne.x - pElem->bbox.sw.x;
@@ -4305,11 +4306,11 @@
43054306
43064307
/*
43074308
** Reduce the length of the line segment by amt (if possible) by
43084309
** modifying the location of *t.
43094310
*/
4310
-static void pik_chop(Pik *p, PPoint *f, PPoint *t, PNum amt){
4311
+static void pik_chop(PPoint *f, PPoint *t, PNum amt){
43114312
PNum dx = t->x - f->x;
43124313
PNum dy = t->y - f->y;
43134314
PNum dist = hypot(dx,dy);
43144315
PNum r;
43154316
if( dist<=amt ){
@@ -4350,11 +4351,11 @@
43504351
by = f->y + e1*dy;
43514352
pik_append_xy(p,"<polygon points=\"", t->x, t->y);
43524353
pik_append_xy(p," ",bx-ddx, by-ddy);
43534354
pik_append_xy(p," ",bx+ddx, by+ddy);
43544355
pik_append_clr(p,"\" style=\"fill:",pElem->color,"\"/>\n");
4355
- pik_chop(p,f,t,h/2);
4356
+ pik_chop(f,t,h/2);
43564357
}
43574358
43584359
/*
43594360
** Compute the relative offset to an edge location from the reference for a
43604361
** an element.
@@ -4538,11 +4539,11 @@
45384539
** Compute the vertical locations for all text items in the
45394540
** element pElem. In other words, set every pElem->aTxt[*].eCode
45404541
** value to contain exactly one of: TP_ABOVE2, TP_ABOVE, TP_CENTER,
45414542
** TP_BELOW, or TP_BELOW2 is set.
45424543
*/
4543
-static void pik_txt_vertical_layout(Pik *p, PElem *pElem){
4544
+static void pik_txt_vertical_layout(PElem *pElem){
45444545
int n, i;
45454546
PToken *aTxt;
45464547
n = pElem->nTxt;
45474548
if( n==0 ) return;
45484549
aTxt = pElem->aTxt;
@@ -4636,11 +4637,11 @@
46364637
if( p->nErr ) return;
46374638
if( pElem->nTxt==0 ) return;
46384639
aTxt = pElem->aTxt;
46394640
dy = 0.5*p->charHeight;
46404641
n = pElem->nTxt;
4641
- pik_txt_vertical_layout(p, pElem);
4642
+ pik_txt_vertical_layout(pElem);
46424643
x = pElem->ptAt.x;
46434644
for(i=0; i<n; i++){
46444645
if( (pElem->aTxt[i].eCode & TP_CENTER)!=0 ) hasCenter = 1;
46454646
}
46464647
if( hasCenter ){
@@ -4765,11 +4766,11 @@
47654766
for(nExtra=0; (c = p->zIn[i+nExtra])!=0 && c!='\n'; nExtra++){}
47664767
pik_append(p, "<div><pre>\n", -1);
47674768
pik_append_text(p, p->zIn, i+nExtra, 3);
47684769
pik_append(p, "\n", 1);
47694770
for(i=0; i<iCol; i++){ pik_append(p, " ", 1); }
4770
- for(i=0; i<pErr->n; i++) pik_append(p, "^", 1);
4771
+ for(i=0; i<(int)pErr->n; i++) pik_append(p, "^", 1);
47714772
pik_append(p, "\nERROR: ", -1);
47724773
pik_append_text(p, zMsg, -1, 0);
47734774
pik_append(p, "\n", 1);
47744775
pik_append(p, "\n</pre></div>\n", -1);
47754776
}
@@ -4841,18 +4842,18 @@
48414842
** (3) Hex integers: 0x000000
48424843
**
48434844
** This routine returns the result in inches. If a different unit
48444845
** is specified, the conversion happens automatically.
48454846
*/
4846
-PNum pik_atof(Pik *p, PToken *num){
4847
+PNum pik_atof(PToken *num){
48474848
char *endptr;
48484849
PNum ans;
48494850
if( num->n>=3 && num->z[0]=='0' && (num->z[1]=='x'||num->z[1]=='X') ){
48504851
return (PNum)strtol(num->z+2, 0, 16);
48514852
}
48524853
ans = strtod(num->z, &endptr);
4853
- if( (int)(endptr - num->z)==num->n-2 ){
4854
+ if( (int)(endptr - num->z)==(int)num->n-2 ){
48544855
char c1 = endptr[0];
48554856
char c2 = endptr[1];
48564857
if( c1=='c' && c2=='m' ){
48574858
ans /= 2.54;
48584859
}else if( c1=='m' && c2=='m' ){
@@ -5063,11 +5064,11 @@
50635064
}
50645065
50655066
/*
50665067
** Set the output direction and exit point for an element.
50675068
*/
5068
-static void pik_elem_set_exit(Pik *p, PElem *pElem, int eDir){
5069
+static void pik_elem_set_exit(PElem *pElem, int eDir){
50695070
assert( ValidDir(eDir) );
50705071
pElem->outDir = eDir;
50715072
if( !pElem->type->isLine || pElem->bClose ){
50725073
pElem->ptExit = pElem->ptAt;
50735074
switch( pElem->outDir ){
@@ -5097,11 +5098,11 @@
50975098
** You can make pikchr render the above exactly like PIC
50985099
** by deleting the following three lines. But I (drh) think
50995100
** it works better with those lines in place.
51005101
*/
51015102
if( p->list && p->list->n ){
5102
- pik_elem_set_exit(p, p->list->a[p->list->n-1], eDir);
5103
+ pik_elem_set_exit(p->list->a[p->list->n-1], eDir);
51035104
}
51045105
}
51055106
51065107
/* Move all coordinates contained within an element (and within its
51075108
** substructure) by dx, dy
@@ -5247,11 +5248,11 @@
52475248
52485249
/*
52495250
** If the current path information came from a "same" or "same as"
52505251
** reset it.
52515252
*/
5252
-static void pik_reset_samepath(Pik *p, PElem *pElem){
5253
+static void pik_reset_samepath(Pik *p){
52535254
if( p->samePath ){
52545255
p->samePath = 0;
52555256
p->nTPath = 1;
52565257
}
52575258
}
@@ -5277,11 +5278,11 @@
52775278
52785279
/* Advance to the next entry in p->aTPath. Return its index.
52795280
*/
52805281
static int pik_next_rpath(Pik *p, PToken *pErr){
52815282
int n = p->nTPath - 1;
5282
- if( n+1>=count(p->aTPath) ){
5283
+ if( n+1>=(int)count(p->aTPath) ){
52835284
pik_error(0, pErr, "too many path elements");
52845285
return n;
52855286
}
52865287
n++;
52875288
p->nTPath++;
@@ -5299,16 +5300,16 @@
52995300
int dir;
53005301
if( !pElem->type->isLine ){
53015302
if( pDir ){
53025303
pik_error(p, pDir, "use with line-oriented objects only");
53035304
}else{
5304
- PToken x = pik_next_semantic_token(p, &pElem->errTok);
5305
+ PToken x = pik_next_semantic_token(&pElem->errTok);
53055306
pik_error(p, &x, "syntax error");
53065307
}
53075308
return;
53085309
}
5309
- pik_reset_samepath(p, pElem);
5310
+ pik_reset_samepath(p);
53105311
n = p->nTPath - 1;
53115312
if( p->thenFlag || p->mTPath==3 || n==0 ){
53125313
n = pik_next_rpath(p, pDir);
53135314
p->thenFlag = 0;
53145315
}
@@ -5357,11 +5358,11 @@
53575358
PNum rDist = pDist->rAbs + pik_value(p,"linewid",7,0)*pDist->rRel;
53585359
if( !pElem->type->isLine ){
53595360
pik_error(p, pErr, "use with line-oriented objects only");
53605361
return;
53615362
}
5362
- pik_reset_samepath(p, pElem);
5363
+ pik_reset_samepath(p);
53635364
do{
53645365
n = pik_next_rpath(p, pErr);
53655366
}while( n<1 );
53665367
if( pHeading ){
53675368
if( rHdg<0.0 || rHdg>360.0 ){
@@ -5403,11 +5404,11 @@
54035404
int n;
54045405
if( !pElem->type->isLine ){
54055406
pik_error(p, pDir, "use with line-oriented objects only");
54065407
return;
54075408
}
5408
- pik_reset_samepath(p, pElem);
5409
+ pik_reset_samepath(p);
54095410
n = p->nTPath - 1;
54105411
if( p->thenFlag || p->mTPath==3 || n==0 ){
54115412
n = pik_next_rpath(p, pDir);
54125413
p->thenFlag = 0;
54135414
}
@@ -5515,11 +5516,11 @@
55155516
if( pElem->mProp & A_AT ){
55165517
pik_error(p, pErrTok, "location fixed by prior \"at\"");
55175518
return;
55185519
}
55195520
pElem->mProp |= A_AT;
5520
- pElem->eWith = pEdge ? boxTranslateEndPoint(pElem,pEdge->eEdge) : CP_C;
5521
+ pElem->eWith = pEdge ? pEdge->eEdge : CP_C;
55215522
pElem->with = *pAt;
55225523
}
55235524
55245525
/*
55255526
** Try to add a text attribute to an element
@@ -5536,11 +5537,11 @@
55365537
pT->eCode = iPos;
55375538
}
55385539
55395540
/* Merge "text-position" flags
55405541
*/
5541
-static int pik_text_position(Pik *p, int iPrev, PToken *pFlag){
5542
+static int pik_text_position(int iPrev, PToken *pFlag){
55425543
int iRes = iPrev;
55435544
switch( pFlag->eType ){
55445545
case T_LJUST: iRes = (iRes&~TP_JMASK) | TP_LJUST; break;
55455546
case T_RJUST: iRes = (iRes&~TP_JMASK) | TP_RJUST; break;
55465547
case T_ABOVE: iRes = (iRes&~TP_VMASK) | TP_ABOVE; break;
@@ -5610,11 +5611,11 @@
56105611
if( pElem->type->xFit==0 ) return;
56115612
if( (pElem->mProp & A_HEIGHT)==0 ){
56125613
int hasCenter = 0;
56135614
int hasSingleStack = 0;
56145615
int hasDoubleStack = 0;
5615
- pik_txt_vertical_layout(p, pElem);
5616
+ pik_txt_vertical_layout(pElem);
56165617
for(i=0; i<pElem->nTxt; i++){
56175618
if( pElem->aTxt[i].eCode & TP_CENTER ){
56185619
hasCenter = 1;
56195620
}else if( pElem->aTxt[i].eCode & (TP_ABOVE2|TP_BELOW2) ){
56205621
hasDoubleStack = 1;
@@ -5736,11 +5737,12 @@
57365737
int first, last, mid, c = 0;
57375738
first = 0;
57385739
last = count(aColor)-1;
57395740
while( first<=last ){
57405741
const char *zClr;
5741
- int c1, c2, i;
5742
+ int c1, c2;
5743
+ unsigned int i;
57425744
mid = (first+last)/2;
57435745
zClr = aColor[mid].zName;
57445746
for(i=0; i<pId->n; i++){
57455747
c1 = zClr[i]&0x7f;
57465748
if( isupper(c1) ) c1 = tolower(c1);
@@ -5970,11 +5972,11 @@
59705972
}
59715973
}
59725974
59735975
/* Do a linear interpolation of two positions.
59745976
*/
5975
-static PPoint pik_position_between(Pik *p, PNum x, PPoint p1, PPoint p2){
5977
+static PPoint pik_position_between(PNum x, PPoint p1, PPoint p2){
59765978
PPoint out;
59775979
if( x<0.0 ) x = 0.0;
59785980
if( x>1.0 ) x = 1.0;
59795981
out.x = p2.x*x + p1.x*(1.0 - x);
59805982
out.y = p2.y*x + p1.y*(1.0 - x);
@@ -5984,21 +5986,21 @@
59845986
/* Compute the position that is dist away from pt at an heading angle of r
59855987
**
59865988
** The angle is a compass heading in degrees. North is 0 (or 360).
59875989
** East is 90. South is 180. West is 270. And so forth.
59885990
*/
5989
-static PPoint pik_position_at_angle(Pik *p, PNum dist, PNum r, PPoint pt){
5991
+static PPoint pik_position_at_angle(PNum dist, PNum r, PPoint pt){
59905992
r *= 0.017453292519943295769; /* degrees to radians */
59915993
pt.x += dist*sin(r);
59925994
pt.y += dist*cos(r);
59935995
return pt;
59945996
}
59955997
59965998
/* Compute the position that is dist away at a compass point
59975999
*/
5998
-static PPoint pik_position_at_hdg(Pik *p, PNum dist, PToken *pD, PPoint pt){
5999
- return pik_position_at_angle(p, dist, pik_hdg_angle[pD->eEdge], pt);
6000
+static PPoint pik_position_at_hdg(PNum dist, PToken *pD, PPoint pt){
6001
+ return pik_position_at_angle(dist, pik_hdg_angle[pD->eEdge], pt);
60006002
}
60016003
60026004
/* Return the coordinates for the n-th vertex of a line.
60036005
*/
60046006
static PPoint pik_nth_vertex(Pik *p, PToken *pNth, PToken *pErr, PElem *pObj){
@@ -6017,11 +6019,11 @@
60176019
return pObj->aPath[n-1];
60186020
}
60196021
60206022
/* Return the value of a property of an object.
60216023
*/
6022
-static PNum pik_property_of(Pik *p, PElem *pElem, PToken *pProp){
6024
+static PNum pik_property_of(PElem *pElem, PToken *pProp){
60236025
PNum v = 0.0;
60246026
switch( pProp->eType ){
60256027
case T_HEIGHT: v = pElem->h; break;
60266028
case T_WIDTH: v = pElem->w; break;
60276029
case T_RADIUS: v = pElem->rad; break;
@@ -6174,16 +6176,15 @@
61746176
*/
61756177
if( pElem->type->isLine ){
61766178
pElem->aPath = malloc( sizeof(PPoint)*p->nTPath );
61776179
if( pElem->aPath==0 ){
61786180
pik_error(p, 0, 0);
6179
- pElem->nPath = 0;
6181
+ return;
61806182
}else{
61816183
pElem->nPath = p->nTPath;
61826184
for(i=0; i<p->nTPath; i++){
61836185
pElem->aPath[i] = p->aTPath[i];
6184
- pik_bbox_add_xy(&pElem->bbox, pElem->aPath[i].x, pElem->aPath[i].y);
61856186
}
61866187
}
61876188
61886189
/* "chop" processing:
61896190
** If the line goes to the center of an object with an
@@ -6193,15 +6194,18 @@
61936194
int n = pElem->nPath;
61946195
pik_autochop(p, &pElem->aPath[n-2], &pElem->aPath[n-1]);
61956196
pik_autochop(p, &pElem->aPath[1], &pElem->aPath[0]);
61966197
}
61976198
6198
- pElem->ptEnter = p->aTPath[0];
6199
- pElem->ptExit = p->aTPath[p->nTPath-1];
6199
+ pElem->ptEnter = pElem->aPath[0];
6200
+ pElem->ptExit = pElem->aPath[pElem->nPath-1];
62006201
62016202
/* Compute the center of the line based on the bounding box over
62026203
** the vertexes */
6204
+ for(i=0; i<pElem->nPath; i++){
6205
+ pik_bbox_add_xy(&pElem->bbox, pElem->aPath[i].x, pElem->aPath[i].y);
6206
+ }
62036207
pElem->ptAt.x = (pElem->bbox.ne.x + pElem->bbox.sw.x)/2.0;
62046208
pElem->ptAt.y = (pElem->bbox.ne.y + pElem->bbox.sw.y)/2.0;
62056209
62066210
/* Reset the width and height of the object to be the width and height
62076211
** of the bounding box over vertexes */
@@ -6210,11 +6214,11 @@
62106214
62116215
/* If this is a polygon (if it has the "close" attribute), then
62126216
** adjust the exit point */
62136217
if( pElem->bClose ){
62146218
/* "closed" lines work like block objects */
6215
- pik_elem_set_exit(p, pElem, pElem->inDir);
6219
+ pik_elem_set_exit(pElem, pElem->inDir);
62166220
}else{
62176221
/* For an open line, the "center" is half way between
62186222
** the .start and the .end */
62196223
}
62206224
}else{
@@ -6778,11 +6782,11 @@
67786782
/* This is not an exp */
67796783
i -= 2;
67806784
}else{
67816785
i++;
67826786
isInt = 0;
6783
- while( (c = z[i])>=0 && c<='9' ){ i++; }
6787
+ while( (c = z[i])>='0' && c<='9' ){ i++; }
67846788
}
67856789
}
67866790
c2 = c ? z[i+1] : 0;
67876791
if( isInt ){
67886792
if( (c=='t' && c2=='h')
@@ -6837,11 +6841,11 @@
68376841
68386842
/*
68396843
** Return a pointer to the next non-whitespace token after pThis.
68406844
** This is used to help form error messages.
68416845
*/
6842
-static PToken pik_next_semantic_token(Pik *p, PToken *pThis){
6846
+static PToken pik_next_semantic_token(PToken *pThis){
68436847
PToken x;
68446848
int sz;
68456849
int i = pThis->n;
68466850
memset(&x, 0, sizeof(x));
68476851
x.z = pThis->z;
@@ -7055,6 +7059,6 @@
70557059
printf("</body></html>\n");
70567060
return 0;
70577061
}
70587062
#endif /* PIKCHR_SHELL */
70597063
7060
-#line 7085 "pikchr.c"
7064
+#line 7089 "pikchr.c"
70617065
--- src/pikchr.c
+++ src/pikchr.c
@@ -124,10 +124,14 @@
124 #include <assert.h>
125 #define count(X) (sizeof(X)/sizeof(X[0]))
126 #ifndef M_PI
127 # define M_PI 3.1415926535897932385
128 #endif
 
 
 
 
129
130 typedef struct Pik Pik; /* Complete parsing context */
131 typedef struct PToken PToken; /* A single token */
132 typedef struct PElem PElem; /* A single diagram object or "element" */
133 typedef struct PEList PEList; /* A list of elements */
@@ -397,11 +401,11 @@
397 static void pik_append_arc(Pik*,PNum,PNum,PNum,PNum);
398 static void pik_append_clr(Pik*,const char*,PNum,const char*);
399 static void pik_append_style(Pik*,PElem*);
400 static void pik_append_txt(Pik*,PElem*, PBox*);
401 static void pik_draw_arrowhead(Pik*,PPoint*pFrom,PPoint*pTo,PElem*);
402 static void pik_chop(Pik*,PPoint*pFrom,PPoint*pTo,PNum);
403 static void pik_error(Pik*,PToken*,const char*);
404 static void pik_elist_free(Pik*,PEList*);
405 static void pik_elem_free(Pik*,PElem*);
406 static void pik_render(Pik*,PEList*);
407 static PEList *pik_elist_append(Pik*,PEList*,PElem*);
@@ -410,11 +414,11 @@
410 static void pik_elem_setname(Pik*,PElem*,PToken*);
411 static void pik_set_var(Pik*,PToken*,PNum,PToken*);
412 static PNum pik_value(Pik*,const char*,int,int*);
413 static PNum pik_lookup_color(Pik*,PToken*);
414 static PNum pik_get_var(Pik*,PToken*);
415 static PNum pik_atof(Pik*,PToken*);
416 static void pik_after_adding_attributes(Pik*,PElem*);
417 static void pik_elem_move(PElem*,PNum dx, PNum dy);
418 static void pik_elist_move(PEList*,PNum dx, PNum dy);
419 static void pik_set_numprop(Pik*,PToken*,PRel*);
420 static void pik_set_clrprop(Pik*,PToken*,PNum);
@@ -437,26 +441,26 @@
437 static void pik_bbox_add_xy(PBox*,PNum,PNum);
438 static void pik_bbox_addellipse(PBox*,PNum x,PNum y,PNum rx,PNum ry);
439 static void pik_add_txt(Pik*,PToken*,int);
440 static int pik_text_length(const PToken *pToken);
441 static void pik_size_to_fit(Pik*,PToken*);
442 static int pik_text_position(Pik*,int,PToken*);
443 static PNum pik_property_of(Pik*,PElem*,PToken*);
444 static PNum pik_func(Pik*,PToken*,PNum,PNum);
445 static PPoint pik_position_between(Pik *p, PNum x, PPoint p1, PPoint p2);
446 static PPoint pik_position_at_angle(Pik *p, PNum dist, PNum r, PPoint pt);
447 static PPoint pik_position_at_hdg(Pik *p, PNum dist, PToken *pD, PPoint pt);
448 static void pik_same(Pik *p, PElem*, PToken*);
449 static PPoint pik_nth_vertex(Pik *p, PToken *pNth, PToken *pErr, PElem *pElem);
450 static PToken pik_next_semantic_token(Pik *p, PToken *pThis);
451 static void pik_compute_layout_settings(Pik*);
452 static void pik_behind(Pik*,PElem*);
453 static PElem *pik_assert(Pik*,PNum,PToken*,PNum);
454 static PElem *pik_place_assert(Pik*,PPoint*,PToken*,PPoint*);
455
456
457 #line 483 "pikchr.c"
458 /**************** End of %include directives **********************************/
459 /* These constants specify the various numeric values for terminal symbols.
460 ***************** Begin token definitions *************************************/
461 #ifndef T_ID
462 #define T_ID 1
@@ -1628,22 +1632,22 @@
1628 ** inside the C code.
1629 */
1630 /********* Begin destructor definitions ***************************************/
1631 case 94: /* element_list */
1632 {
1633 #line 472 "pikchr.y"
1634 pik_elist_free(p,(yypminor->yy72));
1635 #line 1660 "pikchr.c"
1636 }
1637 break;
1638 case 95: /* element */
1639 case 96: /* unnamed_element */
1640 case 97: /* basetype */
1641 {
1642 #line 474 "pikchr.y"
1643 pik_elem_free(p,(yypminor->yy254));
1644 #line 1669 "pikchr.c"
1645 }
1646 break;
1647 /********* End destructor definitions *****************************************/
1648 default: break; /* If no destructor action specified: do nothing */
1649 }
@@ -1806,11 +1810,11 @@
1806 }
1807 }
1808 #endif /* YYWILDCARD */
1809 return yy_default[stateno];
1810 }else{
1811 assert( i>=0 && i<sizeof(yy_action)/sizeof(yy_action[0]) );
1812 return yy_action[i];
1813 }
1814 }while(1);
1815 }
1816
@@ -1857,14 +1861,14 @@
1857 #endif
1858 while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
1859 /* Here code is inserted which will execute if the parser
1860 ** stack every overflows */
1861 /******** Begin %stack_overflow code ******************************************/
1862 #line 505 "pikchr.y"
1863
1864 pik_error(p, 0, "parser stack overflow");
1865 #line 1890 "pikchr.c"
1866 /******** End %stack_overflow code ********************************************/
1867 pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
1868 pik_parserCTX_STORE
1869 }
1870
@@ -2329,593 +2333,593 @@
2329 ** break;
2330 */
2331 /********** Begin reduce actions **********************************************/
2332 YYMINORTYPE yylhsminor;
2333 case 0: /* document ::= element_list */
2334 #line 509 "pikchr.y"
2335 {pik_render(p,yymsp[0].minor.yy72);}
2336 #line 2361 "pikchr.c"
2337 break;
2338 case 1: /* element_list ::= element */
2339 #line 512 "pikchr.y"
2340 { yylhsminor.yy72 = pik_elist_append(p,0,yymsp[0].minor.yy254); }
2341 #line 2366 "pikchr.c"
2342 yymsp[0].minor.yy72 = yylhsminor.yy72;
2343 break;
2344 case 2: /* element_list ::= element_list EOL element */
2345 #line 514 "pikchr.y"
2346 { yylhsminor.yy72 = pik_elist_append(p,yymsp[-2].minor.yy72,yymsp[0].minor.yy254); }
2347 #line 2372 "pikchr.c"
2348 yymsp[-2].minor.yy72 = yylhsminor.yy72;
2349 break;
2350 case 3: /* element ::= */
2351 #line 517 "pikchr.y"
2352 { yymsp[1].minor.yy254 = 0; }
2353 #line 2378 "pikchr.c"
2354 break;
2355 case 4: /* element ::= direction */
2356 #line 518 "pikchr.y"
2357 { pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy254=0; }
2358 #line 2383 "pikchr.c"
2359 yymsp[0].minor.yy254 = yylhsminor.yy254;
2360 break;
2361 case 5: /* element ::= lvalue ASSIGN rvalue */
2362 #line 519 "pikchr.y"
2363 {pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy73,&yymsp[-1].minor.yy0); yylhsminor.yy254=0;}
2364 #line 2389 "pikchr.c"
2365 yymsp[-2].minor.yy254 = yylhsminor.yy254;
2366 break;
2367 case 6: /* element ::= PLACENAME COLON unnamed_element */
2368 #line 521 "pikchr.y"
2369 { yylhsminor.yy254 = yymsp[0].minor.yy254; pik_elem_setname(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0); }
2370 #line 2395 "pikchr.c"
2371 yymsp[-2].minor.yy254 = yylhsminor.yy254;
2372 break;
2373 case 7: /* element ::= PLACENAME COLON position */
2374 #line 523 "pikchr.y"
2375 { yylhsminor.yy254 = pik_elem_new(p,0,0,0);
2376 if(yylhsminor.yy254){ yylhsminor.yy254->ptAt = yymsp[0].minor.yy139; pik_elem_setname(p,yylhsminor.yy254,&yymsp[-2].minor.yy0); }}
2377 #line 2402 "pikchr.c"
2378 yymsp[-2].minor.yy254 = yylhsminor.yy254;
2379 break;
2380 case 8: /* element ::= unnamed_element */
2381 #line 525 "pikchr.y"
2382 {yylhsminor.yy254 = yymsp[0].minor.yy254;}
2383 #line 2408 "pikchr.c"
2384 yymsp[0].minor.yy254 = yylhsminor.yy254;
2385 break;
2386 case 9: /* element ::= print prlist */
2387 #line 526 "pikchr.y"
2388 {pik_append(p,"<br>\n",5); yymsp[-1].minor.yy254=0;}
2389 #line 2414 "pikchr.c"
2390 break;
2391 case 10: /* element ::= ASSERT LP expr EQ expr RP */
2392 #line 531 "pikchr.y"
2393 {yymsp[-5].minor.yy254=pik_assert(p,yymsp[-3].minor.yy73,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy73);}
2394 #line 2419 "pikchr.c"
2395 break;
2396 case 11: /* element ::= ASSERT LP place EQ place RP */
2397 #line 533 "pikchr.y"
2398 {yymsp[-5].minor.yy254=pik_place_assert(p,&yymsp[-3].minor.yy139,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy139);}
2399 #line 2424 "pikchr.c"
2400 break;
2401 case 12: /* rvalue ::= PLACENAME */
2402 #line 544 "pikchr.y"
2403 {yylhsminor.yy73 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2404 #line 2429 "pikchr.c"
2405 yymsp[0].minor.yy73 = yylhsminor.yy73;
2406 break;
2407 case 13: /* pritem ::= FILL */
2408 case 14: /* pritem ::= COLOR */ yytestcase(yyruleno==14);
2409 case 15: /* pritem ::= THICKNESS */ yytestcase(yyruleno==15);
2410 #line 549 "pikchr.y"
2411 {pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2412 #line 2437 "pikchr.c"
2413 break;
2414 case 16: /* pritem ::= rvalue */
2415 #line 552 "pikchr.y"
2416 {pik_append_num(p,"",yymsp[0].minor.yy73);}
2417 #line 2442 "pikchr.c"
2418 break;
2419 case 17: /* pritem ::= STRING */
2420 #line 553 "pikchr.y"
2421 {pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2422 #line 2447 "pikchr.c"
2423 break;
2424 case 18: /* prsep ::= COMMA */
2425 #line 554 "pikchr.y"
2426 {pik_append(p, " ", 1);}
2427 #line 2452 "pikchr.c"
2428 break;
2429 case 19: /* unnamed_element ::= basetype attribute_list */
2430 #line 557 "pikchr.y"
2431 {yylhsminor.yy254 = yymsp[-1].minor.yy254; pik_after_adding_attributes(p,yylhsminor.yy254);}
2432 #line 2457 "pikchr.c"
2433 yymsp[-1].minor.yy254 = yylhsminor.yy254;
2434 break;
2435 case 20: /* basetype ::= CLASSNAME */
2436 #line 559 "pikchr.y"
2437 {yylhsminor.yy254 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2438 #line 2463 "pikchr.c"
2439 yymsp[0].minor.yy254 = yylhsminor.yy254;
2440 break;
2441 case 21: /* basetype ::= STRING textposition */
2442 #line 561 "pikchr.y"
2443 {yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy74; yylhsminor.yy254 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2444 #line 2469 "pikchr.c"
2445 yymsp[-1].minor.yy254 = yylhsminor.yy254;
2446 break;
2447 case 22: /* basetype ::= LB savelist element_list RB */
2448 #line 563 "pikchr.y"
2449 { p->list = yymsp[-2].minor.yy72; yymsp[-3].minor.yy254 = pik_elem_new(p,0,0,yymsp[-1].minor.yy72); if(yymsp[-3].minor.yy254) yymsp[-3].minor.yy254->errTok = yymsp[0].minor.yy0; }
2450 #line 2475 "pikchr.c"
2451 break;
2452 case 23: /* savelist ::= */
2453 #line 568 "pikchr.y"
2454 {yymsp[1].minor.yy72 = p->list; p->list = 0;}
2455 #line 2480 "pikchr.c"
2456 break;
2457 case 24: /* relexpr ::= expr */
2458 #line 575 "pikchr.y"
2459 {yylhsminor.yy60.rAbs = yymsp[0].minor.yy73; yylhsminor.yy60.rRel = 0;}
2460 #line 2485 "pikchr.c"
2461 yymsp[0].minor.yy60 = yylhsminor.yy60;
2462 break;
2463 case 25: /* relexpr ::= expr PERCENT */
2464 #line 576 "pikchr.y"
2465 {yylhsminor.yy60.rAbs = 0; yylhsminor.yy60.rRel = yymsp[-1].minor.yy73/100;}
2466 #line 2491 "pikchr.c"
2467 yymsp[-1].minor.yy60 = yylhsminor.yy60;
2468 break;
2469 case 26: /* optrelexpr ::= */
2470 #line 578 "pikchr.y"
2471 {yymsp[1].minor.yy60.rAbs = 0; yymsp[1].minor.yy60.rRel = 1.0;}
2472 #line 2497 "pikchr.c"
2473 break;
2474 case 27: /* attribute_list ::= relexpr alist */
2475 #line 580 "pikchr.y"
2476 {pik_add_direction(p,0,&yymsp[-1].minor.yy60);}
2477 #line 2502 "pikchr.c"
2478 break;
2479 case 28: /* attribute ::= numproperty relexpr */
2480 #line 584 "pikchr.y"
2481 { pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy60); }
2482 #line 2507 "pikchr.c"
2483 break;
2484 case 29: /* attribute ::= dashproperty expr */
2485 #line 585 "pikchr.y"
2486 { pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy73); }
2487 #line 2512 "pikchr.c"
2488 break;
2489 case 30: /* attribute ::= dashproperty */
2490 #line 586 "pikchr.y"
2491 { pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2492 #line 2517 "pikchr.c"
2493 break;
2494 case 31: /* attribute ::= colorproperty rvalue */
2495 #line 587 "pikchr.y"
2496 { pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy73); }
2497 #line 2522 "pikchr.c"
2498 break;
2499 case 32: /* attribute ::= go direction optrelexpr */
2500 #line 588 "pikchr.y"
2501 { pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy60);}
2502 #line 2527 "pikchr.c"
2503 break;
2504 case 33: /* attribute ::= go direction even position */
2505 #line 589 "pikchr.y"
2506 {pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy139);}
2507 #line 2532 "pikchr.c"
2508 break;
2509 case 34: /* attribute ::= CLOSE */
2510 #line 590 "pikchr.y"
2511 { pik_close_path(p,&yymsp[0].minor.yy0); }
2512 #line 2537 "pikchr.c"
2513 break;
2514 case 35: /* attribute ::= CHOP */
2515 #line 591 "pikchr.y"
2516 { p->cur->bChop = 1; }
2517 #line 2542 "pikchr.c"
2518 break;
2519 case 36: /* attribute ::= FROM position */
2520 #line 592 "pikchr.y"
2521 { pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy139); }
2522 #line 2547 "pikchr.c"
2523 break;
2524 case 37: /* attribute ::= TO position */
2525 #line 593 "pikchr.y"
2526 { pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy139); }
2527 #line 2552 "pikchr.c"
2528 break;
2529 case 38: /* attribute ::= THEN */
2530 #line 594 "pikchr.y"
2531 { pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2532 #line 2557 "pikchr.c"
2533 break;
2534 case 39: /* attribute ::= THEN optrelexpr HEADING expr */
2535 case 41: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==41);
2536 #line 596 "pikchr.y"
2537 {pik_move_hdg(p,&yymsp[-2].minor.yy60,&yymsp[-1].minor.yy0,yymsp[0].minor.yy73,0,&yymsp[-3].minor.yy0);}
2538 #line 2563 "pikchr.c"
2539 break;
2540 case 40: /* attribute ::= THEN optrelexpr EDGEPT */
2541 case 42: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==42);
2542 #line 597 "pikchr.y"
2543 {pik_move_hdg(p,&yymsp[-1].minor.yy60,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2544 #line 2569 "pikchr.c"
2545 break;
2546 case 43: /* attribute ::= AT position */
2547 #line 602 "pikchr.y"
2548 { pik_set_at(p,0,&yymsp[0].minor.yy139,&yymsp[-1].minor.yy0); }
2549 #line 2574 "pikchr.c"
2550 break;
2551 case 44: /* attribute ::= SAME */
2552 #line 604 "pikchr.y"
2553 {pik_same(p,0,&yymsp[0].minor.yy0);}
2554 #line 2579 "pikchr.c"
2555 break;
2556 case 45: /* attribute ::= SAME AS object */
2557 #line 605 "pikchr.y"
2558 {pik_same(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0);}
2559 #line 2584 "pikchr.c"
2560 break;
2561 case 46: /* attribute ::= STRING textposition */
2562 #line 606 "pikchr.y"
2563 {pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy74);}
2564 #line 2589 "pikchr.c"
2565 break;
2566 case 47: /* attribute ::= FIT */
2567 #line 607 "pikchr.y"
2568 {pik_size_to_fit(p,&yymsp[0].minor.yy0); }
2569 #line 2594 "pikchr.c"
2570 break;
2571 case 48: /* attribute ::= BEHIND object */
2572 #line 608 "pikchr.y"
2573 {pik_behind(p,yymsp[0].minor.yy254);}
2574 #line 2599 "pikchr.c"
2575 break;
2576 case 49: /* withclause ::= DOT_E edge AT position */
2577 case 50: /* withclause ::= edge AT position */ yytestcase(yyruleno==50);
2578 #line 616 "pikchr.y"
2579 { pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy139,&yymsp[-1].minor.yy0); }
2580 #line 2605 "pikchr.c"
2581 break;
2582 case 51: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2583 #line 620 "pikchr.y"
2584 {yylhsminor.yy0 = yymsp[0].minor.yy0;}
2585 #line 2610 "pikchr.c"
2586 yymsp[0].minor.yy0 = yylhsminor.yy0;
2587 break;
2588 case 52: /* boolproperty ::= CW */
2589 #line 631 "pikchr.y"
2590 {p->cur->cw = 1;}
2591 #line 2616 "pikchr.c"
2592 break;
2593 case 53: /* boolproperty ::= CCW */
2594 #line 632 "pikchr.y"
2595 {p->cur->cw = 0;}
2596 #line 2621 "pikchr.c"
2597 break;
2598 case 54: /* boolproperty ::= LARROW */
2599 #line 633 "pikchr.y"
2600 {p->cur->larrow=1; p->cur->rarrow=0; }
2601 #line 2626 "pikchr.c"
2602 break;
2603 case 55: /* boolproperty ::= RARROW */
2604 #line 634 "pikchr.y"
2605 {p->cur->larrow=0; p->cur->rarrow=1; }
2606 #line 2631 "pikchr.c"
2607 break;
2608 case 56: /* boolproperty ::= LRARROW */
2609 #line 635 "pikchr.y"
2610 {p->cur->larrow=1; p->cur->rarrow=1; }
2611 #line 2636 "pikchr.c"
2612 break;
2613 case 57: /* boolproperty ::= INVIS */
2614 #line 636 "pikchr.y"
2615 {p->cur->sw = 0.0;}
2616 #line 2641 "pikchr.c"
2617 break;
2618 case 58: /* boolproperty ::= THICK */
2619 #line 637 "pikchr.y"
2620 {p->cur->sw *= 1.5;}
2621 #line 2646 "pikchr.c"
2622 break;
2623 case 59: /* boolproperty ::= THIN */
2624 #line 638 "pikchr.y"
2625 {p->cur->sw *= 0.67;}
2626 #line 2651 "pikchr.c"
2627 break;
2628 case 60: /* textposition ::= */
2629 #line 640 "pikchr.y"
2630 {yymsp[1].minor.yy74 = 0;}
2631 #line 2656 "pikchr.c"
2632 break;
2633 case 61: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2634 #line 643 "pikchr.y"
2635 {yylhsminor.yy74 = pik_text_position(p,yymsp[-1].minor.yy74,&yymsp[0].minor.yy0);}
2636 #line 2661 "pikchr.c"
2637 yymsp[-1].minor.yy74 = yylhsminor.yy74;
2638 break;
2639 case 62: /* position ::= expr COMMA expr */
2640 #line 646 "pikchr.y"
2641 {yylhsminor.yy139.x=yymsp[-2].minor.yy73; yylhsminor.yy139.y=yymsp[0].minor.yy73;}
2642 #line 2667 "pikchr.c"
2643 yymsp[-2].minor.yy139 = yylhsminor.yy139;
2644 break;
2645 case 63: /* position ::= place PLUS expr COMMA expr */
2646 #line 648 "pikchr.y"
2647 {yylhsminor.yy139.x=yymsp[-4].minor.yy139.x+yymsp[-2].minor.yy73; yylhsminor.yy139.y=yymsp[-4].minor.yy139.y+yymsp[0].minor.yy73;}
2648 #line 2673 "pikchr.c"
2649 yymsp[-4].minor.yy139 = yylhsminor.yy139;
2650 break;
2651 case 64: /* position ::= place MINUS expr COMMA expr */
2652 #line 649 "pikchr.y"
2653 {yylhsminor.yy139.x=yymsp[-4].minor.yy139.x-yymsp[-2].minor.yy73; yylhsminor.yy139.y=yymsp[-4].minor.yy139.y-yymsp[0].minor.yy73;}
2654 #line 2679 "pikchr.c"
2655 yymsp[-4].minor.yy139 = yylhsminor.yy139;
2656 break;
2657 case 65: /* position ::= place PLUS LP expr COMMA expr RP */
2658 #line 651 "pikchr.y"
2659 {yylhsminor.yy139.x=yymsp[-6].minor.yy139.x+yymsp[-3].minor.yy73; yylhsminor.yy139.y=yymsp[-6].minor.yy139.y+yymsp[-1].minor.yy73;}
2660 #line 2685 "pikchr.c"
2661 yymsp[-6].minor.yy139 = yylhsminor.yy139;
2662 break;
2663 case 66: /* position ::= place MINUS LP expr COMMA expr RP */
2664 #line 653 "pikchr.y"
2665 {yylhsminor.yy139.x=yymsp[-6].minor.yy139.x-yymsp[-3].minor.yy73; yylhsminor.yy139.y=yymsp[-6].minor.yy139.y-yymsp[-1].minor.yy73;}
2666 #line 2691 "pikchr.c"
2667 yymsp[-6].minor.yy139 = yylhsminor.yy139;
2668 break;
2669 case 67: /* position ::= LP position COMMA position RP */
2670 #line 654 "pikchr.y"
2671 {yymsp[-4].minor.yy139.x=yymsp[-3].minor.yy139.x; yymsp[-4].minor.yy139.y=yymsp[-1].minor.yy139.y;}
2672 #line 2697 "pikchr.c"
2673 break;
2674 case 68: /* position ::= LP position RP */
2675 #line 655 "pikchr.y"
2676 {yymsp[-2].minor.yy139=yymsp[-1].minor.yy139;}
2677 #line 2702 "pikchr.c"
2678 break;
2679 case 69: /* position ::= expr between position AND position */
2680 #line 657 "pikchr.y"
2681 {yylhsminor.yy139 = pik_position_between(p,yymsp[-4].minor.yy73,yymsp[-2].minor.yy139,yymsp[0].minor.yy139);}
2682 #line 2707 "pikchr.c"
2683 yymsp[-4].minor.yy139 = yylhsminor.yy139;
2684 break;
2685 case 70: /* position ::= expr LT position COMMA position GT */
2686 #line 659 "pikchr.y"
2687 {yylhsminor.yy139 = pik_position_between(p,yymsp[-5].minor.yy73,yymsp[-3].minor.yy139,yymsp[-1].minor.yy139);}
2688 #line 2713 "pikchr.c"
2689 yymsp[-5].minor.yy139 = yylhsminor.yy139;
2690 break;
2691 case 71: /* position ::= expr ABOVE position */
2692 #line 660 "pikchr.y"
2693 {yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.y += yymsp[-2].minor.yy73;}
2694 #line 2719 "pikchr.c"
2695 yymsp[-2].minor.yy139 = yylhsminor.yy139;
2696 break;
2697 case 72: /* position ::= expr BELOW position */
2698 #line 661 "pikchr.y"
2699 {yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.y -= yymsp[-2].minor.yy73;}
2700 #line 2725 "pikchr.c"
2701 yymsp[-2].minor.yy139 = yylhsminor.yy139;
2702 break;
2703 case 73: /* position ::= expr LEFT OF position */
2704 #line 662 "pikchr.y"
2705 {yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.x -= yymsp[-3].minor.yy73;}
2706 #line 2731 "pikchr.c"
2707 yymsp[-3].minor.yy139 = yylhsminor.yy139;
2708 break;
2709 case 74: /* position ::= expr RIGHT OF position */
2710 #line 663 "pikchr.y"
2711 {yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.x += yymsp[-3].minor.yy73;}
2712 #line 2737 "pikchr.c"
2713 yymsp[-3].minor.yy139 = yylhsminor.yy139;
2714 break;
2715 case 75: /* position ::= expr ON HEADING EDGEPT OF position */
2716 #line 665 "pikchr.y"
2717 {yylhsminor.yy139 = pik_position_at_hdg(p,yymsp[-5].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);}
2718 #line 2743 "pikchr.c"
2719 yymsp[-5].minor.yy139 = yylhsminor.yy139;
2720 break;
2721 case 76: /* position ::= expr HEADING EDGEPT OF position */
2722 #line 667 "pikchr.y"
2723 {yylhsminor.yy139 = pik_position_at_hdg(p,yymsp[-4].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);}
2724 #line 2749 "pikchr.c"
2725 yymsp[-4].minor.yy139 = yylhsminor.yy139;
2726 break;
2727 case 77: /* position ::= expr EDGEPT OF position */
2728 #line 669 "pikchr.y"
2729 {yylhsminor.yy139 = pik_position_at_hdg(p,yymsp[-3].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);}
2730 #line 2755 "pikchr.c"
2731 yymsp[-3].minor.yy139 = yylhsminor.yy139;
2732 break;
2733 case 78: /* position ::= expr ON HEADING expr FROM position */
2734 #line 671 "pikchr.y"
2735 {yylhsminor.yy139 = pik_position_at_angle(p,yymsp[-5].minor.yy73,yymsp[-2].minor.yy73,yymsp[0].minor.yy139);}
2736 #line 2761 "pikchr.c"
2737 yymsp[-5].minor.yy139 = yylhsminor.yy139;
2738 break;
2739 case 79: /* position ::= expr HEADING expr FROM position */
2740 #line 673 "pikchr.y"
2741 {yylhsminor.yy139 = pik_position_at_angle(p,yymsp[-4].minor.yy73,yymsp[-2].minor.yy73,yymsp[0].minor.yy139);}
2742 #line 2767 "pikchr.c"
2743 yymsp[-4].minor.yy139 = yylhsminor.yy139;
2744 break;
2745 case 80: /* place ::= edge OF object */
2746 #line 685 "pikchr.y"
2747 {yylhsminor.yy139 = pik_place_of_elem(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0);}
2748 #line 2773 "pikchr.c"
2749 yymsp[-2].minor.yy139 = yylhsminor.yy139;
2750 break;
2751 case 81: /* place2 ::= object */
2752 #line 686 "pikchr.y"
2753 {yylhsminor.yy139 = pik_place_of_elem(p,yymsp[0].minor.yy254,0);}
2754 #line 2779 "pikchr.c"
2755 yymsp[0].minor.yy139 = yylhsminor.yy139;
2756 break;
2757 case 82: /* place2 ::= object DOT_E edge */
2758 #line 687 "pikchr.y"
2759 {yylhsminor.yy139 = pik_place_of_elem(p,yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);}
2760 #line 2785 "pikchr.c"
2761 yymsp[-2].minor.yy139 = yylhsminor.yy139;
2762 break;
2763 case 83: /* place2 ::= NTH VERTEX OF object */
2764 #line 688 "pikchr.y"
2765 {yylhsminor.yy139 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy254);}
2766 #line 2791 "pikchr.c"
2767 yymsp[-3].minor.yy139 = yylhsminor.yy139;
2768 break;
2769 case 84: /* object ::= nth */
2770 #line 700 "pikchr.y"
2771 {yylhsminor.yy254 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2772 #line 2797 "pikchr.c"
2773 yymsp[0].minor.yy254 = yylhsminor.yy254;
2774 break;
2775 case 85: /* object ::= nth OF|IN object */
2776 #line 701 "pikchr.y"
2777 {yylhsminor.yy254 = pik_find_nth(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0);}
2778 #line 2803 "pikchr.c"
2779 yymsp[-2].minor.yy254 = yylhsminor.yy254;
2780 break;
2781 case 86: /* objectname ::= PLACENAME */
2782 #line 703 "pikchr.y"
2783 {yylhsminor.yy254 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2784 #line 2809 "pikchr.c"
2785 yymsp[0].minor.yy254 = yylhsminor.yy254;
2786 break;
2787 case 87: /* objectname ::= objectname DOT_U PLACENAME */
2788 #line 705 "pikchr.y"
2789 {yylhsminor.yy254 = pik_find_byname(p,yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);}
2790 #line 2815 "pikchr.c"
2791 yymsp[-2].minor.yy254 = yylhsminor.yy254;
2792 break;
2793 case 88: /* nth ::= NTH CLASSNAME */
2794 #line 707 "pikchr.y"
2795 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2796 #line 2821 "pikchr.c"
2797 yymsp[-1].minor.yy0 = yylhsminor.yy0;
2798 break;
2799 case 89: /* nth ::= NTH LAST CLASSNAME */
2800 #line 708 "pikchr.y"
2801 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2802 #line 2827 "pikchr.c"
2803 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2804 break;
2805 case 90: /* nth ::= LAST CLASSNAME */
2806 #line 709 "pikchr.y"
2807 {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2808 #line 2833 "pikchr.c"
2809 break;
2810 case 91: /* nth ::= LAST */
2811 #line 710 "pikchr.y"
2812 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2813 #line 2838 "pikchr.c"
2814 yymsp[0].minor.yy0 = yylhsminor.yy0;
2815 break;
2816 case 92: /* nth ::= NTH LB RB */
2817 #line 711 "pikchr.y"
2818 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2819 #line 2844 "pikchr.c"
2820 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2821 break;
2822 case 93: /* nth ::= NTH LAST LB RB */
2823 #line 712 "pikchr.y"
2824 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2825 #line 2850 "pikchr.c"
2826 yymsp[-3].minor.yy0 = yylhsminor.yy0;
2827 break;
2828 case 94: /* nth ::= LAST LB RB */
2829 #line 713 "pikchr.y"
2830 {yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2831 #line 2856 "pikchr.c"
2832 break;
2833 case 95: /* expr ::= expr PLUS expr */
2834 #line 715 "pikchr.y"
2835 {yylhsminor.yy73=yymsp[-2].minor.yy73+yymsp[0].minor.yy73;}
2836 #line 2861 "pikchr.c"
2837 yymsp[-2].minor.yy73 = yylhsminor.yy73;
2838 break;
2839 case 96: /* expr ::= expr MINUS expr */
2840 #line 716 "pikchr.y"
2841 {yylhsminor.yy73=yymsp[-2].minor.yy73-yymsp[0].minor.yy73;}
2842 #line 2867 "pikchr.c"
2843 yymsp[-2].minor.yy73 = yylhsminor.yy73;
2844 break;
2845 case 97: /* expr ::= expr STAR expr */
2846 #line 717 "pikchr.y"
2847 {yylhsminor.yy73=yymsp[-2].minor.yy73*yymsp[0].minor.yy73;}
2848 #line 2873 "pikchr.c"
2849 yymsp[-2].minor.yy73 = yylhsminor.yy73;
2850 break;
2851 case 98: /* expr ::= expr SLASH expr */
2852 #line 718 "pikchr.y"
2853 {
2854 if( yymsp[0].minor.yy73==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy73 = 0.0; }
2855 else{ yylhsminor.yy73 = yymsp[-2].minor.yy73/yymsp[0].minor.yy73; }
2856 }
2857 #line 2882 "pikchr.c"
2858 yymsp[-2].minor.yy73 = yylhsminor.yy73;
2859 break;
2860 case 99: /* expr ::= MINUS expr */
2861 #line 722 "pikchr.y"
2862 {yymsp[-1].minor.yy73=-yymsp[0].minor.yy73;}
2863 #line 2888 "pikchr.c"
2864 break;
2865 case 100: /* expr ::= PLUS expr */
2866 #line 723 "pikchr.y"
2867 {yymsp[-1].minor.yy73=yymsp[0].minor.yy73;}
2868 #line 2893 "pikchr.c"
2869 break;
2870 case 101: /* expr ::= LP expr RP */
2871 #line 724 "pikchr.y"
2872 {yymsp[-2].minor.yy73=yymsp[-1].minor.yy73;}
2873 #line 2898 "pikchr.c"
2874 break;
2875 case 102: /* expr ::= NUMBER */
2876 #line 725 "pikchr.y"
2877 {yylhsminor.yy73=pik_atof(p,&yymsp[0].minor.yy0);}
2878 #line 2903 "pikchr.c"
2879 yymsp[0].minor.yy73 = yylhsminor.yy73;
2880 break;
2881 case 103: /* expr ::= ID */
2882 #line 726 "pikchr.y"
2883 {yylhsminor.yy73=pik_get_var(p,&yymsp[0].minor.yy0);}
2884 #line 2909 "pikchr.c"
2885 yymsp[0].minor.yy73 = yylhsminor.yy73;
2886 break;
2887 case 104: /* expr ::= FUNC1 LP expr RP */
2888 #line 727 "pikchr.y"
2889 {yylhsminor.yy73 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy73,0.0);}
2890 #line 2915 "pikchr.c"
2891 yymsp[-3].minor.yy73 = yylhsminor.yy73;
2892 break;
2893 case 105: /* expr ::= FUNC2 LP expr COMMA expr RP */
2894 #line 728 "pikchr.y"
2895 {yylhsminor.yy73 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy73,yymsp[-1].minor.yy73);}
2896 #line 2921 "pikchr.c"
2897 yymsp[-5].minor.yy73 = yylhsminor.yy73;
2898 break;
2899 case 106: /* expr ::= place2 DOT_XY X */
2900 #line 729 "pikchr.y"
2901 {yylhsminor.yy73 = yymsp[-2].minor.yy139.x;}
2902 #line 2927 "pikchr.c"
2903 yymsp[-2].minor.yy73 = yylhsminor.yy73;
2904 break;
2905 case 107: /* expr ::= place2 DOT_XY Y */
2906 #line 730 "pikchr.y"
2907 {yylhsminor.yy73 = yymsp[-2].minor.yy139.y;}
2908 #line 2933 "pikchr.c"
2909 yymsp[-2].minor.yy73 = yylhsminor.yy73;
2910 break;
2911 case 108: /* expr ::= object DOT_L numproperty */
2912 case 109: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==109);
2913 case 110: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==110);
2914 #line 731 "pikchr.y"
2915 {yylhsminor.yy73=pik_property_of(p,yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);}
2916 #line 2941 "pikchr.c"
2917 yymsp[-2].minor.yy73 = yylhsminor.yy73;
2918 break;
2919 default:
2920 /* (111) lvalue ::= ID */ yytestcase(yyruleno==111);
2921 /* (112) lvalue ::= FILL */ yytestcase(yyruleno==112);
@@ -3014,18 +3018,19 @@
3014 ){
3015 pik_parserARG_FETCH
3016 pik_parserCTX_FETCH
3017 #define TOKEN yyminor
3018 /************ Begin %syntax_error code ****************************************/
3019 #line 498 "pikchr.y"
3020
3021 if( TOKEN.z && TOKEN.z[0] ){
3022 pik_error(p, &TOKEN, "syntax error");
3023 }else{
3024 pik_error(p, 0, "syntax error");
3025 }
3026 #line 3051 "pikchr.c"
 
3027 /************ End %syntax_error code ******************************************/
3028 pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
3029 pik_parserCTX_STORE
3030 }
3031
@@ -3254,11 +3259,11 @@
3254 #else
3255 (void)iToken;
3256 return 0;
3257 #endif
3258 }
3259 #line 736 "pikchr.y"
3260
3261
3262
3263 /* Chart of the 140 official HTML color names with their
3264 ** corresponding RGB value.
@@ -3534,33 +3539,10 @@
3534 static void boxInit(Pik *p, PElem *pElem){
3535 pElem->w = pik_value(p, "boxwid",6,0);
3536 pElem->h = pik_value(p, "boxht",5,0);
3537 pElem->rad = pik_value(p, "boxrad",6,0);
3538 }
3539 /* Translate the CP_START and CP_END reference points into the
3540 ** corresponding compass point based on the direction.
3541 */
3542 static int boxTranslateEndPoint(PElem *pElem, int cp){
3543 #if 0
3544 if( cp==CP_START ){
3545 switch( pElem->inDir ){
3546 case DIR_RIGHT: cp = CP_W; break;
3547 case DIR_DOWN: cp = CP_N; break;
3548 case DIR_LEFT: cp = CP_E; break;
3549 case DIR_UP: cp = CP_S; break;
3550 }
3551 }else if( cp==CP_END ){
3552 switch( pElem->outDir ){
3553 case DIR_RIGHT: cp = CP_E; break;
3554 case DIR_DOWN: cp = CP_S; break;
3555 case DIR_LEFT: cp = CP_W; break;
3556 case DIR_UP: cp = CP_N; break;
3557 }
3558 }
3559 #endif
3560 return cp;
3561 }
3562 /* Return offset from the center of the box to the compass point
3563 ** given by parameter cp */
3564 static PPoint boxOffset(Pik *p, PElem *pElem, int cp){
3565 PPoint pt;
3566 PNum w2 = 0.5*pElem->w;
@@ -3573,11 +3555,11 @@
3573 if( rad>w2 ) rad = w2;
3574 if( rad>h2 ) rad = h2;
3575 rx = 0.29289321881345252392*rad;
3576 }
3577 pt.x = pt.y = 0.0;
3578 switch( boxTranslateEndPoint(pElem,cp) ){
3579 case CP_C: pt.x = 0.0; pt.y = 0.0; break;
3580 case CP_N: pt.x = 0.0; pt.y = h2; break;
3581 case CP_NE: pt.x = w2-rx; pt.y = h2-rx; break;
3582 case CP_E: pt.x = w2; pt.y = 0.0; break;
3583 case CP_SE: pt.x = w2-rx; pt.y = rx-h2; break;
@@ -3584,10 +3566,11 @@
3584 case CP_S: pt.x = 0.0; pt.y = -h2; break;
3585 case CP_SW: pt.x = rx-w2; pt.y = rx-h2; break;
3586 case CP_W: pt.x = -w2; pt.y = 0.0; break;
3587 case CP_NW: pt.x = rx-w2; pt.y = h2-rx; break;
3588 }
 
3589 return pt;
3590 }
3591 static PPoint boxChop(Pik *p, PElem *pElem, PPoint *pPt){
3592 PNum dx, dy;
3593 int cp = CP_C;
@@ -3627,10 +3610,11 @@
3627 return chop;
3628 }
3629 static void boxFit(Pik *p, PElem *pElem, PNum w, PNum h){
3630 if( w>0 ) pElem->w = w;
3631 if( h>0 ) pElem->h = h;
 
3632 }
3633 static void boxRender(Pik *p, PElem *pElem){
3634 PNum w2 = 0.5*pElem->w;
3635 PNum h2 = 0.5*pElem->h;
3636 PNum rad = pElem->rad;
@@ -3704,19 +3688,21 @@
3704 case T_HEIGHT:
3705 pElem->w = pElem->h;
3706 pElem->rad = 0.5*pElem->w;
3707 break;
3708 }
 
3709 }
3710 static PPoint circleChop(Pik *p, PElem *pElem, PPoint *pPt){
3711 PPoint chop;
3712 PNum dx = pPt->x - pElem->ptAt.x;
3713 PNum dy = pPt->y - pElem->ptAt.y;
3714 PNum dist = hypot(dx,dy);
3715 if( dist<pElem->rad ) return pElem->ptAt;
3716 chop.x = pElem->ptAt.x + dx*pElem->rad/dist;
3717 chop.y = pElem->ptAt.y + dy*pElem->rad/dist;
 
3718 return chop;
3719 }
3720 static void circleFit(Pik *p, PElem *pElem, PNum w, PNum h){
3721 PNum mx = 0.0;
3722 if( w>0 ) mx = w;
@@ -3726,10 +3712,11 @@
3726 }
3727 if( mx>0.0 ){
3728 pElem->rad = 0.5*mx;
3729 pElem->w = pElem->h = mx;
3730 }
 
3731 }
3732
3733 static void circleRender(Pik *p, PElem *pElem){
3734 PNum r = pElem->rad;
3735 PPoint pt = pElem->ptAt;
@@ -3770,11 +3757,11 @@
3770 static PPoint cylinderOffset(Pik *p, PElem *pElem, int cp){
3771 PPoint pt;
3772 PNum w2 = pElem->w*0.5;
3773 PNum h1 = pElem->h*0.5;
3774 PNum h2 = h1 - pElem->rad;
3775 switch( boxTranslateEndPoint(pElem,cp) ){
3776 case CP_C: pt.x = 0.0; pt.y = 0.0; break;
3777 case CP_N: pt.x = 0.0; pt.y = h1; break;
3778 case CP_NE: pt.x = w2; pt.y = h2; break;
3779 case CP_E: pt.x = w2; pt.y = 0.0; break;
3780 case CP_SE: pt.x = w2; pt.y = -h2; break;
@@ -3781,10 +3768,11 @@
3781 case CP_S: pt.x = 0.0; pt.y = -h1; break;
3782 case CP_SW: pt.x = -w2; pt.y = -h2; break;
3783 case CP_W: pt.x = -w2; pt.y = 0.0; break;
3784 case CP_NW: pt.x = -w2; pt.y = h2; break;
3785 }
 
3786 return pt;
3787 }
3788
3789 /* Methods for the "dot" class */
3790 static void dotInit(Pik *p, PElem *pElem){
@@ -3799,19 +3787,24 @@
3799 break;
3800 case T_FILL:
3801 pElem->color = pElem->fill;
3802 break;
3803 }
 
3804 }
3805 static void dotCheck(Pik *p, PElem *pElem){
3806 pElem->w = pElem->h = 0;
3807 pik_bbox_addellipse(&pElem->bbox, pElem->ptAt.x, pElem->ptAt.y,
3808 pElem->rad, pElem->rad);
 
3809 }
3810 static PPoint dotOffset(Pik *p, PElem *pElem, int cp){
3811 PPoint zero;
3812 zero.x = zero.y = 0;
 
 
 
3813 return zero;
3814 }
3815 static void dotRender(Pik *p, PElem *pElem){
3816 PNum r = pElem->rad;
3817 PPoint pt = pElem->ptAt;
@@ -3843,19 +3836,20 @@
3843 dq = dx*s;
3844 dist = hypot(dq,dy);
3845 if( dist<pElem->h ) return pElem->ptAt;
3846 chop.x = pElem->ptAt.x + 0.5*dq*pElem->h/(dist*s);
3847 chop.y = pElem->ptAt.y + 0.5*dy*pElem->h/dist;
 
3848 return chop;
3849 }
3850 static PPoint ellipseOffset(Pik *p, PElem *pElem, int cp){
3851 PPoint pt;
3852 PNum w = pElem->w*0.5;
3853 PNum w2 = w*0.70710678118654747608;
3854 PNum h = pElem->h*0.5;
3855 PNum h2 = h*0.70710678118654747608;
3856 switch( boxTranslateEndPoint(pElem,cp) ){
3857 case CP_C: pt.x = 0.0; pt.y = 0.0; break;
3858 case CP_N: pt.x = 0.0; pt.y = h; break;
3859 case CP_NE: pt.x = w2; pt.y = h2; break;
3860 case CP_E: pt.x = w; pt.y = 0.0; break;
3861 case CP_SE: pt.x = w2; pt.y = -h2; break;
@@ -3862,10 +3856,11 @@
3862 case CP_S: pt.x = 0.0; pt.y = -h; break;
3863 case CP_SW: pt.x = -w2; pt.y = -h2; break;
3864 case CP_W: pt.x = -w; pt.y = 0.0; break;
3865 case CP_NW: pt.x = -w2; pt.y = h2; break;
3866 }
 
3867 return pt;
3868 }
3869 static void ellipseRender(Pik *p, PElem *pElem){
3870 PNum w = pElem->w;
3871 PNum h = pElem->h;
@@ -3897,11 +3892,11 @@
3897 PNum mn = w2<h2 ? w2 : h2;
3898 if( rx>mn ) rx = mn;
3899 if( rx<mn*0.25 ) rx = mn*0.25;
3900 pt.x = pt.y = 0.0;
3901 rx *= 0.5;
3902 switch( boxTranslateEndPoint(pElem,cp) ){
3903 case CP_C: pt.x = 0.0; pt.y = 0.0; break;
3904 case CP_N: pt.x = 0.0; pt.y = h2; break;
3905 case CP_NE: pt.x = w2-rx; pt.y = h2-rx; break;
3906 case CP_E: pt.x = w2; pt.y = 0.0; break;
3907 case CP_SE: pt.x = w2; pt.y = -h2; break;
@@ -3908,15 +3903,17 @@
3908 case CP_S: pt.x = 0.0; pt.y = -h2; break;
3909 case CP_SW: pt.x = -w2; pt.y = -h2; break;
3910 case CP_W: pt.x = -w2; pt.y = 0.0; break;
3911 case CP_NW: pt.x = -w2; pt.y = h2; break;
3912 }
 
3913 return pt;
3914 }
3915 static void fileFit(Pik *p, PElem *pElem, PNum w, PNum h){
3916 if( w>0 ) pElem->w = w;
3917 if( h>0 ) pElem->h = h + 2*pElem->rad;
 
3918 }
3919 static void fileRender(Pik *p, PElem *pElem){
3920 PNum w2 = 0.5*pElem->w;
3921 PNum h2 = 0.5*pElem->h;
3922 PNum rad = pElem->rad;
@@ -3950,11 +3947,10 @@
3950 pElem->h = pik_value(p, "lineht",6,0);
3951 pElem->rad = pik_value(p, "linerad",7,0);
3952 pElem->fill = -1.0;
3953 }
3954 static PPoint lineOffset(Pik *p, PElem *pElem, int cp){
3955
3956 #if 0
3957 /* In legacy PIC, the .center of an unclosed line is half way between
3958 ** its .start and .end. */
3959 if( cp==CP_C && !pElem->bClose ){
3960 PPoint out;
@@ -3961,11 +3957,10 @@
3961 out.x = 0.5*(pElem->ptEnter.x + pElem->ptExit.x) - pElem->ptAt.x;
3962 out.y = 0.5*(pElem->ptEnter.x + pElem->ptExit.y) - pElem->ptAt.y;
3963 return out;
3964 }
3965 #endif
3966
3967 return boxOffset(p,pElem,cp);
3968 }
3969 static void lineRender(Pik *p, PElem *pElem){
3970 int i;
3971 if( pElem->sw>0.0 ){
@@ -4001,24 +3996,29 @@
4001 pElem->color = -1.0;
4002 pElem->sw = -1.0;
4003 }
4004 static void moveRender(Pik *p, PElem *pElem){
4005 /* No-op */
 
 
4006 }
4007
4008 /* Methods for the "oval" class */
4009 static void ovalInit(Pik *p, PElem *pElem){
4010 pElem->h = pik_value(p, "ovalht",6,0);
4011 pElem->w = pik_value(p, "ovalwid",7,0);
4012 pElem->rad = 0.5*(pElem->h<pElem->w?pElem->h:pElem->w);
4013 }
4014 static void ovalNumProp(Pik *p, PElem *pElem, PToken *pId){
 
 
4015 /* Always adjust the radius to be half of the smaller of
4016 ** the width and height. */
4017 pElem->rad = 0.5*(pElem->h<pElem->w?pElem->h:pElem->w);
4018 }
4019 static void ovalFit(Pik *p, PElem *pElem, PNum w, PNum h){
 
4020 if( w>0 ) pElem->w = w;
4021 if( h>0 ) pElem->h = h;
4022 if( pElem->w<pElem->h ) pElem->w = pElem->h;
4023 }
4024
@@ -4114,10 +4114,11 @@
4114
4115 /* Methods for the "sublist" class */
4116 static void sublistInit(Pik *p, PElem *pElem){
4117 PEList *pList = pElem->pSublist;
4118 int i;
 
4119 pik_bbox_init(&pElem->bbox);
4120 for(i=0; i<pList->n; i++){
4121 pik_bbox_addbox(&pElem->bbox, &pList->a[i]->bbox);
4122 }
4123 pElem->w = pElem->bbox.ne.x - pElem->bbox.sw.x;
@@ -4305,11 +4306,11 @@
4305
4306 /*
4307 ** Reduce the length of the line segment by amt (if possible) by
4308 ** modifying the location of *t.
4309 */
4310 static void pik_chop(Pik *p, PPoint *f, PPoint *t, PNum amt){
4311 PNum dx = t->x - f->x;
4312 PNum dy = t->y - f->y;
4313 PNum dist = hypot(dx,dy);
4314 PNum r;
4315 if( dist<=amt ){
@@ -4350,11 +4351,11 @@
4350 by = f->y + e1*dy;
4351 pik_append_xy(p,"<polygon points=\"", t->x, t->y);
4352 pik_append_xy(p," ",bx-ddx, by-ddy);
4353 pik_append_xy(p," ",bx+ddx, by+ddy);
4354 pik_append_clr(p,"\" style=\"fill:",pElem->color,"\"/>\n");
4355 pik_chop(p,f,t,h/2);
4356 }
4357
4358 /*
4359 ** Compute the relative offset to an edge location from the reference for a
4360 ** an element.
@@ -4538,11 +4539,11 @@
4538 ** Compute the vertical locations for all text items in the
4539 ** element pElem. In other words, set every pElem->aTxt[*].eCode
4540 ** value to contain exactly one of: TP_ABOVE2, TP_ABOVE, TP_CENTER,
4541 ** TP_BELOW, or TP_BELOW2 is set.
4542 */
4543 static void pik_txt_vertical_layout(Pik *p, PElem *pElem){
4544 int n, i;
4545 PToken *aTxt;
4546 n = pElem->nTxt;
4547 if( n==0 ) return;
4548 aTxt = pElem->aTxt;
@@ -4636,11 +4637,11 @@
4636 if( p->nErr ) return;
4637 if( pElem->nTxt==0 ) return;
4638 aTxt = pElem->aTxt;
4639 dy = 0.5*p->charHeight;
4640 n = pElem->nTxt;
4641 pik_txt_vertical_layout(p, pElem);
4642 x = pElem->ptAt.x;
4643 for(i=0; i<n; i++){
4644 if( (pElem->aTxt[i].eCode & TP_CENTER)!=0 ) hasCenter = 1;
4645 }
4646 if( hasCenter ){
@@ -4765,11 +4766,11 @@
4765 for(nExtra=0; (c = p->zIn[i+nExtra])!=0 && c!='\n'; nExtra++){}
4766 pik_append(p, "<div><pre>\n", -1);
4767 pik_append_text(p, p->zIn, i+nExtra, 3);
4768 pik_append(p, "\n", 1);
4769 for(i=0; i<iCol; i++){ pik_append(p, " ", 1); }
4770 for(i=0; i<pErr->n; i++) pik_append(p, "^", 1);
4771 pik_append(p, "\nERROR: ", -1);
4772 pik_append_text(p, zMsg, -1, 0);
4773 pik_append(p, "\n", 1);
4774 pik_append(p, "\n</pre></div>\n", -1);
4775 }
@@ -4841,18 +4842,18 @@
4841 ** (3) Hex integers: 0x000000
4842 **
4843 ** This routine returns the result in inches. If a different unit
4844 ** is specified, the conversion happens automatically.
4845 */
4846 PNum pik_atof(Pik *p, PToken *num){
4847 char *endptr;
4848 PNum ans;
4849 if( num->n>=3 && num->z[0]=='0' && (num->z[1]=='x'||num->z[1]=='X') ){
4850 return (PNum)strtol(num->z+2, 0, 16);
4851 }
4852 ans = strtod(num->z, &endptr);
4853 if( (int)(endptr - num->z)==num->n-2 ){
4854 char c1 = endptr[0];
4855 char c2 = endptr[1];
4856 if( c1=='c' && c2=='m' ){
4857 ans /= 2.54;
4858 }else if( c1=='m' && c2=='m' ){
@@ -5063,11 +5064,11 @@
5063 }
5064
5065 /*
5066 ** Set the output direction and exit point for an element.
5067 */
5068 static void pik_elem_set_exit(Pik *p, PElem *pElem, int eDir){
5069 assert( ValidDir(eDir) );
5070 pElem->outDir = eDir;
5071 if( !pElem->type->isLine || pElem->bClose ){
5072 pElem->ptExit = pElem->ptAt;
5073 switch( pElem->outDir ){
@@ -5097,11 +5098,11 @@
5097 ** You can make pikchr render the above exactly like PIC
5098 ** by deleting the following three lines. But I (drh) think
5099 ** it works better with those lines in place.
5100 */
5101 if( p->list && p->list->n ){
5102 pik_elem_set_exit(p, p->list->a[p->list->n-1], eDir);
5103 }
5104 }
5105
5106 /* Move all coordinates contained within an element (and within its
5107 ** substructure) by dx, dy
@@ -5247,11 +5248,11 @@
5247
5248 /*
5249 ** If the current path information came from a "same" or "same as"
5250 ** reset it.
5251 */
5252 static void pik_reset_samepath(Pik *p, PElem *pElem){
5253 if( p->samePath ){
5254 p->samePath = 0;
5255 p->nTPath = 1;
5256 }
5257 }
@@ -5277,11 +5278,11 @@
5277
5278 /* Advance to the next entry in p->aTPath. Return its index.
5279 */
5280 static int pik_next_rpath(Pik *p, PToken *pErr){
5281 int n = p->nTPath - 1;
5282 if( n+1>=count(p->aTPath) ){
5283 pik_error(0, pErr, "too many path elements");
5284 return n;
5285 }
5286 n++;
5287 p->nTPath++;
@@ -5299,16 +5300,16 @@
5299 int dir;
5300 if( !pElem->type->isLine ){
5301 if( pDir ){
5302 pik_error(p, pDir, "use with line-oriented objects only");
5303 }else{
5304 PToken x = pik_next_semantic_token(p, &pElem->errTok);
5305 pik_error(p, &x, "syntax error");
5306 }
5307 return;
5308 }
5309 pik_reset_samepath(p, pElem);
5310 n = p->nTPath - 1;
5311 if( p->thenFlag || p->mTPath==3 || n==0 ){
5312 n = pik_next_rpath(p, pDir);
5313 p->thenFlag = 0;
5314 }
@@ -5357,11 +5358,11 @@
5357 PNum rDist = pDist->rAbs + pik_value(p,"linewid",7,0)*pDist->rRel;
5358 if( !pElem->type->isLine ){
5359 pik_error(p, pErr, "use with line-oriented objects only");
5360 return;
5361 }
5362 pik_reset_samepath(p, pElem);
5363 do{
5364 n = pik_next_rpath(p, pErr);
5365 }while( n<1 );
5366 if( pHeading ){
5367 if( rHdg<0.0 || rHdg>360.0 ){
@@ -5403,11 +5404,11 @@
5403 int n;
5404 if( !pElem->type->isLine ){
5405 pik_error(p, pDir, "use with line-oriented objects only");
5406 return;
5407 }
5408 pik_reset_samepath(p, pElem);
5409 n = p->nTPath - 1;
5410 if( p->thenFlag || p->mTPath==3 || n==0 ){
5411 n = pik_next_rpath(p, pDir);
5412 p->thenFlag = 0;
5413 }
@@ -5515,11 +5516,11 @@
5515 if( pElem->mProp & A_AT ){
5516 pik_error(p, pErrTok, "location fixed by prior \"at\"");
5517 return;
5518 }
5519 pElem->mProp |= A_AT;
5520 pElem->eWith = pEdge ? boxTranslateEndPoint(pElem,pEdge->eEdge) : CP_C;
5521 pElem->with = *pAt;
5522 }
5523
5524 /*
5525 ** Try to add a text attribute to an element
@@ -5536,11 +5537,11 @@
5536 pT->eCode = iPos;
5537 }
5538
5539 /* Merge "text-position" flags
5540 */
5541 static int pik_text_position(Pik *p, int iPrev, PToken *pFlag){
5542 int iRes = iPrev;
5543 switch( pFlag->eType ){
5544 case T_LJUST: iRes = (iRes&~TP_JMASK) | TP_LJUST; break;
5545 case T_RJUST: iRes = (iRes&~TP_JMASK) | TP_RJUST; break;
5546 case T_ABOVE: iRes = (iRes&~TP_VMASK) | TP_ABOVE; break;
@@ -5610,11 +5611,11 @@
5610 if( pElem->type->xFit==0 ) return;
5611 if( (pElem->mProp & A_HEIGHT)==0 ){
5612 int hasCenter = 0;
5613 int hasSingleStack = 0;
5614 int hasDoubleStack = 0;
5615 pik_txt_vertical_layout(p, pElem);
5616 for(i=0; i<pElem->nTxt; i++){
5617 if( pElem->aTxt[i].eCode & TP_CENTER ){
5618 hasCenter = 1;
5619 }else if( pElem->aTxt[i].eCode & (TP_ABOVE2|TP_BELOW2) ){
5620 hasDoubleStack = 1;
@@ -5736,11 +5737,12 @@
5736 int first, last, mid, c = 0;
5737 first = 0;
5738 last = count(aColor)-1;
5739 while( first<=last ){
5740 const char *zClr;
5741 int c1, c2, i;
 
5742 mid = (first+last)/2;
5743 zClr = aColor[mid].zName;
5744 for(i=0; i<pId->n; i++){
5745 c1 = zClr[i]&0x7f;
5746 if( isupper(c1) ) c1 = tolower(c1);
@@ -5970,11 +5972,11 @@
5970 }
5971 }
5972
5973 /* Do a linear interpolation of two positions.
5974 */
5975 static PPoint pik_position_between(Pik *p, PNum x, PPoint p1, PPoint p2){
5976 PPoint out;
5977 if( x<0.0 ) x = 0.0;
5978 if( x>1.0 ) x = 1.0;
5979 out.x = p2.x*x + p1.x*(1.0 - x);
5980 out.y = p2.y*x + p1.y*(1.0 - x);
@@ -5984,21 +5986,21 @@
5984 /* Compute the position that is dist away from pt at an heading angle of r
5985 **
5986 ** The angle is a compass heading in degrees. North is 0 (or 360).
5987 ** East is 90. South is 180. West is 270. And so forth.
5988 */
5989 static PPoint pik_position_at_angle(Pik *p, PNum dist, PNum r, PPoint pt){
5990 r *= 0.017453292519943295769; /* degrees to radians */
5991 pt.x += dist*sin(r);
5992 pt.y += dist*cos(r);
5993 return pt;
5994 }
5995
5996 /* Compute the position that is dist away at a compass point
5997 */
5998 static PPoint pik_position_at_hdg(Pik *p, PNum dist, PToken *pD, PPoint pt){
5999 return pik_position_at_angle(p, dist, pik_hdg_angle[pD->eEdge], pt);
6000 }
6001
6002 /* Return the coordinates for the n-th vertex of a line.
6003 */
6004 static PPoint pik_nth_vertex(Pik *p, PToken *pNth, PToken *pErr, PElem *pObj){
@@ -6017,11 +6019,11 @@
6017 return pObj->aPath[n-1];
6018 }
6019
6020 /* Return the value of a property of an object.
6021 */
6022 static PNum pik_property_of(Pik *p, PElem *pElem, PToken *pProp){
6023 PNum v = 0.0;
6024 switch( pProp->eType ){
6025 case T_HEIGHT: v = pElem->h; break;
6026 case T_WIDTH: v = pElem->w; break;
6027 case T_RADIUS: v = pElem->rad; break;
@@ -6174,16 +6176,15 @@
6174 */
6175 if( pElem->type->isLine ){
6176 pElem->aPath = malloc( sizeof(PPoint)*p->nTPath );
6177 if( pElem->aPath==0 ){
6178 pik_error(p, 0, 0);
6179 pElem->nPath = 0;
6180 }else{
6181 pElem->nPath = p->nTPath;
6182 for(i=0; i<p->nTPath; i++){
6183 pElem->aPath[i] = p->aTPath[i];
6184 pik_bbox_add_xy(&pElem->bbox, pElem->aPath[i].x, pElem->aPath[i].y);
6185 }
6186 }
6187
6188 /* "chop" processing:
6189 ** If the line goes to the center of an object with an
@@ -6193,15 +6194,18 @@
6193 int n = pElem->nPath;
6194 pik_autochop(p, &pElem->aPath[n-2], &pElem->aPath[n-1]);
6195 pik_autochop(p, &pElem->aPath[1], &pElem->aPath[0]);
6196 }
6197
6198 pElem->ptEnter = p->aTPath[0];
6199 pElem->ptExit = p->aTPath[p->nTPath-1];
6200
6201 /* Compute the center of the line based on the bounding box over
6202 ** the vertexes */
 
 
 
6203 pElem->ptAt.x = (pElem->bbox.ne.x + pElem->bbox.sw.x)/2.0;
6204 pElem->ptAt.y = (pElem->bbox.ne.y + pElem->bbox.sw.y)/2.0;
6205
6206 /* Reset the width and height of the object to be the width and height
6207 ** of the bounding box over vertexes */
@@ -6210,11 +6214,11 @@
6210
6211 /* If this is a polygon (if it has the "close" attribute), then
6212 ** adjust the exit point */
6213 if( pElem->bClose ){
6214 /* "closed" lines work like block objects */
6215 pik_elem_set_exit(p, pElem, pElem->inDir);
6216 }else{
6217 /* For an open line, the "center" is half way between
6218 ** the .start and the .end */
6219 }
6220 }else{
@@ -6778,11 +6782,11 @@
6778 /* This is not an exp */
6779 i -= 2;
6780 }else{
6781 i++;
6782 isInt = 0;
6783 while( (c = z[i])>=0 && c<='9' ){ i++; }
6784 }
6785 }
6786 c2 = c ? z[i+1] : 0;
6787 if( isInt ){
6788 if( (c=='t' && c2=='h')
@@ -6837,11 +6841,11 @@
6837
6838 /*
6839 ** Return a pointer to the next non-whitespace token after pThis.
6840 ** This is used to help form error messages.
6841 */
6842 static PToken pik_next_semantic_token(Pik *p, PToken *pThis){
6843 PToken x;
6844 int sz;
6845 int i = pThis->n;
6846 memset(&x, 0, sizeof(x));
6847 x.z = pThis->z;
@@ -7055,6 +7059,6 @@
7055 printf("</body></html>\n");
7056 return 0;
7057 }
7058 #endif /* PIKCHR_SHELL */
7059
7060 #line 7085 "pikchr.c"
7061
--- src/pikchr.c
+++ src/pikchr.c
@@ -124,10 +124,14 @@
124 #include <assert.h>
125 #define count(X) (sizeof(X)/sizeof(X[0]))
126 #ifndef M_PI
127 # define M_PI 3.1415926535897932385
128 #endif
129
130 /* Tag intentionally unused parameters with this macro to prevent
131 ** compiler warnings with -Wextra */
132 #define UNUSED_PARAMETER(X) (void)(X)
133
134 typedef struct Pik Pik; /* Complete parsing context */
135 typedef struct PToken PToken; /* A single token */
136 typedef struct PElem PElem; /* A single diagram object or "element" */
137 typedef struct PEList PEList; /* A list of elements */
@@ -397,11 +401,11 @@
401 static void pik_append_arc(Pik*,PNum,PNum,PNum,PNum);
402 static void pik_append_clr(Pik*,const char*,PNum,const char*);
403 static void pik_append_style(Pik*,PElem*);
404 static void pik_append_txt(Pik*,PElem*, PBox*);
405 static void pik_draw_arrowhead(Pik*,PPoint*pFrom,PPoint*pTo,PElem*);
406 static void pik_chop(PPoint*pFrom,PPoint*pTo,PNum);
407 static void pik_error(Pik*,PToken*,const char*);
408 static void pik_elist_free(Pik*,PEList*);
409 static void pik_elem_free(Pik*,PElem*);
410 static void pik_render(Pik*,PEList*);
411 static PEList *pik_elist_append(Pik*,PEList*,PElem*);
@@ -410,11 +414,11 @@
414 static void pik_elem_setname(Pik*,PElem*,PToken*);
415 static void pik_set_var(Pik*,PToken*,PNum,PToken*);
416 static PNum pik_value(Pik*,const char*,int,int*);
417 static PNum pik_lookup_color(Pik*,PToken*);
418 static PNum pik_get_var(Pik*,PToken*);
419 static PNum pik_atof(PToken*);
420 static void pik_after_adding_attributes(Pik*,PElem*);
421 static void pik_elem_move(PElem*,PNum dx, PNum dy);
422 static void pik_elist_move(PEList*,PNum dx, PNum dy);
423 static void pik_set_numprop(Pik*,PToken*,PRel*);
424 static void pik_set_clrprop(Pik*,PToken*,PNum);
@@ -437,26 +441,26 @@
441 static void pik_bbox_add_xy(PBox*,PNum,PNum);
442 static void pik_bbox_addellipse(PBox*,PNum x,PNum y,PNum rx,PNum ry);
443 static void pik_add_txt(Pik*,PToken*,int);
444 static int pik_text_length(const PToken *pToken);
445 static void pik_size_to_fit(Pik*,PToken*);
446 static int pik_text_position(int,PToken*);
447 static PNum pik_property_of(PElem*,PToken*);
448 static PNum pik_func(Pik*,PToken*,PNum,PNum);
449 static PPoint pik_position_between(PNum x, PPoint p1, PPoint p2);
450 static PPoint pik_position_at_angle(PNum dist, PNum r, PPoint pt);
451 static PPoint pik_position_at_hdg(PNum dist, PToken *pD, PPoint pt);
452 static void pik_same(Pik *p, PElem*, PToken*);
453 static PPoint pik_nth_vertex(Pik *p, PToken *pNth, PToken *pErr, PElem *pElem);
454 static PToken pik_next_semantic_token(PToken *pThis);
455 static void pik_compute_layout_settings(Pik*);
456 static void pik_behind(Pik*,PElem*);
457 static PElem *pik_assert(Pik*,PNum,PToken*,PNum);
458 static PElem *pik_place_assert(Pik*,PPoint*,PToken*,PPoint*);
459
460
461 #line 487 "pikchr.c"
462 /**************** End of %include directives **********************************/
463 /* These constants specify the various numeric values for terminal symbols.
464 ***************** Begin token definitions *************************************/
465 #ifndef T_ID
466 #define T_ID 1
@@ -1628,22 +1632,22 @@
1632 ** inside the C code.
1633 */
1634 /********* Begin destructor definitions ***************************************/
1635 case 94: /* element_list */
1636 {
1637 #line 476 "pikchr.y"
1638 pik_elist_free(p,(yypminor->yy72));
1639 #line 1664 "pikchr.c"
1640 }
1641 break;
1642 case 95: /* element */
1643 case 96: /* unnamed_element */
1644 case 97: /* basetype */
1645 {
1646 #line 478 "pikchr.y"
1647 pik_elem_free(p,(yypminor->yy254));
1648 #line 1673 "pikchr.c"
1649 }
1650 break;
1651 /********* End destructor definitions *****************************************/
1652 default: break; /* If no destructor action specified: do nothing */
1653 }
@@ -1806,11 +1810,11 @@
1810 }
1811 }
1812 #endif /* YYWILDCARD */
1813 return yy_default[stateno];
1814 }else{
1815 assert( i>=0 && i<(int)(sizeof(yy_action)/sizeof(yy_action[0])) );
1816 return yy_action[i];
1817 }
1818 }while(1);
1819 }
1820
@@ -1857,14 +1861,14 @@
1861 #endif
1862 while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
1863 /* Here code is inserted which will execute if the parser
1864 ** stack every overflows */
1865 /******** Begin %stack_overflow code ******************************************/
1866 #line 510 "pikchr.y"
1867
1868 pik_error(p, 0, "parser stack overflow");
1869 #line 1894 "pikchr.c"
1870 /******** End %stack_overflow code ********************************************/
1871 pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
1872 pik_parserCTX_STORE
1873 }
1874
@@ -2329,593 +2333,593 @@
2333 ** break;
2334 */
2335 /********** Begin reduce actions **********************************************/
2336 YYMINORTYPE yylhsminor;
2337 case 0: /* document ::= element_list */
2338 #line 514 "pikchr.y"
2339 {pik_render(p,yymsp[0].minor.yy72);}
2340 #line 2365 "pikchr.c"
2341 break;
2342 case 1: /* element_list ::= element */
2343 #line 517 "pikchr.y"
2344 { yylhsminor.yy72 = pik_elist_append(p,0,yymsp[0].minor.yy254); }
2345 #line 2370 "pikchr.c"
2346 yymsp[0].minor.yy72 = yylhsminor.yy72;
2347 break;
2348 case 2: /* element_list ::= element_list EOL element */
2349 #line 519 "pikchr.y"
2350 { yylhsminor.yy72 = pik_elist_append(p,yymsp[-2].minor.yy72,yymsp[0].minor.yy254); }
2351 #line 2376 "pikchr.c"
2352 yymsp[-2].minor.yy72 = yylhsminor.yy72;
2353 break;
2354 case 3: /* element ::= */
2355 #line 522 "pikchr.y"
2356 { yymsp[1].minor.yy254 = 0; }
2357 #line 2382 "pikchr.c"
2358 break;
2359 case 4: /* element ::= direction */
2360 #line 523 "pikchr.y"
2361 { pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy254=0; }
2362 #line 2387 "pikchr.c"
2363 yymsp[0].minor.yy254 = yylhsminor.yy254;
2364 break;
2365 case 5: /* element ::= lvalue ASSIGN rvalue */
2366 #line 524 "pikchr.y"
2367 {pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy73,&yymsp[-1].minor.yy0); yylhsminor.yy254=0;}
2368 #line 2393 "pikchr.c"
2369 yymsp[-2].minor.yy254 = yylhsminor.yy254;
2370 break;
2371 case 6: /* element ::= PLACENAME COLON unnamed_element */
2372 #line 526 "pikchr.y"
2373 { yylhsminor.yy254 = yymsp[0].minor.yy254; pik_elem_setname(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0); }
2374 #line 2399 "pikchr.c"
2375 yymsp[-2].minor.yy254 = yylhsminor.yy254;
2376 break;
2377 case 7: /* element ::= PLACENAME COLON position */
2378 #line 528 "pikchr.y"
2379 { yylhsminor.yy254 = pik_elem_new(p,0,0,0);
2380 if(yylhsminor.yy254){ yylhsminor.yy254->ptAt = yymsp[0].minor.yy139; pik_elem_setname(p,yylhsminor.yy254,&yymsp[-2].minor.yy0); }}
2381 #line 2406 "pikchr.c"
2382 yymsp[-2].minor.yy254 = yylhsminor.yy254;
2383 break;
2384 case 8: /* element ::= unnamed_element */
2385 #line 530 "pikchr.y"
2386 {yylhsminor.yy254 = yymsp[0].minor.yy254;}
2387 #line 2412 "pikchr.c"
2388 yymsp[0].minor.yy254 = yylhsminor.yy254;
2389 break;
2390 case 9: /* element ::= print prlist */
2391 #line 531 "pikchr.y"
2392 {pik_append(p,"<br>\n",5); yymsp[-1].minor.yy254=0;}
2393 #line 2418 "pikchr.c"
2394 break;
2395 case 10: /* element ::= ASSERT LP expr EQ expr RP */
2396 #line 536 "pikchr.y"
2397 {yymsp[-5].minor.yy254=pik_assert(p,yymsp[-3].minor.yy73,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy73);}
2398 #line 2423 "pikchr.c"
2399 break;
2400 case 11: /* element ::= ASSERT LP place EQ place RP */
2401 #line 538 "pikchr.y"
2402 {yymsp[-5].minor.yy254=pik_place_assert(p,&yymsp[-3].minor.yy139,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy139);}
2403 #line 2428 "pikchr.c"
2404 break;
2405 case 12: /* rvalue ::= PLACENAME */
2406 #line 549 "pikchr.y"
2407 {yylhsminor.yy73 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2408 #line 2433 "pikchr.c"
2409 yymsp[0].minor.yy73 = yylhsminor.yy73;
2410 break;
2411 case 13: /* pritem ::= FILL */
2412 case 14: /* pritem ::= COLOR */ yytestcase(yyruleno==14);
2413 case 15: /* pritem ::= THICKNESS */ yytestcase(yyruleno==15);
2414 #line 554 "pikchr.y"
2415 {pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2416 #line 2441 "pikchr.c"
2417 break;
2418 case 16: /* pritem ::= rvalue */
2419 #line 557 "pikchr.y"
2420 {pik_append_num(p,"",yymsp[0].minor.yy73);}
2421 #line 2446 "pikchr.c"
2422 break;
2423 case 17: /* pritem ::= STRING */
2424 #line 558 "pikchr.y"
2425 {pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2426 #line 2451 "pikchr.c"
2427 break;
2428 case 18: /* prsep ::= COMMA */
2429 #line 559 "pikchr.y"
2430 {pik_append(p, " ", 1);}
2431 #line 2456 "pikchr.c"
2432 break;
2433 case 19: /* unnamed_element ::= basetype attribute_list */
2434 #line 562 "pikchr.y"
2435 {yylhsminor.yy254 = yymsp[-1].minor.yy254; pik_after_adding_attributes(p,yylhsminor.yy254);}
2436 #line 2461 "pikchr.c"
2437 yymsp[-1].minor.yy254 = yylhsminor.yy254;
2438 break;
2439 case 20: /* basetype ::= CLASSNAME */
2440 #line 564 "pikchr.y"
2441 {yylhsminor.yy254 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2442 #line 2467 "pikchr.c"
2443 yymsp[0].minor.yy254 = yylhsminor.yy254;
2444 break;
2445 case 21: /* basetype ::= STRING textposition */
2446 #line 566 "pikchr.y"
2447 {yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy74; yylhsminor.yy254 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2448 #line 2473 "pikchr.c"
2449 yymsp[-1].minor.yy254 = yylhsminor.yy254;
2450 break;
2451 case 22: /* basetype ::= LB savelist element_list RB */
2452 #line 568 "pikchr.y"
2453 { p->list = yymsp[-2].minor.yy72; yymsp[-3].minor.yy254 = pik_elem_new(p,0,0,yymsp[-1].minor.yy72); if(yymsp[-3].minor.yy254) yymsp[-3].minor.yy254->errTok = yymsp[0].minor.yy0; }
2454 #line 2479 "pikchr.c"
2455 break;
2456 case 23: /* savelist ::= */
2457 #line 573 "pikchr.y"
2458 {yymsp[1].minor.yy72 = p->list; p->list = 0;}
2459 #line 2484 "pikchr.c"
2460 break;
2461 case 24: /* relexpr ::= expr */
2462 #line 580 "pikchr.y"
2463 {yylhsminor.yy60.rAbs = yymsp[0].minor.yy73; yylhsminor.yy60.rRel = 0;}
2464 #line 2489 "pikchr.c"
2465 yymsp[0].minor.yy60 = yylhsminor.yy60;
2466 break;
2467 case 25: /* relexpr ::= expr PERCENT */
2468 #line 581 "pikchr.y"
2469 {yylhsminor.yy60.rAbs = 0; yylhsminor.yy60.rRel = yymsp[-1].minor.yy73/100;}
2470 #line 2495 "pikchr.c"
2471 yymsp[-1].minor.yy60 = yylhsminor.yy60;
2472 break;
2473 case 26: /* optrelexpr ::= */
2474 #line 583 "pikchr.y"
2475 {yymsp[1].minor.yy60.rAbs = 0; yymsp[1].minor.yy60.rRel = 1.0;}
2476 #line 2501 "pikchr.c"
2477 break;
2478 case 27: /* attribute_list ::= relexpr alist */
2479 #line 585 "pikchr.y"
2480 {pik_add_direction(p,0,&yymsp[-1].minor.yy60);}
2481 #line 2506 "pikchr.c"
2482 break;
2483 case 28: /* attribute ::= numproperty relexpr */
2484 #line 589 "pikchr.y"
2485 { pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy60); }
2486 #line 2511 "pikchr.c"
2487 break;
2488 case 29: /* attribute ::= dashproperty expr */
2489 #line 590 "pikchr.y"
2490 { pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy73); }
2491 #line 2516 "pikchr.c"
2492 break;
2493 case 30: /* attribute ::= dashproperty */
2494 #line 591 "pikchr.y"
2495 { pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2496 #line 2521 "pikchr.c"
2497 break;
2498 case 31: /* attribute ::= colorproperty rvalue */
2499 #line 592 "pikchr.y"
2500 { pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy73); }
2501 #line 2526 "pikchr.c"
2502 break;
2503 case 32: /* attribute ::= go direction optrelexpr */
2504 #line 593 "pikchr.y"
2505 { pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy60);}
2506 #line 2531 "pikchr.c"
2507 break;
2508 case 33: /* attribute ::= go direction even position */
2509 #line 594 "pikchr.y"
2510 {pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy139);}
2511 #line 2536 "pikchr.c"
2512 break;
2513 case 34: /* attribute ::= CLOSE */
2514 #line 595 "pikchr.y"
2515 { pik_close_path(p,&yymsp[0].minor.yy0); }
2516 #line 2541 "pikchr.c"
2517 break;
2518 case 35: /* attribute ::= CHOP */
2519 #line 596 "pikchr.y"
2520 { p->cur->bChop = 1; }
2521 #line 2546 "pikchr.c"
2522 break;
2523 case 36: /* attribute ::= FROM position */
2524 #line 597 "pikchr.y"
2525 { pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy139); }
2526 #line 2551 "pikchr.c"
2527 break;
2528 case 37: /* attribute ::= TO position */
2529 #line 598 "pikchr.y"
2530 { pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy139); }
2531 #line 2556 "pikchr.c"
2532 break;
2533 case 38: /* attribute ::= THEN */
2534 #line 599 "pikchr.y"
2535 { pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2536 #line 2561 "pikchr.c"
2537 break;
2538 case 39: /* attribute ::= THEN optrelexpr HEADING expr */
2539 case 41: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==41);
2540 #line 601 "pikchr.y"
2541 {pik_move_hdg(p,&yymsp[-2].minor.yy60,&yymsp[-1].minor.yy0,yymsp[0].minor.yy73,0,&yymsp[-3].minor.yy0);}
2542 #line 2567 "pikchr.c"
2543 break;
2544 case 40: /* attribute ::= THEN optrelexpr EDGEPT */
2545 case 42: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==42);
2546 #line 602 "pikchr.y"
2547 {pik_move_hdg(p,&yymsp[-1].minor.yy60,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2548 #line 2573 "pikchr.c"
2549 break;
2550 case 43: /* attribute ::= AT position */
2551 #line 607 "pikchr.y"
2552 { pik_set_at(p,0,&yymsp[0].minor.yy139,&yymsp[-1].minor.yy0); }
2553 #line 2578 "pikchr.c"
2554 break;
2555 case 44: /* attribute ::= SAME */
2556 #line 609 "pikchr.y"
2557 {pik_same(p,0,&yymsp[0].minor.yy0);}
2558 #line 2583 "pikchr.c"
2559 break;
2560 case 45: /* attribute ::= SAME AS object */
2561 #line 610 "pikchr.y"
2562 {pik_same(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0);}
2563 #line 2588 "pikchr.c"
2564 break;
2565 case 46: /* attribute ::= STRING textposition */
2566 #line 611 "pikchr.y"
2567 {pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy74);}
2568 #line 2593 "pikchr.c"
2569 break;
2570 case 47: /* attribute ::= FIT */
2571 #line 612 "pikchr.y"
2572 {pik_size_to_fit(p,&yymsp[0].minor.yy0); }
2573 #line 2598 "pikchr.c"
2574 break;
2575 case 48: /* attribute ::= BEHIND object */
2576 #line 613 "pikchr.y"
2577 {pik_behind(p,yymsp[0].minor.yy254);}
2578 #line 2603 "pikchr.c"
2579 break;
2580 case 49: /* withclause ::= DOT_E edge AT position */
2581 case 50: /* withclause ::= edge AT position */ yytestcase(yyruleno==50);
2582 #line 621 "pikchr.y"
2583 { pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy139,&yymsp[-1].minor.yy0); }
2584 #line 2609 "pikchr.c"
2585 break;
2586 case 51: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2587 #line 625 "pikchr.y"
2588 {yylhsminor.yy0 = yymsp[0].minor.yy0;}
2589 #line 2614 "pikchr.c"
2590 yymsp[0].minor.yy0 = yylhsminor.yy0;
2591 break;
2592 case 52: /* boolproperty ::= CW */
2593 #line 636 "pikchr.y"
2594 {p->cur->cw = 1;}
2595 #line 2620 "pikchr.c"
2596 break;
2597 case 53: /* boolproperty ::= CCW */
2598 #line 637 "pikchr.y"
2599 {p->cur->cw = 0;}
2600 #line 2625 "pikchr.c"
2601 break;
2602 case 54: /* boolproperty ::= LARROW */
2603 #line 638 "pikchr.y"
2604 {p->cur->larrow=1; p->cur->rarrow=0; }
2605 #line 2630 "pikchr.c"
2606 break;
2607 case 55: /* boolproperty ::= RARROW */
2608 #line 639 "pikchr.y"
2609 {p->cur->larrow=0; p->cur->rarrow=1; }
2610 #line 2635 "pikchr.c"
2611 break;
2612 case 56: /* boolproperty ::= LRARROW */
2613 #line 640 "pikchr.y"
2614 {p->cur->larrow=1; p->cur->rarrow=1; }
2615 #line 2640 "pikchr.c"
2616 break;
2617 case 57: /* boolproperty ::= INVIS */
2618 #line 641 "pikchr.y"
2619 {p->cur->sw = 0.0;}
2620 #line 2645 "pikchr.c"
2621 break;
2622 case 58: /* boolproperty ::= THICK */
2623 #line 642 "pikchr.y"
2624 {p->cur->sw *= 1.5;}
2625 #line 2650 "pikchr.c"
2626 break;
2627 case 59: /* boolproperty ::= THIN */
2628 #line 643 "pikchr.y"
2629 {p->cur->sw *= 0.67;}
2630 #line 2655 "pikchr.c"
2631 break;
2632 case 60: /* textposition ::= */
2633 #line 645 "pikchr.y"
2634 {yymsp[1].minor.yy74 = 0;}
2635 #line 2660 "pikchr.c"
2636 break;
2637 case 61: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2638 #line 648 "pikchr.y"
2639 {yylhsminor.yy74 = pik_text_position(yymsp[-1].minor.yy74,&yymsp[0].minor.yy0);}
2640 #line 2665 "pikchr.c"
2641 yymsp[-1].minor.yy74 = yylhsminor.yy74;
2642 break;
2643 case 62: /* position ::= expr COMMA expr */
2644 #line 651 "pikchr.y"
2645 {yylhsminor.yy139.x=yymsp[-2].minor.yy73; yylhsminor.yy139.y=yymsp[0].minor.yy73;}
2646 #line 2671 "pikchr.c"
2647 yymsp[-2].minor.yy139 = yylhsminor.yy139;
2648 break;
2649 case 63: /* position ::= place PLUS expr COMMA expr */
2650 #line 653 "pikchr.y"
2651 {yylhsminor.yy139.x=yymsp[-4].minor.yy139.x+yymsp[-2].minor.yy73; yylhsminor.yy139.y=yymsp[-4].minor.yy139.y+yymsp[0].minor.yy73;}
2652 #line 2677 "pikchr.c"
2653 yymsp[-4].minor.yy139 = yylhsminor.yy139;
2654 break;
2655 case 64: /* position ::= place MINUS expr COMMA expr */
2656 #line 654 "pikchr.y"
2657 {yylhsminor.yy139.x=yymsp[-4].minor.yy139.x-yymsp[-2].minor.yy73; yylhsminor.yy139.y=yymsp[-4].minor.yy139.y-yymsp[0].minor.yy73;}
2658 #line 2683 "pikchr.c"
2659 yymsp[-4].minor.yy139 = yylhsminor.yy139;
2660 break;
2661 case 65: /* position ::= place PLUS LP expr COMMA expr RP */
2662 #line 656 "pikchr.y"
2663 {yylhsminor.yy139.x=yymsp[-6].minor.yy139.x+yymsp[-3].minor.yy73; yylhsminor.yy139.y=yymsp[-6].minor.yy139.y+yymsp[-1].minor.yy73;}
2664 #line 2689 "pikchr.c"
2665 yymsp[-6].minor.yy139 = yylhsminor.yy139;
2666 break;
2667 case 66: /* position ::= place MINUS LP expr COMMA expr RP */
2668 #line 658 "pikchr.y"
2669 {yylhsminor.yy139.x=yymsp[-6].minor.yy139.x-yymsp[-3].minor.yy73; yylhsminor.yy139.y=yymsp[-6].minor.yy139.y-yymsp[-1].minor.yy73;}
2670 #line 2695 "pikchr.c"
2671 yymsp[-6].minor.yy139 = yylhsminor.yy139;
2672 break;
2673 case 67: /* position ::= LP position COMMA position RP */
2674 #line 659 "pikchr.y"
2675 {yymsp[-4].minor.yy139.x=yymsp[-3].minor.yy139.x; yymsp[-4].minor.yy139.y=yymsp[-1].minor.yy139.y;}
2676 #line 2701 "pikchr.c"
2677 break;
2678 case 68: /* position ::= LP position RP */
2679 #line 660 "pikchr.y"
2680 {yymsp[-2].minor.yy139=yymsp[-1].minor.yy139;}
2681 #line 2706 "pikchr.c"
2682 break;
2683 case 69: /* position ::= expr between position AND position */
2684 #line 662 "pikchr.y"
2685 {yylhsminor.yy139 = pik_position_between(yymsp[-4].minor.yy73,yymsp[-2].minor.yy139,yymsp[0].minor.yy139);}
2686 #line 2711 "pikchr.c"
2687 yymsp[-4].minor.yy139 = yylhsminor.yy139;
2688 break;
2689 case 70: /* position ::= expr LT position COMMA position GT */
2690 #line 664 "pikchr.y"
2691 {yylhsminor.yy139 = pik_position_between(yymsp[-5].minor.yy73,yymsp[-3].minor.yy139,yymsp[-1].minor.yy139);}
2692 #line 2717 "pikchr.c"
2693 yymsp[-5].minor.yy139 = yylhsminor.yy139;
2694 break;
2695 case 71: /* position ::= expr ABOVE position */
2696 #line 665 "pikchr.y"
2697 {yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.y += yymsp[-2].minor.yy73;}
2698 #line 2723 "pikchr.c"
2699 yymsp[-2].minor.yy139 = yylhsminor.yy139;
2700 break;
2701 case 72: /* position ::= expr BELOW position */
2702 #line 666 "pikchr.y"
2703 {yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.y -= yymsp[-2].minor.yy73;}
2704 #line 2729 "pikchr.c"
2705 yymsp[-2].minor.yy139 = yylhsminor.yy139;
2706 break;
2707 case 73: /* position ::= expr LEFT OF position */
2708 #line 667 "pikchr.y"
2709 {yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.x -= yymsp[-3].minor.yy73;}
2710 #line 2735 "pikchr.c"
2711 yymsp[-3].minor.yy139 = yylhsminor.yy139;
2712 break;
2713 case 74: /* position ::= expr RIGHT OF position */
2714 #line 668 "pikchr.y"
2715 {yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.x += yymsp[-3].minor.yy73;}
2716 #line 2741 "pikchr.c"
2717 yymsp[-3].minor.yy139 = yylhsminor.yy139;
2718 break;
2719 case 75: /* position ::= expr ON HEADING EDGEPT OF position */
2720 #line 670 "pikchr.y"
2721 {yylhsminor.yy139 = pik_position_at_hdg(yymsp[-5].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);}
2722 #line 2747 "pikchr.c"
2723 yymsp[-5].minor.yy139 = yylhsminor.yy139;
2724 break;
2725 case 76: /* position ::= expr HEADING EDGEPT OF position */
2726 #line 672 "pikchr.y"
2727 {yylhsminor.yy139 = pik_position_at_hdg(yymsp[-4].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);}
2728 #line 2753 "pikchr.c"
2729 yymsp[-4].minor.yy139 = yylhsminor.yy139;
2730 break;
2731 case 77: /* position ::= expr EDGEPT OF position */
2732 #line 674 "pikchr.y"
2733 {yylhsminor.yy139 = pik_position_at_hdg(yymsp[-3].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);}
2734 #line 2759 "pikchr.c"
2735 yymsp[-3].minor.yy139 = yylhsminor.yy139;
2736 break;
2737 case 78: /* position ::= expr ON HEADING expr FROM position */
2738 #line 676 "pikchr.y"
2739 {yylhsminor.yy139 = pik_position_at_angle(yymsp[-5].minor.yy73,yymsp[-2].minor.yy73,yymsp[0].minor.yy139);}
2740 #line 2765 "pikchr.c"
2741 yymsp[-5].minor.yy139 = yylhsminor.yy139;
2742 break;
2743 case 79: /* position ::= expr HEADING expr FROM position */
2744 #line 678 "pikchr.y"
2745 {yylhsminor.yy139 = pik_position_at_angle(yymsp[-4].minor.yy73,yymsp[-2].minor.yy73,yymsp[0].minor.yy139);}
2746 #line 2771 "pikchr.c"
2747 yymsp[-4].minor.yy139 = yylhsminor.yy139;
2748 break;
2749 case 80: /* place ::= edge OF object */
2750 #line 690 "pikchr.y"
2751 {yylhsminor.yy139 = pik_place_of_elem(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0);}
2752 #line 2777 "pikchr.c"
2753 yymsp[-2].minor.yy139 = yylhsminor.yy139;
2754 break;
2755 case 81: /* place2 ::= object */
2756 #line 691 "pikchr.y"
2757 {yylhsminor.yy139 = pik_place_of_elem(p,yymsp[0].minor.yy254,0);}
2758 #line 2783 "pikchr.c"
2759 yymsp[0].minor.yy139 = yylhsminor.yy139;
2760 break;
2761 case 82: /* place2 ::= object DOT_E edge */
2762 #line 692 "pikchr.y"
2763 {yylhsminor.yy139 = pik_place_of_elem(p,yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);}
2764 #line 2789 "pikchr.c"
2765 yymsp[-2].minor.yy139 = yylhsminor.yy139;
2766 break;
2767 case 83: /* place2 ::= NTH VERTEX OF object */
2768 #line 693 "pikchr.y"
2769 {yylhsminor.yy139 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy254);}
2770 #line 2795 "pikchr.c"
2771 yymsp[-3].minor.yy139 = yylhsminor.yy139;
2772 break;
2773 case 84: /* object ::= nth */
2774 #line 705 "pikchr.y"
2775 {yylhsminor.yy254 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2776 #line 2801 "pikchr.c"
2777 yymsp[0].minor.yy254 = yylhsminor.yy254;
2778 break;
2779 case 85: /* object ::= nth OF|IN object */
2780 #line 706 "pikchr.y"
2781 {yylhsminor.yy254 = pik_find_nth(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0);}
2782 #line 2807 "pikchr.c"
2783 yymsp[-2].minor.yy254 = yylhsminor.yy254;
2784 break;
2785 case 86: /* objectname ::= PLACENAME */
2786 #line 708 "pikchr.y"
2787 {yylhsminor.yy254 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2788 #line 2813 "pikchr.c"
2789 yymsp[0].minor.yy254 = yylhsminor.yy254;
2790 break;
2791 case 87: /* objectname ::= objectname DOT_U PLACENAME */
2792 #line 710 "pikchr.y"
2793 {yylhsminor.yy254 = pik_find_byname(p,yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);}
2794 #line 2819 "pikchr.c"
2795 yymsp[-2].minor.yy254 = yylhsminor.yy254;
2796 break;
2797 case 88: /* nth ::= NTH CLASSNAME */
2798 #line 712 "pikchr.y"
2799 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2800 #line 2825 "pikchr.c"
2801 yymsp[-1].minor.yy0 = yylhsminor.yy0;
2802 break;
2803 case 89: /* nth ::= NTH LAST CLASSNAME */
2804 #line 713 "pikchr.y"
2805 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2806 #line 2831 "pikchr.c"
2807 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2808 break;
2809 case 90: /* nth ::= LAST CLASSNAME */
2810 #line 714 "pikchr.y"
2811 {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2812 #line 2837 "pikchr.c"
2813 break;
2814 case 91: /* nth ::= LAST */
2815 #line 715 "pikchr.y"
2816 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2817 #line 2842 "pikchr.c"
2818 yymsp[0].minor.yy0 = yylhsminor.yy0;
2819 break;
2820 case 92: /* nth ::= NTH LB RB */
2821 #line 716 "pikchr.y"
2822 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2823 #line 2848 "pikchr.c"
2824 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2825 break;
2826 case 93: /* nth ::= NTH LAST LB RB */
2827 #line 717 "pikchr.y"
2828 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2829 #line 2854 "pikchr.c"
2830 yymsp[-3].minor.yy0 = yylhsminor.yy0;
2831 break;
2832 case 94: /* nth ::= LAST LB RB */
2833 #line 718 "pikchr.y"
2834 {yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2835 #line 2860 "pikchr.c"
2836 break;
2837 case 95: /* expr ::= expr PLUS expr */
2838 #line 720 "pikchr.y"
2839 {yylhsminor.yy73=yymsp[-2].minor.yy73+yymsp[0].minor.yy73;}
2840 #line 2865 "pikchr.c"
2841 yymsp[-2].minor.yy73 = yylhsminor.yy73;
2842 break;
2843 case 96: /* expr ::= expr MINUS expr */
2844 #line 721 "pikchr.y"
2845 {yylhsminor.yy73=yymsp[-2].minor.yy73-yymsp[0].minor.yy73;}
2846 #line 2871 "pikchr.c"
2847 yymsp[-2].minor.yy73 = yylhsminor.yy73;
2848 break;
2849 case 97: /* expr ::= expr STAR expr */
2850 #line 722 "pikchr.y"
2851 {yylhsminor.yy73=yymsp[-2].minor.yy73*yymsp[0].minor.yy73;}
2852 #line 2877 "pikchr.c"
2853 yymsp[-2].minor.yy73 = yylhsminor.yy73;
2854 break;
2855 case 98: /* expr ::= expr SLASH expr */
2856 #line 723 "pikchr.y"
2857 {
2858 if( yymsp[0].minor.yy73==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy73 = 0.0; }
2859 else{ yylhsminor.yy73 = yymsp[-2].minor.yy73/yymsp[0].minor.yy73; }
2860 }
2861 #line 2886 "pikchr.c"
2862 yymsp[-2].minor.yy73 = yylhsminor.yy73;
2863 break;
2864 case 99: /* expr ::= MINUS expr */
2865 #line 727 "pikchr.y"
2866 {yymsp[-1].minor.yy73=-yymsp[0].minor.yy73;}
2867 #line 2892 "pikchr.c"
2868 break;
2869 case 100: /* expr ::= PLUS expr */
2870 #line 728 "pikchr.y"
2871 {yymsp[-1].minor.yy73=yymsp[0].minor.yy73;}
2872 #line 2897 "pikchr.c"
2873 break;
2874 case 101: /* expr ::= LP expr RP */
2875 #line 729 "pikchr.y"
2876 {yymsp[-2].minor.yy73=yymsp[-1].minor.yy73;}
2877 #line 2902 "pikchr.c"
2878 break;
2879 case 102: /* expr ::= NUMBER */
2880 #line 730 "pikchr.y"
2881 {yylhsminor.yy73=pik_atof(&yymsp[0].minor.yy0);}
2882 #line 2907 "pikchr.c"
2883 yymsp[0].minor.yy73 = yylhsminor.yy73;
2884 break;
2885 case 103: /* expr ::= ID */
2886 #line 731 "pikchr.y"
2887 {yylhsminor.yy73=pik_get_var(p,&yymsp[0].minor.yy0);}
2888 #line 2913 "pikchr.c"
2889 yymsp[0].minor.yy73 = yylhsminor.yy73;
2890 break;
2891 case 104: /* expr ::= FUNC1 LP expr RP */
2892 #line 732 "pikchr.y"
2893 {yylhsminor.yy73 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy73,0.0);}
2894 #line 2919 "pikchr.c"
2895 yymsp[-3].minor.yy73 = yylhsminor.yy73;
2896 break;
2897 case 105: /* expr ::= FUNC2 LP expr COMMA expr RP */
2898 #line 733 "pikchr.y"
2899 {yylhsminor.yy73 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy73,yymsp[-1].minor.yy73);}
2900 #line 2925 "pikchr.c"
2901 yymsp[-5].minor.yy73 = yylhsminor.yy73;
2902 break;
2903 case 106: /* expr ::= place2 DOT_XY X */
2904 #line 734 "pikchr.y"
2905 {yylhsminor.yy73 = yymsp[-2].minor.yy139.x;}
2906 #line 2931 "pikchr.c"
2907 yymsp[-2].minor.yy73 = yylhsminor.yy73;
2908 break;
2909 case 107: /* expr ::= place2 DOT_XY Y */
2910 #line 735 "pikchr.y"
2911 {yylhsminor.yy73 = yymsp[-2].minor.yy139.y;}
2912 #line 2937 "pikchr.c"
2913 yymsp[-2].minor.yy73 = yylhsminor.yy73;
2914 break;
2915 case 108: /* expr ::= object DOT_L numproperty */
2916 case 109: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==109);
2917 case 110: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==110);
2918 #line 736 "pikchr.y"
2919 {yylhsminor.yy73=pik_property_of(yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);}
2920 #line 2945 "pikchr.c"
2921 yymsp[-2].minor.yy73 = yylhsminor.yy73;
2922 break;
2923 default:
2924 /* (111) lvalue ::= ID */ yytestcase(yyruleno==111);
2925 /* (112) lvalue ::= FILL */ yytestcase(yyruleno==112);
@@ -3014,18 +3018,19 @@
3018 ){
3019 pik_parserARG_FETCH
3020 pik_parserCTX_FETCH
3021 #define TOKEN yyminor
3022 /************ Begin %syntax_error code ****************************************/
3023 #line 502 "pikchr.y"
3024
3025 if( TOKEN.z && TOKEN.z[0] ){
3026 pik_error(p, &TOKEN, "syntax error");
3027 }else{
3028 pik_error(p, 0, "syntax error");
3029 }
3030 UNUSED_PARAMETER(yymajor);
3031 #line 3056 "pikchr.c"
3032 /************ End %syntax_error code ******************************************/
3033 pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
3034 pik_parserCTX_STORE
3035 }
3036
@@ -3254,11 +3259,11 @@
3259 #else
3260 (void)iToken;
3261 return 0;
3262 #endif
3263 }
3264 #line 741 "pikchr.y"
3265
3266
3267
3268 /* Chart of the 140 official HTML color names with their
3269 ** corresponding RGB value.
@@ -3534,33 +3539,10 @@
3539 static void boxInit(Pik *p, PElem *pElem){
3540 pElem->w = pik_value(p, "boxwid",6,0);
3541 pElem->h = pik_value(p, "boxht",5,0);
3542 pElem->rad = pik_value(p, "boxrad",6,0);
3543 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3544 /* Return offset from the center of the box to the compass point
3545 ** given by parameter cp */
3546 static PPoint boxOffset(Pik *p, PElem *pElem, int cp){
3547 PPoint pt;
3548 PNum w2 = 0.5*pElem->w;
@@ -3573,11 +3555,11 @@
3555 if( rad>w2 ) rad = w2;
3556 if( rad>h2 ) rad = h2;
3557 rx = 0.29289321881345252392*rad;
3558 }
3559 pt.x = pt.y = 0.0;
3560 switch( cp ){
3561 case CP_C: pt.x = 0.0; pt.y = 0.0; break;
3562 case CP_N: pt.x = 0.0; pt.y = h2; break;
3563 case CP_NE: pt.x = w2-rx; pt.y = h2-rx; break;
3564 case CP_E: pt.x = w2; pt.y = 0.0; break;
3565 case CP_SE: pt.x = w2-rx; pt.y = rx-h2; break;
@@ -3584,10 +3566,11 @@
3566 case CP_S: pt.x = 0.0; pt.y = -h2; break;
3567 case CP_SW: pt.x = rx-w2; pt.y = rx-h2; break;
3568 case CP_W: pt.x = -w2; pt.y = 0.0; break;
3569 case CP_NW: pt.x = rx-w2; pt.y = h2-rx; break;
3570 }
3571 UNUSED_PARAMETER(p);
3572 return pt;
3573 }
3574 static PPoint boxChop(Pik *p, PElem *pElem, PPoint *pPt){
3575 PNum dx, dy;
3576 int cp = CP_C;
@@ -3627,10 +3610,11 @@
3610 return chop;
3611 }
3612 static void boxFit(Pik *p, PElem *pElem, PNum w, PNum h){
3613 if( w>0 ) pElem->w = w;
3614 if( h>0 ) pElem->h = h;
3615 UNUSED_PARAMETER(p);
3616 }
3617 static void boxRender(Pik *p, PElem *pElem){
3618 PNum w2 = 0.5*pElem->w;
3619 PNum h2 = 0.5*pElem->h;
3620 PNum rad = pElem->rad;
@@ -3704,19 +3688,21 @@
3688 case T_HEIGHT:
3689 pElem->w = pElem->h;
3690 pElem->rad = 0.5*pElem->w;
3691 break;
3692 }
3693 UNUSED_PARAMETER(p);
3694 }
3695 static PPoint circleChop(Pik *p, PElem *pElem, PPoint *pPt){
3696 PPoint chop;
3697 PNum dx = pPt->x - pElem->ptAt.x;
3698 PNum dy = pPt->y - pElem->ptAt.y;
3699 PNum dist = hypot(dx,dy);
3700 if( dist<pElem->rad ) return pElem->ptAt;
3701 chop.x = pElem->ptAt.x + dx*pElem->rad/dist;
3702 chop.y = pElem->ptAt.y + dy*pElem->rad/dist;
3703 UNUSED_PARAMETER(p);
3704 return chop;
3705 }
3706 static void circleFit(Pik *p, PElem *pElem, PNum w, PNum h){
3707 PNum mx = 0.0;
3708 if( w>0 ) mx = w;
@@ -3726,10 +3712,11 @@
3712 }
3713 if( mx>0.0 ){
3714 pElem->rad = 0.5*mx;
3715 pElem->w = pElem->h = mx;
3716 }
3717 UNUSED_PARAMETER(p);
3718 }
3719
3720 static void circleRender(Pik *p, PElem *pElem){
3721 PNum r = pElem->rad;
3722 PPoint pt = pElem->ptAt;
@@ -3770,11 +3757,11 @@
3757 static PPoint cylinderOffset(Pik *p, PElem *pElem, int cp){
3758 PPoint pt;
3759 PNum w2 = pElem->w*0.5;
3760 PNum h1 = pElem->h*0.5;
3761 PNum h2 = h1 - pElem->rad;
3762 switch( cp ){
3763 case CP_C: pt.x = 0.0; pt.y = 0.0; break;
3764 case CP_N: pt.x = 0.0; pt.y = h1; break;
3765 case CP_NE: pt.x = w2; pt.y = h2; break;
3766 case CP_E: pt.x = w2; pt.y = 0.0; break;
3767 case CP_SE: pt.x = w2; pt.y = -h2; break;
@@ -3781,10 +3768,11 @@
3768 case CP_S: pt.x = 0.0; pt.y = -h1; break;
3769 case CP_SW: pt.x = -w2; pt.y = -h2; break;
3770 case CP_W: pt.x = -w2; pt.y = 0.0; break;
3771 case CP_NW: pt.x = -w2; pt.y = h2; break;
3772 }
3773 UNUSED_PARAMETER(p);
3774 return pt;
3775 }
3776
3777 /* Methods for the "dot" class */
3778 static void dotInit(Pik *p, PElem *pElem){
@@ -3799,19 +3787,24 @@
3787 break;
3788 case T_FILL:
3789 pElem->color = pElem->fill;
3790 break;
3791 }
3792 UNUSED_PARAMETER(p);
3793 }
3794 static void dotCheck(Pik *p, PElem *pElem){
3795 pElem->w = pElem->h = 0;
3796 pik_bbox_addellipse(&pElem->bbox, pElem->ptAt.x, pElem->ptAt.y,
3797 pElem->rad, pElem->rad);
3798 UNUSED_PARAMETER(p);
3799 }
3800 static PPoint dotOffset(Pik *p, PElem *pElem, int cp){
3801 PPoint zero;
3802 zero.x = zero.y = 0;
3803 UNUSED_PARAMETER(p);
3804 UNUSED_PARAMETER(pElem);
3805 UNUSED_PARAMETER(cp);
3806 return zero;
3807 }
3808 static void dotRender(Pik *p, PElem *pElem){
3809 PNum r = pElem->rad;
3810 PPoint pt = pElem->ptAt;
@@ -3843,19 +3836,20 @@
3836 dq = dx*s;
3837 dist = hypot(dq,dy);
3838 if( dist<pElem->h ) return pElem->ptAt;
3839 chop.x = pElem->ptAt.x + 0.5*dq*pElem->h/(dist*s);
3840 chop.y = pElem->ptAt.y + 0.5*dy*pElem->h/dist;
3841 UNUSED_PARAMETER(p);
3842 return chop;
3843 }
3844 static PPoint ellipseOffset(Pik *p, PElem *pElem, int cp){
3845 PPoint pt;
3846 PNum w = pElem->w*0.5;
3847 PNum w2 = w*0.70710678118654747608;
3848 PNum h = pElem->h*0.5;
3849 PNum h2 = h*0.70710678118654747608;
3850 switch( cp ){
3851 case CP_C: pt.x = 0.0; pt.y = 0.0; break;
3852 case CP_N: pt.x = 0.0; pt.y = h; break;
3853 case CP_NE: pt.x = w2; pt.y = h2; break;
3854 case CP_E: pt.x = w; pt.y = 0.0; break;
3855 case CP_SE: pt.x = w2; pt.y = -h2; break;
@@ -3862,10 +3856,11 @@
3856 case CP_S: pt.x = 0.0; pt.y = -h; break;
3857 case CP_SW: pt.x = -w2; pt.y = -h2; break;
3858 case CP_W: pt.x = -w; pt.y = 0.0; break;
3859 case CP_NW: pt.x = -w2; pt.y = h2; break;
3860 }
3861 UNUSED_PARAMETER(p);
3862 return pt;
3863 }
3864 static void ellipseRender(Pik *p, PElem *pElem){
3865 PNum w = pElem->w;
3866 PNum h = pElem->h;
@@ -3897,11 +3892,11 @@
3892 PNum mn = w2<h2 ? w2 : h2;
3893 if( rx>mn ) rx = mn;
3894 if( rx<mn*0.25 ) rx = mn*0.25;
3895 pt.x = pt.y = 0.0;
3896 rx *= 0.5;
3897 switch( cp ){
3898 case CP_C: pt.x = 0.0; pt.y = 0.0; break;
3899 case CP_N: pt.x = 0.0; pt.y = h2; break;
3900 case CP_NE: pt.x = w2-rx; pt.y = h2-rx; break;
3901 case CP_E: pt.x = w2; pt.y = 0.0; break;
3902 case CP_SE: pt.x = w2; pt.y = -h2; break;
@@ -3908,15 +3903,17 @@
3903 case CP_S: pt.x = 0.0; pt.y = -h2; break;
3904 case CP_SW: pt.x = -w2; pt.y = -h2; break;
3905 case CP_W: pt.x = -w2; pt.y = 0.0; break;
3906 case CP_NW: pt.x = -w2; pt.y = h2; break;
3907 }
3908 UNUSED_PARAMETER(p);
3909 return pt;
3910 }
3911 static void fileFit(Pik *p, PElem *pElem, PNum w, PNum h){
3912 if( w>0 ) pElem->w = w;
3913 if( h>0 ) pElem->h = h + 2*pElem->rad;
3914 UNUSED_PARAMETER(p);
3915 }
3916 static void fileRender(Pik *p, PElem *pElem){
3917 PNum w2 = 0.5*pElem->w;
3918 PNum h2 = 0.5*pElem->h;
3919 PNum rad = pElem->rad;
@@ -3950,11 +3947,10 @@
3947 pElem->h = pik_value(p, "lineht",6,0);
3948 pElem->rad = pik_value(p, "linerad",7,0);
3949 pElem->fill = -1.0;
3950 }
3951 static PPoint lineOffset(Pik *p, PElem *pElem, int cp){
 
3952 #if 0
3953 /* In legacy PIC, the .center of an unclosed line is half way between
3954 ** its .start and .end. */
3955 if( cp==CP_C && !pElem->bClose ){
3956 PPoint out;
@@ -3961,11 +3957,10 @@
3957 out.x = 0.5*(pElem->ptEnter.x + pElem->ptExit.x) - pElem->ptAt.x;
3958 out.y = 0.5*(pElem->ptEnter.x + pElem->ptExit.y) - pElem->ptAt.y;
3959 return out;
3960 }
3961 #endif
 
3962 return boxOffset(p,pElem,cp);
3963 }
3964 static void lineRender(Pik *p, PElem *pElem){
3965 int i;
3966 if( pElem->sw>0.0 ){
@@ -4001,24 +3996,29 @@
3996 pElem->color = -1.0;
3997 pElem->sw = -1.0;
3998 }
3999 static void moveRender(Pik *p, PElem *pElem){
4000 /* No-op */
4001 UNUSED_PARAMETER(p);
4002 UNUSED_PARAMETER(pElem);
4003 }
4004
4005 /* Methods for the "oval" class */
4006 static void ovalInit(Pik *p, PElem *pElem){
4007 pElem->h = pik_value(p, "ovalht",6,0);
4008 pElem->w = pik_value(p, "ovalwid",7,0);
4009 pElem->rad = 0.5*(pElem->h<pElem->w?pElem->h:pElem->w);
4010 }
4011 static void ovalNumProp(Pik *p, PElem *pElem, PToken *pId){
4012 UNUSED_PARAMETER(p);
4013 UNUSED_PARAMETER(pId);
4014 /* Always adjust the radius to be half of the smaller of
4015 ** the width and height. */
4016 pElem->rad = 0.5*(pElem->h<pElem->w?pElem->h:pElem->w);
4017 }
4018 static void ovalFit(Pik *p, PElem *pElem, PNum w, PNum h){
4019 UNUSED_PARAMETER(p);
4020 if( w>0 ) pElem->w = w;
4021 if( h>0 ) pElem->h = h;
4022 if( pElem->w<pElem->h ) pElem->w = pElem->h;
4023 }
4024
@@ -4114,10 +4114,11 @@
4114
4115 /* Methods for the "sublist" class */
4116 static void sublistInit(Pik *p, PElem *pElem){
4117 PEList *pList = pElem->pSublist;
4118 int i;
4119 UNUSED_PARAMETER(p);
4120 pik_bbox_init(&pElem->bbox);
4121 for(i=0; i<pList->n; i++){
4122 pik_bbox_addbox(&pElem->bbox, &pList->a[i]->bbox);
4123 }
4124 pElem->w = pElem->bbox.ne.x - pElem->bbox.sw.x;
@@ -4305,11 +4306,11 @@
4306
4307 /*
4308 ** Reduce the length of the line segment by amt (if possible) by
4309 ** modifying the location of *t.
4310 */
4311 static void pik_chop(PPoint *f, PPoint *t, PNum amt){
4312 PNum dx = t->x - f->x;
4313 PNum dy = t->y - f->y;
4314 PNum dist = hypot(dx,dy);
4315 PNum r;
4316 if( dist<=amt ){
@@ -4350,11 +4351,11 @@
4351 by = f->y + e1*dy;
4352 pik_append_xy(p,"<polygon points=\"", t->x, t->y);
4353 pik_append_xy(p," ",bx-ddx, by-ddy);
4354 pik_append_xy(p," ",bx+ddx, by+ddy);
4355 pik_append_clr(p,"\" style=\"fill:",pElem->color,"\"/>\n");
4356 pik_chop(f,t,h/2);
4357 }
4358
4359 /*
4360 ** Compute the relative offset to an edge location from the reference for a
4361 ** an element.
@@ -4538,11 +4539,11 @@
4539 ** Compute the vertical locations for all text items in the
4540 ** element pElem. In other words, set every pElem->aTxt[*].eCode
4541 ** value to contain exactly one of: TP_ABOVE2, TP_ABOVE, TP_CENTER,
4542 ** TP_BELOW, or TP_BELOW2 is set.
4543 */
4544 static void pik_txt_vertical_layout(PElem *pElem){
4545 int n, i;
4546 PToken *aTxt;
4547 n = pElem->nTxt;
4548 if( n==0 ) return;
4549 aTxt = pElem->aTxt;
@@ -4636,11 +4637,11 @@
4637 if( p->nErr ) return;
4638 if( pElem->nTxt==0 ) return;
4639 aTxt = pElem->aTxt;
4640 dy = 0.5*p->charHeight;
4641 n = pElem->nTxt;
4642 pik_txt_vertical_layout(pElem);
4643 x = pElem->ptAt.x;
4644 for(i=0; i<n; i++){
4645 if( (pElem->aTxt[i].eCode & TP_CENTER)!=0 ) hasCenter = 1;
4646 }
4647 if( hasCenter ){
@@ -4765,11 +4766,11 @@
4766 for(nExtra=0; (c = p->zIn[i+nExtra])!=0 && c!='\n'; nExtra++){}
4767 pik_append(p, "<div><pre>\n", -1);
4768 pik_append_text(p, p->zIn, i+nExtra, 3);
4769 pik_append(p, "\n", 1);
4770 for(i=0; i<iCol; i++){ pik_append(p, " ", 1); }
4771 for(i=0; i<(int)pErr->n; i++) pik_append(p, "^", 1);
4772 pik_append(p, "\nERROR: ", -1);
4773 pik_append_text(p, zMsg, -1, 0);
4774 pik_append(p, "\n", 1);
4775 pik_append(p, "\n</pre></div>\n", -1);
4776 }
@@ -4841,18 +4842,18 @@
4842 ** (3) Hex integers: 0x000000
4843 **
4844 ** This routine returns the result in inches. If a different unit
4845 ** is specified, the conversion happens automatically.
4846 */
4847 PNum pik_atof(PToken *num){
4848 char *endptr;
4849 PNum ans;
4850 if( num->n>=3 && num->z[0]=='0' && (num->z[1]=='x'||num->z[1]=='X') ){
4851 return (PNum)strtol(num->z+2, 0, 16);
4852 }
4853 ans = strtod(num->z, &endptr);
4854 if( (int)(endptr - num->z)==(int)num->n-2 ){
4855 char c1 = endptr[0];
4856 char c2 = endptr[1];
4857 if( c1=='c' && c2=='m' ){
4858 ans /= 2.54;
4859 }else if( c1=='m' && c2=='m' ){
@@ -5063,11 +5064,11 @@
5064 }
5065
5066 /*
5067 ** Set the output direction and exit point for an element.
5068 */
5069 static void pik_elem_set_exit(PElem *pElem, int eDir){
5070 assert( ValidDir(eDir) );
5071 pElem->outDir = eDir;
5072 if( !pElem->type->isLine || pElem->bClose ){
5073 pElem->ptExit = pElem->ptAt;
5074 switch( pElem->outDir ){
@@ -5097,11 +5098,11 @@
5098 ** You can make pikchr render the above exactly like PIC
5099 ** by deleting the following three lines. But I (drh) think
5100 ** it works better with those lines in place.
5101 */
5102 if( p->list && p->list->n ){
5103 pik_elem_set_exit(p->list->a[p->list->n-1], eDir);
5104 }
5105 }
5106
5107 /* Move all coordinates contained within an element (and within its
5108 ** substructure) by dx, dy
@@ -5247,11 +5248,11 @@
5248
5249 /*
5250 ** If the current path information came from a "same" or "same as"
5251 ** reset it.
5252 */
5253 static void pik_reset_samepath(Pik *p){
5254 if( p->samePath ){
5255 p->samePath = 0;
5256 p->nTPath = 1;
5257 }
5258 }
@@ -5277,11 +5278,11 @@
5278
5279 /* Advance to the next entry in p->aTPath. Return its index.
5280 */
5281 static int pik_next_rpath(Pik *p, PToken *pErr){
5282 int n = p->nTPath - 1;
5283 if( n+1>=(int)count(p->aTPath) ){
5284 pik_error(0, pErr, "too many path elements");
5285 return n;
5286 }
5287 n++;
5288 p->nTPath++;
@@ -5299,16 +5300,16 @@
5300 int dir;
5301 if( !pElem->type->isLine ){
5302 if( pDir ){
5303 pik_error(p, pDir, "use with line-oriented objects only");
5304 }else{
5305 PToken x = pik_next_semantic_token(&pElem->errTok);
5306 pik_error(p, &x, "syntax error");
5307 }
5308 return;
5309 }
5310 pik_reset_samepath(p);
5311 n = p->nTPath - 1;
5312 if( p->thenFlag || p->mTPath==3 || n==0 ){
5313 n = pik_next_rpath(p, pDir);
5314 p->thenFlag = 0;
5315 }
@@ -5357,11 +5358,11 @@
5358 PNum rDist = pDist->rAbs + pik_value(p,"linewid",7,0)*pDist->rRel;
5359 if( !pElem->type->isLine ){
5360 pik_error(p, pErr, "use with line-oriented objects only");
5361 return;
5362 }
5363 pik_reset_samepath(p);
5364 do{
5365 n = pik_next_rpath(p, pErr);
5366 }while( n<1 );
5367 if( pHeading ){
5368 if( rHdg<0.0 || rHdg>360.0 ){
@@ -5403,11 +5404,11 @@
5404 int n;
5405 if( !pElem->type->isLine ){
5406 pik_error(p, pDir, "use with line-oriented objects only");
5407 return;
5408 }
5409 pik_reset_samepath(p);
5410 n = p->nTPath - 1;
5411 if( p->thenFlag || p->mTPath==3 || n==0 ){
5412 n = pik_next_rpath(p, pDir);
5413 p->thenFlag = 0;
5414 }
@@ -5515,11 +5516,11 @@
5516 if( pElem->mProp & A_AT ){
5517 pik_error(p, pErrTok, "location fixed by prior \"at\"");
5518 return;
5519 }
5520 pElem->mProp |= A_AT;
5521 pElem->eWith = pEdge ? pEdge->eEdge : CP_C;
5522 pElem->with = *pAt;
5523 }
5524
5525 /*
5526 ** Try to add a text attribute to an element
@@ -5536,11 +5537,11 @@
5537 pT->eCode = iPos;
5538 }
5539
5540 /* Merge "text-position" flags
5541 */
5542 static int pik_text_position(int iPrev, PToken *pFlag){
5543 int iRes = iPrev;
5544 switch( pFlag->eType ){
5545 case T_LJUST: iRes = (iRes&~TP_JMASK) | TP_LJUST; break;
5546 case T_RJUST: iRes = (iRes&~TP_JMASK) | TP_RJUST; break;
5547 case T_ABOVE: iRes = (iRes&~TP_VMASK) | TP_ABOVE; break;
@@ -5610,11 +5611,11 @@
5611 if( pElem->type->xFit==0 ) return;
5612 if( (pElem->mProp & A_HEIGHT)==0 ){
5613 int hasCenter = 0;
5614 int hasSingleStack = 0;
5615 int hasDoubleStack = 0;
5616 pik_txt_vertical_layout(pElem);
5617 for(i=0; i<pElem->nTxt; i++){
5618 if( pElem->aTxt[i].eCode & TP_CENTER ){
5619 hasCenter = 1;
5620 }else if( pElem->aTxt[i].eCode & (TP_ABOVE2|TP_BELOW2) ){
5621 hasDoubleStack = 1;
@@ -5736,11 +5737,12 @@
5737 int first, last, mid, c = 0;
5738 first = 0;
5739 last = count(aColor)-1;
5740 while( first<=last ){
5741 const char *zClr;
5742 int c1, c2;
5743 unsigned int i;
5744 mid = (first+last)/2;
5745 zClr = aColor[mid].zName;
5746 for(i=0; i<pId->n; i++){
5747 c1 = zClr[i]&0x7f;
5748 if( isupper(c1) ) c1 = tolower(c1);
@@ -5970,11 +5972,11 @@
5972 }
5973 }
5974
5975 /* Do a linear interpolation of two positions.
5976 */
5977 static PPoint pik_position_between(PNum x, PPoint p1, PPoint p2){
5978 PPoint out;
5979 if( x<0.0 ) x = 0.0;
5980 if( x>1.0 ) x = 1.0;
5981 out.x = p2.x*x + p1.x*(1.0 - x);
5982 out.y = p2.y*x + p1.y*(1.0 - x);
@@ -5984,21 +5986,21 @@
5986 /* Compute the position that is dist away from pt at an heading angle of r
5987 **
5988 ** The angle is a compass heading in degrees. North is 0 (or 360).
5989 ** East is 90. South is 180. West is 270. And so forth.
5990 */
5991 static PPoint pik_position_at_angle(PNum dist, PNum r, PPoint pt){
5992 r *= 0.017453292519943295769; /* degrees to radians */
5993 pt.x += dist*sin(r);
5994 pt.y += dist*cos(r);
5995 return pt;
5996 }
5997
5998 /* Compute the position that is dist away at a compass point
5999 */
6000 static PPoint pik_position_at_hdg(PNum dist, PToken *pD, PPoint pt){
6001 return pik_position_at_angle(dist, pik_hdg_angle[pD->eEdge], pt);
6002 }
6003
6004 /* Return the coordinates for the n-th vertex of a line.
6005 */
6006 static PPoint pik_nth_vertex(Pik *p, PToken *pNth, PToken *pErr, PElem *pObj){
@@ -6017,11 +6019,11 @@
6019 return pObj->aPath[n-1];
6020 }
6021
6022 /* Return the value of a property of an object.
6023 */
6024 static PNum pik_property_of(PElem *pElem, PToken *pProp){
6025 PNum v = 0.0;
6026 switch( pProp->eType ){
6027 case T_HEIGHT: v = pElem->h; break;
6028 case T_WIDTH: v = pElem->w; break;
6029 case T_RADIUS: v = pElem->rad; break;
@@ -6174,16 +6176,15 @@
6176 */
6177 if( pElem->type->isLine ){
6178 pElem->aPath = malloc( sizeof(PPoint)*p->nTPath );
6179 if( pElem->aPath==0 ){
6180 pik_error(p, 0, 0);
6181 return;
6182 }else{
6183 pElem->nPath = p->nTPath;
6184 for(i=0; i<p->nTPath; i++){
6185 pElem->aPath[i] = p->aTPath[i];
 
6186 }
6187 }
6188
6189 /* "chop" processing:
6190 ** If the line goes to the center of an object with an
@@ -6193,15 +6194,18 @@
6194 int n = pElem->nPath;
6195 pik_autochop(p, &pElem->aPath[n-2], &pElem->aPath[n-1]);
6196 pik_autochop(p, &pElem->aPath[1], &pElem->aPath[0]);
6197 }
6198
6199 pElem->ptEnter = pElem->aPath[0];
6200 pElem->ptExit = pElem->aPath[pElem->nPath-1];
6201
6202 /* Compute the center of the line based on the bounding box over
6203 ** the vertexes */
6204 for(i=0; i<pElem->nPath; i++){
6205 pik_bbox_add_xy(&pElem->bbox, pElem->aPath[i].x, pElem->aPath[i].y);
6206 }
6207 pElem->ptAt.x = (pElem->bbox.ne.x + pElem->bbox.sw.x)/2.0;
6208 pElem->ptAt.y = (pElem->bbox.ne.y + pElem->bbox.sw.y)/2.0;
6209
6210 /* Reset the width and height of the object to be the width and height
6211 ** of the bounding box over vertexes */
@@ -6210,11 +6214,11 @@
6214
6215 /* If this is a polygon (if it has the "close" attribute), then
6216 ** adjust the exit point */
6217 if( pElem->bClose ){
6218 /* "closed" lines work like block objects */
6219 pik_elem_set_exit(pElem, pElem->inDir);
6220 }else{
6221 /* For an open line, the "center" is half way between
6222 ** the .start and the .end */
6223 }
6224 }else{
@@ -6778,11 +6782,11 @@
6782 /* This is not an exp */
6783 i -= 2;
6784 }else{
6785 i++;
6786 isInt = 0;
6787 while( (c = z[i])>='0' && c<='9' ){ i++; }
6788 }
6789 }
6790 c2 = c ? z[i+1] : 0;
6791 if( isInt ){
6792 if( (c=='t' && c2=='h')
@@ -6837,11 +6841,11 @@
6841
6842 /*
6843 ** Return a pointer to the next non-whitespace token after pThis.
6844 ** This is used to help form error messages.
6845 */
6846 static PToken pik_next_semantic_token(PToken *pThis){
6847 PToken x;
6848 int sz;
6849 int i = pThis->n;
6850 memset(&x, 0, sizeof(x));
6851 x.z = pThis->z;
@@ -7055,6 +7059,6 @@
7059 printf("</body></html>\n");
7060 return 0;
7061 }
7062 #endif /* PIKCHR_SHELL */
7063
7064 #line 7089 "pikchr.c"
7065

Keyboard Shortcuts

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