Fossil SCM

Import the latest version of pikchr that supports the "file" object type.

drh 2020-09-12 00:00 trunk
Commit b01fae602d9387fa52012432993dd8c5a58360a03510b253acac3736dabde7a3
1 file changed +359 -230
+359 -230
--- src/pikchr.c
+++ src/pikchr.c
@@ -349,10 +349,11 @@
349349
** this structure. This it the "virtual method" table.
350350
*/
351351
struct PClass {
352352
const char *zName; /* Name of class */
353353
char isLine; /* True if a line class */
354
+ char eJust; /* Use box-style text justification */
354355
void (*xInit)(Pik*,PElem*); /* Initializer */
355356
void (*xNumProp)(Pik*,PElem*,PToken*); /* Value change notification */
356357
PPoint (*xChop)(PElem*,PPoint*); /* Chopper */
357358
PPoint (*xOffset)(Pik*,PElem*,int); /* Offset from center to edge point */
358359
void (*xFit)(Pik*,PElem*,PNum w,PNum h); /* Size to fit text */
@@ -422,11 +423,11 @@
422423
static PPoint pik_nth_vertex(Pik *p, PToken *pNth, PToken *pErr, PElem *pElem);
423424
static PToken pik_next_semantic_token(Pik *p, PToken *pThis);
424425
static void pik_compute_layout_settings(Pik*);
425426
426427
427
-#line 453 "pikchr.c"
428
+#line 454 "pikchr.c"
428429
/**************** End of %include directives **********************************/
429430
/* These constants specify the various numeric values for terminal symbols.
430431
***************** Begin token definitions *************************************/
431432
#ifndef T_ID
432433
#define T_ID 1
@@ -1506,22 +1507,22 @@
15061507
** inside the C code.
15071508
*/
15081509
/********* Begin destructor definitions ***************************************/
15091510
case 86: /* element_list */
15101511
{
1511
-#line 442 "pikchr.y"
1512
+#line 443 "pikchr.y"
15121513
pik_elist_free(p,(yypminor->yy120));
1513
-#line 1538 "pikchr.c"
1514
+#line 1539 "pikchr.c"
15141515
}
15151516
break;
15161517
case 87: /* element */
15171518
case 88: /* unnamed_element */
15181519
case 89: /* basetype */
15191520
{
1520
-#line 444 "pikchr.y"
1521
+#line 445 "pikchr.y"
15211522
pik_elem_free(p,(yypminor->yy26));
1522
-#line 1547 "pikchr.c"
1523
+#line 1548 "pikchr.c"
15231524
}
15241525
break;
15251526
/********* End destructor definitions *****************************************/
15261527
default: break; /* If no destructor action specified: do nothing */
15271528
}
@@ -1735,14 +1736,14 @@
17351736
#endif
17361737
while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
17371738
/* Here code is inserted which will execute if the parser
17381739
** stack every overflows */
17391740
/******** Begin %stack_overflow code ******************************************/
1740
-#line 473 "pikchr.y"
1741
+#line 474 "pikchr.y"
17411742
17421743
pik_error(p, 0, "parser stack overflow");
1743
-#line 1768 "pikchr.c"
1744
+#line 1769 "pikchr.c"
17441745
/******** End %stack_overflow code ********************************************/
17451746
pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
17461747
pik_parserCTX_STORE
17471748
}
17481749
@@ -2201,566 +2202,566 @@
22012202
** break;
22022203
*/
22032204
/********** Begin reduce actions **********************************************/
22042205
YYMINORTYPE yylhsminor;
22052206
case 0: /* document ::= element_list */
2206
-#line 477 "pikchr.y"
2207
+#line 478 "pikchr.y"
22072208
{pik_render(p,yymsp[0].minor.yy120);}
2208
-#line 2233 "pikchr.c"
2209
+#line 2234 "pikchr.c"
22092210
break;
22102211
case 1: /* element_list ::= element */
2211
-#line 480 "pikchr.y"
2212
+#line 481 "pikchr.y"
22122213
{ yylhsminor.yy120 = pik_elist_append(p,0,yymsp[0].minor.yy26); }
2213
-#line 2238 "pikchr.c"
2214
+#line 2239 "pikchr.c"
22142215
yymsp[0].minor.yy120 = yylhsminor.yy120;
22152216
break;
22162217
case 2: /* element_list ::= element_list EOL element */
2217
-#line 482 "pikchr.y"
2218
+#line 483 "pikchr.y"
22182219
{ yylhsminor.yy120 = pik_elist_append(p,yymsp[-2].minor.yy120,yymsp[0].minor.yy26); }
2219
-#line 2244 "pikchr.c"
2220
+#line 2245 "pikchr.c"
22202221
yymsp[-2].minor.yy120 = yylhsminor.yy120;
22212222
break;
22222223
case 3: /* element ::= */
2223
-#line 485 "pikchr.y"
2224
+#line 486 "pikchr.y"
22242225
{ yymsp[1].minor.yy26 = 0; }
2225
-#line 2250 "pikchr.c"
2226
+#line 2251 "pikchr.c"
22262227
break;
22272228
case 4: /* element ::= direction */
2228
-#line 486 "pikchr.y"
2229
+#line 487 "pikchr.y"
22292230
{ pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy26=0; }
2230
-#line 2255 "pikchr.c"
2231
+#line 2256 "pikchr.c"
22312232
yymsp[0].minor.yy26 = yylhsminor.yy26;
22322233
break;
22332234
case 5: /* element ::= lvalue ASSIGN rvalue */
2234
-#line 487 "pikchr.y"
2235
+#line 488 "pikchr.y"
22352236
{pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy191,&yymsp[-1].minor.yy0); yylhsminor.yy26=0;}
2236
-#line 2261 "pikchr.c"
2237
+#line 2262 "pikchr.c"
22372238
yymsp[-2].minor.yy26 = yylhsminor.yy26;
22382239
break;
22392240
case 6: /* element ::= PLACENAME COLON unnamed_element */
2240
-#line 489 "pikchr.y"
2241
+#line 490 "pikchr.y"
22412242
{ yylhsminor.yy26 = yymsp[0].minor.yy26; pik_elem_setname(p,yymsp[0].minor.yy26,&yymsp[-2].minor.yy0); }
2242
-#line 2267 "pikchr.c"
2243
+#line 2268 "pikchr.c"
22432244
yymsp[-2].minor.yy26 = yylhsminor.yy26;
22442245
break;
22452246
case 7: /* element ::= PLACENAME COLON position */
2246
-#line 491 "pikchr.y"
2247
+#line 492 "pikchr.y"
22472248
{ yylhsminor.yy26 = pik_elem_new(p,0,0,0);
22482249
if(yylhsminor.yy26){ yylhsminor.yy26->ptAt = yymsp[0].minor.yy131; pik_elem_setname(p,yylhsminor.yy26,&yymsp[-2].minor.yy0); }}
2249
-#line 2274 "pikchr.c"
2250
+#line 2275 "pikchr.c"
22502251
yymsp[-2].minor.yy26 = yylhsminor.yy26;
22512252
break;
22522253
case 8: /* element ::= unnamed_element */
2253
-#line 493 "pikchr.y"
2254
+#line 494 "pikchr.y"
22542255
{yylhsminor.yy26 = yymsp[0].minor.yy26;}
2255
-#line 2280 "pikchr.c"
2256
+#line 2281 "pikchr.c"
22562257
yymsp[0].minor.yy26 = yylhsminor.yy26;
22572258
break;
22582259
case 9: /* element ::= print prlist */
2259
-#line 494 "pikchr.y"
2260
+#line 495 "pikchr.y"
22602261
{pik_append(p,"<br>\n",5); yymsp[-1].minor.yy26=0;}
2261
-#line 2286 "pikchr.c"
2262
+#line 2287 "pikchr.c"
22622263
break;
22632264
case 10: /* rvalue ::= PLACENAME */
2264
-#line 505 "pikchr.y"
2265
+#line 506 "pikchr.y"
22652266
{yylhsminor.yy191 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2266
-#line 2291 "pikchr.c"
2267
+#line 2292 "pikchr.c"
22672268
yymsp[0].minor.yy191 = yylhsminor.yy191;
22682269
break;
22692270
case 11: /* pritem ::= FILL */
22702271
case 12: /* pritem ::= COLOR */ yytestcase(yyruleno==12);
22712272
case 13: /* pritem ::= THICKNESS */ yytestcase(yyruleno==13);
2272
-#line 510 "pikchr.y"
2273
+#line 511 "pikchr.y"
22732274
{pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2274
-#line 2299 "pikchr.c"
2275
+#line 2300 "pikchr.c"
22752276
break;
22762277
case 14: /* pritem ::= rvalue */
2277
-#line 513 "pikchr.y"
2278
+#line 514 "pikchr.y"
22782279
{pik_append_num(p,"",yymsp[0].minor.yy191);}
2279
-#line 2304 "pikchr.c"
2280
+#line 2305 "pikchr.c"
22802281
break;
22812282
case 15: /* pritem ::= STRING */
2282
-#line 514 "pikchr.y"
2283
+#line 515 "pikchr.y"
22832284
{pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2284
-#line 2309 "pikchr.c"
2285
+#line 2310 "pikchr.c"
22852286
break;
22862287
case 16: /* prsep ::= COMMA */
2287
-#line 515 "pikchr.y"
2288
+#line 516 "pikchr.y"
22882289
{pik_append(p, " ", 1);}
2289
-#line 2314 "pikchr.c"
2290
+#line 2315 "pikchr.c"
22902291
break;
22912292
case 17: /* unnamed_element ::= basetype attribute_list */
2292
-#line 518 "pikchr.y"
2293
+#line 519 "pikchr.y"
22932294
{yylhsminor.yy26 = yymsp[-1].minor.yy26; pik_after_adding_attributes(p,yylhsminor.yy26);}
2294
-#line 2319 "pikchr.c"
2295
+#line 2320 "pikchr.c"
22952296
yymsp[-1].minor.yy26 = yylhsminor.yy26;
22962297
break;
22972298
case 18: /* basetype ::= CLASSNAME */
2298
-#line 520 "pikchr.y"
2299
+#line 521 "pikchr.y"
22992300
{yylhsminor.yy26 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2300
-#line 2325 "pikchr.c"
2301
+#line 2326 "pikchr.c"
23012302
yymsp[0].minor.yy26 = yylhsminor.yy26;
23022303
break;
23032304
case 19: /* basetype ::= STRING textposition */
2304
-#line 522 "pikchr.y"
2305
+#line 523 "pikchr.y"
23052306
{yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy60; yylhsminor.yy26 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2306
-#line 2331 "pikchr.c"
2307
+#line 2332 "pikchr.c"
23072308
yymsp[-1].minor.yy26 = yylhsminor.yy26;
23082309
break;
23092310
case 20: /* basetype ::= LB savelist element_list RB */
2310
-#line 524 "pikchr.y"
2311
+#line 525 "pikchr.y"
23112312
{ p->list = yymsp[-2].minor.yy120; yymsp[-3].minor.yy26 = pik_elem_new(p,0,0,yymsp[-1].minor.yy120); if(yymsp[-3].minor.yy26) yymsp[-3].minor.yy26->errTok = yymsp[0].minor.yy0; }
2312
-#line 2337 "pikchr.c"
2313
+#line 2338 "pikchr.c"
23132314
break;
23142315
case 21: /* savelist ::= */
2315
-#line 529 "pikchr.y"
2316
+#line 530 "pikchr.y"
23162317
{yymsp[1].minor.yy120 = p->list; p->list = 0;}
2317
-#line 2342 "pikchr.c"
2318
+#line 2343 "pikchr.c"
23182319
break;
23192320
case 22: /* attribute_list ::= expr */
2320
-#line 536 "pikchr.y"
2321
+#line 537 "pikchr.y"
23212322
{ pik_add_direction(p,0,&yymsp[0].minor.yy191,0);}
2322
-#line 2347 "pikchr.c"
2323
+#line 2348 "pikchr.c"
23232324
break;
23242325
case 23: /* attribute_list ::= expr PERCENT */
2325
-#line 537 "pikchr.y"
2326
+#line 538 "pikchr.y"
23262327
{ pik_add_direction(p,0,&yymsp[-1].minor.yy191,1);}
2327
-#line 2352 "pikchr.c"
2328
+#line 2353 "pikchr.c"
23282329
break;
23292330
case 24: /* attribute ::= numproperty expr PERCENT */
2330
-#line 542 "pikchr.y"
2331
+#line 543 "pikchr.y"
23312332
{ pik_set_numprop(p,&yymsp[-2].minor.yy0,0.0,yymsp[-1].minor.yy191/100.0); }
2332
-#line 2357 "pikchr.c"
2333
+#line 2358 "pikchr.c"
23332334
break;
23342335
case 25: /* attribute ::= numproperty expr */
23352336
case 28: /* attribute ::= colorproperty rvalue */ yytestcase(yyruleno==28);
2336
-#line 543 "pikchr.y"
2337
+#line 544 "pikchr.y"
23372338
{ pik_set_numprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy191,0.0); }
2338
-#line 2363 "pikchr.c"
2339
+#line 2364 "pikchr.c"
23392340
break;
23402341
case 26: /* attribute ::= dashproperty expr */
2341
-#line 544 "pikchr.y"
2342
+#line 545 "pikchr.y"
23422343
{ pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy191); }
2343
-#line 2368 "pikchr.c"
2344
+#line 2369 "pikchr.c"
23442345
break;
23452346
case 27: /* attribute ::= dashproperty */
2346
-#line 545 "pikchr.y"
2347
+#line 546 "pikchr.y"
23472348
{ pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2348
-#line 2373 "pikchr.c"
2349
+#line 2374 "pikchr.c"
23492350
break;
23502351
case 29: /* attribute ::= direction expr PERCENT */
2351
-#line 548 "pikchr.y"
2352
+#line 549 "pikchr.y"
23522353
{ pik_add_direction(p,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy191,1);}
2353
-#line 2378 "pikchr.c"
2354
+#line 2379 "pikchr.c"
23542355
break;
23552356
case 30: /* attribute ::= direction expr */
2356
-#line 549 "pikchr.y"
2357
+#line 550 "pikchr.y"
23572358
{ pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy191,0);}
2358
-#line 2383 "pikchr.c"
2359
+#line 2384 "pikchr.c"
23592360
break;
23602361
case 31: /* attribute ::= direction */
2361
-#line 550 "pikchr.y"
2362
+#line 551 "pikchr.y"
23622363
{ pik_add_direction(p,&yymsp[0].minor.yy0,0,0); }
2363
-#line 2388 "pikchr.c"
2364
+#line 2389 "pikchr.c"
23642365
break;
23652366
case 32: /* attribute ::= direction even position */
2366
-#line 551 "pikchr.y"
2367
+#line 552 "pikchr.y"
23672368
{pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy131);}
2368
-#line 2393 "pikchr.c"
2369
+#line 2394 "pikchr.c"
23692370
break;
23702371
case 33: /* attribute ::= CLOSE */
2371
-#line 552 "pikchr.y"
2372
+#line 553 "pikchr.y"
23722373
{ pik_close_path(p,&yymsp[0].minor.yy0); }
2373
-#line 2398 "pikchr.c"
2374
+#line 2399 "pikchr.c"
23742375
break;
23752376
case 34: /* attribute ::= CHOP */
2376
-#line 553 "pikchr.y"
2377
+#line 554 "pikchr.y"
23772378
{ p->cur->bChop = 1; }
2378
-#line 2403 "pikchr.c"
2379
+#line 2404 "pikchr.c"
23792380
break;
23802381
case 35: /* attribute ::= FROM position */
2381
-#line 554 "pikchr.y"
2382
+#line 555 "pikchr.y"
23822383
{ pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy131); }
2383
-#line 2408 "pikchr.c"
2384
+#line 2409 "pikchr.c"
23842385
break;
23852386
case 36: /* attribute ::= TO position */
2386
-#line 555 "pikchr.y"
2387
+#line 556 "pikchr.y"
23872388
{ pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy131); }
2388
-#line 2413 "pikchr.c"
2389
+#line 2414 "pikchr.c"
23892390
break;
23902391
case 37: /* attribute ::= THEN */
2391
-#line 556 "pikchr.y"
2392
+#line 557 "pikchr.y"
23922393
{ pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2393
-#line 2418 "pikchr.c"
2394
+#line 2419 "pikchr.c"
23942395
break;
23952396
case 38: /* attribute ::= AT position */
2396
-#line 558 "pikchr.y"
2397
+#line 559 "pikchr.y"
23972398
{ pik_set_at(p,0,&yymsp[0].minor.yy131,&yymsp[-1].minor.yy0); }
2398
-#line 2423 "pikchr.c"
2399
+#line 2424 "pikchr.c"
23992400
break;
24002401
case 39: /* attribute ::= SAME */
2401
-#line 560 "pikchr.y"
2402
+#line 561 "pikchr.y"
24022403
{pik_same(p,0,&yymsp[0].minor.yy0);}
2403
-#line 2428 "pikchr.c"
2404
+#line 2429 "pikchr.c"
24042405
break;
24052406
case 40: /* attribute ::= SAME AS object */
2406
-#line 561 "pikchr.y"
2407
+#line 562 "pikchr.y"
24072408
{pik_same(p,yymsp[0].minor.yy26,&yymsp[-2].minor.yy0);}
2408
-#line 2433 "pikchr.c"
2409
+#line 2434 "pikchr.c"
24092410
break;
24102411
case 41: /* attribute ::= STRING textposition */
2411
-#line 562 "pikchr.y"
2412
+#line 563 "pikchr.y"
24122413
{pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy60);}
2413
-#line 2438 "pikchr.c"
2414
+#line 2439 "pikchr.c"
24142415
break;
24152416
case 42: /* attribute ::= FIT */
2416
-#line 563 "pikchr.y"
2417
+#line 564 "pikchr.y"
24172418
{pik_size_to_fit(p,&yymsp[0].minor.yy0); }
2418
-#line 2443 "pikchr.c"
2419
+#line 2444 "pikchr.c"
24192420
break;
24202421
case 43: /* with ::= DOT_E edge AT position */
24212422
case 44: /* with ::= edge AT position */ yytestcase(yyruleno==44);
2422
-#line 570 "pikchr.y"
2423
+#line 571 "pikchr.y"
24232424
{ pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy131,&yymsp[-1].minor.yy0); }
2424
-#line 2449 "pikchr.c"
2425
+#line 2450 "pikchr.c"
24252426
break;
24262427
case 45: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2427
-#line 574 "pikchr.y"
2428
+#line 575 "pikchr.y"
24282429
{yylhsminor.yy0 = yymsp[0].minor.yy0;}
2429
-#line 2454 "pikchr.c"
2430
+#line 2455 "pikchr.c"
24302431
yymsp[0].minor.yy0 = yylhsminor.yy0;
24312432
break;
24322433
case 46: /* boolproperty ::= CW */
2433
-#line 585 "pikchr.y"
2434
+#line 586 "pikchr.y"
24342435
{p->cur->cw = 1;}
2435
-#line 2460 "pikchr.c"
2436
+#line 2461 "pikchr.c"
24362437
break;
24372438
case 47: /* boolproperty ::= CCW */
2438
-#line 586 "pikchr.y"
2439
+#line 587 "pikchr.y"
24392440
{p->cur->cw = 0;}
2440
-#line 2465 "pikchr.c"
2441
+#line 2466 "pikchr.c"
24412442
break;
24422443
case 48: /* boolproperty ::= LARROW */
2443
-#line 587 "pikchr.y"
2444
+#line 588 "pikchr.y"
24442445
{p->cur->larrow=1; p->cur->rarrow=0; }
2445
-#line 2470 "pikchr.c"
2446
+#line 2471 "pikchr.c"
24462447
break;
24472448
case 49: /* boolproperty ::= RARROW */
2448
-#line 588 "pikchr.y"
2449
+#line 589 "pikchr.y"
24492450
{p->cur->larrow=0; p->cur->rarrow=1; }
2450
-#line 2475 "pikchr.c"
2451
+#line 2476 "pikchr.c"
24512452
break;
24522453
case 50: /* boolproperty ::= LRARROW */
2453
-#line 589 "pikchr.y"
2454
+#line 590 "pikchr.y"
24542455
{p->cur->larrow=1; p->cur->rarrow=1; }
2455
-#line 2480 "pikchr.c"
2456
+#line 2481 "pikchr.c"
24562457
break;
24572458
case 51: /* boolproperty ::= INVIS */
2458
-#line 590 "pikchr.y"
2459
+#line 591 "pikchr.y"
24592460
{p->cur->sw = 0.0;}
2460
-#line 2485 "pikchr.c"
2461
+#line 2486 "pikchr.c"
24612462
break;
24622463
case 52: /* boolproperty ::= THICK */
2463
-#line 591 "pikchr.y"
2464
+#line 592 "pikchr.y"
24642465
{p->cur->sw *= 1.5;}
2465
-#line 2490 "pikchr.c"
2466
+#line 2491 "pikchr.c"
24662467
break;
24672468
case 53: /* boolproperty ::= THIN */
2468
-#line 592 "pikchr.y"
2469
+#line 593 "pikchr.y"
24692470
{p->cur->sw *= 0.67;}
2470
-#line 2495 "pikchr.c"
2471
+#line 2496 "pikchr.c"
24712472
break;
24722473
case 54: /* textposition ::= */
2473
-#line 594 "pikchr.y"
2474
+#line 595 "pikchr.y"
24742475
{yymsp[1].minor.yy60 = 0;}
2475
-#line 2500 "pikchr.c"
2476
+#line 2501 "pikchr.c"
24762477
break;
24772478
case 55: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2478
-#line 597 "pikchr.y"
2479
+#line 598 "pikchr.y"
24792480
{yylhsminor.yy60 = pik_text_position(p,yymsp[-1].minor.yy60,&yymsp[0].minor.yy0);}
2480
-#line 2505 "pikchr.c"
2481
+#line 2506 "pikchr.c"
24812482
yymsp[-1].minor.yy60 = yylhsminor.yy60;
24822483
break;
24832484
case 56: /* position ::= expr COMMA expr */
2484
-#line 600 "pikchr.y"
2485
+#line 601 "pikchr.y"
24852486
{yylhsminor.yy131.x=yymsp[-2].minor.yy191; yylhsminor.yy131.y=yymsp[0].minor.yy191;}
2486
-#line 2511 "pikchr.c"
2487
+#line 2512 "pikchr.c"
24872488
yymsp[-2].minor.yy131 = yylhsminor.yy131;
24882489
break;
24892490
case 57: /* position ::= place PLUS expr COMMA expr */
2490
-#line 602 "pikchr.y"
2491
+#line 603 "pikchr.y"
24912492
{yylhsminor.yy131.x=yymsp[-4].minor.yy131.x+yymsp[-2].minor.yy191; yylhsminor.yy131.y=yymsp[-4].minor.yy131.y+yymsp[0].minor.yy191;}
2492
-#line 2517 "pikchr.c"
2493
+#line 2518 "pikchr.c"
24932494
yymsp[-4].minor.yy131 = yylhsminor.yy131;
24942495
break;
24952496
case 58: /* position ::= place MINUS expr COMMA expr */
2496
-#line 603 "pikchr.y"
2497
+#line 604 "pikchr.y"
24972498
{yylhsminor.yy131.x=yymsp[-4].minor.yy131.x-yymsp[-2].minor.yy191; yylhsminor.yy131.y=yymsp[-4].minor.yy131.y-yymsp[0].minor.yy191;}
2498
-#line 2523 "pikchr.c"
2499
+#line 2524 "pikchr.c"
24992500
yymsp[-4].minor.yy131 = yylhsminor.yy131;
25002501
break;
25012502
case 59: /* position ::= place PLUS LP expr COMMA expr RP */
2502
-#line 605 "pikchr.y"
2503
+#line 606 "pikchr.y"
25032504
{yylhsminor.yy131.x=yymsp[-6].minor.yy131.x+yymsp[-3].minor.yy191; yylhsminor.yy131.y=yymsp[-6].minor.yy131.y+yymsp[-1].minor.yy191;}
2504
-#line 2529 "pikchr.c"
2505
+#line 2530 "pikchr.c"
25052506
yymsp[-6].minor.yy131 = yylhsminor.yy131;
25062507
break;
25072508
case 60: /* position ::= place MINUS LP expr COMMA expr RP */
2508
-#line 607 "pikchr.y"
2509
+#line 608 "pikchr.y"
25092510
{yylhsminor.yy131.x=yymsp[-6].minor.yy131.x-yymsp[-3].minor.yy191; yylhsminor.yy131.y=yymsp[-6].minor.yy131.y-yymsp[-1].minor.yy191;}
2510
-#line 2535 "pikchr.c"
2511
+#line 2536 "pikchr.c"
25112512
yymsp[-6].minor.yy131 = yylhsminor.yy131;
25122513
break;
25132514
case 61: /* position ::= LP position COMMA position RP */
2514
-#line 608 "pikchr.y"
2515
+#line 609 "pikchr.y"
25152516
{yymsp[-4].minor.yy131.x=yymsp[-3].minor.yy131.x; yymsp[-4].minor.yy131.y=yymsp[-1].minor.yy131.y;}
2516
-#line 2541 "pikchr.c"
2517
+#line 2542 "pikchr.c"
25172518
break;
25182519
case 62: /* position ::= LP position RP */
2519
-#line 609 "pikchr.y"
2520
+#line 610 "pikchr.y"
25202521
{yymsp[-2].minor.yy131=yymsp[-1].minor.yy131;}
2521
-#line 2546 "pikchr.c"
2522
+#line 2547 "pikchr.c"
25222523
break;
25232524
case 63: /* position ::= expr between position AND position */
2524
-#line 611 "pikchr.y"
2525
+#line 612 "pikchr.y"
25252526
{yylhsminor.yy131 = pik_position_between(p,yymsp[-4].minor.yy191,yymsp[-2].minor.yy131,yymsp[0].minor.yy131);}
2526
-#line 2551 "pikchr.c"
2527
+#line 2552 "pikchr.c"
25272528
yymsp[-4].minor.yy131 = yylhsminor.yy131;
25282529
break;
25292530
case 64: /* position ::= expr ABOVE position */
2530
-#line 612 "pikchr.y"
2531
+#line 613 "pikchr.y"
25312532
{yylhsminor.yy131=yymsp[0].minor.yy131; yylhsminor.yy131.y += yymsp[-2].minor.yy191;}
2532
-#line 2557 "pikchr.c"
2533
+#line 2558 "pikchr.c"
25332534
yymsp[-2].minor.yy131 = yylhsminor.yy131;
25342535
break;
25352536
case 65: /* position ::= expr BELOW position */
2536
-#line 613 "pikchr.y"
2537
+#line 614 "pikchr.y"
25372538
{yylhsminor.yy131=yymsp[0].minor.yy131; yylhsminor.yy131.y -= yymsp[-2].minor.yy191;}
2538
-#line 2563 "pikchr.c"
2539
+#line 2564 "pikchr.c"
25392540
yymsp[-2].minor.yy131 = yylhsminor.yy131;
25402541
break;
25412542
case 66: /* position ::= expr LEFT OF position */
2542
-#line 614 "pikchr.y"
2543
+#line 615 "pikchr.y"
25432544
{yylhsminor.yy131=yymsp[0].minor.yy131; yylhsminor.yy131.x -= yymsp[-3].minor.yy191;}
2544
-#line 2569 "pikchr.c"
2545
+#line 2570 "pikchr.c"
25452546
yymsp[-3].minor.yy131 = yylhsminor.yy131;
25462547
break;
25472548
case 67: /* position ::= expr RIGHT OF position */
2548
-#line 615 "pikchr.y"
2549
+#line 616 "pikchr.y"
25492550
{yylhsminor.yy131=yymsp[0].minor.yy131; yylhsminor.yy131.x += yymsp[-3].minor.yy191;}
2550
-#line 2575 "pikchr.c"
2551
+#line 2576 "pikchr.c"
25512552
yymsp[-3].minor.yy131 = yylhsminor.yy131;
25522553
break;
25532554
case 68: /* position ::= expr EDGEPT OF position */
2554
-#line 617 "pikchr.y"
2555
+#line 618 "pikchr.y"
25552556
{yylhsminor.yy131 = pik_position_at_hdg(p,yymsp[-3].minor.yy191,&yymsp[-2].minor.yy0,yymsp[0].minor.yy131);}
2556
-#line 2581 "pikchr.c"
2557
+#line 2582 "pikchr.c"
25572558
yymsp[-3].minor.yy131 = yylhsminor.yy131;
25582559
break;
25592560
case 69: /* position ::= expr HEADING expr FROM position */
2560
-#line 619 "pikchr.y"
2561
+#line 620 "pikchr.y"
25612562
{yylhsminor.yy131 = pik_position_at_angle(p,yymsp[-4].minor.yy191,yymsp[-2].minor.yy191,yymsp[0].minor.yy131);}
2562
-#line 2587 "pikchr.c"
2563
+#line 2588 "pikchr.c"
25632564
yymsp[-4].minor.yy131 = yylhsminor.yy131;
25642565
break;
25652566
case 70: /* place ::= object */
2566
-#line 625 "pikchr.y"
2567
+#line 626 "pikchr.y"
25672568
{yylhsminor.yy131 = pik_place_of_elem(p,yymsp[0].minor.yy26,0);}
2568
-#line 2593 "pikchr.c"
2569
+#line 2594 "pikchr.c"
25692570
yymsp[0].minor.yy131 = yylhsminor.yy131;
25702571
break;
25712572
case 71: /* place ::= object DOT_E edge */
25722573
case 72: /* place ::= object DOT_L START */ yytestcase(yyruleno==72);
25732574
case 73: /* place ::= object DOT_L END */ yytestcase(yyruleno==73);
2574
-#line 626 "pikchr.y"
2575
+#line 627 "pikchr.y"
25752576
{yylhsminor.yy131 = pik_place_of_elem(p,yymsp[-2].minor.yy26,&yymsp[0].minor.yy0);}
2576
-#line 2601 "pikchr.c"
2577
+#line 2602 "pikchr.c"
25772578
yymsp[-2].minor.yy131 = yylhsminor.yy131;
25782579
break;
25792580
case 74: /* place ::= START OF object */
25802581
case 75: /* place ::= END OF object */ yytestcase(yyruleno==75);
25812582
case 76: /* place ::= edge OF object */ yytestcase(yyruleno==76);
2582
-#line 629 "pikchr.y"
2583
+#line 630 "pikchr.y"
25832584
{yylhsminor.yy131 = pik_place_of_elem(p,yymsp[0].minor.yy26,&yymsp[-2].minor.yy0);}
2584
-#line 2609 "pikchr.c"
2585
+#line 2610 "pikchr.c"
25852586
yymsp[-2].minor.yy131 = yylhsminor.yy131;
25862587
break;
25872588
case 77: /* place ::= NTH VERTEX OF object */
2588
-#line 632 "pikchr.y"
2589
+#line 633 "pikchr.y"
25892590
{yylhsminor.yy131 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy26);}
2590
-#line 2615 "pikchr.c"
2591
+#line 2616 "pikchr.c"
25912592
yymsp[-3].minor.yy131 = yylhsminor.yy131;
25922593
break;
25932594
case 78: /* object ::= nth */
2594
-#line 635 "pikchr.y"
2595
+#line 636 "pikchr.y"
25952596
{yylhsminor.yy26 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2596
-#line 2621 "pikchr.c"
2597
+#line 2622 "pikchr.c"
25972598
yymsp[0].minor.yy26 = yylhsminor.yy26;
25982599
break;
25992600
case 79: /* object ::= nth OF|IN object */
2600
-#line 636 "pikchr.y"
2601
+#line 637 "pikchr.y"
26012602
{yylhsminor.yy26 = pik_find_nth(p,yymsp[0].minor.yy26,&yymsp[-2].minor.yy0);}
2602
-#line 2627 "pikchr.c"
2603
+#line 2628 "pikchr.c"
26032604
yymsp[-2].minor.yy26 = yylhsminor.yy26;
26042605
break;
26052606
case 80: /* objectname ::= PLACENAME */
2606
-#line 638 "pikchr.y"
2607
+#line 639 "pikchr.y"
26072608
{yylhsminor.yy26 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2608
-#line 2633 "pikchr.c"
2609
+#line 2634 "pikchr.c"
26092610
yymsp[0].minor.yy26 = yylhsminor.yy26;
26102611
break;
26112612
case 81: /* objectname ::= objectname DOT_U PLACENAME */
2612
-#line 640 "pikchr.y"
2613
+#line 641 "pikchr.y"
26132614
{yylhsminor.yy26 = pik_find_byname(p,yymsp[-2].minor.yy26,&yymsp[0].minor.yy0);}
2614
-#line 2639 "pikchr.c"
2615
+#line 2640 "pikchr.c"
26152616
yymsp[-2].minor.yy26 = yylhsminor.yy26;
26162617
break;
26172618
case 82: /* nth ::= NTH CLASSNAME */
2618
-#line 642 "pikchr.y"
2619
+#line 643 "pikchr.y"
26192620
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2620
-#line 2645 "pikchr.c"
2621
+#line 2646 "pikchr.c"
26212622
yymsp[-1].minor.yy0 = yylhsminor.yy0;
26222623
break;
26232624
case 83: /* nth ::= NTH LAST CLASSNAME */
2624
-#line 643 "pikchr.y"
2625
+#line 644 "pikchr.y"
26252626
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2626
-#line 2651 "pikchr.c"
2627
+#line 2652 "pikchr.c"
26272628
yymsp[-2].minor.yy0 = yylhsminor.yy0;
26282629
break;
26292630
case 84: /* nth ::= LAST CLASSNAME */
2630
-#line 644 "pikchr.y"
2631
+#line 645 "pikchr.y"
26312632
{yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2632
-#line 2657 "pikchr.c"
2633
+#line 2658 "pikchr.c"
26332634
break;
26342635
case 85: /* nth ::= LAST */
2635
-#line 645 "pikchr.y"
2636
+#line 646 "pikchr.y"
26362637
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2637
-#line 2662 "pikchr.c"
2638
+#line 2663 "pikchr.c"
26382639
yymsp[0].minor.yy0 = yylhsminor.yy0;
26392640
break;
26402641
case 86: /* nth ::= NTH LB RB */
2641
-#line 646 "pikchr.y"
2642
+#line 647 "pikchr.y"
26422643
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2643
-#line 2668 "pikchr.c"
2644
+#line 2669 "pikchr.c"
26442645
yymsp[-2].minor.yy0 = yylhsminor.yy0;
26452646
break;
26462647
case 87: /* nth ::= NTH LAST LB RB */
2647
-#line 647 "pikchr.y"
2648
+#line 648 "pikchr.y"
26482649
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2649
-#line 2674 "pikchr.c"
2650
+#line 2675 "pikchr.c"
26502651
yymsp[-3].minor.yy0 = yylhsminor.yy0;
26512652
break;
26522653
case 88: /* nth ::= LAST LB RB */
2653
-#line 648 "pikchr.y"
2654
+#line 649 "pikchr.y"
26542655
{yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2655
-#line 2680 "pikchr.c"
2656
+#line 2681 "pikchr.c"
26562657
break;
26572658
case 89: /* expr ::= expr PLUS expr */
2658
-#line 650 "pikchr.y"
2659
+#line 651 "pikchr.y"
26592660
{yylhsminor.yy191=yymsp[-2].minor.yy191+yymsp[0].minor.yy191;}
2660
-#line 2685 "pikchr.c"
2661
+#line 2686 "pikchr.c"
26612662
yymsp[-2].minor.yy191 = yylhsminor.yy191;
26622663
break;
26632664
case 90: /* expr ::= expr MINUS expr */
2664
-#line 651 "pikchr.y"
2665
+#line 652 "pikchr.y"
26652666
{yylhsminor.yy191=yymsp[-2].minor.yy191-yymsp[0].minor.yy191;}
2666
-#line 2691 "pikchr.c"
2667
+#line 2692 "pikchr.c"
26672668
yymsp[-2].minor.yy191 = yylhsminor.yy191;
26682669
break;
26692670
case 91: /* expr ::= expr STAR expr */
2670
-#line 652 "pikchr.y"
2671
+#line 653 "pikchr.y"
26712672
{yylhsminor.yy191=yymsp[-2].minor.yy191*yymsp[0].minor.yy191;}
2672
-#line 2697 "pikchr.c"
2673
+#line 2698 "pikchr.c"
26732674
yymsp[-2].minor.yy191 = yylhsminor.yy191;
26742675
break;
26752676
case 92: /* expr ::= expr SLASH expr */
2676
-#line 653 "pikchr.y"
2677
+#line 654 "pikchr.y"
26772678
{
26782679
if( yymsp[0].minor.yy191==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy191 = 0.0; }
26792680
else{ yylhsminor.yy191 = yymsp[-2].minor.yy191/yymsp[0].minor.yy191; }
26802681
}
2681
-#line 2706 "pikchr.c"
2682
+#line 2707 "pikchr.c"
26822683
yymsp[-2].minor.yy191 = yylhsminor.yy191;
26832684
break;
26842685
case 93: /* expr ::= MINUS expr */
2685
-#line 657 "pikchr.y"
2686
+#line 658 "pikchr.y"
26862687
{yymsp[-1].minor.yy191=-yymsp[0].minor.yy191;}
2687
-#line 2712 "pikchr.c"
2688
+#line 2713 "pikchr.c"
26882689
break;
26892690
case 94: /* expr ::= PLUS expr */
2690
-#line 658 "pikchr.y"
2691
+#line 659 "pikchr.y"
26912692
{yymsp[-1].minor.yy191=yymsp[0].minor.yy191;}
2692
-#line 2717 "pikchr.c"
2693
+#line 2718 "pikchr.c"
26932694
break;
26942695
case 95: /* expr ::= LP expr RP */
2695
-#line 659 "pikchr.y"
2696
+#line 660 "pikchr.y"
26962697
{yymsp[-2].minor.yy191=yymsp[-1].minor.yy191;}
2697
-#line 2722 "pikchr.c"
2698
+#line 2723 "pikchr.c"
26982699
break;
26992700
case 96: /* expr ::= NUMBER */
2700
-#line 660 "pikchr.y"
2701
+#line 661 "pikchr.y"
27012702
{yylhsminor.yy191=pik_atof(p,&yymsp[0].minor.yy0);}
2702
-#line 2727 "pikchr.c"
2703
+#line 2728 "pikchr.c"
27032704
yymsp[0].minor.yy191 = yylhsminor.yy191;
27042705
break;
27052706
case 97: /* expr ::= ID */
2706
-#line 661 "pikchr.y"
2707
+#line 662 "pikchr.y"
27072708
{yylhsminor.yy191=pik_get_var(p,&yymsp[0].minor.yy0);}
2708
-#line 2733 "pikchr.c"
2709
+#line 2734 "pikchr.c"
27092710
yymsp[0].minor.yy191 = yylhsminor.yy191;
27102711
break;
27112712
case 98: /* expr ::= FUNC1 LP expr RP */
2712
-#line 662 "pikchr.y"
2713
+#line 663 "pikchr.y"
27132714
{yylhsminor.yy191 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy191,0.0);}
2714
-#line 2739 "pikchr.c"
2715
+#line 2740 "pikchr.c"
27152716
yymsp[-3].minor.yy191 = yylhsminor.yy191;
27162717
break;
27172718
case 99: /* expr ::= FUNC2 LP expr COMMA expr RP */
2718
-#line 663 "pikchr.y"
2719
+#line 664 "pikchr.y"
27192720
{yylhsminor.yy191 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy191,yymsp[-1].minor.yy191);}
2720
-#line 2745 "pikchr.c"
2721
+#line 2746 "pikchr.c"
27212722
yymsp[-5].minor.yy191 = yylhsminor.yy191;
27222723
break;
27232724
case 100: /* expr ::= object DOT_L locproperty */
27242725
case 101: /* expr ::= object DOT_L numproperty */ yytestcase(yyruleno==101);
27252726
case 102: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==102);
27262727
case 103: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==103);
2727
-#line 665 "pikchr.y"
2728
+#line 666 "pikchr.y"
27282729
{yylhsminor.yy191=pik_property_of(p,yymsp[-2].minor.yy26,&yymsp[0].minor.yy0);}
2729
-#line 2754 "pikchr.c"
2730
+#line 2755 "pikchr.c"
27302731
yymsp[-2].minor.yy191 = yylhsminor.yy191;
27312732
break;
27322733
case 104: /* expr ::= object DOT_E edge DOT_L X */
2733
-#line 669 "pikchr.y"
2734
+#line 670 "pikchr.y"
27342735
{yylhsminor.yy191=pik_place_of_elem(p,yymsp[-4].minor.yy26,&yymsp[-2].minor.yy0).x;}
2735
-#line 2760 "pikchr.c"
2736
+#line 2761 "pikchr.c"
27362737
yymsp[-4].minor.yy191 = yylhsminor.yy191;
27372738
break;
27382739
case 105: /* expr ::= object DOT_E edge DOT_L Y */
2739
-#line 670 "pikchr.y"
2740
+#line 671 "pikchr.y"
27402741
{yylhsminor.yy191=pik_place_of_elem(p,yymsp[-4].minor.yy26,&yymsp[-2].minor.yy0).y;}
2741
-#line 2766 "pikchr.c"
2742
+#line 2767 "pikchr.c"
27422743
yymsp[-4].minor.yy191 = yylhsminor.yy191;
27432744
break;
27442745
case 106: /* expr ::= LP locproperty OF object RP */
27452746
case 107: /* expr ::= LP dashproperty OF object RP */ yytestcase(yyruleno==107);
27462747
case 108: /* expr ::= LP numproperty OF object RP */ yytestcase(yyruleno==108);
27472748
case 109: /* expr ::= LP colorproperty OF object RP */ yytestcase(yyruleno==109);
2748
-#line 671 "pikchr.y"
2749
+#line 672 "pikchr.y"
27492750
{yymsp[-4].minor.yy191=pik_property_of(p,yymsp[-1].minor.yy26,&yymsp[-3].minor.yy0);}
2750
-#line 2775 "pikchr.c"
2751
+#line 2776 "pikchr.c"
27512752
break;
27522753
case 110: /* expr ::= NTH VERTEX OF object DOT_L X */
2753
-#line 677 "pikchr.y"
2754
+#line 678 "pikchr.y"
27542755
{yylhsminor.yy191 = pik_nth_vertex(p,&yymsp[-5].minor.yy0,&yymsp[-4].minor.yy0,yymsp[-2].minor.yy26).x;}
2755
-#line 2780 "pikchr.c"
2756
+#line 2781 "pikchr.c"
27562757
yymsp[-5].minor.yy191 = yylhsminor.yy191;
27572758
break;
27582759
case 111: /* expr ::= NTH VERTEX OF object DOT_L Y */
2759
-#line 679 "pikchr.y"
2760
+#line 680 "pikchr.y"
27602761
{yylhsminor.yy191 = pik_nth_vertex(p,&yymsp[-5].minor.yy0,&yymsp[-4].minor.yy0,yymsp[-2].minor.yy26).y;}
2761
-#line 2786 "pikchr.c"
2762
+#line 2787 "pikchr.c"
27622763
yymsp[-5].minor.yy191 = yylhsminor.yy191;
27632764
break;
27642765
default:
27652766
/* (112) lvalue ::= ID */ yytestcase(yyruleno==112);
27662767
/* (113) lvalue ::= FILL */ yytestcase(yyruleno==113);
@@ -2855,18 +2856,18 @@
28552856
){
28562857
pik_parserARG_FETCH
28572858
pik_parserCTX_FETCH
28582859
#define TOKEN yyminor
28592860
/************ Begin %syntax_error code ****************************************/
2860
-#line 466 "pikchr.y"
2861
+#line 467 "pikchr.y"
28612862
28622863
if( TOKEN.z && TOKEN.z[0] ){
28632864
pik_error(p, &TOKEN, "syntax error");
28642865
}else{
28652866
pik_error(p, 0, "syntax error");
28662867
}
2867
-#line 2892 "pikchr.c"
2868
+#line 2893 "pikchr.c"
28682869
/************ End %syntax_error code ******************************************/
28692870
pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
28702871
pik_parserCTX_STORE
28712872
}
28722873
@@ -3095,11 +3096,11 @@
30953096
#else
30963097
(void)iToken;
30973098
return 0;
30983099
#endif
30993100
}
3100
-#line 689 "pikchr.y"
3101
+#line 690 "pikchr.y"
31013102
31023103
31033104
31043105
/* Chart of the 140 official HTML color names with their
31053106
** corresponding RGB value.
@@ -3284,10 +3285,13 @@
32843285
{ "cylwid", 0.75 },
32853286
{ "dashwid", 0.05 },
32863287
{ "dotrad", 0.015 },
32873288
{ "ellipseht", 0.5 },
32883289
{ "ellipsewid", 0.75 },
3290
+ { "fileht", 0.75 },
3291
+ { "filerad", 0.15 },
3292
+ { "filewid", 0.5 },
32893293
{ "fill", -1.0 },
32903294
{ "lineht", 0.5 },
32913295
{ "linewid", 0.5 },
32923296
{ "movewid", 0.5 },
32933297
{ "ovalht", 0.5 },
@@ -3669,10 +3673,73 @@
36693673
pik_append_style(p,pElem);
36703674
pik_append(p,"\" />\n", -1);
36713675
}
36723676
pik_append_txt(p, pElem, 0);
36733677
}
3678
+
3679
+/* Methods for the "file" object */
3680
+static void fileInit(Pik *p, PElem *pElem){
3681
+ pElem->w = pik_value(p, "filewid",7,0);
3682
+ pElem->h = pik_value(p, "fileht",6,0);
3683
+ pElem->rad = pik_value(p, "filerad",7,0);
3684
+}
3685
+/* Return offset from the center of the box to the compass point
3686
+** given by parameter cp */
3687
+static PPoint fileOffset(Pik *p, PElem *pElem, int cp){
3688
+ PPoint pt;
3689
+ PNum w2 = 0.5*pElem->w;
3690
+ PNum h2 = 0.5*pElem->h;
3691
+ PNum rx = pElem->rad;
3692
+ PNum mn = w2<h2 ? w2 : h2;
3693
+ if( rx>mn ) rx = mn;
3694
+ if( rx<mn*0.25 ) rx = mn*0.25;
3695
+ pt.x = pt.y = 0.0;
3696
+ rx *= 0.5;
3697
+ switch( cp ){
3698
+ case CP_C: pt.x = 0.0; pt.y = 0.0; break;
3699
+ case CP_N: pt.x = 0.0; pt.y = h2; break;
3700
+ case CP_NE: pt.x = w2-rx; pt.y = h2-rx; break;
3701
+ case CP_E: pt.x = w2; pt.y = 0.0; break;
3702
+ case CP_SE: pt.x = w2; pt.y = -h2; break;
3703
+ case CP_S: pt.x = 0.0; pt.y = -h2; break;
3704
+ case CP_SW: pt.x = -w2; pt.y = -h2; break;
3705
+ case CP_W: pt.x = -w2; pt.y = 0.0; break;
3706
+ case CP_NW: pt.x = -w2; pt.y = h2; break;
3707
+ }
3708
+ return pt;
3709
+}
3710
+static void fileFit(Pik *p, PElem *pElem, PNum w, PNum h){
3711
+ if( w>0 ) pElem->w = w;
3712
+ if( h>0 ) pElem->h = h + 2*pElem->rad;
3713
+}
3714
+static void fileRender(Pik *p, PElem *pElem){
3715
+ PNum w2 = 0.5*pElem->w;
3716
+ PNum h2 = 0.5*pElem->h;
3717
+ PNum rad = pElem->rad;
3718
+ PPoint pt = pElem->ptAt;
3719
+ PNum mn = w2<h2 ? w2 : h2;
3720
+ if( rad>mn ) rad = mn;
3721
+ if( rad<mn*0.25 ) rad = mn*0.25;
3722
+ if( pElem->sw>0.0 ){
3723
+ pik_append_xy(p,"<path d=\"M", pt.x-w2,pt.y-h2);
3724
+ pik_append_xy(p,"L", pt.x+w2,pt.y-h2);
3725
+ pik_append_xy(p,"L", pt.x+w2,pt.y+(h2-rad));
3726
+ pik_append_xy(p,"L", pt.x+(w2-rad),pt.y+h2);
3727
+ pik_append_xy(p,"L", pt.x-w2,pt.y+h2);
3728
+ pik_append(p,"Z\" ",-1);
3729
+ pik_append_style(p,pElem);
3730
+ pik_append(p,"\" />\n",-1);
3731
+ pik_append_xy(p,"<path d=\"M", pt.x+(w2-rad), pt.y+h2);
3732
+ pik_append_xy(p,"L", pt.x+(w2-rad),pt.y+(h2-rad));
3733
+ pik_append_xy(p,"L", pt.x+w2, pt.y+(h2-rad));
3734
+ pik_append(p,"\" ",-1);
3735
+ pik_append_style(p,pElem);
3736
+ pik_append(p,"\" />\n",-1);
3737
+ }
3738
+ pik_append_txt(p, pElem, 0);
3739
+}
3740
+
36743741
36753742
/* Methods for the "line" class */
36763743
static void lineInit(Pik *p, PElem *pElem){
36773744
pElem->w = pik_value(p, "linewid",7,0);
36783745
pElem->h = pik_value(p, "lineht",6,0);
@@ -3838,109 +3905,131 @@
38383905
** elements. The special STRING and [] elements are separate.
38393906
*/
38403907
static const PClass aClass[] = {
38413908
{ /* name */ "arc",
38423909
/* isline */ 1,
3910
+ /* eJust */ 0,
38433911
/* xInit */ arcInit,
38443912
/* xNumProp */ 0,
38453913
/* xChop */ 0,
38463914
/* xOffset */ 0,
38473915
/* xFit */ 0,
38483916
/* xRender */ arcRender
38493917
},
38503918
{ /* name */ "arrow",
38513919
/* isline */ 1,
3920
+ /* eJust */ 0,
38523921
/* xInit */ arrowInit,
38533922
/* xNumProp */ 0,
38543923
/* xChop */ 0,
38553924
/* xOffset */ 0,
38563925
/* xFit */ 0,
38573926
/* xRender */ splineRender
38583927
},
38593928
{ /* name */ "box",
38603929
/* isline */ 0,
3930
+ /* eJust */ 1,
38613931
/* xInit */ boxInit,
38623932
/* xNumProp */ 0,
38633933
/* xChop */ boxChop,
38643934
/* xOffset */ boxOffset,
38653935
/* xFit */ boxFit,
38663936
/* xRender */ boxRender
38673937
},
38683938
{ /* name */ "circle",
38693939
/* isline */ 0,
3940
+ /* eJust */ 0,
38703941
/* xInit */ circleInit,
38713942
/* xNumProp */ circleNumProp,
38723943
/* xChop */ circleChop,
38733944
/* xOffset */ ellipseOffset,
38743945
/* xFit */ circleFit,
38753946
/* xRender */ circleRender
38763947
},
38773948
{ /* name */ "cylinder",
38783949
/* isline */ 0,
3950
+ /* eJust */ 1,
38793951
/* xInit */ cylinderInit,
38803952
/* xNumProp */ 0,
38813953
/* xChop */ boxChop,
38823954
/* xOffset */ cylinderOffset,
38833955
/* xFit */ 0,
38843956
/* xRender */ cylinderRender
38853957
},
38863958
{ /* name */ "dot",
38873959
/* isline */ 0,
3960
+ /* eJust */ 0,
38883961
/* xInit */ dotInit,
38893962
/* xNumProp */ dotNumProp,
38903963
/* xChop */ circleChop,
38913964
/* xOffset */ ellipseOffset,
38923965
/* xFit */ 0,
38933966
/* xRender */ dotRender
38943967
},
38953968
{ /* name */ "ellipse",
38963969
/* isline */ 0,
3970
+ /* eJust */ 0,
38973971
/* xInit */ ellipseInit,
38983972
/* xNumProp */ 0,
38993973
/* xChop */ ellipseChop,
39003974
/* xOffset */ ellipseOffset,
39013975
/* xFit */ 0,
39023976
/* xRender */ ellipseRender
39033977
},
3978
+ { /* name */ "file",
3979
+ /* isline */ 0,
3980
+ /* eJust */ 1,
3981
+ /* xInit */ fileInit,
3982
+ /* xNumProp */ 0,
3983
+ /* xChop */ boxChop,
3984
+ /* xOffset */ fileOffset,
3985
+ /* xFit */ fileFit,
3986
+ /* xRender */ fileRender
3987
+ },
39043988
{ /* name */ "line",
39053989
/* isline */ 1,
3990
+ /* eJust */ 0,
39063991
/* xInit */ lineInit,
39073992
/* xNumProp */ 0,
39083993
/* xChop */ 0,
39093994
/* xOffset */ 0,
39103995
/* xFit */ 0,
39113996
/* xRender */ splineRender
39123997
},
39133998
{ /* name */ "move",
39143999
/* isline */ 1,
4000
+ /* eJust */ 0,
39154001
/* xInit */ moveInit,
39164002
/* xNumProp */ 0,
39174003
/* xChop */ 0,
39184004
/* xOffset */ 0,
39194005
/* xFit */ 0,
39204006
/* xRender */ moveRender
39214007
},
39224008
{ /* name */ "oval",
39234009
/* isline */ 0,
4010
+ /* eJust */ 1,
39244011
/* xInit */ ovalInit,
39254012
/* xNumProp */ ovalNumProp,
39264013
/* xChop */ boxChop,
39274014
/* xOffset */ boxOffset,
39284015
/* xFit */ ovalFit,
39294016
/* xRender */ boxRender
39304017
},
39314018
{ /* name */ "spline",
39324019
/* isline */ 1,
4020
+ /* eJust */ 0,
39334021
/* xInit */ splineInit,
39344022
/* xNumProp */ 0,
39354023
/* xChop */ 0,
39364024
/* xOffset */ 0,
39374025
/* xFit */ 0,
39384026
/* xRender */ splineRender
39394027
},
39404028
{ /* name */ "text",
39414029
/* isline */ 0,
4030
+ /* eJust */ 0,
39424031
/* xInit */ textInit,
39434032
/* xNumProp */ 0,
39444033
/* xChop */ boxChop,
39454034
/* xOffset */ boxOffset,
39464035
/* xFit */ 0,
@@ -3948,10 +4037,11 @@
39484037
},
39494038
};
39504039
static const PClass sublistClass =
39514040
{ /* name */ "[]",
39524041
/* isline */ 0,
4042
+ /* eJust */ 0,
39534043
/* xInit */ sublistInit,
39544044
/* xNumProp */ 0,
39554045
/* xChop */ 0,
39564046
/* xOffset */ 0,
39574047
/* xFit */ 0,
@@ -3958,10 +4048,11 @@
39584048
/* xRender */ 0
39594049
};
39604050
static const PClass noopClass =
39614051
{ /* name */ "noop",
39624052
/* isline */ 0,
4053
+ /* eJust */ 0,
39634054
/* xInit */ 0,
39644055
/* xNumProp */ 0,
39654056
/* xChop */ 0,
39664057
/* xOffset */ 0,
39674058
/* xFit */ 0,
@@ -4218,42 +4309,59 @@
42184309
}
42194310
}else{
42204311
int allSlots = 0;
42214312
int aFree[5];
42224313
int iSlot;
4223
- int j;
4314
+ int j, mJust;
42244315
/* If there is more than one TP_ABOVE, change the first to TP_ABOVE2. */
4225
- for(j=0, i=n-1; i>=0; i--){
4316
+ for(j=mJust=0, i=n-1; i>=0; i--){
42264317
if( aTxt[i].eCode & TP_ABOVE ){
42274318
if( j==0 ){
42284319
j++;
4320
+ mJust = aTxt[i].eCode & TP_JMASK;
4321
+ }else if( j==1 && mJust!=0 && (aTxt[i].eCode & mJust)==0 ){
4322
+ j++;
42294323
}else{
42304324
aTxt[i].eCode = (aTxt[i].eCode & ~TP_VMASK) | TP_ABOVE2;
42314325
break;
42324326
}
42334327
}
42344328
}
42354329
/* If more than one TP_BELOW, change the last to TP_BELOW2 */
4236
- for(j=0, i=0; i<n; i++){
4330
+ for(j=mJust=0, i=0; i<n; i++){
42374331
if( aTxt[i].eCode & TP_BELOW ){
42384332
if( j==0 ){
42394333
j++;
4334
+ mJust = aTxt[i].eCode & TP_JMASK;
4335
+ }else if( j==1 && mJust!=0 && (aTxt[i].eCode & mJust)==0 ){
4336
+ j++;
42404337
}else{
42414338
aTxt[i].eCode = (aTxt[i].eCode & ~TP_VMASK) | TP_BELOW2;
42424339
break;
42434340
}
42444341
}
42454342
}
42464343
/* Compute a mask of all slots used */
42474344
for(i=0; i<n; i++) allSlots |= aTxt[i].eCode & TP_VMASK;
42484345
/* Set of an array of available slots */
4249
- iSlot = 0;
4250
- if( n>=4 && (allSlots & TP_ABOVE2)==0 ) aFree[iSlot++] = TP_ABOVE2;
4251
- if( (allSlots & TP_ABOVE)==0 ) aFree[iSlot++] = TP_ABOVE;
4252
- if( (n&1)!=0 ) aFree[iSlot++] = TP_CENTER;
4253
- if( (allSlots & TP_BELOW)==0 ) aFree[iSlot++] = TP_BELOW;
4254
- if( n>=4 && (allSlots & TP_BELOW2)==0 ) aFree[iSlot++] = TP_BELOW2;
4346
+ if( n==2
4347
+ && ((aTxt[0].eCode|aTxt[1].eCode)&TP_JMASK)==(TP_LJUST|TP_RJUST)
4348
+ ){
4349
+ /* Special case of two texts that have opposite justification:
4350
+ ** Allow them both to float to center. */
4351
+ iSlot = 2;
4352
+ aFree[0] = aFree[1] = TP_CENTER;
4353
+ }else{
4354
+ /* Set up the arrow so that available slots are filled from top to
4355
+ ** bottom */
4356
+ iSlot = 0;
4357
+ if( n>=4 && (allSlots & TP_ABOVE2)==0 ) aFree[iSlot++] = TP_ABOVE2;
4358
+ if( (allSlots & TP_ABOVE)==0 ) aFree[iSlot++] = TP_ABOVE;
4359
+ if( (n&1)!=0 ) aFree[iSlot++] = TP_CENTER;
4360
+ if( (allSlots & TP_BELOW)==0 ) aFree[iSlot++] = TP_BELOW;
4361
+ if( n>=4 && (allSlots & TP_BELOW2)==0 ) aFree[iSlot++] = TP_BELOW2;
4362
+ }
42554363
/* Set the VMASK for all unassigned texts */
42564364
for(i=iSlot=0; i<n; i++){
42574365
if( (aTxt[i].eCode & TP_VMASK)==0 ){
42584366
aTxt[i].eCode |= aFree[iSlot++];
42594367
}
@@ -4260,18 +4368,27 @@
42604368
}
42614369
}
42624370
}
42634371
42644372
/* Append multiple <text> SGV element for the text fields of the PElem.
4373
+** Parameters:
4374
+**
4375
+** p The Pik object into which we are rendering
4376
+**
4377
+** pElem Object containing the text to be rendered
4378
+**
4379
+** jw LJUST text is shifted to the left by this amount.
4380
+** RJUST text is shifted to the right.
42654381
**
4266
-** Or, if pBox!=NULL, then do not actually do any output. Instead
4267
-** guess at how large the various <text> elements would be and where
4268
-** the will be located and expand the pBox to include them.
4382
+** pBox If not NULL, do no rendering at all. Instead
4383
+** expand the box object so that it will include all
4384
+** of the text.
42694385
*/
42704386
static void pik_append_txt(Pik *p, PElem *pElem, PBox *pBox){
4271
- PNum dy; /* Half the height of a single line of text */
4272
- PNum dy2; /* Extra vertical space around the center */
4387
+ PNum dy; /* Half the height of a single line of text */
4388
+ PNum dy2; /* Extra vertical space around the center */
4389
+ PNum jw; /* Justification margin relative to center */
42734390
int n, i, nz;
42744391
PNum x, y, orig_y;
42754392
const char *z;
42764393
PToken *aTxt;
42774394
int hasCenter = 0;
@@ -4290,42 +4407,50 @@
42904407
dy2 = dy;
42914408
}else if( pElem->type->isLine ){
42924409
dy2 = pElem->sw;
42934410
}else{
42944411
dy2 = 0.0;
4412
+ }
4413
+ if( pElem->type->eJust==1 ){
4414
+ jw = 0.5*(pElem->w - 0.5*(p->charWidth + pElem->sw));
4415
+ }else{
4416
+ jw = 0.0;
42954417
}
42964418
for(i=0; i<n; i++){
42974419
PToken *t = &aTxt[i];
42984420
PNum xtraFontScale = 1.0;
42994421
orig_y = y = pElem->ptAt.y;
4422
+ PNum nx = x;
43004423
if( t->eCode & TP_ABOVE2 ) y += dy2 + 3*dy;
43014424
if( t->eCode & TP_ABOVE ) y += dy2 + dy;
43024425
if( t->eCode & TP_BELOW ) y -= dy2 + dy;
43034426
if( t->eCode & TP_BELOW2 ) y -= dy2 + 3*dy;
43044427
if( t->eCode & TP_BIG ) xtraFontScale *= 1.25;
43054428
if( t->eCode & TP_SMALL ) xtraFontScale *= 0.8;
43064429
if( t->eCode & TP_XTRA ) xtraFontScale *= xtraFontScale;
4430
+ if( t->eCode & TP_LJUST ) nx -= jw;
4431
+ if( t->eCode & TP_RJUST ) nx += jw;
43074432
43084433
if( pBox!=0 ){
43094434
/* If pBox is not NULL, do not draw any <text>. Instead, just expand
43104435
** pBox to include the text */
43114436
PNum cw = pik_text_length(t)*p->charWidth*xtraFontScale;
43124437
PNum ch = p->charHeight*0.5*xtraFontScale;
43134438
if( t->eCode & TP_RJUST ){
4314
- pik_bbox_add_xy(pBox, x, y-ch);
4315
- pik_bbox_add_xy(pBox, x-cw, y+ch);
4439
+ pik_bbox_add_xy(pBox, nx, y-ch);
4440
+ pik_bbox_add_xy(pBox, nx-cw, y+ch);
43164441
}else if( t->eCode & TP_LJUST ){
4317
- pik_bbox_add_xy(pBox, x, y-ch);
4318
- pik_bbox_add_xy(pBox, x+cw, y+ch);
4442
+ pik_bbox_add_xy(pBox, nx, y-ch);
4443
+ pik_bbox_add_xy(pBox, nx+cw, y+ch);
43194444
}else{
4320
- pik_bbox_add_xy(pBox, x+cw/2, y+ch);
4321
- pik_bbox_add_xy(pBox, x-cw/2, y-ch);
4445
+ pik_bbox_add_xy(pBox, nx+cw/2, y+ch);
4446
+ pik_bbox_add_xy(pBox, nx-cw/2, y-ch);
43224447
}
43234448
continue;
43244449
}
43254450
4326
- pik_append_x(p, "<text x=\"", x, "\"");
4451
+ pik_append_x(p, "<text x=\"", nx, "\"");
43274452
pik_append_y(p, " y=\"", y, "\"");
43284453
if( t->eCode & TP_RJUST ){
43294454
pik_append(p, " text-anchor=\"end\"", -1);
43304455
}else if( t->eCode & TP_LJUST ){
43314456
pik_append(p, " text-anchor=\"start\"", -1);
@@ -5093,14 +5218,14 @@
50935218
/* Merge "text-position" flags
50945219
*/
50955220
static int pik_text_position(Pik *p, int iPrev, PToken *pFlag){
50965221
int iRes = iPrev;
50975222
switch( pFlag->eType ){
5098
- case T_CENTER: /* no-op */ break;
50995223
case T_LJUST: iRes = (iRes&~TP_JMASK) | TP_LJUST; break;
51005224
case T_RJUST: iRes = (iRes&~TP_JMASK) | TP_RJUST; break;
51015225
case T_ABOVE: iRes = (iRes&~TP_VMASK) | TP_ABOVE; break;
5226
+ case T_CENTER: iRes = (iRes&~TP_VMASK) | TP_CENTER; break;
51025227
case T_BELOW: iRes = (iRes&~TP_VMASK) | TP_BELOW; break;
51035228
case T_ITALIC: iRes |= TP_ITALIC; break;
51045229
case T_BOLD: iRes |= TP_BOLD; break;
51055230
case T_ALIGNED: iRes |= TP_ALIGN; break;
51065231
case T_BIG: if( iRes & TP_BIG ) iRes |= TP_XTRA;
@@ -5177,11 +5302,15 @@
51775302
h = hasCenter + hasSingleStack*2 + hasDoubleStack*2;
51785303
}
51795304
if( (pElem->mProp & A_WIDTH)==0 ){
51805305
for(i=0; i<pElem->nTxt; i++){
51815306
int cnt = pik_text_length(&pElem->aTxt[i]);
5182
- if( (pElem->aTxt[i].eCode & TP_JMASK)!=0 ) cnt *= 2;
5307
+ if( pElem->type->eJust==0
5308
+ && (pElem->aTxt[i].eCode & TP_JMASK)!=0
5309
+ ){
5310
+ cnt *= 2;
5311
+ }
51835312
if( cnt>w ) w = cnt;
51845313
}
51855314
}
51865315
if( h>0 || w>0 ){
51875316
pik_compute_layout_settings(p);
@@ -6528,6 +6657,6 @@
65286657
printf("</body></html>\n");
65296658
return 0;
65306659
}
65316660
#endif /* PIKCHR_SHELL */
65326661
6533
-#line 6558 "pikchr.c"
6662
+#line 6687 "pikchr.c"
65346663
--- src/pikchr.c
+++ src/pikchr.c
@@ -349,10 +349,11 @@
349 ** this structure. This it the "virtual method" table.
350 */
351 struct PClass {
352 const char *zName; /* Name of class */
353 char isLine; /* True if a line class */
 
354 void (*xInit)(Pik*,PElem*); /* Initializer */
355 void (*xNumProp)(Pik*,PElem*,PToken*); /* Value change notification */
356 PPoint (*xChop)(PElem*,PPoint*); /* Chopper */
357 PPoint (*xOffset)(Pik*,PElem*,int); /* Offset from center to edge point */
358 void (*xFit)(Pik*,PElem*,PNum w,PNum h); /* Size to fit text */
@@ -422,11 +423,11 @@
422 static PPoint pik_nth_vertex(Pik *p, PToken *pNth, PToken *pErr, PElem *pElem);
423 static PToken pik_next_semantic_token(Pik *p, PToken *pThis);
424 static void pik_compute_layout_settings(Pik*);
425
426
427 #line 453 "pikchr.c"
428 /**************** End of %include directives **********************************/
429 /* These constants specify the various numeric values for terminal symbols.
430 ***************** Begin token definitions *************************************/
431 #ifndef T_ID
432 #define T_ID 1
@@ -1506,22 +1507,22 @@
1506 ** inside the C code.
1507 */
1508 /********* Begin destructor definitions ***************************************/
1509 case 86: /* element_list */
1510 {
1511 #line 442 "pikchr.y"
1512 pik_elist_free(p,(yypminor->yy120));
1513 #line 1538 "pikchr.c"
1514 }
1515 break;
1516 case 87: /* element */
1517 case 88: /* unnamed_element */
1518 case 89: /* basetype */
1519 {
1520 #line 444 "pikchr.y"
1521 pik_elem_free(p,(yypminor->yy26));
1522 #line 1547 "pikchr.c"
1523 }
1524 break;
1525 /********* End destructor definitions *****************************************/
1526 default: break; /* If no destructor action specified: do nothing */
1527 }
@@ -1735,14 +1736,14 @@
1735 #endif
1736 while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
1737 /* Here code is inserted which will execute if the parser
1738 ** stack every overflows */
1739 /******** Begin %stack_overflow code ******************************************/
1740 #line 473 "pikchr.y"
1741
1742 pik_error(p, 0, "parser stack overflow");
1743 #line 1768 "pikchr.c"
1744 /******** End %stack_overflow code ********************************************/
1745 pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
1746 pik_parserCTX_STORE
1747 }
1748
@@ -2201,566 +2202,566 @@
2201 ** break;
2202 */
2203 /********** Begin reduce actions **********************************************/
2204 YYMINORTYPE yylhsminor;
2205 case 0: /* document ::= element_list */
2206 #line 477 "pikchr.y"
2207 {pik_render(p,yymsp[0].minor.yy120);}
2208 #line 2233 "pikchr.c"
2209 break;
2210 case 1: /* element_list ::= element */
2211 #line 480 "pikchr.y"
2212 { yylhsminor.yy120 = pik_elist_append(p,0,yymsp[0].minor.yy26); }
2213 #line 2238 "pikchr.c"
2214 yymsp[0].minor.yy120 = yylhsminor.yy120;
2215 break;
2216 case 2: /* element_list ::= element_list EOL element */
2217 #line 482 "pikchr.y"
2218 { yylhsminor.yy120 = pik_elist_append(p,yymsp[-2].minor.yy120,yymsp[0].minor.yy26); }
2219 #line 2244 "pikchr.c"
2220 yymsp[-2].minor.yy120 = yylhsminor.yy120;
2221 break;
2222 case 3: /* element ::= */
2223 #line 485 "pikchr.y"
2224 { yymsp[1].minor.yy26 = 0; }
2225 #line 2250 "pikchr.c"
2226 break;
2227 case 4: /* element ::= direction */
2228 #line 486 "pikchr.y"
2229 { pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy26=0; }
2230 #line 2255 "pikchr.c"
2231 yymsp[0].minor.yy26 = yylhsminor.yy26;
2232 break;
2233 case 5: /* element ::= lvalue ASSIGN rvalue */
2234 #line 487 "pikchr.y"
2235 {pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy191,&yymsp[-1].minor.yy0); yylhsminor.yy26=0;}
2236 #line 2261 "pikchr.c"
2237 yymsp[-2].minor.yy26 = yylhsminor.yy26;
2238 break;
2239 case 6: /* element ::= PLACENAME COLON unnamed_element */
2240 #line 489 "pikchr.y"
2241 { yylhsminor.yy26 = yymsp[0].minor.yy26; pik_elem_setname(p,yymsp[0].minor.yy26,&yymsp[-2].minor.yy0); }
2242 #line 2267 "pikchr.c"
2243 yymsp[-2].minor.yy26 = yylhsminor.yy26;
2244 break;
2245 case 7: /* element ::= PLACENAME COLON position */
2246 #line 491 "pikchr.y"
2247 { yylhsminor.yy26 = pik_elem_new(p,0,0,0);
2248 if(yylhsminor.yy26){ yylhsminor.yy26->ptAt = yymsp[0].minor.yy131; pik_elem_setname(p,yylhsminor.yy26,&yymsp[-2].minor.yy0); }}
2249 #line 2274 "pikchr.c"
2250 yymsp[-2].minor.yy26 = yylhsminor.yy26;
2251 break;
2252 case 8: /* element ::= unnamed_element */
2253 #line 493 "pikchr.y"
2254 {yylhsminor.yy26 = yymsp[0].minor.yy26;}
2255 #line 2280 "pikchr.c"
2256 yymsp[0].minor.yy26 = yylhsminor.yy26;
2257 break;
2258 case 9: /* element ::= print prlist */
2259 #line 494 "pikchr.y"
2260 {pik_append(p,"<br>\n",5); yymsp[-1].minor.yy26=0;}
2261 #line 2286 "pikchr.c"
2262 break;
2263 case 10: /* rvalue ::= PLACENAME */
2264 #line 505 "pikchr.y"
2265 {yylhsminor.yy191 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2266 #line 2291 "pikchr.c"
2267 yymsp[0].minor.yy191 = yylhsminor.yy191;
2268 break;
2269 case 11: /* pritem ::= FILL */
2270 case 12: /* pritem ::= COLOR */ yytestcase(yyruleno==12);
2271 case 13: /* pritem ::= THICKNESS */ yytestcase(yyruleno==13);
2272 #line 510 "pikchr.y"
2273 {pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2274 #line 2299 "pikchr.c"
2275 break;
2276 case 14: /* pritem ::= rvalue */
2277 #line 513 "pikchr.y"
2278 {pik_append_num(p,"",yymsp[0].minor.yy191);}
2279 #line 2304 "pikchr.c"
2280 break;
2281 case 15: /* pritem ::= STRING */
2282 #line 514 "pikchr.y"
2283 {pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2284 #line 2309 "pikchr.c"
2285 break;
2286 case 16: /* prsep ::= COMMA */
2287 #line 515 "pikchr.y"
2288 {pik_append(p, " ", 1);}
2289 #line 2314 "pikchr.c"
2290 break;
2291 case 17: /* unnamed_element ::= basetype attribute_list */
2292 #line 518 "pikchr.y"
2293 {yylhsminor.yy26 = yymsp[-1].minor.yy26; pik_after_adding_attributes(p,yylhsminor.yy26);}
2294 #line 2319 "pikchr.c"
2295 yymsp[-1].minor.yy26 = yylhsminor.yy26;
2296 break;
2297 case 18: /* basetype ::= CLASSNAME */
2298 #line 520 "pikchr.y"
2299 {yylhsminor.yy26 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2300 #line 2325 "pikchr.c"
2301 yymsp[0].minor.yy26 = yylhsminor.yy26;
2302 break;
2303 case 19: /* basetype ::= STRING textposition */
2304 #line 522 "pikchr.y"
2305 {yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy60; yylhsminor.yy26 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2306 #line 2331 "pikchr.c"
2307 yymsp[-1].minor.yy26 = yylhsminor.yy26;
2308 break;
2309 case 20: /* basetype ::= LB savelist element_list RB */
2310 #line 524 "pikchr.y"
2311 { p->list = yymsp[-2].minor.yy120; yymsp[-3].minor.yy26 = pik_elem_new(p,0,0,yymsp[-1].minor.yy120); if(yymsp[-3].minor.yy26) yymsp[-3].minor.yy26->errTok = yymsp[0].minor.yy0; }
2312 #line 2337 "pikchr.c"
2313 break;
2314 case 21: /* savelist ::= */
2315 #line 529 "pikchr.y"
2316 {yymsp[1].minor.yy120 = p->list; p->list = 0;}
2317 #line 2342 "pikchr.c"
2318 break;
2319 case 22: /* attribute_list ::= expr */
2320 #line 536 "pikchr.y"
2321 { pik_add_direction(p,0,&yymsp[0].minor.yy191,0);}
2322 #line 2347 "pikchr.c"
2323 break;
2324 case 23: /* attribute_list ::= expr PERCENT */
2325 #line 537 "pikchr.y"
2326 { pik_add_direction(p,0,&yymsp[-1].minor.yy191,1);}
2327 #line 2352 "pikchr.c"
2328 break;
2329 case 24: /* attribute ::= numproperty expr PERCENT */
2330 #line 542 "pikchr.y"
2331 { pik_set_numprop(p,&yymsp[-2].minor.yy0,0.0,yymsp[-1].minor.yy191/100.0); }
2332 #line 2357 "pikchr.c"
2333 break;
2334 case 25: /* attribute ::= numproperty expr */
2335 case 28: /* attribute ::= colorproperty rvalue */ yytestcase(yyruleno==28);
2336 #line 543 "pikchr.y"
2337 { pik_set_numprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy191,0.0); }
2338 #line 2363 "pikchr.c"
2339 break;
2340 case 26: /* attribute ::= dashproperty expr */
2341 #line 544 "pikchr.y"
2342 { pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy191); }
2343 #line 2368 "pikchr.c"
2344 break;
2345 case 27: /* attribute ::= dashproperty */
2346 #line 545 "pikchr.y"
2347 { pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2348 #line 2373 "pikchr.c"
2349 break;
2350 case 29: /* attribute ::= direction expr PERCENT */
2351 #line 548 "pikchr.y"
2352 { pik_add_direction(p,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy191,1);}
2353 #line 2378 "pikchr.c"
2354 break;
2355 case 30: /* attribute ::= direction expr */
2356 #line 549 "pikchr.y"
2357 { pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy191,0);}
2358 #line 2383 "pikchr.c"
2359 break;
2360 case 31: /* attribute ::= direction */
2361 #line 550 "pikchr.y"
2362 { pik_add_direction(p,&yymsp[0].minor.yy0,0,0); }
2363 #line 2388 "pikchr.c"
2364 break;
2365 case 32: /* attribute ::= direction even position */
2366 #line 551 "pikchr.y"
2367 {pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy131);}
2368 #line 2393 "pikchr.c"
2369 break;
2370 case 33: /* attribute ::= CLOSE */
2371 #line 552 "pikchr.y"
2372 { pik_close_path(p,&yymsp[0].minor.yy0); }
2373 #line 2398 "pikchr.c"
2374 break;
2375 case 34: /* attribute ::= CHOP */
2376 #line 553 "pikchr.y"
2377 { p->cur->bChop = 1; }
2378 #line 2403 "pikchr.c"
2379 break;
2380 case 35: /* attribute ::= FROM position */
2381 #line 554 "pikchr.y"
2382 { pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy131); }
2383 #line 2408 "pikchr.c"
2384 break;
2385 case 36: /* attribute ::= TO position */
2386 #line 555 "pikchr.y"
2387 { pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy131); }
2388 #line 2413 "pikchr.c"
2389 break;
2390 case 37: /* attribute ::= THEN */
2391 #line 556 "pikchr.y"
2392 { pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2393 #line 2418 "pikchr.c"
2394 break;
2395 case 38: /* attribute ::= AT position */
2396 #line 558 "pikchr.y"
2397 { pik_set_at(p,0,&yymsp[0].minor.yy131,&yymsp[-1].minor.yy0); }
2398 #line 2423 "pikchr.c"
2399 break;
2400 case 39: /* attribute ::= SAME */
2401 #line 560 "pikchr.y"
2402 {pik_same(p,0,&yymsp[0].minor.yy0);}
2403 #line 2428 "pikchr.c"
2404 break;
2405 case 40: /* attribute ::= SAME AS object */
2406 #line 561 "pikchr.y"
2407 {pik_same(p,yymsp[0].minor.yy26,&yymsp[-2].minor.yy0);}
2408 #line 2433 "pikchr.c"
2409 break;
2410 case 41: /* attribute ::= STRING textposition */
2411 #line 562 "pikchr.y"
2412 {pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy60);}
2413 #line 2438 "pikchr.c"
2414 break;
2415 case 42: /* attribute ::= FIT */
2416 #line 563 "pikchr.y"
2417 {pik_size_to_fit(p,&yymsp[0].minor.yy0); }
2418 #line 2443 "pikchr.c"
2419 break;
2420 case 43: /* with ::= DOT_E edge AT position */
2421 case 44: /* with ::= edge AT position */ yytestcase(yyruleno==44);
2422 #line 570 "pikchr.y"
2423 { pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy131,&yymsp[-1].minor.yy0); }
2424 #line 2449 "pikchr.c"
2425 break;
2426 case 45: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2427 #line 574 "pikchr.y"
2428 {yylhsminor.yy0 = yymsp[0].minor.yy0;}
2429 #line 2454 "pikchr.c"
2430 yymsp[0].minor.yy0 = yylhsminor.yy0;
2431 break;
2432 case 46: /* boolproperty ::= CW */
2433 #line 585 "pikchr.y"
2434 {p->cur->cw = 1;}
2435 #line 2460 "pikchr.c"
2436 break;
2437 case 47: /* boolproperty ::= CCW */
2438 #line 586 "pikchr.y"
2439 {p->cur->cw = 0;}
2440 #line 2465 "pikchr.c"
2441 break;
2442 case 48: /* boolproperty ::= LARROW */
2443 #line 587 "pikchr.y"
2444 {p->cur->larrow=1; p->cur->rarrow=0; }
2445 #line 2470 "pikchr.c"
2446 break;
2447 case 49: /* boolproperty ::= RARROW */
2448 #line 588 "pikchr.y"
2449 {p->cur->larrow=0; p->cur->rarrow=1; }
2450 #line 2475 "pikchr.c"
2451 break;
2452 case 50: /* boolproperty ::= LRARROW */
2453 #line 589 "pikchr.y"
2454 {p->cur->larrow=1; p->cur->rarrow=1; }
2455 #line 2480 "pikchr.c"
2456 break;
2457 case 51: /* boolproperty ::= INVIS */
2458 #line 590 "pikchr.y"
2459 {p->cur->sw = 0.0;}
2460 #line 2485 "pikchr.c"
2461 break;
2462 case 52: /* boolproperty ::= THICK */
2463 #line 591 "pikchr.y"
2464 {p->cur->sw *= 1.5;}
2465 #line 2490 "pikchr.c"
2466 break;
2467 case 53: /* boolproperty ::= THIN */
2468 #line 592 "pikchr.y"
2469 {p->cur->sw *= 0.67;}
2470 #line 2495 "pikchr.c"
2471 break;
2472 case 54: /* textposition ::= */
2473 #line 594 "pikchr.y"
2474 {yymsp[1].minor.yy60 = 0;}
2475 #line 2500 "pikchr.c"
2476 break;
2477 case 55: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2478 #line 597 "pikchr.y"
2479 {yylhsminor.yy60 = pik_text_position(p,yymsp[-1].minor.yy60,&yymsp[0].minor.yy0);}
2480 #line 2505 "pikchr.c"
2481 yymsp[-1].minor.yy60 = yylhsminor.yy60;
2482 break;
2483 case 56: /* position ::= expr COMMA expr */
2484 #line 600 "pikchr.y"
2485 {yylhsminor.yy131.x=yymsp[-2].minor.yy191; yylhsminor.yy131.y=yymsp[0].minor.yy191;}
2486 #line 2511 "pikchr.c"
2487 yymsp[-2].minor.yy131 = yylhsminor.yy131;
2488 break;
2489 case 57: /* position ::= place PLUS expr COMMA expr */
2490 #line 602 "pikchr.y"
2491 {yylhsminor.yy131.x=yymsp[-4].minor.yy131.x+yymsp[-2].minor.yy191; yylhsminor.yy131.y=yymsp[-4].minor.yy131.y+yymsp[0].minor.yy191;}
2492 #line 2517 "pikchr.c"
2493 yymsp[-4].minor.yy131 = yylhsminor.yy131;
2494 break;
2495 case 58: /* position ::= place MINUS expr COMMA expr */
2496 #line 603 "pikchr.y"
2497 {yylhsminor.yy131.x=yymsp[-4].minor.yy131.x-yymsp[-2].minor.yy191; yylhsminor.yy131.y=yymsp[-4].minor.yy131.y-yymsp[0].minor.yy191;}
2498 #line 2523 "pikchr.c"
2499 yymsp[-4].minor.yy131 = yylhsminor.yy131;
2500 break;
2501 case 59: /* position ::= place PLUS LP expr COMMA expr RP */
2502 #line 605 "pikchr.y"
2503 {yylhsminor.yy131.x=yymsp[-6].minor.yy131.x+yymsp[-3].minor.yy191; yylhsminor.yy131.y=yymsp[-6].minor.yy131.y+yymsp[-1].minor.yy191;}
2504 #line 2529 "pikchr.c"
2505 yymsp[-6].minor.yy131 = yylhsminor.yy131;
2506 break;
2507 case 60: /* position ::= place MINUS LP expr COMMA expr RP */
2508 #line 607 "pikchr.y"
2509 {yylhsminor.yy131.x=yymsp[-6].minor.yy131.x-yymsp[-3].minor.yy191; yylhsminor.yy131.y=yymsp[-6].minor.yy131.y-yymsp[-1].minor.yy191;}
2510 #line 2535 "pikchr.c"
2511 yymsp[-6].minor.yy131 = yylhsminor.yy131;
2512 break;
2513 case 61: /* position ::= LP position COMMA position RP */
2514 #line 608 "pikchr.y"
2515 {yymsp[-4].minor.yy131.x=yymsp[-3].minor.yy131.x; yymsp[-4].minor.yy131.y=yymsp[-1].minor.yy131.y;}
2516 #line 2541 "pikchr.c"
2517 break;
2518 case 62: /* position ::= LP position RP */
2519 #line 609 "pikchr.y"
2520 {yymsp[-2].minor.yy131=yymsp[-1].minor.yy131;}
2521 #line 2546 "pikchr.c"
2522 break;
2523 case 63: /* position ::= expr between position AND position */
2524 #line 611 "pikchr.y"
2525 {yylhsminor.yy131 = pik_position_between(p,yymsp[-4].minor.yy191,yymsp[-2].minor.yy131,yymsp[0].minor.yy131);}
2526 #line 2551 "pikchr.c"
2527 yymsp[-4].minor.yy131 = yylhsminor.yy131;
2528 break;
2529 case 64: /* position ::= expr ABOVE position */
2530 #line 612 "pikchr.y"
2531 {yylhsminor.yy131=yymsp[0].minor.yy131; yylhsminor.yy131.y += yymsp[-2].minor.yy191;}
2532 #line 2557 "pikchr.c"
2533 yymsp[-2].minor.yy131 = yylhsminor.yy131;
2534 break;
2535 case 65: /* position ::= expr BELOW position */
2536 #line 613 "pikchr.y"
2537 {yylhsminor.yy131=yymsp[0].minor.yy131; yylhsminor.yy131.y -= yymsp[-2].minor.yy191;}
2538 #line 2563 "pikchr.c"
2539 yymsp[-2].minor.yy131 = yylhsminor.yy131;
2540 break;
2541 case 66: /* position ::= expr LEFT OF position */
2542 #line 614 "pikchr.y"
2543 {yylhsminor.yy131=yymsp[0].minor.yy131; yylhsminor.yy131.x -= yymsp[-3].minor.yy191;}
2544 #line 2569 "pikchr.c"
2545 yymsp[-3].minor.yy131 = yylhsminor.yy131;
2546 break;
2547 case 67: /* position ::= expr RIGHT OF position */
2548 #line 615 "pikchr.y"
2549 {yylhsminor.yy131=yymsp[0].minor.yy131; yylhsminor.yy131.x += yymsp[-3].minor.yy191;}
2550 #line 2575 "pikchr.c"
2551 yymsp[-3].minor.yy131 = yylhsminor.yy131;
2552 break;
2553 case 68: /* position ::= expr EDGEPT OF position */
2554 #line 617 "pikchr.y"
2555 {yylhsminor.yy131 = pik_position_at_hdg(p,yymsp[-3].minor.yy191,&yymsp[-2].minor.yy0,yymsp[0].minor.yy131);}
2556 #line 2581 "pikchr.c"
2557 yymsp[-3].minor.yy131 = yylhsminor.yy131;
2558 break;
2559 case 69: /* position ::= expr HEADING expr FROM position */
2560 #line 619 "pikchr.y"
2561 {yylhsminor.yy131 = pik_position_at_angle(p,yymsp[-4].minor.yy191,yymsp[-2].minor.yy191,yymsp[0].minor.yy131);}
2562 #line 2587 "pikchr.c"
2563 yymsp[-4].minor.yy131 = yylhsminor.yy131;
2564 break;
2565 case 70: /* place ::= object */
2566 #line 625 "pikchr.y"
2567 {yylhsminor.yy131 = pik_place_of_elem(p,yymsp[0].minor.yy26,0);}
2568 #line 2593 "pikchr.c"
2569 yymsp[0].minor.yy131 = yylhsminor.yy131;
2570 break;
2571 case 71: /* place ::= object DOT_E edge */
2572 case 72: /* place ::= object DOT_L START */ yytestcase(yyruleno==72);
2573 case 73: /* place ::= object DOT_L END */ yytestcase(yyruleno==73);
2574 #line 626 "pikchr.y"
2575 {yylhsminor.yy131 = pik_place_of_elem(p,yymsp[-2].minor.yy26,&yymsp[0].minor.yy0);}
2576 #line 2601 "pikchr.c"
2577 yymsp[-2].minor.yy131 = yylhsminor.yy131;
2578 break;
2579 case 74: /* place ::= START OF object */
2580 case 75: /* place ::= END OF object */ yytestcase(yyruleno==75);
2581 case 76: /* place ::= edge OF object */ yytestcase(yyruleno==76);
2582 #line 629 "pikchr.y"
2583 {yylhsminor.yy131 = pik_place_of_elem(p,yymsp[0].minor.yy26,&yymsp[-2].minor.yy0);}
2584 #line 2609 "pikchr.c"
2585 yymsp[-2].minor.yy131 = yylhsminor.yy131;
2586 break;
2587 case 77: /* place ::= NTH VERTEX OF object */
2588 #line 632 "pikchr.y"
2589 {yylhsminor.yy131 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy26);}
2590 #line 2615 "pikchr.c"
2591 yymsp[-3].minor.yy131 = yylhsminor.yy131;
2592 break;
2593 case 78: /* object ::= nth */
2594 #line 635 "pikchr.y"
2595 {yylhsminor.yy26 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2596 #line 2621 "pikchr.c"
2597 yymsp[0].minor.yy26 = yylhsminor.yy26;
2598 break;
2599 case 79: /* object ::= nth OF|IN object */
2600 #line 636 "pikchr.y"
2601 {yylhsminor.yy26 = pik_find_nth(p,yymsp[0].minor.yy26,&yymsp[-2].minor.yy0);}
2602 #line 2627 "pikchr.c"
2603 yymsp[-2].minor.yy26 = yylhsminor.yy26;
2604 break;
2605 case 80: /* objectname ::= PLACENAME */
2606 #line 638 "pikchr.y"
2607 {yylhsminor.yy26 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2608 #line 2633 "pikchr.c"
2609 yymsp[0].minor.yy26 = yylhsminor.yy26;
2610 break;
2611 case 81: /* objectname ::= objectname DOT_U PLACENAME */
2612 #line 640 "pikchr.y"
2613 {yylhsminor.yy26 = pik_find_byname(p,yymsp[-2].minor.yy26,&yymsp[0].minor.yy0);}
2614 #line 2639 "pikchr.c"
2615 yymsp[-2].minor.yy26 = yylhsminor.yy26;
2616 break;
2617 case 82: /* nth ::= NTH CLASSNAME */
2618 #line 642 "pikchr.y"
2619 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2620 #line 2645 "pikchr.c"
2621 yymsp[-1].minor.yy0 = yylhsminor.yy0;
2622 break;
2623 case 83: /* nth ::= NTH LAST CLASSNAME */
2624 #line 643 "pikchr.y"
2625 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2626 #line 2651 "pikchr.c"
2627 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2628 break;
2629 case 84: /* nth ::= LAST CLASSNAME */
2630 #line 644 "pikchr.y"
2631 {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2632 #line 2657 "pikchr.c"
2633 break;
2634 case 85: /* nth ::= LAST */
2635 #line 645 "pikchr.y"
2636 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2637 #line 2662 "pikchr.c"
2638 yymsp[0].minor.yy0 = yylhsminor.yy0;
2639 break;
2640 case 86: /* nth ::= NTH LB RB */
2641 #line 646 "pikchr.y"
2642 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2643 #line 2668 "pikchr.c"
2644 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2645 break;
2646 case 87: /* nth ::= NTH LAST LB RB */
2647 #line 647 "pikchr.y"
2648 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2649 #line 2674 "pikchr.c"
2650 yymsp[-3].minor.yy0 = yylhsminor.yy0;
2651 break;
2652 case 88: /* nth ::= LAST LB RB */
2653 #line 648 "pikchr.y"
2654 {yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2655 #line 2680 "pikchr.c"
2656 break;
2657 case 89: /* expr ::= expr PLUS expr */
2658 #line 650 "pikchr.y"
2659 {yylhsminor.yy191=yymsp[-2].minor.yy191+yymsp[0].minor.yy191;}
2660 #line 2685 "pikchr.c"
2661 yymsp[-2].minor.yy191 = yylhsminor.yy191;
2662 break;
2663 case 90: /* expr ::= expr MINUS expr */
2664 #line 651 "pikchr.y"
2665 {yylhsminor.yy191=yymsp[-2].minor.yy191-yymsp[0].minor.yy191;}
2666 #line 2691 "pikchr.c"
2667 yymsp[-2].minor.yy191 = yylhsminor.yy191;
2668 break;
2669 case 91: /* expr ::= expr STAR expr */
2670 #line 652 "pikchr.y"
2671 {yylhsminor.yy191=yymsp[-2].minor.yy191*yymsp[0].minor.yy191;}
2672 #line 2697 "pikchr.c"
2673 yymsp[-2].minor.yy191 = yylhsminor.yy191;
2674 break;
2675 case 92: /* expr ::= expr SLASH expr */
2676 #line 653 "pikchr.y"
2677 {
2678 if( yymsp[0].minor.yy191==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy191 = 0.0; }
2679 else{ yylhsminor.yy191 = yymsp[-2].minor.yy191/yymsp[0].minor.yy191; }
2680 }
2681 #line 2706 "pikchr.c"
2682 yymsp[-2].minor.yy191 = yylhsminor.yy191;
2683 break;
2684 case 93: /* expr ::= MINUS expr */
2685 #line 657 "pikchr.y"
2686 {yymsp[-1].minor.yy191=-yymsp[0].minor.yy191;}
2687 #line 2712 "pikchr.c"
2688 break;
2689 case 94: /* expr ::= PLUS expr */
2690 #line 658 "pikchr.y"
2691 {yymsp[-1].minor.yy191=yymsp[0].minor.yy191;}
2692 #line 2717 "pikchr.c"
2693 break;
2694 case 95: /* expr ::= LP expr RP */
2695 #line 659 "pikchr.y"
2696 {yymsp[-2].minor.yy191=yymsp[-1].minor.yy191;}
2697 #line 2722 "pikchr.c"
2698 break;
2699 case 96: /* expr ::= NUMBER */
2700 #line 660 "pikchr.y"
2701 {yylhsminor.yy191=pik_atof(p,&yymsp[0].minor.yy0);}
2702 #line 2727 "pikchr.c"
2703 yymsp[0].minor.yy191 = yylhsminor.yy191;
2704 break;
2705 case 97: /* expr ::= ID */
2706 #line 661 "pikchr.y"
2707 {yylhsminor.yy191=pik_get_var(p,&yymsp[0].minor.yy0);}
2708 #line 2733 "pikchr.c"
2709 yymsp[0].minor.yy191 = yylhsminor.yy191;
2710 break;
2711 case 98: /* expr ::= FUNC1 LP expr RP */
2712 #line 662 "pikchr.y"
2713 {yylhsminor.yy191 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy191,0.0);}
2714 #line 2739 "pikchr.c"
2715 yymsp[-3].minor.yy191 = yylhsminor.yy191;
2716 break;
2717 case 99: /* expr ::= FUNC2 LP expr COMMA expr RP */
2718 #line 663 "pikchr.y"
2719 {yylhsminor.yy191 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy191,yymsp[-1].minor.yy191);}
2720 #line 2745 "pikchr.c"
2721 yymsp[-5].minor.yy191 = yylhsminor.yy191;
2722 break;
2723 case 100: /* expr ::= object DOT_L locproperty */
2724 case 101: /* expr ::= object DOT_L numproperty */ yytestcase(yyruleno==101);
2725 case 102: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==102);
2726 case 103: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==103);
2727 #line 665 "pikchr.y"
2728 {yylhsminor.yy191=pik_property_of(p,yymsp[-2].minor.yy26,&yymsp[0].minor.yy0);}
2729 #line 2754 "pikchr.c"
2730 yymsp[-2].minor.yy191 = yylhsminor.yy191;
2731 break;
2732 case 104: /* expr ::= object DOT_E edge DOT_L X */
2733 #line 669 "pikchr.y"
2734 {yylhsminor.yy191=pik_place_of_elem(p,yymsp[-4].minor.yy26,&yymsp[-2].minor.yy0).x;}
2735 #line 2760 "pikchr.c"
2736 yymsp[-4].minor.yy191 = yylhsminor.yy191;
2737 break;
2738 case 105: /* expr ::= object DOT_E edge DOT_L Y */
2739 #line 670 "pikchr.y"
2740 {yylhsminor.yy191=pik_place_of_elem(p,yymsp[-4].minor.yy26,&yymsp[-2].minor.yy0).y;}
2741 #line 2766 "pikchr.c"
2742 yymsp[-4].minor.yy191 = yylhsminor.yy191;
2743 break;
2744 case 106: /* expr ::= LP locproperty OF object RP */
2745 case 107: /* expr ::= LP dashproperty OF object RP */ yytestcase(yyruleno==107);
2746 case 108: /* expr ::= LP numproperty OF object RP */ yytestcase(yyruleno==108);
2747 case 109: /* expr ::= LP colorproperty OF object RP */ yytestcase(yyruleno==109);
2748 #line 671 "pikchr.y"
2749 {yymsp[-4].minor.yy191=pik_property_of(p,yymsp[-1].minor.yy26,&yymsp[-3].minor.yy0);}
2750 #line 2775 "pikchr.c"
2751 break;
2752 case 110: /* expr ::= NTH VERTEX OF object DOT_L X */
2753 #line 677 "pikchr.y"
2754 {yylhsminor.yy191 = pik_nth_vertex(p,&yymsp[-5].minor.yy0,&yymsp[-4].minor.yy0,yymsp[-2].minor.yy26).x;}
2755 #line 2780 "pikchr.c"
2756 yymsp[-5].minor.yy191 = yylhsminor.yy191;
2757 break;
2758 case 111: /* expr ::= NTH VERTEX OF object DOT_L Y */
2759 #line 679 "pikchr.y"
2760 {yylhsminor.yy191 = pik_nth_vertex(p,&yymsp[-5].minor.yy0,&yymsp[-4].minor.yy0,yymsp[-2].minor.yy26).y;}
2761 #line 2786 "pikchr.c"
2762 yymsp[-5].minor.yy191 = yylhsminor.yy191;
2763 break;
2764 default:
2765 /* (112) lvalue ::= ID */ yytestcase(yyruleno==112);
2766 /* (113) lvalue ::= FILL */ yytestcase(yyruleno==113);
@@ -2855,18 +2856,18 @@
2855 ){
2856 pik_parserARG_FETCH
2857 pik_parserCTX_FETCH
2858 #define TOKEN yyminor
2859 /************ Begin %syntax_error code ****************************************/
2860 #line 466 "pikchr.y"
2861
2862 if( TOKEN.z && TOKEN.z[0] ){
2863 pik_error(p, &TOKEN, "syntax error");
2864 }else{
2865 pik_error(p, 0, "syntax error");
2866 }
2867 #line 2892 "pikchr.c"
2868 /************ End %syntax_error code ******************************************/
2869 pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
2870 pik_parserCTX_STORE
2871 }
2872
@@ -3095,11 +3096,11 @@
3095 #else
3096 (void)iToken;
3097 return 0;
3098 #endif
3099 }
3100 #line 689 "pikchr.y"
3101
3102
3103
3104 /* Chart of the 140 official HTML color names with their
3105 ** corresponding RGB value.
@@ -3284,10 +3285,13 @@
3284 { "cylwid", 0.75 },
3285 { "dashwid", 0.05 },
3286 { "dotrad", 0.015 },
3287 { "ellipseht", 0.5 },
3288 { "ellipsewid", 0.75 },
 
 
 
3289 { "fill", -1.0 },
3290 { "lineht", 0.5 },
3291 { "linewid", 0.5 },
3292 { "movewid", 0.5 },
3293 { "ovalht", 0.5 },
@@ -3669,10 +3673,73 @@
3669 pik_append_style(p,pElem);
3670 pik_append(p,"\" />\n", -1);
3671 }
3672 pik_append_txt(p, pElem, 0);
3673 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3674
3675 /* Methods for the "line" class */
3676 static void lineInit(Pik *p, PElem *pElem){
3677 pElem->w = pik_value(p, "linewid",7,0);
3678 pElem->h = pik_value(p, "lineht",6,0);
@@ -3838,109 +3905,131 @@
3838 ** elements. The special STRING and [] elements are separate.
3839 */
3840 static const PClass aClass[] = {
3841 { /* name */ "arc",
3842 /* isline */ 1,
 
3843 /* xInit */ arcInit,
3844 /* xNumProp */ 0,
3845 /* xChop */ 0,
3846 /* xOffset */ 0,
3847 /* xFit */ 0,
3848 /* xRender */ arcRender
3849 },
3850 { /* name */ "arrow",
3851 /* isline */ 1,
 
3852 /* xInit */ arrowInit,
3853 /* xNumProp */ 0,
3854 /* xChop */ 0,
3855 /* xOffset */ 0,
3856 /* xFit */ 0,
3857 /* xRender */ splineRender
3858 },
3859 { /* name */ "box",
3860 /* isline */ 0,
 
3861 /* xInit */ boxInit,
3862 /* xNumProp */ 0,
3863 /* xChop */ boxChop,
3864 /* xOffset */ boxOffset,
3865 /* xFit */ boxFit,
3866 /* xRender */ boxRender
3867 },
3868 { /* name */ "circle",
3869 /* isline */ 0,
 
3870 /* xInit */ circleInit,
3871 /* xNumProp */ circleNumProp,
3872 /* xChop */ circleChop,
3873 /* xOffset */ ellipseOffset,
3874 /* xFit */ circleFit,
3875 /* xRender */ circleRender
3876 },
3877 { /* name */ "cylinder",
3878 /* isline */ 0,
 
3879 /* xInit */ cylinderInit,
3880 /* xNumProp */ 0,
3881 /* xChop */ boxChop,
3882 /* xOffset */ cylinderOffset,
3883 /* xFit */ 0,
3884 /* xRender */ cylinderRender
3885 },
3886 { /* name */ "dot",
3887 /* isline */ 0,
 
3888 /* xInit */ dotInit,
3889 /* xNumProp */ dotNumProp,
3890 /* xChop */ circleChop,
3891 /* xOffset */ ellipseOffset,
3892 /* xFit */ 0,
3893 /* xRender */ dotRender
3894 },
3895 { /* name */ "ellipse",
3896 /* isline */ 0,
 
3897 /* xInit */ ellipseInit,
3898 /* xNumProp */ 0,
3899 /* xChop */ ellipseChop,
3900 /* xOffset */ ellipseOffset,
3901 /* xFit */ 0,
3902 /* xRender */ ellipseRender
3903 },
 
 
 
 
 
 
 
 
 
 
3904 { /* name */ "line",
3905 /* isline */ 1,
 
3906 /* xInit */ lineInit,
3907 /* xNumProp */ 0,
3908 /* xChop */ 0,
3909 /* xOffset */ 0,
3910 /* xFit */ 0,
3911 /* xRender */ splineRender
3912 },
3913 { /* name */ "move",
3914 /* isline */ 1,
 
3915 /* xInit */ moveInit,
3916 /* xNumProp */ 0,
3917 /* xChop */ 0,
3918 /* xOffset */ 0,
3919 /* xFit */ 0,
3920 /* xRender */ moveRender
3921 },
3922 { /* name */ "oval",
3923 /* isline */ 0,
 
3924 /* xInit */ ovalInit,
3925 /* xNumProp */ ovalNumProp,
3926 /* xChop */ boxChop,
3927 /* xOffset */ boxOffset,
3928 /* xFit */ ovalFit,
3929 /* xRender */ boxRender
3930 },
3931 { /* name */ "spline",
3932 /* isline */ 1,
 
3933 /* xInit */ splineInit,
3934 /* xNumProp */ 0,
3935 /* xChop */ 0,
3936 /* xOffset */ 0,
3937 /* xFit */ 0,
3938 /* xRender */ splineRender
3939 },
3940 { /* name */ "text",
3941 /* isline */ 0,
 
3942 /* xInit */ textInit,
3943 /* xNumProp */ 0,
3944 /* xChop */ boxChop,
3945 /* xOffset */ boxOffset,
3946 /* xFit */ 0,
@@ -3948,10 +4037,11 @@
3948 },
3949 };
3950 static const PClass sublistClass =
3951 { /* name */ "[]",
3952 /* isline */ 0,
 
3953 /* xInit */ sublistInit,
3954 /* xNumProp */ 0,
3955 /* xChop */ 0,
3956 /* xOffset */ 0,
3957 /* xFit */ 0,
@@ -3958,10 +4048,11 @@
3958 /* xRender */ 0
3959 };
3960 static const PClass noopClass =
3961 { /* name */ "noop",
3962 /* isline */ 0,
 
3963 /* xInit */ 0,
3964 /* xNumProp */ 0,
3965 /* xChop */ 0,
3966 /* xOffset */ 0,
3967 /* xFit */ 0,
@@ -4218,42 +4309,59 @@
4218 }
4219 }else{
4220 int allSlots = 0;
4221 int aFree[5];
4222 int iSlot;
4223 int j;
4224 /* If there is more than one TP_ABOVE, change the first to TP_ABOVE2. */
4225 for(j=0, i=n-1; i>=0; i--){
4226 if( aTxt[i].eCode & TP_ABOVE ){
4227 if( j==0 ){
4228 j++;
 
 
 
4229 }else{
4230 aTxt[i].eCode = (aTxt[i].eCode & ~TP_VMASK) | TP_ABOVE2;
4231 break;
4232 }
4233 }
4234 }
4235 /* If more than one TP_BELOW, change the last to TP_BELOW2 */
4236 for(j=0, i=0; i<n; i++){
4237 if( aTxt[i].eCode & TP_BELOW ){
4238 if( j==0 ){
4239 j++;
 
 
 
4240 }else{
4241 aTxt[i].eCode = (aTxt[i].eCode & ~TP_VMASK) | TP_BELOW2;
4242 break;
4243 }
4244 }
4245 }
4246 /* Compute a mask of all slots used */
4247 for(i=0; i<n; i++) allSlots |= aTxt[i].eCode & TP_VMASK;
4248 /* Set of an array of available slots */
4249 iSlot = 0;
4250 if( n>=4 && (allSlots & TP_ABOVE2)==0 ) aFree[iSlot++] = TP_ABOVE2;
4251 if( (allSlots & TP_ABOVE)==0 ) aFree[iSlot++] = TP_ABOVE;
4252 if( (n&1)!=0 ) aFree[iSlot++] = TP_CENTER;
4253 if( (allSlots & TP_BELOW)==0 ) aFree[iSlot++] = TP_BELOW;
4254 if( n>=4 && (allSlots & TP_BELOW2)==0 ) aFree[iSlot++] = TP_BELOW2;
 
 
 
 
 
 
 
 
 
 
 
4255 /* Set the VMASK for all unassigned texts */
4256 for(i=iSlot=0; i<n; i++){
4257 if( (aTxt[i].eCode & TP_VMASK)==0 ){
4258 aTxt[i].eCode |= aFree[iSlot++];
4259 }
@@ -4260,18 +4368,27 @@
4260 }
4261 }
4262 }
4263
4264 /* Append multiple <text> SGV element for the text fields of the PElem.
 
 
 
 
 
 
 
 
4265 **
4266 ** Or, if pBox!=NULL, then do not actually do any output. Instead
4267 ** guess at how large the various <text> elements would be and where
4268 ** the will be located and expand the pBox to include them.
4269 */
4270 static void pik_append_txt(Pik *p, PElem *pElem, PBox *pBox){
4271 PNum dy; /* Half the height of a single line of text */
4272 PNum dy2; /* Extra vertical space around the center */
 
4273 int n, i, nz;
4274 PNum x, y, orig_y;
4275 const char *z;
4276 PToken *aTxt;
4277 int hasCenter = 0;
@@ -4290,42 +4407,50 @@
4290 dy2 = dy;
4291 }else if( pElem->type->isLine ){
4292 dy2 = pElem->sw;
4293 }else{
4294 dy2 = 0.0;
 
 
 
 
 
4295 }
4296 for(i=0; i<n; i++){
4297 PToken *t = &aTxt[i];
4298 PNum xtraFontScale = 1.0;
4299 orig_y = y = pElem->ptAt.y;
 
4300 if( t->eCode & TP_ABOVE2 ) y += dy2 + 3*dy;
4301 if( t->eCode & TP_ABOVE ) y += dy2 + dy;
4302 if( t->eCode & TP_BELOW ) y -= dy2 + dy;
4303 if( t->eCode & TP_BELOW2 ) y -= dy2 + 3*dy;
4304 if( t->eCode & TP_BIG ) xtraFontScale *= 1.25;
4305 if( t->eCode & TP_SMALL ) xtraFontScale *= 0.8;
4306 if( t->eCode & TP_XTRA ) xtraFontScale *= xtraFontScale;
 
 
4307
4308 if( pBox!=0 ){
4309 /* If pBox is not NULL, do not draw any <text>. Instead, just expand
4310 ** pBox to include the text */
4311 PNum cw = pik_text_length(t)*p->charWidth*xtraFontScale;
4312 PNum ch = p->charHeight*0.5*xtraFontScale;
4313 if( t->eCode & TP_RJUST ){
4314 pik_bbox_add_xy(pBox, x, y-ch);
4315 pik_bbox_add_xy(pBox, x-cw, y+ch);
4316 }else if( t->eCode & TP_LJUST ){
4317 pik_bbox_add_xy(pBox, x, y-ch);
4318 pik_bbox_add_xy(pBox, x+cw, y+ch);
4319 }else{
4320 pik_bbox_add_xy(pBox, x+cw/2, y+ch);
4321 pik_bbox_add_xy(pBox, x-cw/2, y-ch);
4322 }
4323 continue;
4324 }
4325
4326 pik_append_x(p, "<text x=\"", x, "\"");
4327 pik_append_y(p, " y=\"", y, "\"");
4328 if( t->eCode & TP_RJUST ){
4329 pik_append(p, " text-anchor=\"end\"", -1);
4330 }else if( t->eCode & TP_LJUST ){
4331 pik_append(p, " text-anchor=\"start\"", -1);
@@ -5093,14 +5218,14 @@
5093 /* Merge "text-position" flags
5094 */
5095 static int pik_text_position(Pik *p, int iPrev, PToken *pFlag){
5096 int iRes = iPrev;
5097 switch( pFlag->eType ){
5098 case T_CENTER: /* no-op */ break;
5099 case T_LJUST: iRes = (iRes&~TP_JMASK) | TP_LJUST; break;
5100 case T_RJUST: iRes = (iRes&~TP_JMASK) | TP_RJUST; break;
5101 case T_ABOVE: iRes = (iRes&~TP_VMASK) | TP_ABOVE; break;
 
5102 case T_BELOW: iRes = (iRes&~TP_VMASK) | TP_BELOW; break;
5103 case T_ITALIC: iRes |= TP_ITALIC; break;
5104 case T_BOLD: iRes |= TP_BOLD; break;
5105 case T_ALIGNED: iRes |= TP_ALIGN; break;
5106 case T_BIG: if( iRes & TP_BIG ) iRes |= TP_XTRA;
@@ -5177,11 +5302,15 @@
5177 h = hasCenter + hasSingleStack*2 + hasDoubleStack*2;
5178 }
5179 if( (pElem->mProp & A_WIDTH)==0 ){
5180 for(i=0; i<pElem->nTxt; i++){
5181 int cnt = pik_text_length(&pElem->aTxt[i]);
5182 if( (pElem->aTxt[i].eCode & TP_JMASK)!=0 ) cnt *= 2;
 
 
 
 
5183 if( cnt>w ) w = cnt;
5184 }
5185 }
5186 if( h>0 || w>0 ){
5187 pik_compute_layout_settings(p);
@@ -6528,6 +6657,6 @@
6528 printf("</body></html>\n");
6529 return 0;
6530 }
6531 #endif /* PIKCHR_SHELL */
6532
6533 #line 6558 "pikchr.c"
6534
--- src/pikchr.c
+++ src/pikchr.c
@@ -349,10 +349,11 @@
349 ** this structure. This it the "virtual method" table.
350 */
351 struct PClass {
352 const char *zName; /* Name of class */
353 char isLine; /* True if a line class */
354 char eJust; /* Use box-style text justification */
355 void (*xInit)(Pik*,PElem*); /* Initializer */
356 void (*xNumProp)(Pik*,PElem*,PToken*); /* Value change notification */
357 PPoint (*xChop)(PElem*,PPoint*); /* Chopper */
358 PPoint (*xOffset)(Pik*,PElem*,int); /* Offset from center to edge point */
359 void (*xFit)(Pik*,PElem*,PNum w,PNum h); /* Size to fit text */
@@ -422,11 +423,11 @@
423 static PPoint pik_nth_vertex(Pik *p, PToken *pNth, PToken *pErr, PElem *pElem);
424 static PToken pik_next_semantic_token(Pik *p, PToken *pThis);
425 static void pik_compute_layout_settings(Pik*);
426
427
428 #line 454 "pikchr.c"
429 /**************** End of %include directives **********************************/
430 /* These constants specify the various numeric values for terminal symbols.
431 ***************** Begin token definitions *************************************/
432 #ifndef T_ID
433 #define T_ID 1
@@ -1506,22 +1507,22 @@
1507 ** inside the C code.
1508 */
1509 /********* Begin destructor definitions ***************************************/
1510 case 86: /* element_list */
1511 {
1512 #line 443 "pikchr.y"
1513 pik_elist_free(p,(yypminor->yy120));
1514 #line 1539 "pikchr.c"
1515 }
1516 break;
1517 case 87: /* element */
1518 case 88: /* unnamed_element */
1519 case 89: /* basetype */
1520 {
1521 #line 445 "pikchr.y"
1522 pik_elem_free(p,(yypminor->yy26));
1523 #line 1548 "pikchr.c"
1524 }
1525 break;
1526 /********* End destructor definitions *****************************************/
1527 default: break; /* If no destructor action specified: do nothing */
1528 }
@@ -1735,14 +1736,14 @@
1736 #endif
1737 while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
1738 /* Here code is inserted which will execute if the parser
1739 ** stack every overflows */
1740 /******** Begin %stack_overflow code ******************************************/
1741 #line 474 "pikchr.y"
1742
1743 pik_error(p, 0, "parser stack overflow");
1744 #line 1769 "pikchr.c"
1745 /******** End %stack_overflow code ********************************************/
1746 pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
1747 pik_parserCTX_STORE
1748 }
1749
@@ -2201,566 +2202,566 @@
2202 ** break;
2203 */
2204 /********** Begin reduce actions **********************************************/
2205 YYMINORTYPE yylhsminor;
2206 case 0: /* document ::= element_list */
2207 #line 478 "pikchr.y"
2208 {pik_render(p,yymsp[0].minor.yy120);}
2209 #line 2234 "pikchr.c"
2210 break;
2211 case 1: /* element_list ::= element */
2212 #line 481 "pikchr.y"
2213 { yylhsminor.yy120 = pik_elist_append(p,0,yymsp[0].minor.yy26); }
2214 #line 2239 "pikchr.c"
2215 yymsp[0].minor.yy120 = yylhsminor.yy120;
2216 break;
2217 case 2: /* element_list ::= element_list EOL element */
2218 #line 483 "pikchr.y"
2219 { yylhsminor.yy120 = pik_elist_append(p,yymsp[-2].minor.yy120,yymsp[0].minor.yy26); }
2220 #line 2245 "pikchr.c"
2221 yymsp[-2].minor.yy120 = yylhsminor.yy120;
2222 break;
2223 case 3: /* element ::= */
2224 #line 486 "pikchr.y"
2225 { yymsp[1].minor.yy26 = 0; }
2226 #line 2251 "pikchr.c"
2227 break;
2228 case 4: /* element ::= direction */
2229 #line 487 "pikchr.y"
2230 { pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy26=0; }
2231 #line 2256 "pikchr.c"
2232 yymsp[0].minor.yy26 = yylhsminor.yy26;
2233 break;
2234 case 5: /* element ::= lvalue ASSIGN rvalue */
2235 #line 488 "pikchr.y"
2236 {pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy191,&yymsp[-1].minor.yy0); yylhsminor.yy26=0;}
2237 #line 2262 "pikchr.c"
2238 yymsp[-2].minor.yy26 = yylhsminor.yy26;
2239 break;
2240 case 6: /* element ::= PLACENAME COLON unnamed_element */
2241 #line 490 "pikchr.y"
2242 { yylhsminor.yy26 = yymsp[0].minor.yy26; pik_elem_setname(p,yymsp[0].minor.yy26,&yymsp[-2].minor.yy0); }
2243 #line 2268 "pikchr.c"
2244 yymsp[-2].minor.yy26 = yylhsminor.yy26;
2245 break;
2246 case 7: /* element ::= PLACENAME COLON position */
2247 #line 492 "pikchr.y"
2248 { yylhsminor.yy26 = pik_elem_new(p,0,0,0);
2249 if(yylhsminor.yy26){ yylhsminor.yy26->ptAt = yymsp[0].minor.yy131; pik_elem_setname(p,yylhsminor.yy26,&yymsp[-2].minor.yy0); }}
2250 #line 2275 "pikchr.c"
2251 yymsp[-2].minor.yy26 = yylhsminor.yy26;
2252 break;
2253 case 8: /* element ::= unnamed_element */
2254 #line 494 "pikchr.y"
2255 {yylhsminor.yy26 = yymsp[0].minor.yy26;}
2256 #line 2281 "pikchr.c"
2257 yymsp[0].minor.yy26 = yylhsminor.yy26;
2258 break;
2259 case 9: /* element ::= print prlist */
2260 #line 495 "pikchr.y"
2261 {pik_append(p,"<br>\n",5); yymsp[-1].minor.yy26=0;}
2262 #line 2287 "pikchr.c"
2263 break;
2264 case 10: /* rvalue ::= PLACENAME */
2265 #line 506 "pikchr.y"
2266 {yylhsminor.yy191 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2267 #line 2292 "pikchr.c"
2268 yymsp[0].minor.yy191 = yylhsminor.yy191;
2269 break;
2270 case 11: /* pritem ::= FILL */
2271 case 12: /* pritem ::= COLOR */ yytestcase(yyruleno==12);
2272 case 13: /* pritem ::= THICKNESS */ yytestcase(yyruleno==13);
2273 #line 511 "pikchr.y"
2274 {pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2275 #line 2300 "pikchr.c"
2276 break;
2277 case 14: /* pritem ::= rvalue */
2278 #line 514 "pikchr.y"
2279 {pik_append_num(p,"",yymsp[0].minor.yy191);}
2280 #line 2305 "pikchr.c"
2281 break;
2282 case 15: /* pritem ::= STRING */
2283 #line 515 "pikchr.y"
2284 {pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2285 #line 2310 "pikchr.c"
2286 break;
2287 case 16: /* prsep ::= COMMA */
2288 #line 516 "pikchr.y"
2289 {pik_append(p, " ", 1);}
2290 #line 2315 "pikchr.c"
2291 break;
2292 case 17: /* unnamed_element ::= basetype attribute_list */
2293 #line 519 "pikchr.y"
2294 {yylhsminor.yy26 = yymsp[-1].minor.yy26; pik_after_adding_attributes(p,yylhsminor.yy26);}
2295 #line 2320 "pikchr.c"
2296 yymsp[-1].minor.yy26 = yylhsminor.yy26;
2297 break;
2298 case 18: /* basetype ::= CLASSNAME */
2299 #line 521 "pikchr.y"
2300 {yylhsminor.yy26 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2301 #line 2326 "pikchr.c"
2302 yymsp[0].minor.yy26 = yylhsminor.yy26;
2303 break;
2304 case 19: /* basetype ::= STRING textposition */
2305 #line 523 "pikchr.y"
2306 {yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy60; yylhsminor.yy26 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2307 #line 2332 "pikchr.c"
2308 yymsp[-1].minor.yy26 = yylhsminor.yy26;
2309 break;
2310 case 20: /* basetype ::= LB savelist element_list RB */
2311 #line 525 "pikchr.y"
2312 { p->list = yymsp[-2].minor.yy120; yymsp[-3].minor.yy26 = pik_elem_new(p,0,0,yymsp[-1].minor.yy120); if(yymsp[-3].minor.yy26) yymsp[-3].minor.yy26->errTok = yymsp[0].minor.yy0; }
2313 #line 2338 "pikchr.c"
2314 break;
2315 case 21: /* savelist ::= */
2316 #line 530 "pikchr.y"
2317 {yymsp[1].minor.yy120 = p->list; p->list = 0;}
2318 #line 2343 "pikchr.c"
2319 break;
2320 case 22: /* attribute_list ::= expr */
2321 #line 537 "pikchr.y"
2322 { pik_add_direction(p,0,&yymsp[0].minor.yy191,0);}
2323 #line 2348 "pikchr.c"
2324 break;
2325 case 23: /* attribute_list ::= expr PERCENT */
2326 #line 538 "pikchr.y"
2327 { pik_add_direction(p,0,&yymsp[-1].minor.yy191,1);}
2328 #line 2353 "pikchr.c"
2329 break;
2330 case 24: /* attribute ::= numproperty expr PERCENT */
2331 #line 543 "pikchr.y"
2332 { pik_set_numprop(p,&yymsp[-2].minor.yy0,0.0,yymsp[-1].minor.yy191/100.0); }
2333 #line 2358 "pikchr.c"
2334 break;
2335 case 25: /* attribute ::= numproperty expr */
2336 case 28: /* attribute ::= colorproperty rvalue */ yytestcase(yyruleno==28);
2337 #line 544 "pikchr.y"
2338 { pik_set_numprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy191,0.0); }
2339 #line 2364 "pikchr.c"
2340 break;
2341 case 26: /* attribute ::= dashproperty expr */
2342 #line 545 "pikchr.y"
2343 { pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy191); }
2344 #line 2369 "pikchr.c"
2345 break;
2346 case 27: /* attribute ::= dashproperty */
2347 #line 546 "pikchr.y"
2348 { pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2349 #line 2374 "pikchr.c"
2350 break;
2351 case 29: /* attribute ::= direction expr PERCENT */
2352 #line 549 "pikchr.y"
2353 { pik_add_direction(p,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy191,1);}
2354 #line 2379 "pikchr.c"
2355 break;
2356 case 30: /* attribute ::= direction expr */
2357 #line 550 "pikchr.y"
2358 { pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy191,0);}
2359 #line 2384 "pikchr.c"
2360 break;
2361 case 31: /* attribute ::= direction */
2362 #line 551 "pikchr.y"
2363 { pik_add_direction(p,&yymsp[0].minor.yy0,0,0); }
2364 #line 2389 "pikchr.c"
2365 break;
2366 case 32: /* attribute ::= direction even position */
2367 #line 552 "pikchr.y"
2368 {pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy131);}
2369 #line 2394 "pikchr.c"
2370 break;
2371 case 33: /* attribute ::= CLOSE */
2372 #line 553 "pikchr.y"
2373 { pik_close_path(p,&yymsp[0].minor.yy0); }
2374 #line 2399 "pikchr.c"
2375 break;
2376 case 34: /* attribute ::= CHOP */
2377 #line 554 "pikchr.y"
2378 { p->cur->bChop = 1; }
2379 #line 2404 "pikchr.c"
2380 break;
2381 case 35: /* attribute ::= FROM position */
2382 #line 555 "pikchr.y"
2383 { pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy131); }
2384 #line 2409 "pikchr.c"
2385 break;
2386 case 36: /* attribute ::= TO position */
2387 #line 556 "pikchr.y"
2388 { pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy131); }
2389 #line 2414 "pikchr.c"
2390 break;
2391 case 37: /* attribute ::= THEN */
2392 #line 557 "pikchr.y"
2393 { pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2394 #line 2419 "pikchr.c"
2395 break;
2396 case 38: /* attribute ::= AT position */
2397 #line 559 "pikchr.y"
2398 { pik_set_at(p,0,&yymsp[0].minor.yy131,&yymsp[-1].minor.yy0); }
2399 #line 2424 "pikchr.c"
2400 break;
2401 case 39: /* attribute ::= SAME */
2402 #line 561 "pikchr.y"
2403 {pik_same(p,0,&yymsp[0].minor.yy0);}
2404 #line 2429 "pikchr.c"
2405 break;
2406 case 40: /* attribute ::= SAME AS object */
2407 #line 562 "pikchr.y"
2408 {pik_same(p,yymsp[0].minor.yy26,&yymsp[-2].minor.yy0);}
2409 #line 2434 "pikchr.c"
2410 break;
2411 case 41: /* attribute ::= STRING textposition */
2412 #line 563 "pikchr.y"
2413 {pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy60);}
2414 #line 2439 "pikchr.c"
2415 break;
2416 case 42: /* attribute ::= FIT */
2417 #line 564 "pikchr.y"
2418 {pik_size_to_fit(p,&yymsp[0].minor.yy0); }
2419 #line 2444 "pikchr.c"
2420 break;
2421 case 43: /* with ::= DOT_E edge AT position */
2422 case 44: /* with ::= edge AT position */ yytestcase(yyruleno==44);
2423 #line 571 "pikchr.y"
2424 { pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy131,&yymsp[-1].minor.yy0); }
2425 #line 2450 "pikchr.c"
2426 break;
2427 case 45: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2428 #line 575 "pikchr.y"
2429 {yylhsminor.yy0 = yymsp[0].minor.yy0;}
2430 #line 2455 "pikchr.c"
2431 yymsp[0].minor.yy0 = yylhsminor.yy0;
2432 break;
2433 case 46: /* boolproperty ::= CW */
2434 #line 586 "pikchr.y"
2435 {p->cur->cw = 1;}
2436 #line 2461 "pikchr.c"
2437 break;
2438 case 47: /* boolproperty ::= CCW */
2439 #line 587 "pikchr.y"
2440 {p->cur->cw = 0;}
2441 #line 2466 "pikchr.c"
2442 break;
2443 case 48: /* boolproperty ::= LARROW */
2444 #line 588 "pikchr.y"
2445 {p->cur->larrow=1; p->cur->rarrow=0; }
2446 #line 2471 "pikchr.c"
2447 break;
2448 case 49: /* boolproperty ::= RARROW */
2449 #line 589 "pikchr.y"
2450 {p->cur->larrow=0; p->cur->rarrow=1; }
2451 #line 2476 "pikchr.c"
2452 break;
2453 case 50: /* boolproperty ::= LRARROW */
2454 #line 590 "pikchr.y"
2455 {p->cur->larrow=1; p->cur->rarrow=1; }
2456 #line 2481 "pikchr.c"
2457 break;
2458 case 51: /* boolproperty ::= INVIS */
2459 #line 591 "pikchr.y"
2460 {p->cur->sw = 0.0;}
2461 #line 2486 "pikchr.c"
2462 break;
2463 case 52: /* boolproperty ::= THICK */
2464 #line 592 "pikchr.y"
2465 {p->cur->sw *= 1.5;}
2466 #line 2491 "pikchr.c"
2467 break;
2468 case 53: /* boolproperty ::= THIN */
2469 #line 593 "pikchr.y"
2470 {p->cur->sw *= 0.67;}
2471 #line 2496 "pikchr.c"
2472 break;
2473 case 54: /* textposition ::= */
2474 #line 595 "pikchr.y"
2475 {yymsp[1].minor.yy60 = 0;}
2476 #line 2501 "pikchr.c"
2477 break;
2478 case 55: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2479 #line 598 "pikchr.y"
2480 {yylhsminor.yy60 = pik_text_position(p,yymsp[-1].minor.yy60,&yymsp[0].minor.yy0);}
2481 #line 2506 "pikchr.c"
2482 yymsp[-1].minor.yy60 = yylhsminor.yy60;
2483 break;
2484 case 56: /* position ::= expr COMMA expr */
2485 #line 601 "pikchr.y"
2486 {yylhsminor.yy131.x=yymsp[-2].minor.yy191; yylhsminor.yy131.y=yymsp[0].minor.yy191;}
2487 #line 2512 "pikchr.c"
2488 yymsp[-2].minor.yy131 = yylhsminor.yy131;
2489 break;
2490 case 57: /* position ::= place PLUS expr COMMA expr */
2491 #line 603 "pikchr.y"
2492 {yylhsminor.yy131.x=yymsp[-4].minor.yy131.x+yymsp[-2].minor.yy191; yylhsminor.yy131.y=yymsp[-4].minor.yy131.y+yymsp[0].minor.yy191;}
2493 #line 2518 "pikchr.c"
2494 yymsp[-4].minor.yy131 = yylhsminor.yy131;
2495 break;
2496 case 58: /* position ::= place MINUS expr COMMA expr */
2497 #line 604 "pikchr.y"
2498 {yylhsminor.yy131.x=yymsp[-4].minor.yy131.x-yymsp[-2].minor.yy191; yylhsminor.yy131.y=yymsp[-4].minor.yy131.y-yymsp[0].minor.yy191;}
2499 #line 2524 "pikchr.c"
2500 yymsp[-4].minor.yy131 = yylhsminor.yy131;
2501 break;
2502 case 59: /* position ::= place PLUS LP expr COMMA expr RP */
2503 #line 606 "pikchr.y"
2504 {yylhsminor.yy131.x=yymsp[-6].minor.yy131.x+yymsp[-3].minor.yy191; yylhsminor.yy131.y=yymsp[-6].minor.yy131.y+yymsp[-1].minor.yy191;}
2505 #line 2530 "pikchr.c"
2506 yymsp[-6].minor.yy131 = yylhsminor.yy131;
2507 break;
2508 case 60: /* position ::= place MINUS LP expr COMMA expr RP */
2509 #line 608 "pikchr.y"
2510 {yylhsminor.yy131.x=yymsp[-6].minor.yy131.x-yymsp[-3].minor.yy191; yylhsminor.yy131.y=yymsp[-6].minor.yy131.y-yymsp[-1].minor.yy191;}
2511 #line 2536 "pikchr.c"
2512 yymsp[-6].minor.yy131 = yylhsminor.yy131;
2513 break;
2514 case 61: /* position ::= LP position COMMA position RP */
2515 #line 609 "pikchr.y"
2516 {yymsp[-4].minor.yy131.x=yymsp[-3].minor.yy131.x; yymsp[-4].minor.yy131.y=yymsp[-1].minor.yy131.y;}
2517 #line 2542 "pikchr.c"
2518 break;
2519 case 62: /* position ::= LP position RP */
2520 #line 610 "pikchr.y"
2521 {yymsp[-2].minor.yy131=yymsp[-1].minor.yy131;}
2522 #line 2547 "pikchr.c"
2523 break;
2524 case 63: /* position ::= expr between position AND position */
2525 #line 612 "pikchr.y"
2526 {yylhsminor.yy131 = pik_position_between(p,yymsp[-4].minor.yy191,yymsp[-2].minor.yy131,yymsp[0].minor.yy131);}
2527 #line 2552 "pikchr.c"
2528 yymsp[-4].minor.yy131 = yylhsminor.yy131;
2529 break;
2530 case 64: /* position ::= expr ABOVE position */
2531 #line 613 "pikchr.y"
2532 {yylhsminor.yy131=yymsp[0].minor.yy131; yylhsminor.yy131.y += yymsp[-2].minor.yy191;}
2533 #line 2558 "pikchr.c"
2534 yymsp[-2].minor.yy131 = yylhsminor.yy131;
2535 break;
2536 case 65: /* position ::= expr BELOW position */
2537 #line 614 "pikchr.y"
2538 {yylhsminor.yy131=yymsp[0].minor.yy131; yylhsminor.yy131.y -= yymsp[-2].minor.yy191;}
2539 #line 2564 "pikchr.c"
2540 yymsp[-2].minor.yy131 = yylhsminor.yy131;
2541 break;
2542 case 66: /* position ::= expr LEFT OF position */
2543 #line 615 "pikchr.y"
2544 {yylhsminor.yy131=yymsp[0].minor.yy131; yylhsminor.yy131.x -= yymsp[-3].minor.yy191;}
2545 #line 2570 "pikchr.c"
2546 yymsp[-3].minor.yy131 = yylhsminor.yy131;
2547 break;
2548 case 67: /* position ::= expr RIGHT OF position */
2549 #line 616 "pikchr.y"
2550 {yylhsminor.yy131=yymsp[0].minor.yy131; yylhsminor.yy131.x += yymsp[-3].minor.yy191;}
2551 #line 2576 "pikchr.c"
2552 yymsp[-3].minor.yy131 = yylhsminor.yy131;
2553 break;
2554 case 68: /* position ::= expr EDGEPT OF position */
2555 #line 618 "pikchr.y"
2556 {yylhsminor.yy131 = pik_position_at_hdg(p,yymsp[-3].minor.yy191,&yymsp[-2].minor.yy0,yymsp[0].minor.yy131);}
2557 #line 2582 "pikchr.c"
2558 yymsp[-3].minor.yy131 = yylhsminor.yy131;
2559 break;
2560 case 69: /* position ::= expr HEADING expr FROM position */
2561 #line 620 "pikchr.y"
2562 {yylhsminor.yy131 = pik_position_at_angle(p,yymsp[-4].minor.yy191,yymsp[-2].minor.yy191,yymsp[0].minor.yy131);}
2563 #line 2588 "pikchr.c"
2564 yymsp[-4].minor.yy131 = yylhsminor.yy131;
2565 break;
2566 case 70: /* place ::= object */
2567 #line 626 "pikchr.y"
2568 {yylhsminor.yy131 = pik_place_of_elem(p,yymsp[0].minor.yy26,0);}
2569 #line 2594 "pikchr.c"
2570 yymsp[0].minor.yy131 = yylhsminor.yy131;
2571 break;
2572 case 71: /* place ::= object DOT_E edge */
2573 case 72: /* place ::= object DOT_L START */ yytestcase(yyruleno==72);
2574 case 73: /* place ::= object DOT_L END */ yytestcase(yyruleno==73);
2575 #line 627 "pikchr.y"
2576 {yylhsminor.yy131 = pik_place_of_elem(p,yymsp[-2].minor.yy26,&yymsp[0].minor.yy0);}
2577 #line 2602 "pikchr.c"
2578 yymsp[-2].minor.yy131 = yylhsminor.yy131;
2579 break;
2580 case 74: /* place ::= START OF object */
2581 case 75: /* place ::= END OF object */ yytestcase(yyruleno==75);
2582 case 76: /* place ::= edge OF object */ yytestcase(yyruleno==76);
2583 #line 630 "pikchr.y"
2584 {yylhsminor.yy131 = pik_place_of_elem(p,yymsp[0].minor.yy26,&yymsp[-2].minor.yy0);}
2585 #line 2610 "pikchr.c"
2586 yymsp[-2].minor.yy131 = yylhsminor.yy131;
2587 break;
2588 case 77: /* place ::= NTH VERTEX OF object */
2589 #line 633 "pikchr.y"
2590 {yylhsminor.yy131 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy26);}
2591 #line 2616 "pikchr.c"
2592 yymsp[-3].minor.yy131 = yylhsminor.yy131;
2593 break;
2594 case 78: /* object ::= nth */
2595 #line 636 "pikchr.y"
2596 {yylhsminor.yy26 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2597 #line 2622 "pikchr.c"
2598 yymsp[0].minor.yy26 = yylhsminor.yy26;
2599 break;
2600 case 79: /* object ::= nth OF|IN object */
2601 #line 637 "pikchr.y"
2602 {yylhsminor.yy26 = pik_find_nth(p,yymsp[0].minor.yy26,&yymsp[-2].minor.yy0);}
2603 #line 2628 "pikchr.c"
2604 yymsp[-2].minor.yy26 = yylhsminor.yy26;
2605 break;
2606 case 80: /* objectname ::= PLACENAME */
2607 #line 639 "pikchr.y"
2608 {yylhsminor.yy26 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2609 #line 2634 "pikchr.c"
2610 yymsp[0].minor.yy26 = yylhsminor.yy26;
2611 break;
2612 case 81: /* objectname ::= objectname DOT_U PLACENAME */
2613 #line 641 "pikchr.y"
2614 {yylhsminor.yy26 = pik_find_byname(p,yymsp[-2].minor.yy26,&yymsp[0].minor.yy0);}
2615 #line 2640 "pikchr.c"
2616 yymsp[-2].minor.yy26 = yylhsminor.yy26;
2617 break;
2618 case 82: /* nth ::= NTH CLASSNAME */
2619 #line 643 "pikchr.y"
2620 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2621 #line 2646 "pikchr.c"
2622 yymsp[-1].minor.yy0 = yylhsminor.yy0;
2623 break;
2624 case 83: /* nth ::= NTH LAST CLASSNAME */
2625 #line 644 "pikchr.y"
2626 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2627 #line 2652 "pikchr.c"
2628 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2629 break;
2630 case 84: /* nth ::= LAST CLASSNAME */
2631 #line 645 "pikchr.y"
2632 {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2633 #line 2658 "pikchr.c"
2634 break;
2635 case 85: /* nth ::= LAST */
2636 #line 646 "pikchr.y"
2637 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2638 #line 2663 "pikchr.c"
2639 yymsp[0].minor.yy0 = yylhsminor.yy0;
2640 break;
2641 case 86: /* nth ::= NTH LB RB */
2642 #line 647 "pikchr.y"
2643 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2644 #line 2669 "pikchr.c"
2645 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2646 break;
2647 case 87: /* nth ::= NTH LAST LB RB */
2648 #line 648 "pikchr.y"
2649 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2650 #line 2675 "pikchr.c"
2651 yymsp[-3].minor.yy0 = yylhsminor.yy0;
2652 break;
2653 case 88: /* nth ::= LAST LB RB */
2654 #line 649 "pikchr.y"
2655 {yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2656 #line 2681 "pikchr.c"
2657 break;
2658 case 89: /* expr ::= expr PLUS expr */
2659 #line 651 "pikchr.y"
2660 {yylhsminor.yy191=yymsp[-2].minor.yy191+yymsp[0].minor.yy191;}
2661 #line 2686 "pikchr.c"
2662 yymsp[-2].minor.yy191 = yylhsminor.yy191;
2663 break;
2664 case 90: /* expr ::= expr MINUS expr */
2665 #line 652 "pikchr.y"
2666 {yylhsminor.yy191=yymsp[-2].minor.yy191-yymsp[0].minor.yy191;}
2667 #line 2692 "pikchr.c"
2668 yymsp[-2].minor.yy191 = yylhsminor.yy191;
2669 break;
2670 case 91: /* expr ::= expr STAR expr */
2671 #line 653 "pikchr.y"
2672 {yylhsminor.yy191=yymsp[-2].minor.yy191*yymsp[0].minor.yy191;}
2673 #line 2698 "pikchr.c"
2674 yymsp[-2].minor.yy191 = yylhsminor.yy191;
2675 break;
2676 case 92: /* expr ::= expr SLASH expr */
2677 #line 654 "pikchr.y"
2678 {
2679 if( yymsp[0].minor.yy191==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy191 = 0.0; }
2680 else{ yylhsminor.yy191 = yymsp[-2].minor.yy191/yymsp[0].minor.yy191; }
2681 }
2682 #line 2707 "pikchr.c"
2683 yymsp[-2].minor.yy191 = yylhsminor.yy191;
2684 break;
2685 case 93: /* expr ::= MINUS expr */
2686 #line 658 "pikchr.y"
2687 {yymsp[-1].minor.yy191=-yymsp[0].minor.yy191;}
2688 #line 2713 "pikchr.c"
2689 break;
2690 case 94: /* expr ::= PLUS expr */
2691 #line 659 "pikchr.y"
2692 {yymsp[-1].minor.yy191=yymsp[0].minor.yy191;}
2693 #line 2718 "pikchr.c"
2694 break;
2695 case 95: /* expr ::= LP expr RP */
2696 #line 660 "pikchr.y"
2697 {yymsp[-2].minor.yy191=yymsp[-1].minor.yy191;}
2698 #line 2723 "pikchr.c"
2699 break;
2700 case 96: /* expr ::= NUMBER */
2701 #line 661 "pikchr.y"
2702 {yylhsminor.yy191=pik_atof(p,&yymsp[0].minor.yy0);}
2703 #line 2728 "pikchr.c"
2704 yymsp[0].minor.yy191 = yylhsminor.yy191;
2705 break;
2706 case 97: /* expr ::= ID */
2707 #line 662 "pikchr.y"
2708 {yylhsminor.yy191=pik_get_var(p,&yymsp[0].minor.yy0);}
2709 #line 2734 "pikchr.c"
2710 yymsp[0].minor.yy191 = yylhsminor.yy191;
2711 break;
2712 case 98: /* expr ::= FUNC1 LP expr RP */
2713 #line 663 "pikchr.y"
2714 {yylhsminor.yy191 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy191,0.0);}
2715 #line 2740 "pikchr.c"
2716 yymsp[-3].minor.yy191 = yylhsminor.yy191;
2717 break;
2718 case 99: /* expr ::= FUNC2 LP expr COMMA expr RP */
2719 #line 664 "pikchr.y"
2720 {yylhsminor.yy191 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy191,yymsp[-1].minor.yy191);}
2721 #line 2746 "pikchr.c"
2722 yymsp[-5].minor.yy191 = yylhsminor.yy191;
2723 break;
2724 case 100: /* expr ::= object DOT_L locproperty */
2725 case 101: /* expr ::= object DOT_L numproperty */ yytestcase(yyruleno==101);
2726 case 102: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==102);
2727 case 103: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==103);
2728 #line 666 "pikchr.y"
2729 {yylhsminor.yy191=pik_property_of(p,yymsp[-2].minor.yy26,&yymsp[0].minor.yy0);}
2730 #line 2755 "pikchr.c"
2731 yymsp[-2].minor.yy191 = yylhsminor.yy191;
2732 break;
2733 case 104: /* expr ::= object DOT_E edge DOT_L X */
2734 #line 670 "pikchr.y"
2735 {yylhsminor.yy191=pik_place_of_elem(p,yymsp[-4].minor.yy26,&yymsp[-2].minor.yy0).x;}
2736 #line 2761 "pikchr.c"
2737 yymsp[-4].minor.yy191 = yylhsminor.yy191;
2738 break;
2739 case 105: /* expr ::= object DOT_E edge DOT_L Y */
2740 #line 671 "pikchr.y"
2741 {yylhsminor.yy191=pik_place_of_elem(p,yymsp[-4].minor.yy26,&yymsp[-2].minor.yy0).y;}
2742 #line 2767 "pikchr.c"
2743 yymsp[-4].minor.yy191 = yylhsminor.yy191;
2744 break;
2745 case 106: /* expr ::= LP locproperty OF object RP */
2746 case 107: /* expr ::= LP dashproperty OF object RP */ yytestcase(yyruleno==107);
2747 case 108: /* expr ::= LP numproperty OF object RP */ yytestcase(yyruleno==108);
2748 case 109: /* expr ::= LP colorproperty OF object RP */ yytestcase(yyruleno==109);
2749 #line 672 "pikchr.y"
2750 {yymsp[-4].minor.yy191=pik_property_of(p,yymsp[-1].minor.yy26,&yymsp[-3].minor.yy0);}
2751 #line 2776 "pikchr.c"
2752 break;
2753 case 110: /* expr ::= NTH VERTEX OF object DOT_L X */
2754 #line 678 "pikchr.y"
2755 {yylhsminor.yy191 = pik_nth_vertex(p,&yymsp[-5].minor.yy0,&yymsp[-4].minor.yy0,yymsp[-2].minor.yy26).x;}
2756 #line 2781 "pikchr.c"
2757 yymsp[-5].minor.yy191 = yylhsminor.yy191;
2758 break;
2759 case 111: /* expr ::= NTH VERTEX OF object DOT_L Y */
2760 #line 680 "pikchr.y"
2761 {yylhsminor.yy191 = pik_nth_vertex(p,&yymsp[-5].minor.yy0,&yymsp[-4].minor.yy0,yymsp[-2].minor.yy26).y;}
2762 #line 2787 "pikchr.c"
2763 yymsp[-5].minor.yy191 = yylhsminor.yy191;
2764 break;
2765 default:
2766 /* (112) lvalue ::= ID */ yytestcase(yyruleno==112);
2767 /* (113) lvalue ::= FILL */ yytestcase(yyruleno==113);
@@ -2855,18 +2856,18 @@
2856 ){
2857 pik_parserARG_FETCH
2858 pik_parserCTX_FETCH
2859 #define TOKEN yyminor
2860 /************ Begin %syntax_error code ****************************************/
2861 #line 467 "pikchr.y"
2862
2863 if( TOKEN.z && TOKEN.z[0] ){
2864 pik_error(p, &TOKEN, "syntax error");
2865 }else{
2866 pik_error(p, 0, "syntax error");
2867 }
2868 #line 2893 "pikchr.c"
2869 /************ End %syntax_error code ******************************************/
2870 pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
2871 pik_parserCTX_STORE
2872 }
2873
@@ -3095,11 +3096,11 @@
3096 #else
3097 (void)iToken;
3098 return 0;
3099 #endif
3100 }
3101 #line 690 "pikchr.y"
3102
3103
3104
3105 /* Chart of the 140 official HTML color names with their
3106 ** corresponding RGB value.
@@ -3284,10 +3285,13 @@
3285 { "cylwid", 0.75 },
3286 { "dashwid", 0.05 },
3287 { "dotrad", 0.015 },
3288 { "ellipseht", 0.5 },
3289 { "ellipsewid", 0.75 },
3290 { "fileht", 0.75 },
3291 { "filerad", 0.15 },
3292 { "filewid", 0.5 },
3293 { "fill", -1.0 },
3294 { "lineht", 0.5 },
3295 { "linewid", 0.5 },
3296 { "movewid", 0.5 },
3297 { "ovalht", 0.5 },
@@ -3669,10 +3673,73 @@
3673 pik_append_style(p,pElem);
3674 pik_append(p,"\" />\n", -1);
3675 }
3676 pik_append_txt(p, pElem, 0);
3677 }
3678
3679 /* Methods for the "file" object */
3680 static void fileInit(Pik *p, PElem *pElem){
3681 pElem->w = pik_value(p, "filewid",7,0);
3682 pElem->h = pik_value(p, "fileht",6,0);
3683 pElem->rad = pik_value(p, "filerad",7,0);
3684 }
3685 /* Return offset from the center of the box to the compass point
3686 ** given by parameter cp */
3687 static PPoint fileOffset(Pik *p, PElem *pElem, int cp){
3688 PPoint pt;
3689 PNum w2 = 0.5*pElem->w;
3690 PNum h2 = 0.5*pElem->h;
3691 PNum rx = pElem->rad;
3692 PNum mn = w2<h2 ? w2 : h2;
3693 if( rx>mn ) rx = mn;
3694 if( rx<mn*0.25 ) rx = mn*0.25;
3695 pt.x = pt.y = 0.0;
3696 rx *= 0.5;
3697 switch( cp ){
3698 case CP_C: pt.x = 0.0; pt.y = 0.0; break;
3699 case CP_N: pt.x = 0.0; pt.y = h2; break;
3700 case CP_NE: pt.x = w2-rx; pt.y = h2-rx; break;
3701 case CP_E: pt.x = w2; pt.y = 0.0; break;
3702 case CP_SE: pt.x = w2; pt.y = -h2; break;
3703 case CP_S: pt.x = 0.0; pt.y = -h2; break;
3704 case CP_SW: pt.x = -w2; pt.y = -h2; break;
3705 case CP_W: pt.x = -w2; pt.y = 0.0; break;
3706 case CP_NW: pt.x = -w2; pt.y = h2; break;
3707 }
3708 return pt;
3709 }
3710 static void fileFit(Pik *p, PElem *pElem, PNum w, PNum h){
3711 if( w>0 ) pElem->w = w;
3712 if( h>0 ) pElem->h = h + 2*pElem->rad;
3713 }
3714 static void fileRender(Pik *p, PElem *pElem){
3715 PNum w2 = 0.5*pElem->w;
3716 PNum h2 = 0.5*pElem->h;
3717 PNum rad = pElem->rad;
3718 PPoint pt = pElem->ptAt;
3719 PNum mn = w2<h2 ? w2 : h2;
3720 if( rad>mn ) rad = mn;
3721 if( rad<mn*0.25 ) rad = mn*0.25;
3722 if( pElem->sw>0.0 ){
3723 pik_append_xy(p,"<path d=\"M", pt.x-w2,pt.y-h2);
3724 pik_append_xy(p,"L", pt.x+w2,pt.y-h2);
3725 pik_append_xy(p,"L", pt.x+w2,pt.y+(h2-rad));
3726 pik_append_xy(p,"L", pt.x+(w2-rad),pt.y+h2);
3727 pik_append_xy(p,"L", pt.x-w2,pt.y+h2);
3728 pik_append(p,"Z\" ",-1);
3729 pik_append_style(p,pElem);
3730 pik_append(p,"\" />\n",-1);
3731 pik_append_xy(p,"<path d=\"M", pt.x+(w2-rad), pt.y+h2);
3732 pik_append_xy(p,"L", pt.x+(w2-rad),pt.y+(h2-rad));
3733 pik_append_xy(p,"L", pt.x+w2, pt.y+(h2-rad));
3734 pik_append(p,"\" ",-1);
3735 pik_append_style(p,pElem);
3736 pik_append(p,"\" />\n",-1);
3737 }
3738 pik_append_txt(p, pElem, 0);
3739 }
3740
3741
3742 /* Methods for the "line" class */
3743 static void lineInit(Pik *p, PElem *pElem){
3744 pElem->w = pik_value(p, "linewid",7,0);
3745 pElem->h = pik_value(p, "lineht",6,0);
@@ -3838,109 +3905,131 @@
3905 ** elements. The special STRING and [] elements are separate.
3906 */
3907 static const PClass aClass[] = {
3908 { /* name */ "arc",
3909 /* isline */ 1,
3910 /* eJust */ 0,
3911 /* xInit */ arcInit,
3912 /* xNumProp */ 0,
3913 /* xChop */ 0,
3914 /* xOffset */ 0,
3915 /* xFit */ 0,
3916 /* xRender */ arcRender
3917 },
3918 { /* name */ "arrow",
3919 /* isline */ 1,
3920 /* eJust */ 0,
3921 /* xInit */ arrowInit,
3922 /* xNumProp */ 0,
3923 /* xChop */ 0,
3924 /* xOffset */ 0,
3925 /* xFit */ 0,
3926 /* xRender */ splineRender
3927 },
3928 { /* name */ "box",
3929 /* isline */ 0,
3930 /* eJust */ 1,
3931 /* xInit */ boxInit,
3932 /* xNumProp */ 0,
3933 /* xChop */ boxChop,
3934 /* xOffset */ boxOffset,
3935 /* xFit */ boxFit,
3936 /* xRender */ boxRender
3937 },
3938 { /* name */ "circle",
3939 /* isline */ 0,
3940 /* eJust */ 0,
3941 /* xInit */ circleInit,
3942 /* xNumProp */ circleNumProp,
3943 /* xChop */ circleChop,
3944 /* xOffset */ ellipseOffset,
3945 /* xFit */ circleFit,
3946 /* xRender */ circleRender
3947 },
3948 { /* name */ "cylinder",
3949 /* isline */ 0,
3950 /* eJust */ 1,
3951 /* xInit */ cylinderInit,
3952 /* xNumProp */ 0,
3953 /* xChop */ boxChop,
3954 /* xOffset */ cylinderOffset,
3955 /* xFit */ 0,
3956 /* xRender */ cylinderRender
3957 },
3958 { /* name */ "dot",
3959 /* isline */ 0,
3960 /* eJust */ 0,
3961 /* xInit */ dotInit,
3962 /* xNumProp */ dotNumProp,
3963 /* xChop */ circleChop,
3964 /* xOffset */ ellipseOffset,
3965 /* xFit */ 0,
3966 /* xRender */ dotRender
3967 },
3968 { /* name */ "ellipse",
3969 /* isline */ 0,
3970 /* eJust */ 0,
3971 /* xInit */ ellipseInit,
3972 /* xNumProp */ 0,
3973 /* xChop */ ellipseChop,
3974 /* xOffset */ ellipseOffset,
3975 /* xFit */ 0,
3976 /* xRender */ ellipseRender
3977 },
3978 { /* name */ "file",
3979 /* isline */ 0,
3980 /* eJust */ 1,
3981 /* xInit */ fileInit,
3982 /* xNumProp */ 0,
3983 /* xChop */ boxChop,
3984 /* xOffset */ fileOffset,
3985 /* xFit */ fileFit,
3986 /* xRender */ fileRender
3987 },
3988 { /* name */ "line",
3989 /* isline */ 1,
3990 /* eJust */ 0,
3991 /* xInit */ lineInit,
3992 /* xNumProp */ 0,
3993 /* xChop */ 0,
3994 /* xOffset */ 0,
3995 /* xFit */ 0,
3996 /* xRender */ splineRender
3997 },
3998 { /* name */ "move",
3999 /* isline */ 1,
4000 /* eJust */ 0,
4001 /* xInit */ moveInit,
4002 /* xNumProp */ 0,
4003 /* xChop */ 0,
4004 /* xOffset */ 0,
4005 /* xFit */ 0,
4006 /* xRender */ moveRender
4007 },
4008 { /* name */ "oval",
4009 /* isline */ 0,
4010 /* eJust */ 1,
4011 /* xInit */ ovalInit,
4012 /* xNumProp */ ovalNumProp,
4013 /* xChop */ boxChop,
4014 /* xOffset */ boxOffset,
4015 /* xFit */ ovalFit,
4016 /* xRender */ boxRender
4017 },
4018 { /* name */ "spline",
4019 /* isline */ 1,
4020 /* eJust */ 0,
4021 /* xInit */ splineInit,
4022 /* xNumProp */ 0,
4023 /* xChop */ 0,
4024 /* xOffset */ 0,
4025 /* xFit */ 0,
4026 /* xRender */ splineRender
4027 },
4028 { /* name */ "text",
4029 /* isline */ 0,
4030 /* eJust */ 0,
4031 /* xInit */ textInit,
4032 /* xNumProp */ 0,
4033 /* xChop */ boxChop,
4034 /* xOffset */ boxOffset,
4035 /* xFit */ 0,
@@ -3948,10 +4037,11 @@
4037 },
4038 };
4039 static const PClass sublistClass =
4040 { /* name */ "[]",
4041 /* isline */ 0,
4042 /* eJust */ 0,
4043 /* xInit */ sublistInit,
4044 /* xNumProp */ 0,
4045 /* xChop */ 0,
4046 /* xOffset */ 0,
4047 /* xFit */ 0,
@@ -3958,10 +4048,11 @@
4048 /* xRender */ 0
4049 };
4050 static const PClass noopClass =
4051 { /* name */ "noop",
4052 /* isline */ 0,
4053 /* eJust */ 0,
4054 /* xInit */ 0,
4055 /* xNumProp */ 0,
4056 /* xChop */ 0,
4057 /* xOffset */ 0,
4058 /* xFit */ 0,
@@ -4218,42 +4309,59 @@
4309 }
4310 }else{
4311 int allSlots = 0;
4312 int aFree[5];
4313 int iSlot;
4314 int j, mJust;
4315 /* If there is more than one TP_ABOVE, change the first to TP_ABOVE2. */
4316 for(j=mJust=0, i=n-1; i>=0; i--){
4317 if( aTxt[i].eCode & TP_ABOVE ){
4318 if( j==0 ){
4319 j++;
4320 mJust = aTxt[i].eCode & TP_JMASK;
4321 }else if( j==1 && mJust!=0 && (aTxt[i].eCode & mJust)==0 ){
4322 j++;
4323 }else{
4324 aTxt[i].eCode = (aTxt[i].eCode & ~TP_VMASK) | TP_ABOVE2;
4325 break;
4326 }
4327 }
4328 }
4329 /* If more than one TP_BELOW, change the last to TP_BELOW2 */
4330 for(j=mJust=0, i=0; i<n; i++){
4331 if( aTxt[i].eCode & TP_BELOW ){
4332 if( j==0 ){
4333 j++;
4334 mJust = aTxt[i].eCode & TP_JMASK;
4335 }else if( j==1 && mJust!=0 && (aTxt[i].eCode & mJust)==0 ){
4336 j++;
4337 }else{
4338 aTxt[i].eCode = (aTxt[i].eCode & ~TP_VMASK) | TP_BELOW2;
4339 break;
4340 }
4341 }
4342 }
4343 /* Compute a mask of all slots used */
4344 for(i=0; i<n; i++) allSlots |= aTxt[i].eCode & TP_VMASK;
4345 /* Set of an array of available slots */
4346 if( n==2
4347 && ((aTxt[0].eCode|aTxt[1].eCode)&TP_JMASK)==(TP_LJUST|TP_RJUST)
4348 ){
4349 /* Special case of two texts that have opposite justification:
4350 ** Allow them both to float to center. */
4351 iSlot = 2;
4352 aFree[0] = aFree[1] = TP_CENTER;
4353 }else{
4354 /* Set up the arrow so that available slots are filled from top to
4355 ** bottom */
4356 iSlot = 0;
4357 if( n>=4 && (allSlots & TP_ABOVE2)==0 ) aFree[iSlot++] = TP_ABOVE2;
4358 if( (allSlots & TP_ABOVE)==0 ) aFree[iSlot++] = TP_ABOVE;
4359 if( (n&1)!=0 ) aFree[iSlot++] = TP_CENTER;
4360 if( (allSlots & TP_BELOW)==0 ) aFree[iSlot++] = TP_BELOW;
4361 if( n>=4 && (allSlots & TP_BELOW2)==0 ) aFree[iSlot++] = TP_BELOW2;
4362 }
4363 /* Set the VMASK for all unassigned texts */
4364 for(i=iSlot=0; i<n; i++){
4365 if( (aTxt[i].eCode & TP_VMASK)==0 ){
4366 aTxt[i].eCode |= aFree[iSlot++];
4367 }
@@ -4260,18 +4368,27 @@
4368 }
4369 }
4370 }
4371
4372 /* Append multiple <text> SGV element for the text fields of the PElem.
4373 ** Parameters:
4374 **
4375 ** p The Pik object into which we are rendering
4376 **
4377 ** pElem Object containing the text to be rendered
4378 **
4379 ** jw LJUST text is shifted to the left by this amount.
4380 ** RJUST text is shifted to the right.
4381 **
4382 ** pBox If not NULL, do no rendering at all. Instead
4383 ** expand the box object so that it will include all
4384 ** of the text.
4385 */
4386 static void pik_append_txt(Pik *p, PElem *pElem, PBox *pBox){
4387 PNum dy; /* Half the height of a single line of text */
4388 PNum dy2; /* Extra vertical space around the center */
4389 PNum jw; /* Justification margin relative to center */
4390 int n, i, nz;
4391 PNum x, y, orig_y;
4392 const char *z;
4393 PToken *aTxt;
4394 int hasCenter = 0;
@@ -4290,42 +4407,50 @@
4407 dy2 = dy;
4408 }else if( pElem->type->isLine ){
4409 dy2 = pElem->sw;
4410 }else{
4411 dy2 = 0.0;
4412 }
4413 if( pElem->type->eJust==1 ){
4414 jw = 0.5*(pElem->w - 0.5*(p->charWidth + pElem->sw));
4415 }else{
4416 jw = 0.0;
4417 }
4418 for(i=0; i<n; i++){
4419 PToken *t = &aTxt[i];
4420 PNum xtraFontScale = 1.0;
4421 orig_y = y = pElem->ptAt.y;
4422 PNum nx = x;
4423 if( t->eCode & TP_ABOVE2 ) y += dy2 + 3*dy;
4424 if( t->eCode & TP_ABOVE ) y += dy2 + dy;
4425 if( t->eCode & TP_BELOW ) y -= dy2 + dy;
4426 if( t->eCode & TP_BELOW2 ) y -= dy2 + 3*dy;
4427 if( t->eCode & TP_BIG ) xtraFontScale *= 1.25;
4428 if( t->eCode & TP_SMALL ) xtraFontScale *= 0.8;
4429 if( t->eCode & TP_XTRA ) xtraFontScale *= xtraFontScale;
4430 if( t->eCode & TP_LJUST ) nx -= jw;
4431 if( t->eCode & TP_RJUST ) nx += jw;
4432
4433 if( pBox!=0 ){
4434 /* If pBox is not NULL, do not draw any <text>. Instead, just expand
4435 ** pBox to include the text */
4436 PNum cw = pik_text_length(t)*p->charWidth*xtraFontScale;
4437 PNum ch = p->charHeight*0.5*xtraFontScale;
4438 if( t->eCode & TP_RJUST ){
4439 pik_bbox_add_xy(pBox, nx, y-ch);
4440 pik_bbox_add_xy(pBox, nx-cw, y+ch);
4441 }else if( t->eCode & TP_LJUST ){
4442 pik_bbox_add_xy(pBox, nx, y-ch);
4443 pik_bbox_add_xy(pBox, nx+cw, y+ch);
4444 }else{
4445 pik_bbox_add_xy(pBox, nx+cw/2, y+ch);
4446 pik_bbox_add_xy(pBox, nx-cw/2, y-ch);
4447 }
4448 continue;
4449 }
4450
4451 pik_append_x(p, "<text x=\"", nx, "\"");
4452 pik_append_y(p, " y=\"", y, "\"");
4453 if( t->eCode & TP_RJUST ){
4454 pik_append(p, " text-anchor=\"end\"", -1);
4455 }else if( t->eCode & TP_LJUST ){
4456 pik_append(p, " text-anchor=\"start\"", -1);
@@ -5093,14 +5218,14 @@
5218 /* Merge "text-position" flags
5219 */
5220 static int pik_text_position(Pik *p, int iPrev, PToken *pFlag){
5221 int iRes = iPrev;
5222 switch( pFlag->eType ){
 
5223 case T_LJUST: iRes = (iRes&~TP_JMASK) | TP_LJUST; break;
5224 case T_RJUST: iRes = (iRes&~TP_JMASK) | TP_RJUST; break;
5225 case T_ABOVE: iRes = (iRes&~TP_VMASK) | TP_ABOVE; break;
5226 case T_CENTER: iRes = (iRes&~TP_VMASK) | TP_CENTER; break;
5227 case T_BELOW: iRes = (iRes&~TP_VMASK) | TP_BELOW; break;
5228 case T_ITALIC: iRes |= TP_ITALIC; break;
5229 case T_BOLD: iRes |= TP_BOLD; break;
5230 case T_ALIGNED: iRes |= TP_ALIGN; break;
5231 case T_BIG: if( iRes & TP_BIG ) iRes |= TP_XTRA;
@@ -5177,11 +5302,15 @@
5302 h = hasCenter + hasSingleStack*2 + hasDoubleStack*2;
5303 }
5304 if( (pElem->mProp & A_WIDTH)==0 ){
5305 for(i=0; i<pElem->nTxt; i++){
5306 int cnt = pik_text_length(&pElem->aTxt[i]);
5307 if( pElem->type->eJust==0
5308 && (pElem->aTxt[i].eCode & TP_JMASK)!=0
5309 ){
5310 cnt *= 2;
5311 }
5312 if( cnt>w ) w = cnt;
5313 }
5314 }
5315 if( h>0 || w>0 ){
5316 pik_compute_layout_settings(p);
@@ -6528,6 +6657,6 @@
6657 printf("</body></html>\n");
6658 return 0;
6659 }
6660 #endif /* PIKCHR_SHELL */
6661
6662 #line 6687 "pikchr.c"
6663

Keyboard Shortcuts

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