Fossil SCM
Import the latest version of pikchr that supports the "file" object type.
Commit
b01fae602d9387fa52012432993dd8c5a58360a03510b253acac3736dabde7a3
Parent
c304b4ffdf163ae…
1 file changed
+359
-230
+359
-230
| --- src/pikchr.c | ||
| +++ src/pikchr.c | ||
| @@ -349,10 +349,11 @@ | ||
| 349 | 349 | ** this structure. This it the "virtual method" table. |
| 350 | 350 | */ |
| 351 | 351 | struct PClass { |
| 352 | 352 | const char *zName; /* Name of class */ |
| 353 | 353 | char isLine; /* True if a line class */ |
| 354 | + char eJust; /* Use box-style text justification */ | |
| 354 | 355 | void (*xInit)(Pik*,PElem*); /* Initializer */ |
| 355 | 356 | void (*xNumProp)(Pik*,PElem*,PToken*); /* Value change notification */ |
| 356 | 357 | PPoint (*xChop)(PElem*,PPoint*); /* Chopper */ |
| 357 | 358 | PPoint (*xOffset)(Pik*,PElem*,int); /* Offset from center to edge point */ |
| 358 | 359 | void (*xFit)(Pik*,PElem*,PNum w,PNum h); /* Size to fit text */ |
| @@ -422,11 +423,11 @@ | ||
| 422 | 423 | static PPoint pik_nth_vertex(Pik *p, PToken *pNth, PToken *pErr, PElem *pElem); |
| 423 | 424 | static PToken pik_next_semantic_token(Pik *p, PToken *pThis); |
| 424 | 425 | static void pik_compute_layout_settings(Pik*); |
| 425 | 426 | |
| 426 | 427 | |
| 427 | -#line 453 "pikchr.c" | |
| 428 | +#line 454 "pikchr.c" | |
| 428 | 429 | /**************** End of %include directives **********************************/ |
| 429 | 430 | /* These constants specify the various numeric values for terminal symbols. |
| 430 | 431 | ***************** Begin token definitions *************************************/ |
| 431 | 432 | #ifndef T_ID |
| 432 | 433 | #define T_ID 1 |
| @@ -1506,22 +1507,22 @@ | ||
| 1506 | 1507 | ** inside the C code. |
| 1507 | 1508 | */ |
| 1508 | 1509 | /********* Begin destructor definitions ***************************************/ |
| 1509 | 1510 | case 86: /* element_list */ |
| 1510 | 1511 | { |
| 1511 | -#line 442 "pikchr.y" | |
| 1512 | +#line 443 "pikchr.y" | |
| 1512 | 1513 | pik_elist_free(p,(yypminor->yy120)); |
| 1513 | -#line 1538 "pikchr.c" | |
| 1514 | +#line 1539 "pikchr.c" | |
| 1514 | 1515 | } |
| 1515 | 1516 | break; |
| 1516 | 1517 | case 87: /* element */ |
| 1517 | 1518 | case 88: /* unnamed_element */ |
| 1518 | 1519 | case 89: /* basetype */ |
| 1519 | 1520 | { |
| 1520 | -#line 444 "pikchr.y" | |
| 1521 | +#line 445 "pikchr.y" | |
| 1521 | 1522 | pik_elem_free(p,(yypminor->yy26)); |
| 1522 | -#line 1547 "pikchr.c" | |
| 1523 | +#line 1548 "pikchr.c" | |
| 1523 | 1524 | } |
| 1524 | 1525 | break; |
| 1525 | 1526 | /********* End destructor definitions *****************************************/ |
| 1526 | 1527 | default: break; /* If no destructor action specified: do nothing */ |
| 1527 | 1528 | } |
| @@ -1735,14 +1736,14 @@ | ||
| 1735 | 1736 | #endif |
| 1736 | 1737 | while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser); |
| 1737 | 1738 | /* Here code is inserted which will execute if the parser |
| 1738 | 1739 | ** stack every overflows */ |
| 1739 | 1740 | /******** Begin %stack_overflow code ******************************************/ |
| 1740 | -#line 473 "pikchr.y" | |
| 1741 | +#line 474 "pikchr.y" | |
| 1741 | 1742 | |
| 1742 | 1743 | pik_error(p, 0, "parser stack overflow"); |
| 1743 | -#line 1768 "pikchr.c" | |
| 1744 | +#line 1769 "pikchr.c" | |
| 1744 | 1745 | /******** End %stack_overflow code ********************************************/ |
| 1745 | 1746 | pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */ |
| 1746 | 1747 | pik_parserCTX_STORE |
| 1747 | 1748 | } |
| 1748 | 1749 | |
| @@ -2201,566 +2202,566 @@ | ||
| 2201 | 2202 | ** break; |
| 2202 | 2203 | */ |
| 2203 | 2204 | /********** Begin reduce actions **********************************************/ |
| 2204 | 2205 | YYMINORTYPE yylhsminor; |
| 2205 | 2206 | case 0: /* document ::= element_list */ |
| 2206 | -#line 477 "pikchr.y" | |
| 2207 | +#line 478 "pikchr.y" | |
| 2207 | 2208 | {pik_render(p,yymsp[0].minor.yy120);} |
| 2208 | -#line 2233 "pikchr.c" | |
| 2209 | +#line 2234 "pikchr.c" | |
| 2209 | 2210 | break; |
| 2210 | 2211 | case 1: /* element_list ::= element */ |
| 2211 | -#line 480 "pikchr.y" | |
| 2212 | +#line 481 "pikchr.y" | |
| 2212 | 2213 | { yylhsminor.yy120 = pik_elist_append(p,0,yymsp[0].minor.yy26); } |
| 2213 | -#line 2238 "pikchr.c" | |
| 2214 | +#line 2239 "pikchr.c" | |
| 2214 | 2215 | yymsp[0].minor.yy120 = yylhsminor.yy120; |
| 2215 | 2216 | break; |
| 2216 | 2217 | case 2: /* element_list ::= element_list EOL element */ |
| 2217 | -#line 482 "pikchr.y" | |
| 2218 | +#line 483 "pikchr.y" | |
| 2218 | 2219 | { yylhsminor.yy120 = pik_elist_append(p,yymsp[-2].minor.yy120,yymsp[0].minor.yy26); } |
| 2219 | -#line 2244 "pikchr.c" | |
| 2220 | +#line 2245 "pikchr.c" | |
| 2220 | 2221 | yymsp[-2].minor.yy120 = yylhsminor.yy120; |
| 2221 | 2222 | break; |
| 2222 | 2223 | case 3: /* element ::= */ |
| 2223 | -#line 485 "pikchr.y" | |
| 2224 | +#line 486 "pikchr.y" | |
| 2224 | 2225 | { yymsp[1].minor.yy26 = 0; } |
| 2225 | -#line 2250 "pikchr.c" | |
| 2226 | +#line 2251 "pikchr.c" | |
| 2226 | 2227 | break; |
| 2227 | 2228 | case 4: /* element ::= direction */ |
| 2228 | -#line 486 "pikchr.y" | |
| 2229 | +#line 487 "pikchr.y" | |
| 2229 | 2230 | { pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy26=0; } |
| 2230 | -#line 2255 "pikchr.c" | |
| 2231 | +#line 2256 "pikchr.c" | |
| 2231 | 2232 | yymsp[0].minor.yy26 = yylhsminor.yy26; |
| 2232 | 2233 | break; |
| 2233 | 2234 | case 5: /* element ::= lvalue ASSIGN rvalue */ |
| 2234 | -#line 487 "pikchr.y" | |
| 2235 | +#line 488 "pikchr.y" | |
| 2235 | 2236 | {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" | |
| 2237 | 2238 | yymsp[-2].minor.yy26 = yylhsminor.yy26; |
| 2238 | 2239 | break; |
| 2239 | 2240 | case 6: /* element ::= PLACENAME COLON unnamed_element */ |
| 2240 | -#line 489 "pikchr.y" | |
| 2241 | +#line 490 "pikchr.y" | |
| 2241 | 2242 | { 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" | |
| 2243 | 2244 | yymsp[-2].minor.yy26 = yylhsminor.yy26; |
| 2244 | 2245 | break; |
| 2245 | 2246 | case 7: /* element ::= PLACENAME COLON position */ |
| 2246 | -#line 491 "pikchr.y" | |
| 2247 | +#line 492 "pikchr.y" | |
| 2247 | 2248 | { yylhsminor.yy26 = pik_elem_new(p,0,0,0); |
| 2248 | 2249 | 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" | |
| 2250 | 2251 | yymsp[-2].minor.yy26 = yylhsminor.yy26; |
| 2251 | 2252 | break; |
| 2252 | 2253 | case 8: /* element ::= unnamed_element */ |
| 2253 | -#line 493 "pikchr.y" | |
| 2254 | +#line 494 "pikchr.y" | |
| 2254 | 2255 | {yylhsminor.yy26 = yymsp[0].minor.yy26;} |
| 2255 | -#line 2280 "pikchr.c" | |
| 2256 | +#line 2281 "pikchr.c" | |
| 2256 | 2257 | yymsp[0].minor.yy26 = yylhsminor.yy26; |
| 2257 | 2258 | break; |
| 2258 | 2259 | case 9: /* element ::= print prlist */ |
| 2259 | -#line 494 "pikchr.y" | |
| 2260 | +#line 495 "pikchr.y" | |
| 2260 | 2261 | {pik_append(p,"<br>\n",5); yymsp[-1].minor.yy26=0;} |
| 2261 | -#line 2286 "pikchr.c" | |
| 2262 | +#line 2287 "pikchr.c" | |
| 2262 | 2263 | break; |
| 2263 | 2264 | case 10: /* rvalue ::= PLACENAME */ |
| 2264 | -#line 505 "pikchr.y" | |
| 2265 | +#line 506 "pikchr.y" | |
| 2265 | 2266 | {yylhsminor.yy191 = pik_lookup_color(p,&yymsp[0].minor.yy0);} |
| 2266 | -#line 2291 "pikchr.c" | |
| 2267 | +#line 2292 "pikchr.c" | |
| 2267 | 2268 | yymsp[0].minor.yy191 = yylhsminor.yy191; |
| 2268 | 2269 | break; |
| 2269 | 2270 | case 11: /* pritem ::= FILL */ |
| 2270 | 2271 | case 12: /* pritem ::= COLOR */ yytestcase(yyruleno==12); |
| 2271 | 2272 | case 13: /* pritem ::= THICKNESS */ yytestcase(yyruleno==13); |
| 2272 | -#line 510 "pikchr.y" | |
| 2273 | +#line 511 "pikchr.y" | |
| 2273 | 2274 | {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" | |
| 2275 | 2276 | break; |
| 2276 | 2277 | case 14: /* pritem ::= rvalue */ |
| 2277 | -#line 513 "pikchr.y" | |
| 2278 | +#line 514 "pikchr.y" | |
| 2278 | 2279 | {pik_append_num(p,"",yymsp[0].minor.yy191);} |
| 2279 | -#line 2304 "pikchr.c" | |
| 2280 | +#line 2305 "pikchr.c" | |
| 2280 | 2281 | break; |
| 2281 | 2282 | case 15: /* pritem ::= STRING */ |
| 2282 | -#line 514 "pikchr.y" | |
| 2283 | +#line 515 "pikchr.y" | |
| 2283 | 2284 | {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" | |
| 2285 | 2286 | break; |
| 2286 | 2287 | case 16: /* prsep ::= COMMA */ |
| 2287 | -#line 515 "pikchr.y" | |
| 2288 | +#line 516 "pikchr.y" | |
| 2288 | 2289 | {pik_append(p, " ", 1);} |
| 2289 | -#line 2314 "pikchr.c" | |
| 2290 | +#line 2315 "pikchr.c" | |
| 2290 | 2291 | break; |
| 2291 | 2292 | case 17: /* unnamed_element ::= basetype attribute_list */ |
| 2292 | -#line 518 "pikchr.y" | |
| 2293 | +#line 519 "pikchr.y" | |
| 2293 | 2294 | {yylhsminor.yy26 = yymsp[-1].minor.yy26; pik_after_adding_attributes(p,yylhsminor.yy26);} |
| 2294 | -#line 2319 "pikchr.c" | |
| 2295 | +#line 2320 "pikchr.c" | |
| 2295 | 2296 | yymsp[-1].minor.yy26 = yylhsminor.yy26; |
| 2296 | 2297 | break; |
| 2297 | 2298 | case 18: /* basetype ::= CLASSNAME */ |
| 2298 | -#line 520 "pikchr.y" | |
| 2299 | +#line 521 "pikchr.y" | |
| 2299 | 2300 | {yylhsminor.yy26 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); } |
| 2300 | -#line 2325 "pikchr.c" | |
| 2301 | +#line 2326 "pikchr.c" | |
| 2301 | 2302 | yymsp[0].minor.yy26 = yylhsminor.yy26; |
| 2302 | 2303 | break; |
| 2303 | 2304 | case 19: /* basetype ::= STRING textposition */ |
| 2304 | -#line 522 "pikchr.y" | |
| 2305 | +#line 523 "pikchr.y" | |
| 2305 | 2306 | {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" | |
| 2307 | 2308 | yymsp[-1].minor.yy26 = yylhsminor.yy26; |
| 2308 | 2309 | break; |
| 2309 | 2310 | case 20: /* basetype ::= LB savelist element_list RB */ |
| 2310 | -#line 524 "pikchr.y" | |
| 2311 | +#line 525 "pikchr.y" | |
| 2311 | 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; } |
| 2312 | -#line 2337 "pikchr.c" | |
| 2313 | +#line 2338 "pikchr.c" | |
| 2313 | 2314 | break; |
| 2314 | 2315 | case 21: /* savelist ::= */ |
| 2315 | -#line 529 "pikchr.y" | |
| 2316 | +#line 530 "pikchr.y" | |
| 2316 | 2317 | {yymsp[1].minor.yy120 = p->list; p->list = 0;} |
| 2317 | -#line 2342 "pikchr.c" | |
| 2318 | +#line 2343 "pikchr.c" | |
| 2318 | 2319 | break; |
| 2319 | 2320 | case 22: /* attribute_list ::= expr */ |
| 2320 | -#line 536 "pikchr.y" | |
| 2321 | +#line 537 "pikchr.y" | |
| 2321 | 2322 | { pik_add_direction(p,0,&yymsp[0].minor.yy191,0);} |
| 2322 | -#line 2347 "pikchr.c" | |
| 2323 | +#line 2348 "pikchr.c" | |
| 2323 | 2324 | break; |
| 2324 | 2325 | case 23: /* attribute_list ::= expr PERCENT */ |
| 2325 | -#line 537 "pikchr.y" | |
| 2326 | +#line 538 "pikchr.y" | |
| 2326 | 2327 | { pik_add_direction(p,0,&yymsp[-1].minor.yy191,1);} |
| 2327 | -#line 2352 "pikchr.c" | |
| 2328 | +#line 2353 "pikchr.c" | |
| 2328 | 2329 | break; |
| 2329 | 2330 | case 24: /* attribute ::= numproperty expr PERCENT */ |
| 2330 | -#line 542 "pikchr.y" | |
| 2331 | +#line 543 "pikchr.y" | |
| 2331 | 2332 | { 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" | |
| 2333 | 2334 | break; |
| 2334 | 2335 | case 25: /* attribute ::= numproperty expr */ |
| 2335 | 2336 | case 28: /* attribute ::= colorproperty rvalue */ yytestcase(yyruleno==28); |
| 2336 | -#line 543 "pikchr.y" | |
| 2337 | +#line 544 "pikchr.y" | |
| 2337 | 2338 | { pik_set_numprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy191,0.0); } |
| 2338 | -#line 2363 "pikchr.c" | |
| 2339 | +#line 2364 "pikchr.c" | |
| 2339 | 2340 | break; |
| 2340 | 2341 | case 26: /* attribute ::= dashproperty expr */ |
| 2341 | -#line 544 "pikchr.y" | |
| 2342 | +#line 545 "pikchr.y" | |
| 2342 | 2343 | { pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy191); } |
| 2343 | -#line 2368 "pikchr.c" | |
| 2344 | +#line 2369 "pikchr.c" | |
| 2344 | 2345 | break; |
| 2345 | 2346 | case 27: /* attribute ::= dashproperty */ |
| 2346 | -#line 545 "pikchr.y" | |
| 2347 | +#line 546 "pikchr.y" | |
| 2347 | 2348 | { pik_set_dashed(p,&yymsp[0].minor.yy0,0); } |
| 2348 | -#line 2373 "pikchr.c" | |
| 2349 | +#line 2374 "pikchr.c" | |
| 2349 | 2350 | break; |
| 2350 | 2351 | case 29: /* attribute ::= direction expr PERCENT */ |
| 2351 | -#line 548 "pikchr.y" | |
| 2352 | +#line 549 "pikchr.y" | |
| 2352 | 2353 | { pik_add_direction(p,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy191,1);} |
| 2353 | -#line 2378 "pikchr.c" | |
| 2354 | +#line 2379 "pikchr.c" | |
| 2354 | 2355 | break; |
| 2355 | 2356 | case 30: /* attribute ::= direction expr */ |
| 2356 | -#line 549 "pikchr.y" | |
| 2357 | +#line 550 "pikchr.y" | |
| 2357 | 2358 | { pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy191,0);} |
| 2358 | -#line 2383 "pikchr.c" | |
| 2359 | +#line 2384 "pikchr.c" | |
| 2359 | 2360 | break; |
| 2360 | 2361 | case 31: /* attribute ::= direction */ |
| 2361 | -#line 550 "pikchr.y" | |
| 2362 | +#line 551 "pikchr.y" | |
| 2362 | 2363 | { pik_add_direction(p,&yymsp[0].minor.yy0,0,0); } |
| 2363 | -#line 2388 "pikchr.c" | |
| 2364 | +#line 2389 "pikchr.c" | |
| 2364 | 2365 | break; |
| 2365 | 2366 | case 32: /* attribute ::= direction even position */ |
| 2366 | -#line 551 "pikchr.y" | |
| 2367 | +#line 552 "pikchr.y" | |
| 2367 | 2368 | {pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy131);} |
| 2368 | -#line 2393 "pikchr.c" | |
| 2369 | +#line 2394 "pikchr.c" | |
| 2369 | 2370 | break; |
| 2370 | 2371 | case 33: /* attribute ::= CLOSE */ |
| 2371 | -#line 552 "pikchr.y" | |
| 2372 | +#line 553 "pikchr.y" | |
| 2372 | 2373 | { pik_close_path(p,&yymsp[0].minor.yy0); } |
| 2373 | -#line 2398 "pikchr.c" | |
| 2374 | +#line 2399 "pikchr.c" | |
| 2374 | 2375 | break; |
| 2375 | 2376 | case 34: /* attribute ::= CHOP */ |
| 2376 | -#line 553 "pikchr.y" | |
| 2377 | +#line 554 "pikchr.y" | |
| 2377 | 2378 | { p->cur->bChop = 1; } |
| 2378 | -#line 2403 "pikchr.c" | |
| 2379 | +#line 2404 "pikchr.c" | |
| 2379 | 2380 | break; |
| 2380 | 2381 | case 35: /* attribute ::= FROM position */ |
| 2381 | -#line 554 "pikchr.y" | |
| 2382 | +#line 555 "pikchr.y" | |
| 2382 | 2383 | { pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy131); } |
| 2383 | -#line 2408 "pikchr.c" | |
| 2384 | +#line 2409 "pikchr.c" | |
| 2384 | 2385 | break; |
| 2385 | 2386 | case 36: /* attribute ::= TO position */ |
| 2386 | -#line 555 "pikchr.y" | |
| 2387 | +#line 556 "pikchr.y" | |
| 2387 | 2388 | { pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy131); } |
| 2388 | -#line 2413 "pikchr.c" | |
| 2389 | +#line 2414 "pikchr.c" | |
| 2389 | 2390 | break; |
| 2390 | 2391 | case 37: /* attribute ::= THEN */ |
| 2391 | -#line 556 "pikchr.y" | |
| 2392 | +#line 557 "pikchr.y" | |
| 2392 | 2393 | { pik_then(p, &yymsp[0].minor.yy0, p->cur); } |
| 2393 | -#line 2418 "pikchr.c" | |
| 2394 | +#line 2419 "pikchr.c" | |
| 2394 | 2395 | break; |
| 2395 | 2396 | case 38: /* attribute ::= AT position */ |
| 2396 | -#line 558 "pikchr.y" | |
| 2397 | +#line 559 "pikchr.y" | |
| 2397 | 2398 | { pik_set_at(p,0,&yymsp[0].minor.yy131,&yymsp[-1].minor.yy0); } |
| 2398 | -#line 2423 "pikchr.c" | |
| 2399 | +#line 2424 "pikchr.c" | |
| 2399 | 2400 | break; |
| 2400 | 2401 | case 39: /* attribute ::= SAME */ |
| 2401 | -#line 560 "pikchr.y" | |
| 2402 | +#line 561 "pikchr.y" | |
| 2402 | 2403 | {pik_same(p,0,&yymsp[0].minor.yy0);} |
| 2403 | -#line 2428 "pikchr.c" | |
| 2404 | +#line 2429 "pikchr.c" | |
| 2404 | 2405 | break; |
| 2405 | 2406 | case 40: /* attribute ::= SAME AS object */ |
| 2406 | -#line 561 "pikchr.y" | |
| 2407 | +#line 562 "pikchr.y" | |
| 2407 | 2408 | {pik_same(p,yymsp[0].minor.yy26,&yymsp[-2].minor.yy0);} |
| 2408 | -#line 2433 "pikchr.c" | |
| 2409 | +#line 2434 "pikchr.c" | |
| 2409 | 2410 | break; |
| 2410 | 2411 | case 41: /* attribute ::= STRING textposition */ |
| 2411 | -#line 562 "pikchr.y" | |
| 2412 | +#line 563 "pikchr.y" | |
| 2412 | 2413 | {pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy60);} |
| 2413 | -#line 2438 "pikchr.c" | |
| 2414 | +#line 2439 "pikchr.c" | |
| 2414 | 2415 | break; |
| 2415 | 2416 | case 42: /* attribute ::= FIT */ |
| 2416 | -#line 563 "pikchr.y" | |
| 2417 | +#line 564 "pikchr.y" | |
| 2417 | 2418 | {pik_size_to_fit(p,&yymsp[0].minor.yy0); } |
| 2418 | -#line 2443 "pikchr.c" | |
| 2419 | +#line 2444 "pikchr.c" | |
| 2419 | 2420 | break; |
| 2420 | 2421 | case 43: /* with ::= DOT_E edge AT position */ |
| 2421 | 2422 | case 44: /* with ::= edge AT position */ yytestcase(yyruleno==44); |
| 2422 | -#line 570 "pikchr.y" | |
| 2423 | +#line 571 "pikchr.y" | |
| 2423 | 2424 | { 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" | |
| 2425 | 2426 | break; |
| 2426 | 2427 | case 45: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */ |
| 2427 | -#line 574 "pikchr.y" | |
| 2428 | +#line 575 "pikchr.y" | |
| 2428 | 2429 | {yylhsminor.yy0 = yymsp[0].minor.yy0;} |
| 2429 | -#line 2454 "pikchr.c" | |
| 2430 | +#line 2455 "pikchr.c" | |
| 2430 | 2431 | yymsp[0].minor.yy0 = yylhsminor.yy0; |
| 2431 | 2432 | break; |
| 2432 | 2433 | case 46: /* boolproperty ::= CW */ |
| 2433 | -#line 585 "pikchr.y" | |
| 2434 | +#line 586 "pikchr.y" | |
| 2434 | 2435 | {p->cur->cw = 1;} |
| 2435 | -#line 2460 "pikchr.c" | |
| 2436 | +#line 2461 "pikchr.c" | |
| 2436 | 2437 | break; |
| 2437 | 2438 | case 47: /* boolproperty ::= CCW */ |
| 2438 | -#line 586 "pikchr.y" | |
| 2439 | +#line 587 "pikchr.y" | |
| 2439 | 2440 | {p->cur->cw = 0;} |
| 2440 | -#line 2465 "pikchr.c" | |
| 2441 | +#line 2466 "pikchr.c" | |
| 2441 | 2442 | break; |
| 2442 | 2443 | case 48: /* boolproperty ::= LARROW */ |
| 2443 | -#line 587 "pikchr.y" | |
| 2444 | +#line 588 "pikchr.y" | |
| 2444 | 2445 | {p->cur->larrow=1; p->cur->rarrow=0; } |
| 2445 | -#line 2470 "pikchr.c" | |
| 2446 | +#line 2471 "pikchr.c" | |
| 2446 | 2447 | break; |
| 2447 | 2448 | case 49: /* boolproperty ::= RARROW */ |
| 2448 | -#line 588 "pikchr.y" | |
| 2449 | +#line 589 "pikchr.y" | |
| 2449 | 2450 | {p->cur->larrow=0; p->cur->rarrow=1; } |
| 2450 | -#line 2475 "pikchr.c" | |
| 2451 | +#line 2476 "pikchr.c" | |
| 2451 | 2452 | break; |
| 2452 | 2453 | case 50: /* boolproperty ::= LRARROW */ |
| 2453 | -#line 589 "pikchr.y" | |
| 2454 | +#line 590 "pikchr.y" | |
| 2454 | 2455 | {p->cur->larrow=1; p->cur->rarrow=1; } |
| 2455 | -#line 2480 "pikchr.c" | |
| 2456 | +#line 2481 "pikchr.c" | |
| 2456 | 2457 | break; |
| 2457 | 2458 | case 51: /* boolproperty ::= INVIS */ |
| 2458 | -#line 590 "pikchr.y" | |
| 2459 | +#line 591 "pikchr.y" | |
| 2459 | 2460 | {p->cur->sw = 0.0;} |
| 2460 | -#line 2485 "pikchr.c" | |
| 2461 | +#line 2486 "pikchr.c" | |
| 2461 | 2462 | break; |
| 2462 | 2463 | case 52: /* boolproperty ::= THICK */ |
| 2463 | -#line 591 "pikchr.y" | |
| 2464 | +#line 592 "pikchr.y" | |
| 2464 | 2465 | {p->cur->sw *= 1.5;} |
| 2465 | -#line 2490 "pikchr.c" | |
| 2466 | +#line 2491 "pikchr.c" | |
| 2466 | 2467 | break; |
| 2467 | 2468 | case 53: /* boolproperty ::= THIN */ |
| 2468 | -#line 592 "pikchr.y" | |
| 2469 | +#line 593 "pikchr.y" | |
| 2469 | 2470 | {p->cur->sw *= 0.67;} |
| 2470 | -#line 2495 "pikchr.c" | |
| 2471 | +#line 2496 "pikchr.c" | |
| 2471 | 2472 | break; |
| 2472 | 2473 | case 54: /* textposition ::= */ |
| 2473 | -#line 594 "pikchr.y" | |
| 2474 | +#line 595 "pikchr.y" | |
| 2474 | 2475 | {yymsp[1].minor.yy60 = 0;} |
| 2475 | -#line 2500 "pikchr.c" | |
| 2476 | +#line 2501 "pikchr.c" | |
| 2476 | 2477 | break; |
| 2477 | 2478 | case 55: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */ |
| 2478 | -#line 597 "pikchr.y" | |
| 2479 | +#line 598 "pikchr.y" | |
| 2479 | 2480 | {yylhsminor.yy60 = pik_text_position(p,yymsp[-1].minor.yy60,&yymsp[0].minor.yy0);} |
| 2480 | -#line 2505 "pikchr.c" | |
| 2481 | +#line 2506 "pikchr.c" | |
| 2481 | 2482 | yymsp[-1].minor.yy60 = yylhsminor.yy60; |
| 2482 | 2483 | break; |
| 2483 | 2484 | case 56: /* position ::= expr COMMA expr */ |
| 2484 | -#line 600 "pikchr.y" | |
| 2485 | +#line 601 "pikchr.y" | |
| 2485 | 2486 | {yylhsminor.yy131.x=yymsp[-2].minor.yy191; yylhsminor.yy131.y=yymsp[0].minor.yy191;} |
| 2486 | -#line 2511 "pikchr.c" | |
| 2487 | +#line 2512 "pikchr.c" | |
| 2487 | 2488 | yymsp[-2].minor.yy131 = yylhsminor.yy131; |
| 2488 | 2489 | break; |
| 2489 | 2490 | case 57: /* position ::= place PLUS expr COMMA expr */ |
| 2490 | -#line 602 "pikchr.y" | |
| 2491 | +#line 603 "pikchr.y" | |
| 2491 | 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;} |
| 2492 | -#line 2517 "pikchr.c" | |
| 2493 | +#line 2518 "pikchr.c" | |
| 2493 | 2494 | yymsp[-4].minor.yy131 = yylhsminor.yy131; |
| 2494 | 2495 | break; |
| 2495 | 2496 | case 58: /* position ::= place MINUS expr COMMA expr */ |
| 2496 | -#line 603 "pikchr.y" | |
| 2497 | +#line 604 "pikchr.y" | |
| 2497 | 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;} |
| 2498 | -#line 2523 "pikchr.c" | |
| 2499 | +#line 2524 "pikchr.c" | |
| 2499 | 2500 | yymsp[-4].minor.yy131 = yylhsminor.yy131; |
| 2500 | 2501 | break; |
| 2501 | 2502 | case 59: /* position ::= place PLUS LP expr COMMA expr RP */ |
| 2502 | -#line 605 "pikchr.y" | |
| 2503 | +#line 606 "pikchr.y" | |
| 2503 | 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;} |
| 2504 | -#line 2529 "pikchr.c" | |
| 2505 | +#line 2530 "pikchr.c" | |
| 2505 | 2506 | yymsp[-6].minor.yy131 = yylhsminor.yy131; |
| 2506 | 2507 | break; |
| 2507 | 2508 | case 60: /* position ::= place MINUS LP expr COMMA expr RP */ |
| 2508 | -#line 607 "pikchr.y" | |
| 2509 | +#line 608 "pikchr.y" | |
| 2509 | 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;} |
| 2510 | -#line 2535 "pikchr.c" | |
| 2511 | +#line 2536 "pikchr.c" | |
| 2511 | 2512 | yymsp[-6].minor.yy131 = yylhsminor.yy131; |
| 2512 | 2513 | break; |
| 2513 | 2514 | case 61: /* position ::= LP position COMMA position RP */ |
| 2514 | -#line 608 "pikchr.y" | |
| 2515 | +#line 609 "pikchr.y" | |
| 2515 | 2516 | {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" | |
| 2517 | 2518 | break; |
| 2518 | 2519 | case 62: /* position ::= LP position RP */ |
| 2519 | -#line 609 "pikchr.y" | |
| 2520 | +#line 610 "pikchr.y" | |
| 2520 | 2521 | {yymsp[-2].minor.yy131=yymsp[-1].minor.yy131;} |
| 2521 | -#line 2546 "pikchr.c" | |
| 2522 | +#line 2547 "pikchr.c" | |
| 2522 | 2523 | break; |
| 2523 | 2524 | case 63: /* position ::= expr between position AND position */ |
| 2524 | -#line 611 "pikchr.y" | |
| 2525 | +#line 612 "pikchr.y" | |
| 2525 | 2526 | {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" | |
| 2527 | 2528 | yymsp[-4].minor.yy131 = yylhsminor.yy131; |
| 2528 | 2529 | break; |
| 2529 | 2530 | case 64: /* position ::= expr ABOVE position */ |
| 2530 | -#line 612 "pikchr.y" | |
| 2531 | +#line 613 "pikchr.y" | |
| 2531 | 2532 | {yylhsminor.yy131=yymsp[0].minor.yy131; yylhsminor.yy131.y += yymsp[-2].minor.yy191;} |
| 2532 | -#line 2557 "pikchr.c" | |
| 2533 | +#line 2558 "pikchr.c" | |
| 2533 | 2534 | yymsp[-2].minor.yy131 = yylhsminor.yy131; |
| 2534 | 2535 | break; |
| 2535 | 2536 | case 65: /* position ::= expr BELOW position */ |
| 2536 | -#line 613 "pikchr.y" | |
| 2537 | +#line 614 "pikchr.y" | |
| 2537 | 2538 | {yylhsminor.yy131=yymsp[0].minor.yy131; yylhsminor.yy131.y -= yymsp[-2].minor.yy191;} |
| 2538 | -#line 2563 "pikchr.c" | |
| 2539 | +#line 2564 "pikchr.c" | |
| 2539 | 2540 | yymsp[-2].minor.yy131 = yylhsminor.yy131; |
| 2540 | 2541 | break; |
| 2541 | 2542 | case 66: /* position ::= expr LEFT OF position */ |
| 2542 | -#line 614 "pikchr.y" | |
| 2543 | +#line 615 "pikchr.y" | |
| 2543 | 2544 | {yylhsminor.yy131=yymsp[0].minor.yy131; yylhsminor.yy131.x -= yymsp[-3].minor.yy191;} |
| 2544 | -#line 2569 "pikchr.c" | |
| 2545 | +#line 2570 "pikchr.c" | |
| 2545 | 2546 | yymsp[-3].minor.yy131 = yylhsminor.yy131; |
| 2546 | 2547 | break; |
| 2547 | 2548 | case 67: /* position ::= expr RIGHT OF position */ |
| 2548 | -#line 615 "pikchr.y" | |
| 2549 | +#line 616 "pikchr.y" | |
| 2549 | 2550 | {yylhsminor.yy131=yymsp[0].minor.yy131; yylhsminor.yy131.x += yymsp[-3].minor.yy191;} |
| 2550 | -#line 2575 "pikchr.c" | |
| 2551 | +#line 2576 "pikchr.c" | |
| 2551 | 2552 | yymsp[-3].minor.yy131 = yylhsminor.yy131; |
| 2552 | 2553 | break; |
| 2553 | 2554 | case 68: /* position ::= expr EDGEPT OF position */ |
| 2554 | -#line 617 "pikchr.y" | |
| 2555 | +#line 618 "pikchr.y" | |
| 2555 | 2556 | {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" | |
| 2557 | 2558 | yymsp[-3].minor.yy131 = yylhsminor.yy131; |
| 2558 | 2559 | break; |
| 2559 | 2560 | case 69: /* position ::= expr HEADING expr FROM position */ |
| 2560 | -#line 619 "pikchr.y" | |
| 2561 | +#line 620 "pikchr.y" | |
| 2561 | 2562 | {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" | |
| 2563 | 2564 | yymsp[-4].minor.yy131 = yylhsminor.yy131; |
| 2564 | 2565 | break; |
| 2565 | 2566 | case 70: /* place ::= object */ |
| 2566 | -#line 625 "pikchr.y" | |
| 2567 | +#line 626 "pikchr.y" | |
| 2567 | 2568 | {yylhsminor.yy131 = pik_place_of_elem(p,yymsp[0].minor.yy26,0);} |
| 2568 | -#line 2593 "pikchr.c" | |
| 2569 | +#line 2594 "pikchr.c" | |
| 2569 | 2570 | yymsp[0].minor.yy131 = yylhsminor.yy131; |
| 2570 | 2571 | break; |
| 2571 | 2572 | case 71: /* place ::= object DOT_E edge */ |
| 2572 | 2573 | case 72: /* place ::= object DOT_L START */ yytestcase(yyruleno==72); |
| 2573 | 2574 | case 73: /* place ::= object DOT_L END */ yytestcase(yyruleno==73); |
| 2574 | -#line 626 "pikchr.y" | |
| 2575 | +#line 627 "pikchr.y" | |
| 2575 | 2576 | {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" | |
| 2577 | 2578 | yymsp[-2].minor.yy131 = yylhsminor.yy131; |
| 2578 | 2579 | break; |
| 2579 | 2580 | case 74: /* place ::= START OF object */ |
| 2580 | 2581 | case 75: /* place ::= END OF object */ yytestcase(yyruleno==75); |
| 2581 | 2582 | case 76: /* place ::= edge OF object */ yytestcase(yyruleno==76); |
| 2582 | -#line 629 "pikchr.y" | |
| 2583 | +#line 630 "pikchr.y" | |
| 2583 | 2584 | {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" | |
| 2585 | 2586 | yymsp[-2].minor.yy131 = yylhsminor.yy131; |
| 2586 | 2587 | break; |
| 2587 | 2588 | case 77: /* place ::= NTH VERTEX OF object */ |
| 2588 | -#line 632 "pikchr.y" | |
| 2589 | +#line 633 "pikchr.y" | |
| 2589 | 2590 | {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" | |
| 2591 | 2592 | yymsp[-3].minor.yy131 = yylhsminor.yy131; |
| 2592 | 2593 | break; |
| 2593 | 2594 | case 78: /* object ::= nth */ |
| 2594 | -#line 635 "pikchr.y" | |
| 2595 | +#line 636 "pikchr.y" | |
| 2595 | 2596 | {yylhsminor.yy26 = pik_find_nth(p,0,&yymsp[0].minor.yy0);} |
| 2596 | -#line 2621 "pikchr.c" | |
| 2597 | +#line 2622 "pikchr.c" | |
| 2597 | 2598 | yymsp[0].minor.yy26 = yylhsminor.yy26; |
| 2598 | 2599 | break; |
| 2599 | 2600 | case 79: /* object ::= nth OF|IN object */ |
| 2600 | -#line 636 "pikchr.y" | |
| 2601 | +#line 637 "pikchr.y" | |
| 2601 | 2602 | {yylhsminor.yy26 = pik_find_nth(p,yymsp[0].minor.yy26,&yymsp[-2].minor.yy0);} |
| 2602 | -#line 2627 "pikchr.c" | |
| 2603 | +#line 2628 "pikchr.c" | |
| 2603 | 2604 | yymsp[-2].minor.yy26 = yylhsminor.yy26; |
| 2604 | 2605 | break; |
| 2605 | 2606 | case 80: /* objectname ::= PLACENAME */ |
| 2606 | -#line 638 "pikchr.y" | |
| 2607 | +#line 639 "pikchr.y" | |
| 2607 | 2608 | {yylhsminor.yy26 = pik_find_byname(p,0,&yymsp[0].minor.yy0);} |
| 2608 | -#line 2633 "pikchr.c" | |
| 2609 | +#line 2634 "pikchr.c" | |
| 2609 | 2610 | yymsp[0].minor.yy26 = yylhsminor.yy26; |
| 2610 | 2611 | break; |
| 2611 | 2612 | case 81: /* objectname ::= objectname DOT_U PLACENAME */ |
| 2612 | -#line 640 "pikchr.y" | |
| 2613 | +#line 641 "pikchr.y" | |
| 2613 | 2614 | {yylhsminor.yy26 = pik_find_byname(p,yymsp[-2].minor.yy26,&yymsp[0].minor.yy0);} |
| 2614 | -#line 2639 "pikchr.c" | |
| 2615 | +#line 2640 "pikchr.c" | |
| 2615 | 2616 | yymsp[-2].minor.yy26 = yylhsminor.yy26; |
| 2616 | 2617 | break; |
| 2617 | 2618 | case 82: /* nth ::= NTH CLASSNAME */ |
| 2618 | -#line 642 "pikchr.y" | |
| 2619 | +#line 643 "pikchr.y" | |
| 2619 | 2620 | {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" | |
| 2621 | 2622 | yymsp[-1].minor.yy0 = yylhsminor.yy0; |
| 2622 | 2623 | break; |
| 2623 | 2624 | case 83: /* nth ::= NTH LAST CLASSNAME */ |
| 2624 | -#line 643 "pikchr.y" | |
| 2625 | +#line 644 "pikchr.y" | |
| 2625 | 2626 | {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" | |
| 2627 | 2628 | yymsp[-2].minor.yy0 = yylhsminor.yy0; |
| 2628 | 2629 | break; |
| 2629 | 2630 | case 84: /* nth ::= LAST CLASSNAME */ |
| 2630 | -#line 644 "pikchr.y" | |
| 2631 | +#line 645 "pikchr.y" | |
| 2631 | 2632 | {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;} |
| 2632 | -#line 2657 "pikchr.c" | |
| 2633 | +#line 2658 "pikchr.c" | |
| 2633 | 2634 | break; |
| 2634 | 2635 | case 85: /* nth ::= LAST */ |
| 2635 | -#line 645 "pikchr.y" | |
| 2636 | +#line 646 "pikchr.y" | |
| 2636 | 2637 | {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;} |
| 2637 | -#line 2662 "pikchr.c" | |
| 2638 | +#line 2663 "pikchr.c" | |
| 2638 | 2639 | yymsp[0].minor.yy0 = yylhsminor.yy0; |
| 2639 | 2640 | break; |
| 2640 | 2641 | case 86: /* nth ::= NTH LB RB */ |
| 2641 | -#line 646 "pikchr.y" | |
| 2642 | +#line 647 "pikchr.y" | |
| 2642 | 2643 | {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" | |
| 2644 | 2645 | yymsp[-2].minor.yy0 = yylhsminor.yy0; |
| 2645 | 2646 | break; |
| 2646 | 2647 | case 87: /* nth ::= NTH LAST LB RB */ |
| 2647 | -#line 647 "pikchr.y" | |
| 2648 | +#line 648 "pikchr.y" | |
| 2648 | 2649 | {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" | |
| 2650 | 2651 | yymsp[-3].minor.yy0 = yylhsminor.yy0; |
| 2651 | 2652 | break; |
| 2652 | 2653 | case 88: /* nth ::= LAST LB RB */ |
| 2653 | -#line 648 "pikchr.y" | |
| 2654 | +#line 649 "pikchr.y" | |
| 2654 | 2655 | {yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; } |
| 2655 | -#line 2680 "pikchr.c" | |
| 2656 | +#line 2681 "pikchr.c" | |
| 2656 | 2657 | break; |
| 2657 | 2658 | case 89: /* expr ::= expr PLUS expr */ |
| 2658 | -#line 650 "pikchr.y" | |
| 2659 | +#line 651 "pikchr.y" | |
| 2659 | 2660 | {yylhsminor.yy191=yymsp[-2].minor.yy191+yymsp[0].minor.yy191;} |
| 2660 | -#line 2685 "pikchr.c" | |
| 2661 | +#line 2686 "pikchr.c" | |
| 2661 | 2662 | yymsp[-2].minor.yy191 = yylhsminor.yy191; |
| 2662 | 2663 | break; |
| 2663 | 2664 | case 90: /* expr ::= expr MINUS expr */ |
| 2664 | -#line 651 "pikchr.y" | |
| 2665 | +#line 652 "pikchr.y" | |
| 2665 | 2666 | {yylhsminor.yy191=yymsp[-2].minor.yy191-yymsp[0].minor.yy191;} |
| 2666 | -#line 2691 "pikchr.c" | |
| 2667 | +#line 2692 "pikchr.c" | |
| 2667 | 2668 | yymsp[-2].minor.yy191 = yylhsminor.yy191; |
| 2668 | 2669 | break; |
| 2669 | 2670 | case 91: /* expr ::= expr STAR expr */ |
| 2670 | -#line 652 "pikchr.y" | |
| 2671 | +#line 653 "pikchr.y" | |
| 2671 | 2672 | {yylhsminor.yy191=yymsp[-2].minor.yy191*yymsp[0].minor.yy191;} |
| 2672 | -#line 2697 "pikchr.c" | |
| 2673 | +#line 2698 "pikchr.c" | |
| 2673 | 2674 | yymsp[-2].minor.yy191 = yylhsminor.yy191; |
| 2674 | 2675 | break; |
| 2675 | 2676 | case 92: /* expr ::= expr SLASH expr */ |
| 2676 | -#line 653 "pikchr.y" | |
| 2677 | +#line 654 "pikchr.y" | |
| 2677 | 2678 | { |
| 2678 | 2679 | if( yymsp[0].minor.yy191==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy191 = 0.0; } |
| 2679 | 2680 | else{ yylhsminor.yy191 = yymsp[-2].minor.yy191/yymsp[0].minor.yy191; } |
| 2680 | 2681 | } |
| 2681 | -#line 2706 "pikchr.c" | |
| 2682 | +#line 2707 "pikchr.c" | |
| 2682 | 2683 | yymsp[-2].minor.yy191 = yylhsminor.yy191; |
| 2683 | 2684 | break; |
| 2684 | 2685 | case 93: /* expr ::= MINUS expr */ |
| 2685 | -#line 657 "pikchr.y" | |
| 2686 | +#line 658 "pikchr.y" | |
| 2686 | 2687 | {yymsp[-1].minor.yy191=-yymsp[0].minor.yy191;} |
| 2687 | -#line 2712 "pikchr.c" | |
| 2688 | +#line 2713 "pikchr.c" | |
| 2688 | 2689 | break; |
| 2689 | 2690 | case 94: /* expr ::= PLUS expr */ |
| 2690 | -#line 658 "pikchr.y" | |
| 2691 | +#line 659 "pikchr.y" | |
| 2691 | 2692 | {yymsp[-1].minor.yy191=yymsp[0].minor.yy191;} |
| 2692 | -#line 2717 "pikchr.c" | |
| 2693 | +#line 2718 "pikchr.c" | |
| 2693 | 2694 | break; |
| 2694 | 2695 | case 95: /* expr ::= LP expr RP */ |
| 2695 | -#line 659 "pikchr.y" | |
| 2696 | +#line 660 "pikchr.y" | |
| 2696 | 2697 | {yymsp[-2].minor.yy191=yymsp[-1].minor.yy191;} |
| 2697 | -#line 2722 "pikchr.c" | |
| 2698 | +#line 2723 "pikchr.c" | |
| 2698 | 2699 | break; |
| 2699 | 2700 | case 96: /* expr ::= NUMBER */ |
| 2700 | -#line 660 "pikchr.y" | |
| 2701 | +#line 661 "pikchr.y" | |
| 2701 | 2702 | {yylhsminor.yy191=pik_atof(p,&yymsp[0].minor.yy0);} |
| 2702 | -#line 2727 "pikchr.c" | |
| 2703 | +#line 2728 "pikchr.c" | |
| 2703 | 2704 | yymsp[0].minor.yy191 = yylhsminor.yy191; |
| 2704 | 2705 | break; |
| 2705 | 2706 | case 97: /* expr ::= ID */ |
| 2706 | -#line 661 "pikchr.y" | |
| 2707 | +#line 662 "pikchr.y" | |
| 2707 | 2708 | {yylhsminor.yy191=pik_get_var(p,&yymsp[0].minor.yy0);} |
| 2708 | -#line 2733 "pikchr.c" | |
| 2709 | +#line 2734 "pikchr.c" | |
| 2709 | 2710 | yymsp[0].minor.yy191 = yylhsminor.yy191; |
| 2710 | 2711 | break; |
| 2711 | 2712 | case 98: /* expr ::= FUNC1 LP expr RP */ |
| 2712 | -#line 662 "pikchr.y" | |
| 2713 | +#line 663 "pikchr.y" | |
| 2713 | 2714 | {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" | |
| 2715 | 2716 | yymsp[-3].minor.yy191 = yylhsminor.yy191; |
| 2716 | 2717 | break; |
| 2717 | 2718 | case 99: /* expr ::= FUNC2 LP expr COMMA expr RP */ |
| 2718 | -#line 663 "pikchr.y" | |
| 2719 | +#line 664 "pikchr.y" | |
| 2719 | 2720 | {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" | |
| 2721 | 2722 | yymsp[-5].minor.yy191 = yylhsminor.yy191; |
| 2722 | 2723 | break; |
| 2723 | 2724 | case 100: /* expr ::= object DOT_L locproperty */ |
| 2724 | 2725 | case 101: /* expr ::= object DOT_L numproperty */ yytestcase(yyruleno==101); |
| 2725 | 2726 | case 102: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==102); |
| 2726 | 2727 | case 103: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==103); |
| 2727 | -#line 665 "pikchr.y" | |
| 2728 | +#line 666 "pikchr.y" | |
| 2728 | 2729 | {yylhsminor.yy191=pik_property_of(p,yymsp[-2].minor.yy26,&yymsp[0].minor.yy0);} |
| 2729 | -#line 2754 "pikchr.c" | |
| 2730 | +#line 2755 "pikchr.c" | |
| 2730 | 2731 | yymsp[-2].minor.yy191 = yylhsminor.yy191; |
| 2731 | 2732 | break; |
| 2732 | 2733 | case 104: /* expr ::= object DOT_E edge DOT_L X */ |
| 2733 | -#line 669 "pikchr.y" | |
| 2734 | +#line 670 "pikchr.y" | |
| 2734 | 2735 | {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" | |
| 2736 | 2737 | yymsp[-4].minor.yy191 = yylhsminor.yy191; |
| 2737 | 2738 | break; |
| 2738 | 2739 | case 105: /* expr ::= object DOT_E edge DOT_L Y */ |
| 2739 | -#line 670 "pikchr.y" | |
| 2740 | +#line 671 "pikchr.y" | |
| 2740 | 2741 | {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" | |
| 2742 | 2743 | yymsp[-4].minor.yy191 = yylhsminor.yy191; |
| 2743 | 2744 | break; |
| 2744 | 2745 | case 106: /* expr ::= LP locproperty OF object RP */ |
| 2745 | 2746 | case 107: /* expr ::= LP dashproperty OF object RP */ yytestcase(yyruleno==107); |
| 2746 | 2747 | case 108: /* expr ::= LP numproperty OF object RP */ yytestcase(yyruleno==108); |
| 2747 | 2748 | case 109: /* expr ::= LP colorproperty OF object RP */ yytestcase(yyruleno==109); |
| 2748 | -#line 671 "pikchr.y" | |
| 2749 | +#line 672 "pikchr.y" | |
| 2749 | 2750 | {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" | |
| 2751 | 2752 | break; |
| 2752 | 2753 | case 110: /* expr ::= NTH VERTEX OF object DOT_L X */ |
| 2753 | -#line 677 "pikchr.y" | |
| 2754 | +#line 678 "pikchr.y" | |
| 2754 | 2755 | {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" | |
| 2756 | 2757 | yymsp[-5].minor.yy191 = yylhsminor.yy191; |
| 2757 | 2758 | break; |
| 2758 | 2759 | case 111: /* expr ::= NTH VERTEX OF object DOT_L Y */ |
| 2759 | -#line 679 "pikchr.y" | |
| 2760 | +#line 680 "pikchr.y" | |
| 2760 | 2761 | {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" | |
| 2762 | 2763 | yymsp[-5].minor.yy191 = yylhsminor.yy191; |
| 2763 | 2764 | break; |
| 2764 | 2765 | default: |
| 2765 | 2766 | /* (112) lvalue ::= ID */ yytestcase(yyruleno==112); |
| 2766 | 2767 | /* (113) lvalue ::= FILL */ yytestcase(yyruleno==113); |
| @@ -2855,18 +2856,18 @@ | ||
| 2855 | 2856 | ){ |
| 2856 | 2857 | pik_parserARG_FETCH |
| 2857 | 2858 | pik_parserCTX_FETCH |
| 2858 | 2859 | #define TOKEN yyminor |
| 2859 | 2860 | /************ Begin %syntax_error code ****************************************/ |
| 2860 | -#line 466 "pikchr.y" | |
| 2861 | +#line 467 "pikchr.y" | |
| 2861 | 2862 | |
| 2862 | 2863 | if( TOKEN.z && TOKEN.z[0] ){ |
| 2863 | 2864 | pik_error(p, &TOKEN, "syntax error"); |
| 2864 | 2865 | }else{ |
| 2865 | 2866 | pik_error(p, 0, "syntax error"); |
| 2866 | 2867 | } |
| 2867 | -#line 2892 "pikchr.c" | |
| 2868 | +#line 2893 "pikchr.c" | |
| 2868 | 2869 | /************ End %syntax_error code ******************************************/ |
| 2869 | 2870 | pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */ |
| 2870 | 2871 | pik_parserCTX_STORE |
| 2871 | 2872 | } |
| 2872 | 2873 | |
| @@ -3095,11 +3096,11 @@ | ||
| 3095 | 3096 | #else |
| 3096 | 3097 | (void)iToken; |
| 3097 | 3098 | return 0; |
| 3098 | 3099 | #endif |
| 3099 | 3100 | } |
| 3100 | -#line 689 "pikchr.y" | |
| 3101 | +#line 690 "pikchr.y" | |
| 3101 | 3102 | |
| 3102 | 3103 | |
| 3103 | 3104 | |
| 3104 | 3105 | /* Chart of the 140 official HTML color names with their |
| 3105 | 3106 | ** corresponding RGB value. |
| @@ -3284,10 +3285,13 @@ | ||
| 3284 | 3285 | { "cylwid", 0.75 }, |
| 3285 | 3286 | { "dashwid", 0.05 }, |
| 3286 | 3287 | { "dotrad", 0.015 }, |
| 3287 | 3288 | { "ellipseht", 0.5 }, |
| 3288 | 3289 | { "ellipsewid", 0.75 }, |
| 3290 | + { "fileht", 0.75 }, | |
| 3291 | + { "filerad", 0.15 }, | |
| 3292 | + { "filewid", 0.5 }, | |
| 3289 | 3293 | { "fill", -1.0 }, |
| 3290 | 3294 | { "lineht", 0.5 }, |
| 3291 | 3295 | { "linewid", 0.5 }, |
| 3292 | 3296 | { "movewid", 0.5 }, |
| 3293 | 3297 | { "ovalht", 0.5 }, |
| @@ -3669,10 +3673,73 @@ | ||
| 3669 | 3673 | pik_append_style(p,pElem); |
| 3670 | 3674 | pik_append(p,"\" />\n", -1); |
| 3671 | 3675 | } |
| 3672 | 3676 | pik_append_txt(p, pElem, 0); |
| 3673 | 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 | + | |
| 3674 | 3741 | |
| 3675 | 3742 | /* Methods for the "line" class */ |
| 3676 | 3743 | static void lineInit(Pik *p, PElem *pElem){ |
| 3677 | 3744 | pElem->w = pik_value(p, "linewid",7,0); |
| 3678 | 3745 | pElem->h = pik_value(p, "lineht",6,0); |
| @@ -3838,109 +3905,131 @@ | ||
| 3838 | 3905 | ** elements. The special STRING and [] elements are separate. |
| 3839 | 3906 | */ |
| 3840 | 3907 | static const PClass aClass[] = { |
| 3841 | 3908 | { /* name */ "arc", |
| 3842 | 3909 | /* isline */ 1, |
| 3910 | + /* eJust */ 0, | |
| 3843 | 3911 | /* xInit */ arcInit, |
| 3844 | 3912 | /* xNumProp */ 0, |
| 3845 | 3913 | /* xChop */ 0, |
| 3846 | 3914 | /* xOffset */ 0, |
| 3847 | 3915 | /* xFit */ 0, |
| 3848 | 3916 | /* xRender */ arcRender |
| 3849 | 3917 | }, |
| 3850 | 3918 | { /* name */ "arrow", |
| 3851 | 3919 | /* isline */ 1, |
| 3920 | + /* eJust */ 0, | |
| 3852 | 3921 | /* xInit */ arrowInit, |
| 3853 | 3922 | /* xNumProp */ 0, |
| 3854 | 3923 | /* xChop */ 0, |
| 3855 | 3924 | /* xOffset */ 0, |
| 3856 | 3925 | /* xFit */ 0, |
| 3857 | 3926 | /* xRender */ splineRender |
| 3858 | 3927 | }, |
| 3859 | 3928 | { /* name */ "box", |
| 3860 | 3929 | /* isline */ 0, |
| 3930 | + /* eJust */ 1, | |
| 3861 | 3931 | /* xInit */ boxInit, |
| 3862 | 3932 | /* xNumProp */ 0, |
| 3863 | 3933 | /* xChop */ boxChop, |
| 3864 | 3934 | /* xOffset */ boxOffset, |
| 3865 | 3935 | /* xFit */ boxFit, |
| 3866 | 3936 | /* xRender */ boxRender |
| 3867 | 3937 | }, |
| 3868 | 3938 | { /* name */ "circle", |
| 3869 | 3939 | /* isline */ 0, |
| 3940 | + /* eJust */ 0, | |
| 3870 | 3941 | /* xInit */ circleInit, |
| 3871 | 3942 | /* xNumProp */ circleNumProp, |
| 3872 | 3943 | /* xChop */ circleChop, |
| 3873 | 3944 | /* xOffset */ ellipseOffset, |
| 3874 | 3945 | /* xFit */ circleFit, |
| 3875 | 3946 | /* xRender */ circleRender |
| 3876 | 3947 | }, |
| 3877 | 3948 | { /* name */ "cylinder", |
| 3878 | 3949 | /* isline */ 0, |
| 3950 | + /* eJust */ 1, | |
| 3879 | 3951 | /* xInit */ cylinderInit, |
| 3880 | 3952 | /* xNumProp */ 0, |
| 3881 | 3953 | /* xChop */ boxChop, |
| 3882 | 3954 | /* xOffset */ cylinderOffset, |
| 3883 | 3955 | /* xFit */ 0, |
| 3884 | 3956 | /* xRender */ cylinderRender |
| 3885 | 3957 | }, |
| 3886 | 3958 | { /* name */ "dot", |
| 3887 | 3959 | /* isline */ 0, |
| 3960 | + /* eJust */ 0, | |
| 3888 | 3961 | /* xInit */ dotInit, |
| 3889 | 3962 | /* xNumProp */ dotNumProp, |
| 3890 | 3963 | /* xChop */ circleChop, |
| 3891 | 3964 | /* xOffset */ ellipseOffset, |
| 3892 | 3965 | /* xFit */ 0, |
| 3893 | 3966 | /* xRender */ dotRender |
| 3894 | 3967 | }, |
| 3895 | 3968 | { /* name */ "ellipse", |
| 3896 | 3969 | /* isline */ 0, |
| 3970 | + /* eJust */ 0, | |
| 3897 | 3971 | /* xInit */ ellipseInit, |
| 3898 | 3972 | /* xNumProp */ 0, |
| 3899 | 3973 | /* xChop */ ellipseChop, |
| 3900 | 3974 | /* xOffset */ ellipseOffset, |
| 3901 | 3975 | /* xFit */ 0, |
| 3902 | 3976 | /* xRender */ ellipseRender |
| 3903 | 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 | + }, | |
| 3904 | 3988 | { /* name */ "line", |
| 3905 | 3989 | /* isline */ 1, |
| 3990 | + /* eJust */ 0, | |
| 3906 | 3991 | /* xInit */ lineInit, |
| 3907 | 3992 | /* xNumProp */ 0, |
| 3908 | 3993 | /* xChop */ 0, |
| 3909 | 3994 | /* xOffset */ 0, |
| 3910 | 3995 | /* xFit */ 0, |
| 3911 | 3996 | /* xRender */ splineRender |
| 3912 | 3997 | }, |
| 3913 | 3998 | { /* name */ "move", |
| 3914 | 3999 | /* isline */ 1, |
| 4000 | + /* eJust */ 0, | |
| 3915 | 4001 | /* xInit */ moveInit, |
| 3916 | 4002 | /* xNumProp */ 0, |
| 3917 | 4003 | /* xChop */ 0, |
| 3918 | 4004 | /* xOffset */ 0, |
| 3919 | 4005 | /* xFit */ 0, |
| 3920 | 4006 | /* xRender */ moveRender |
| 3921 | 4007 | }, |
| 3922 | 4008 | { /* name */ "oval", |
| 3923 | 4009 | /* isline */ 0, |
| 4010 | + /* eJust */ 1, | |
| 3924 | 4011 | /* xInit */ ovalInit, |
| 3925 | 4012 | /* xNumProp */ ovalNumProp, |
| 3926 | 4013 | /* xChop */ boxChop, |
| 3927 | 4014 | /* xOffset */ boxOffset, |
| 3928 | 4015 | /* xFit */ ovalFit, |
| 3929 | 4016 | /* xRender */ boxRender |
| 3930 | 4017 | }, |
| 3931 | 4018 | { /* name */ "spline", |
| 3932 | 4019 | /* isline */ 1, |
| 4020 | + /* eJust */ 0, | |
| 3933 | 4021 | /* xInit */ splineInit, |
| 3934 | 4022 | /* xNumProp */ 0, |
| 3935 | 4023 | /* xChop */ 0, |
| 3936 | 4024 | /* xOffset */ 0, |
| 3937 | 4025 | /* xFit */ 0, |
| 3938 | 4026 | /* xRender */ splineRender |
| 3939 | 4027 | }, |
| 3940 | 4028 | { /* name */ "text", |
| 3941 | 4029 | /* isline */ 0, |
| 4030 | + /* eJust */ 0, | |
| 3942 | 4031 | /* xInit */ textInit, |
| 3943 | 4032 | /* xNumProp */ 0, |
| 3944 | 4033 | /* xChop */ boxChop, |
| 3945 | 4034 | /* xOffset */ boxOffset, |
| 3946 | 4035 | /* xFit */ 0, |
| @@ -3948,10 +4037,11 @@ | ||
| 3948 | 4037 | }, |
| 3949 | 4038 | }; |
| 3950 | 4039 | static const PClass sublistClass = |
| 3951 | 4040 | { /* name */ "[]", |
| 3952 | 4041 | /* isline */ 0, |
| 4042 | + /* eJust */ 0, | |
| 3953 | 4043 | /* xInit */ sublistInit, |
| 3954 | 4044 | /* xNumProp */ 0, |
| 3955 | 4045 | /* xChop */ 0, |
| 3956 | 4046 | /* xOffset */ 0, |
| 3957 | 4047 | /* xFit */ 0, |
| @@ -3958,10 +4048,11 @@ | ||
| 3958 | 4048 | /* xRender */ 0 |
| 3959 | 4049 | }; |
| 3960 | 4050 | static const PClass noopClass = |
| 3961 | 4051 | { /* name */ "noop", |
| 3962 | 4052 | /* isline */ 0, |
| 4053 | + /* eJust */ 0, | |
| 3963 | 4054 | /* xInit */ 0, |
| 3964 | 4055 | /* xNumProp */ 0, |
| 3965 | 4056 | /* xChop */ 0, |
| 3966 | 4057 | /* xOffset */ 0, |
| 3967 | 4058 | /* xFit */ 0, |
| @@ -4218,42 +4309,59 @@ | ||
| 4218 | 4309 | } |
| 4219 | 4310 | }else{ |
| 4220 | 4311 | int allSlots = 0; |
| 4221 | 4312 | int aFree[5]; |
| 4222 | 4313 | int iSlot; |
| 4223 | - int j; | |
| 4314 | + int j, mJust; | |
| 4224 | 4315 | /* 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--){ | |
| 4226 | 4317 | if( aTxt[i].eCode & TP_ABOVE ){ |
| 4227 | 4318 | if( j==0 ){ |
| 4228 | 4319 | j++; |
| 4320 | + mJust = aTxt[i].eCode & TP_JMASK; | |
| 4321 | + }else if( j==1 && mJust!=0 && (aTxt[i].eCode & mJust)==0 ){ | |
| 4322 | + j++; | |
| 4229 | 4323 | }else{ |
| 4230 | 4324 | aTxt[i].eCode = (aTxt[i].eCode & ~TP_VMASK) | TP_ABOVE2; |
| 4231 | 4325 | break; |
| 4232 | 4326 | } |
| 4233 | 4327 | } |
| 4234 | 4328 | } |
| 4235 | 4329 | /* 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++){ | |
| 4237 | 4331 | if( aTxt[i].eCode & TP_BELOW ){ |
| 4238 | 4332 | if( j==0 ){ |
| 4239 | 4333 | j++; |
| 4334 | + mJust = aTxt[i].eCode & TP_JMASK; | |
| 4335 | + }else if( j==1 && mJust!=0 && (aTxt[i].eCode & mJust)==0 ){ | |
| 4336 | + j++; | |
| 4240 | 4337 | }else{ |
| 4241 | 4338 | aTxt[i].eCode = (aTxt[i].eCode & ~TP_VMASK) | TP_BELOW2; |
| 4242 | 4339 | break; |
| 4243 | 4340 | } |
| 4244 | 4341 | } |
| 4245 | 4342 | } |
| 4246 | 4343 | /* Compute a mask of all slots used */ |
| 4247 | 4344 | for(i=0; i<n; i++) allSlots |= aTxt[i].eCode & TP_VMASK; |
| 4248 | 4345 | /* 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 | + } | |
| 4255 | 4363 | /* Set the VMASK for all unassigned texts */ |
| 4256 | 4364 | for(i=iSlot=0; i<n; i++){ |
| 4257 | 4365 | if( (aTxt[i].eCode & TP_VMASK)==0 ){ |
| 4258 | 4366 | aTxt[i].eCode |= aFree[iSlot++]; |
| 4259 | 4367 | } |
| @@ -4260,18 +4368,27 @@ | ||
| 4260 | 4368 | } |
| 4261 | 4369 | } |
| 4262 | 4370 | } |
| 4263 | 4371 | |
| 4264 | 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. | |
| 4265 | 4381 | ** |
| 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. | |
| 4269 | 4385 | */ |
| 4270 | 4386 | 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 */ | |
| 4273 | 4390 | int n, i, nz; |
| 4274 | 4391 | PNum x, y, orig_y; |
| 4275 | 4392 | const char *z; |
| 4276 | 4393 | PToken *aTxt; |
| 4277 | 4394 | int hasCenter = 0; |
| @@ -4290,42 +4407,50 @@ | ||
| 4290 | 4407 | dy2 = dy; |
| 4291 | 4408 | }else if( pElem->type->isLine ){ |
| 4292 | 4409 | dy2 = pElem->sw; |
| 4293 | 4410 | }else{ |
| 4294 | 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; | |
| 4295 | 4417 | } |
| 4296 | 4418 | for(i=0; i<n; i++){ |
| 4297 | 4419 | PToken *t = &aTxt[i]; |
| 4298 | 4420 | PNum xtraFontScale = 1.0; |
| 4299 | 4421 | orig_y = y = pElem->ptAt.y; |
| 4422 | + PNum nx = x; | |
| 4300 | 4423 | if( t->eCode & TP_ABOVE2 ) y += dy2 + 3*dy; |
| 4301 | 4424 | if( t->eCode & TP_ABOVE ) y += dy2 + dy; |
| 4302 | 4425 | if( t->eCode & TP_BELOW ) y -= dy2 + dy; |
| 4303 | 4426 | if( t->eCode & TP_BELOW2 ) y -= dy2 + 3*dy; |
| 4304 | 4427 | if( t->eCode & TP_BIG ) xtraFontScale *= 1.25; |
| 4305 | 4428 | if( t->eCode & TP_SMALL ) xtraFontScale *= 0.8; |
| 4306 | 4429 | if( t->eCode & TP_XTRA ) xtraFontScale *= xtraFontScale; |
| 4430 | + if( t->eCode & TP_LJUST ) nx -= jw; | |
| 4431 | + if( t->eCode & TP_RJUST ) nx += jw; | |
| 4307 | 4432 | |
| 4308 | 4433 | if( pBox!=0 ){ |
| 4309 | 4434 | /* If pBox is not NULL, do not draw any <text>. Instead, just expand |
| 4310 | 4435 | ** pBox to include the text */ |
| 4311 | 4436 | PNum cw = pik_text_length(t)*p->charWidth*xtraFontScale; |
| 4312 | 4437 | PNum ch = p->charHeight*0.5*xtraFontScale; |
| 4313 | 4438 | 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); | |
| 4316 | 4441 | }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); | |
| 4319 | 4444 | }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); | |
| 4322 | 4447 | } |
| 4323 | 4448 | continue; |
| 4324 | 4449 | } |
| 4325 | 4450 | |
| 4326 | - pik_append_x(p, "<text x=\"", x, "\""); | |
| 4451 | + pik_append_x(p, "<text x=\"", nx, "\""); | |
| 4327 | 4452 | pik_append_y(p, " y=\"", y, "\""); |
| 4328 | 4453 | if( t->eCode & TP_RJUST ){ |
| 4329 | 4454 | pik_append(p, " text-anchor=\"end\"", -1); |
| 4330 | 4455 | }else if( t->eCode & TP_LJUST ){ |
| 4331 | 4456 | pik_append(p, " text-anchor=\"start\"", -1); |
| @@ -5093,14 +5218,14 @@ | ||
| 5093 | 5218 | /* Merge "text-position" flags |
| 5094 | 5219 | */ |
| 5095 | 5220 | static int pik_text_position(Pik *p, int iPrev, PToken *pFlag){ |
| 5096 | 5221 | int iRes = iPrev; |
| 5097 | 5222 | switch( pFlag->eType ){ |
| 5098 | - case T_CENTER: /* no-op */ break; | |
| 5099 | 5223 | case T_LJUST: iRes = (iRes&~TP_JMASK) | TP_LJUST; break; |
| 5100 | 5224 | case T_RJUST: iRes = (iRes&~TP_JMASK) | TP_RJUST; break; |
| 5101 | 5225 | case T_ABOVE: iRes = (iRes&~TP_VMASK) | TP_ABOVE; break; |
| 5226 | + case T_CENTER: iRes = (iRes&~TP_VMASK) | TP_CENTER; break; | |
| 5102 | 5227 | case T_BELOW: iRes = (iRes&~TP_VMASK) | TP_BELOW; break; |
| 5103 | 5228 | case T_ITALIC: iRes |= TP_ITALIC; break; |
| 5104 | 5229 | case T_BOLD: iRes |= TP_BOLD; break; |
| 5105 | 5230 | case T_ALIGNED: iRes |= TP_ALIGN; break; |
| 5106 | 5231 | case T_BIG: if( iRes & TP_BIG ) iRes |= TP_XTRA; |
| @@ -5177,11 +5302,15 @@ | ||
| 5177 | 5302 | h = hasCenter + hasSingleStack*2 + hasDoubleStack*2; |
| 5178 | 5303 | } |
| 5179 | 5304 | if( (pElem->mProp & A_WIDTH)==0 ){ |
| 5180 | 5305 | for(i=0; i<pElem->nTxt; i++){ |
| 5181 | 5306 | 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 | + } | |
| 5183 | 5312 | if( cnt>w ) w = cnt; |
| 5184 | 5313 | } |
| 5185 | 5314 | } |
| 5186 | 5315 | if( h>0 || w>0 ){ |
| 5187 | 5316 | pik_compute_layout_settings(p); |
| @@ -6528,6 +6657,6 @@ | ||
| 6528 | 6657 | printf("</body></html>\n"); |
| 6529 | 6658 | return 0; |
| 6530 | 6659 | } |
| 6531 | 6660 | #endif /* PIKCHR_SHELL */ |
| 6532 | 6661 | |
| 6533 | -#line 6558 "pikchr.c" | |
| 6662 | +#line 6687 "pikchr.c" | |
| 6534 | 6663 |
| --- 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 |