Fossil SCM
New pikchr.c file that fixes alignment of chopped lines.
Commit
7c28d11d9ad2dc13a3b291a04972923bcd5f4a6a75af0caa4f7bc9c5249143c8
Parent
367654037435909…
1 file changed
+302
-298
+302
-298
| --- src/pikchr.c | ||
| +++ src/pikchr.c | ||
| @@ -124,10 +124,14 @@ | ||
| 124 | 124 | #include <assert.h> |
| 125 | 125 | #define count(X) (sizeof(X)/sizeof(X[0])) |
| 126 | 126 | #ifndef M_PI |
| 127 | 127 | # define M_PI 3.1415926535897932385 |
| 128 | 128 | #endif |
| 129 | + | |
| 130 | +/* Tag intentionally unused parameters with this macro to prevent | |
| 131 | +** compiler warnings with -Wextra */ | |
| 132 | +#define UNUSED_PARAMETER(X) (void)(X) | |
| 129 | 133 | |
| 130 | 134 | typedef struct Pik Pik; /* Complete parsing context */ |
| 131 | 135 | typedef struct PToken PToken; /* A single token */ |
| 132 | 136 | typedef struct PElem PElem; /* A single diagram object or "element" */ |
| 133 | 137 | typedef struct PEList PEList; /* A list of elements */ |
| @@ -397,11 +401,11 @@ | ||
| 397 | 401 | static void pik_append_arc(Pik*,PNum,PNum,PNum,PNum); |
| 398 | 402 | static void pik_append_clr(Pik*,const char*,PNum,const char*); |
| 399 | 403 | static void pik_append_style(Pik*,PElem*); |
| 400 | 404 | static void pik_append_txt(Pik*,PElem*, PBox*); |
| 401 | 405 | static void pik_draw_arrowhead(Pik*,PPoint*pFrom,PPoint*pTo,PElem*); |
| 402 | -static void pik_chop(Pik*,PPoint*pFrom,PPoint*pTo,PNum); | |
| 406 | +static void pik_chop(PPoint*pFrom,PPoint*pTo,PNum); | |
| 403 | 407 | static void pik_error(Pik*,PToken*,const char*); |
| 404 | 408 | static void pik_elist_free(Pik*,PEList*); |
| 405 | 409 | static void pik_elem_free(Pik*,PElem*); |
| 406 | 410 | static void pik_render(Pik*,PEList*); |
| 407 | 411 | static PEList *pik_elist_append(Pik*,PEList*,PElem*); |
| @@ -410,11 +414,11 @@ | ||
| 410 | 414 | static void pik_elem_setname(Pik*,PElem*,PToken*); |
| 411 | 415 | static void pik_set_var(Pik*,PToken*,PNum,PToken*); |
| 412 | 416 | static PNum pik_value(Pik*,const char*,int,int*); |
| 413 | 417 | static PNum pik_lookup_color(Pik*,PToken*); |
| 414 | 418 | static PNum pik_get_var(Pik*,PToken*); |
| 415 | -static PNum pik_atof(Pik*,PToken*); | |
| 419 | +static PNum pik_atof(PToken*); | |
| 416 | 420 | static void pik_after_adding_attributes(Pik*,PElem*); |
| 417 | 421 | static void pik_elem_move(PElem*,PNum dx, PNum dy); |
| 418 | 422 | static void pik_elist_move(PEList*,PNum dx, PNum dy); |
| 419 | 423 | static void pik_set_numprop(Pik*,PToken*,PRel*); |
| 420 | 424 | static void pik_set_clrprop(Pik*,PToken*,PNum); |
| @@ -437,26 +441,26 @@ | ||
| 437 | 441 | static void pik_bbox_add_xy(PBox*,PNum,PNum); |
| 438 | 442 | static void pik_bbox_addellipse(PBox*,PNum x,PNum y,PNum rx,PNum ry); |
| 439 | 443 | static void pik_add_txt(Pik*,PToken*,int); |
| 440 | 444 | static int pik_text_length(const PToken *pToken); |
| 441 | 445 | static void pik_size_to_fit(Pik*,PToken*); |
| 442 | -static int pik_text_position(Pik*,int,PToken*); | |
| 443 | -static PNum pik_property_of(Pik*,PElem*,PToken*); | |
| 446 | +static int pik_text_position(int,PToken*); | |
| 447 | +static PNum pik_property_of(PElem*,PToken*); | |
| 444 | 448 | static PNum pik_func(Pik*,PToken*,PNum,PNum); |
| 445 | -static PPoint pik_position_between(Pik *p, PNum x, PPoint p1, PPoint p2); | |
| 446 | -static PPoint pik_position_at_angle(Pik *p, PNum dist, PNum r, PPoint pt); | |
| 447 | -static PPoint pik_position_at_hdg(Pik *p, PNum dist, PToken *pD, PPoint pt); | |
| 449 | +static PPoint pik_position_between(PNum x, PPoint p1, PPoint p2); | |
| 450 | +static PPoint pik_position_at_angle(PNum dist, PNum r, PPoint pt); | |
| 451 | +static PPoint pik_position_at_hdg(PNum dist, PToken *pD, PPoint pt); | |
| 448 | 452 | static void pik_same(Pik *p, PElem*, PToken*); |
| 449 | 453 | static PPoint pik_nth_vertex(Pik *p, PToken *pNth, PToken *pErr, PElem *pElem); |
| 450 | -static PToken pik_next_semantic_token(Pik *p, PToken *pThis); | |
| 454 | +static PToken pik_next_semantic_token(PToken *pThis); | |
| 451 | 455 | static void pik_compute_layout_settings(Pik*); |
| 452 | 456 | static void pik_behind(Pik*,PElem*); |
| 453 | 457 | static PElem *pik_assert(Pik*,PNum,PToken*,PNum); |
| 454 | 458 | static PElem *pik_place_assert(Pik*,PPoint*,PToken*,PPoint*); |
| 455 | 459 | |
| 456 | 460 | |
| 457 | -#line 483 "pikchr.c" | |
| 461 | +#line 487 "pikchr.c" | |
| 458 | 462 | /**************** End of %include directives **********************************/ |
| 459 | 463 | /* These constants specify the various numeric values for terminal symbols. |
| 460 | 464 | ***************** Begin token definitions *************************************/ |
| 461 | 465 | #ifndef T_ID |
| 462 | 466 | #define T_ID 1 |
| @@ -1628,22 +1632,22 @@ | ||
| 1628 | 1632 | ** inside the C code. |
| 1629 | 1633 | */ |
| 1630 | 1634 | /********* Begin destructor definitions ***************************************/ |
| 1631 | 1635 | case 94: /* element_list */ |
| 1632 | 1636 | { |
| 1633 | -#line 472 "pikchr.y" | |
| 1637 | +#line 476 "pikchr.y" | |
| 1634 | 1638 | pik_elist_free(p,(yypminor->yy72)); |
| 1635 | -#line 1660 "pikchr.c" | |
| 1639 | +#line 1664 "pikchr.c" | |
| 1636 | 1640 | } |
| 1637 | 1641 | break; |
| 1638 | 1642 | case 95: /* element */ |
| 1639 | 1643 | case 96: /* unnamed_element */ |
| 1640 | 1644 | case 97: /* basetype */ |
| 1641 | 1645 | { |
| 1642 | -#line 474 "pikchr.y" | |
| 1646 | +#line 478 "pikchr.y" | |
| 1643 | 1647 | pik_elem_free(p,(yypminor->yy254)); |
| 1644 | -#line 1669 "pikchr.c" | |
| 1648 | +#line 1673 "pikchr.c" | |
| 1645 | 1649 | } |
| 1646 | 1650 | break; |
| 1647 | 1651 | /********* End destructor definitions *****************************************/ |
| 1648 | 1652 | default: break; /* If no destructor action specified: do nothing */ |
| 1649 | 1653 | } |
| @@ -1806,11 +1810,11 @@ | ||
| 1806 | 1810 | } |
| 1807 | 1811 | } |
| 1808 | 1812 | #endif /* YYWILDCARD */ |
| 1809 | 1813 | return yy_default[stateno]; |
| 1810 | 1814 | }else{ |
| 1811 | - assert( i>=0 && i<sizeof(yy_action)/sizeof(yy_action[0]) ); | |
| 1815 | + assert( i>=0 && i<(int)(sizeof(yy_action)/sizeof(yy_action[0])) ); | |
| 1812 | 1816 | return yy_action[i]; |
| 1813 | 1817 | } |
| 1814 | 1818 | }while(1); |
| 1815 | 1819 | } |
| 1816 | 1820 | |
| @@ -1857,14 +1861,14 @@ | ||
| 1857 | 1861 | #endif |
| 1858 | 1862 | while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser); |
| 1859 | 1863 | /* Here code is inserted which will execute if the parser |
| 1860 | 1864 | ** stack every overflows */ |
| 1861 | 1865 | /******** Begin %stack_overflow code ******************************************/ |
| 1862 | -#line 505 "pikchr.y" | |
| 1866 | +#line 510 "pikchr.y" | |
| 1863 | 1867 | |
| 1864 | 1868 | pik_error(p, 0, "parser stack overflow"); |
| 1865 | -#line 1890 "pikchr.c" | |
| 1869 | +#line 1894 "pikchr.c" | |
| 1866 | 1870 | /******** End %stack_overflow code ********************************************/ |
| 1867 | 1871 | pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */ |
| 1868 | 1872 | pik_parserCTX_STORE |
| 1869 | 1873 | } |
| 1870 | 1874 | |
| @@ -2329,593 +2333,593 @@ | ||
| 2329 | 2333 | ** break; |
| 2330 | 2334 | */ |
| 2331 | 2335 | /********** Begin reduce actions **********************************************/ |
| 2332 | 2336 | YYMINORTYPE yylhsminor; |
| 2333 | 2337 | case 0: /* document ::= element_list */ |
| 2334 | -#line 509 "pikchr.y" | |
| 2338 | +#line 514 "pikchr.y" | |
| 2335 | 2339 | {pik_render(p,yymsp[0].minor.yy72);} |
| 2336 | -#line 2361 "pikchr.c" | |
| 2340 | +#line 2365 "pikchr.c" | |
| 2337 | 2341 | break; |
| 2338 | 2342 | case 1: /* element_list ::= element */ |
| 2339 | -#line 512 "pikchr.y" | |
| 2343 | +#line 517 "pikchr.y" | |
| 2340 | 2344 | { yylhsminor.yy72 = pik_elist_append(p,0,yymsp[0].minor.yy254); } |
| 2341 | -#line 2366 "pikchr.c" | |
| 2345 | +#line 2370 "pikchr.c" | |
| 2342 | 2346 | yymsp[0].minor.yy72 = yylhsminor.yy72; |
| 2343 | 2347 | break; |
| 2344 | 2348 | case 2: /* element_list ::= element_list EOL element */ |
| 2345 | -#line 514 "pikchr.y" | |
| 2349 | +#line 519 "pikchr.y" | |
| 2346 | 2350 | { yylhsminor.yy72 = pik_elist_append(p,yymsp[-2].minor.yy72,yymsp[0].minor.yy254); } |
| 2347 | -#line 2372 "pikchr.c" | |
| 2351 | +#line 2376 "pikchr.c" | |
| 2348 | 2352 | yymsp[-2].minor.yy72 = yylhsminor.yy72; |
| 2349 | 2353 | break; |
| 2350 | 2354 | case 3: /* element ::= */ |
| 2351 | -#line 517 "pikchr.y" | |
| 2355 | +#line 522 "pikchr.y" | |
| 2352 | 2356 | { yymsp[1].minor.yy254 = 0; } |
| 2353 | -#line 2378 "pikchr.c" | |
| 2357 | +#line 2382 "pikchr.c" | |
| 2354 | 2358 | break; |
| 2355 | 2359 | case 4: /* element ::= direction */ |
| 2356 | -#line 518 "pikchr.y" | |
| 2360 | +#line 523 "pikchr.y" | |
| 2357 | 2361 | { pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy254=0; } |
| 2358 | -#line 2383 "pikchr.c" | |
| 2362 | +#line 2387 "pikchr.c" | |
| 2359 | 2363 | yymsp[0].minor.yy254 = yylhsminor.yy254; |
| 2360 | 2364 | break; |
| 2361 | 2365 | case 5: /* element ::= lvalue ASSIGN rvalue */ |
| 2362 | -#line 519 "pikchr.y" | |
| 2366 | +#line 524 "pikchr.y" | |
| 2363 | 2367 | {pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy73,&yymsp[-1].minor.yy0); yylhsminor.yy254=0;} |
| 2364 | -#line 2389 "pikchr.c" | |
| 2368 | +#line 2393 "pikchr.c" | |
| 2365 | 2369 | yymsp[-2].minor.yy254 = yylhsminor.yy254; |
| 2366 | 2370 | break; |
| 2367 | 2371 | case 6: /* element ::= PLACENAME COLON unnamed_element */ |
| 2368 | -#line 521 "pikchr.y" | |
| 2372 | +#line 526 "pikchr.y" | |
| 2369 | 2373 | { yylhsminor.yy254 = yymsp[0].minor.yy254; pik_elem_setname(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0); } |
| 2370 | -#line 2395 "pikchr.c" | |
| 2374 | +#line 2399 "pikchr.c" | |
| 2371 | 2375 | yymsp[-2].minor.yy254 = yylhsminor.yy254; |
| 2372 | 2376 | break; |
| 2373 | 2377 | case 7: /* element ::= PLACENAME COLON position */ |
| 2374 | -#line 523 "pikchr.y" | |
| 2378 | +#line 528 "pikchr.y" | |
| 2375 | 2379 | { yylhsminor.yy254 = pik_elem_new(p,0,0,0); |
| 2376 | 2380 | if(yylhsminor.yy254){ yylhsminor.yy254->ptAt = yymsp[0].minor.yy139; pik_elem_setname(p,yylhsminor.yy254,&yymsp[-2].minor.yy0); }} |
| 2377 | -#line 2402 "pikchr.c" | |
| 2381 | +#line 2406 "pikchr.c" | |
| 2378 | 2382 | yymsp[-2].minor.yy254 = yylhsminor.yy254; |
| 2379 | 2383 | break; |
| 2380 | 2384 | case 8: /* element ::= unnamed_element */ |
| 2381 | -#line 525 "pikchr.y" | |
| 2385 | +#line 530 "pikchr.y" | |
| 2382 | 2386 | {yylhsminor.yy254 = yymsp[0].minor.yy254;} |
| 2383 | -#line 2408 "pikchr.c" | |
| 2387 | +#line 2412 "pikchr.c" | |
| 2384 | 2388 | yymsp[0].minor.yy254 = yylhsminor.yy254; |
| 2385 | 2389 | break; |
| 2386 | 2390 | case 9: /* element ::= print prlist */ |
| 2387 | -#line 526 "pikchr.y" | |
| 2391 | +#line 531 "pikchr.y" | |
| 2388 | 2392 | {pik_append(p,"<br>\n",5); yymsp[-1].minor.yy254=0;} |
| 2389 | -#line 2414 "pikchr.c" | |
| 2393 | +#line 2418 "pikchr.c" | |
| 2390 | 2394 | break; |
| 2391 | 2395 | case 10: /* element ::= ASSERT LP expr EQ expr RP */ |
| 2392 | -#line 531 "pikchr.y" | |
| 2396 | +#line 536 "pikchr.y" | |
| 2393 | 2397 | {yymsp[-5].minor.yy254=pik_assert(p,yymsp[-3].minor.yy73,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy73);} |
| 2394 | -#line 2419 "pikchr.c" | |
| 2398 | +#line 2423 "pikchr.c" | |
| 2395 | 2399 | break; |
| 2396 | 2400 | case 11: /* element ::= ASSERT LP place EQ place RP */ |
| 2397 | -#line 533 "pikchr.y" | |
| 2401 | +#line 538 "pikchr.y" | |
| 2398 | 2402 | {yymsp[-5].minor.yy254=pik_place_assert(p,&yymsp[-3].minor.yy139,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy139);} |
| 2399 | -#line 2424 "pikchr.c" | |
| 2403 | +#line 2428 "pikchr.c" | |
| 2400 | 2404 | break; |
| 2401 | 2405 | case 12: /* rvalue ::= PLACENAME */ |
| 2402 | -#line 544 "pikchr.y" | |
| 2406 | +#line 549 "pikchr.y" | |
| 2403 | 2407 | {yylhsminor.yy73 = pik_lookup_color(p,&yymsp[0].minor.yy0);} |
| 2404 | -#line 2429 "pikchr.c" | |
| 2408 | +#line 2433 "pikchr.c" | |
| 2405 | 2409 | yymsp[0].minor.yy73 = yylhsminor.yy73; |
| 2406 | 2410 | break; |
| 2407 | 2411 | case 13: /* pritem ::= FILL */ |
| 2408 | 2412 | case 14: /* pritem ::= COLOR */ yytestcase(yyruleno==14); |
| 2409 | 2413 | case 15: /* pritem ::= THICKNESS */ yytestcase(yyruleno==15); |
| 2410 | -#line 549 "pikchr.y" | |
| 2414 | +#line 554 "pikchr.y" | |
| 2411 | 2415 | {pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));} |
| 2412 | -#line 2437 "pikchr.c" | |
| 2416 | +#line 2441 "pikchr.c" | |
| 2413 | 2417 | break; |
| 2414 | 2418 | case 16: /* pritem ::= rvalue */ |
| 2415 | -#line 552 "pikchr.y" | |
| 2419 | +#line 557 "pikchr.y" | |
| 2416 | 2420 | {pik_append_num(p,"",yymsp[0].minor.yy73);} |
| 2417 | -#line 2442 "pikchr.c" | |
| 2421 | +#line 2446 "pikchr.c" | |
| 2418 | 2422 | break; |
| 2419 | 2423 | case 17: /* pritem ::= STRING */ |
| 2420 | -#line 553 "pikchr.y" | |
| 2424 | +#line 558 "pikchr.y" | |
| 2421 | 2425 | {pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);} |
| 2422 | -#line 2447 "pikchr.c" | |
| 2426 | +#line 2451 "pikchr.c" | |
| 2423 | 2427 | break; |
| 2424 | 2428 | case 18: /* prsep ::= COMMA */ |
| 2425 | -#line 554 "pikchr.y" | |
| 2429 | +#line 559 "pikchr.y" | |
| 2426 | 2430 | {pik_append(p, " ", 1);} |
| 2427 | -#line 2452 "pikchr.c" | |
| 2431 | +#line 2456 "pikchr.c" | |
| 2428 | 2432 | break; |
| 2429 | 2433 | case 19: /* unnamed_element ::= basetype attribute_list */ |
| 2430 | -#line 557 "pikchr.y" | |
| 2434 | +#line 562 "pikchr.y" | |
| 2431 | 2435 | {yylhsminor.yy254 = yymsp[-1].minor.yy254; pik_after_adding_attributes(p,yylhsminor.yy254);} |
| 2432 | -#line 2457 "pikchr.c" | |
| 2436 | +#line 2461 "pikchr.c" | |
| 2433 | 2437 | yymsp[-1].minor.yy254 = yylhsminor.yy254; |
| 2434 | 2438 | break; |
| 2435 | 2439 | case 20: /* basetype ::= CLASSNAME */ |
| 2436 | -#line 559 "pikchr.y" | |
| 2440 | +#line 564 "pikchr.y" | |
| 2437 | 2441 | {yylhsminor.yy254 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); } |
| 2438 | -#line 2463 "pikchr.c" | |
| 2442 | +#line 2467 "pikchr.c" | |
| 2439 | 2443 | yymsp[0].minor.yy254 = yylhsminor.yy254; |
| 2440 | 2444 | break; |
| 2441 | 2445 | case 21: /* basetype ::= STRING textposition */ |
| 2442 | -#line 561 "pikchr.y" | |
| 2446 | +#line 566 "pikchr.y" | |
| 2443 | 2447 | {yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy74; yylhsminor.yy254 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); } |
| 2444 | -#line 2469 "pikchr.c" | |
| 2448 | +#line 2473 "pikchr.c" | |
| 2445 | 2449 | yymsp[-1].minor.yy254 = yylhsminor.yy254; |
| 2446 | 2450 | break; |
| 2447 | 2451 | case 22: /* basetype ::= LB savelist element_list RB */ |
| 2448 | -#line 563 "pikchr.y" | |
| 2452 | +#line 568 "pikchr.y" | |
| 2449 | 2453 | { p->list = yymsp[-2].minor.yy72; yymsp[-3].minor.yy254 = pik_elem_new(p,0,0,yymsp[-1].minor.yy72); if(yymsp[-3].minor.yy254) yymsp[-3].minor.yy254->errTok = yymsp[0].minor.yy0; } |
| 2450 | -#line 2475 "pikchr.c" | |
| 2454 | +#line 2479 "pikchr.c" | |
| 2451 | 2455 | break; |
| 2452 | 2456 | case 23: /* savelist ::= */ |
| 2453 | -#line 568 "pikchr.y" | |
| 2457 | +#line 573 "pikchr.y" | |
| 2454 | 2458 | {yymsp[1].minor.yy72 = p->list; p->list = 0;} |
| 2455 | -#line 2480 "pikchr.c" | |
| 2459 | +#line 2484 "pikchr.c" | |
| 2456 | 2460 | break; |
| 2457 | 2461 | case 24: /* relexpr ::= expr */ |
| 2458 | -#line 575 "pikchr.y" | |
| 2462 | +#line 580 "pikchr.y" | |
| 2459 | 2463 | {yylhsminor.yy60.rAbs = yymsp[0].minor.yy73; yylhsminor.yy60.rRel = 0;} |
| 2460 | -#line 2485 "pikchr.c" | |
| 2464 | +#line 2489 "pikchr.c" | |
| 2461 | 2465 | yymsp[0].minor.yy60 = yylhsminor.yy60; |
| 2462 | 2466 | break; |
| 2463 | 2467 | case 25: /* relexpr ::= expr PERCENT */ |
| 2464 | -#line 576 "pikchr.y" | |
| 2468 | +#line 581 "pikchr.y" | |
| 2465 | 2469 | {yylhsminor.yy60.rAbs = 0; yylhsminor.yy60.rRel = yymsp[-1].minor.yy73/100;} |
| 2466 | -#line 2491 "pikchr.c" | |
| 2470 | +#line 2495 "pikchr.c" | |
| 2467 | 2471 | yymsp[-1].minor.yy60 = yylhsminor.yy60; |
| 2468 | 2472 | break; |
| 2469 | 2473 | case 26: /* optrelexpr ::= */ |
| 2470 | -#line 578 "pikchr.y" | |
| 2474 | +#line 583 "pikchr.y" | |
| 2471 | 2475 | {yymsp[1].minor.yy60.rAbs = 0; yymsp[1].minor.yy60.rRel = 1.0;} |
| 2472 | -#line 2497 "pikchr.c" | |
| 2476 | +#line 2501 "pikchr.c" | |
| 2473 | 2477 | break; |
| 2474 | 2478 | case 27: /* attribute_list ::= relexpr alist */ |
| 2475 | -#line 580 "pikchr.y" | |
| 2479 | +#line 585 "pikchr.y" | |
| 2476 | 2480 | {pik_add_direction(p,0,&yymsp[-1].minor.yy60);} |
| 2477 | -#line 2502 "pikchr.c" | |
| 2481 | +#line 2506 "pikchr.c" | |
| 2478 | 2482 | break; |
| 2479 | 2483 | case 28: /* attribute ::= numproperty relexpr */ |
| 2480 | -#line 584 "pikchr.y" | |
| 2484 | +#line 589 "pikchr.y" | |
| 2481 | 2485 | { pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy60); } |
| 2482 | -#line 2507 "pikchr.c" | |
| 2486 | +#line 2511 "pikchr.c" | |
| 2483 | 2487 | break; |
| 2484 | 2488 | case 29: /* attribute ::= dashproperty expr */ |
| 2485 | -#line 585 "pikchr.y" | |
| 2489 | +#line 590 "pikchr.y" | |
| 2486 | 2490 | { pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy73); } |
| 2487 | -#line 2512 "pikchr.c" | |
| 2491 | +#line 2516 "pikchr.c" | |
| 2488 | 2492 | break; |
| 2489 | 2493 | case 30: /* attribute ::= dashproperty */ |
| 2490 | -#line 586 "pikchr.y" | |
| 2494 | +#line 591 "pikchr.y" | |
| 2491 | 2495 | { pik_set_dashed(p,&yymsp[0].minor.yy0,0); } |
| 2492 | -#line 2517 "pikchr.c" | |
| 2496 | +#line 2521 "pikchr.c" | |
| 2493 | 2497 | break; |
| 2494 | 2498 | case 31: /* attribute ::= colorproperty rvalue */ |
| 2495 | -#line 587 "pikchr.y" | |
| 2499 | +#line 592 "pikchr.y" | |
| 2496 | 2500 | { pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy73); } |
| 2497 | -#line 2522 "pikchr.c" | |
| 2501 | +#line 2526 "pikchr.c" | |
| 2498 | 2502 | break; |
| 2499 | 2503 | case 32: /* attribute ::= go direction optrelexpr */ |
| 2500 | -#line 588 "pikchr.y" | |
| 2504 | +#line 593 "pikchr.y" | |
| 2501 | 2505 | { pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy60);} |
| 2502 | -#line 2527 "pikchr.c" | |
| 2506 | +#line 2531 "pikchr.c" | |
| 2503 | 2507 | break; |
| 2504 | 2508 | case 33: /* attribute ::= go direction even position */ |
| 2505 | -#line 589 "pikchr.y" | |
| 2509 | +#line 594 "pikchr.y" | |
| 2506 | 2510 | {pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy139);} |
| 2507 | -#line 2532 "pikchr.c" | |
| 2511 | +#line 2536 "pikchr.c" | |
| 2508 | 2512 | break; |
| 2509 | 2513 | case 34: /* attribute ::= CLOSE */ |
| 2510 | -#line 590 "pikchr.y" | |
| 2514 | +#line 595 "pikchr.y" | |
| 2511 | 2515 | { pik_close_path(p,&yymsp[0].minor.yy0); } |
| 2512 | -#line 2537 "pikchr.c" | |
| 2516 | +#line 2541 "pikchr.c" | |
| 2513 | 2517 | break; |
| 2514 | 2518 | case 35: /* attribute ::= CHOP */ |
| 2515 | -#line 591 "pikchr.y" | |
| 2519 | +#line 596 "pikchr.y" | |
| 2516 | 2520 | { p->cur->bChop = 1; } |
| 2517 | -#line 2542 "pikchr.c" | |
| 2521 | +#line 2546 "pikchr.c" | |
| 2518 | 2522 | break; |
| 2519 | 2523 | case 36: /* attribute ::= FROM position */ |
| 2520 | -#line 592 "pikchr.y" | |
| 2524 | +#line 597 "pikchr.y" | |
| 2521 | 2525 | { pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy139); } |
| 2522 | -#line 2547 "pikchr.c" | |
| 2526 | +#line 2551 "pikchr.c" | |
| 2523 | 2527 | break; |
| 2524 | 2528 | case 37: /* attribute ::= TO position */ |
| 2525 | -#line 593 "pikchr.y" | |
| 2529 | +#line 598 "pikchr.y" | |
| 2526 | 2530 | { pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy139); } |
| 2527 | -#line 2552 "pikchr.c" | |
| 2531 | +#line 2556 "pikchr.c" | |
| 2528 | 2532 | break; |
| 2529 | 2533 | case 38: /* attribute ::= THEN */ |
| 2530 | -#line 594 "pikchr.y" | |
| 2534 | +#line 599 "pikchr.y" | |
| 2531 | 2535 | { pik_then(p, &yymsp[0].minor.yy0, p->cur); } |
| 2532 | -#line 2557 "pikchr.c" | |
| 2536 | +#line 2561 "pikchr.c" | |
| 2533 | 2537 | break; |
| 2534 | 2538 | case 39: /* attribute ::= THEN optrelexpr HEADING expr */ |
| 2535 | 2539 | case 41: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==41); |
| 2536 | -#line 596 "pikchr.y" | |
| 2540 | +#line 601 "pikchr.y" | |
| 2537 | 2541 | {pik_move_hdg(p,&yymsp[-2].minor.yy60,&yymsp[-1].minor.yy0,yymsp[0].minor.yy73,0,&yymsp[-3].minor.yy0);} |
| 2538 | -#line 2563 "pikchr.c" | |
| 2542 | +#line 2567 "pikchr.c" | |
| 2539 | 2543 | break; |
| 2540 | 2544 | case 40: /* attribute ::= THEN optrelexpr EDGEPT */ |
| 2541 | 2545 | case 42: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==42); |
| 2542 | -#line 597 "pikchr.y" | |
| 2546 | +#line 602 "pikchr.y" | |
| 2543 | 2547 | {pik_move_hdg(p,&yymsp[-1].minor.yy60,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);} |
| 2544 | -#line 2569 "pikchr.c" | |
| 2548 | +#line 2573 "pikchr.c" | |
| 2545 | 2549 | break; |
| 2546 | 2550 | case 43: /* attribute ::= AT position */ |
| 2547 | -#line 602 "pikchr.y" | |
| 2551 | +#line 607 "pikchr.y" | |
| 2548 | 2552 | { pik_set_at(p,0,&yymsp[0].minor.yy139,&yymsp[-1].minor.yy0); } |
| 2549 | -#line 2574 "pikchr.c" | |
| 2553 | +#line 2578 "pikchr.c" | |
| 2550 | 2554 | break; |
| 2551 | 2555 | case 44: /* attribute ::= SAME */ |
| 2552 | -#line 604 "pikchr.y" | |
| 2556 | +#line 609 "pikchr.y" | |
| 2553 | 2557 | {pik_same(p,0,&yymsp[0].minor.yy0);} |
| 2554 | -#line 2579 "pikchr.c" | |
| 2558 | +#line 2583 "pikchr.c" | |
| 2555 | 2559 | break; |
| 2556 | 2560 | case 45: /* attribute ::= SAME AS object */ |
| 2557 | -#line 605 "pikchr.y" | |
| 2561 | +#line 610 "pikchr.y" | |
| 2558 | 2562 | {pik_same(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0);} |
| 2559 | -#line 2584 "pikchr.c" | |
| 2563 | +#line 2588 "pikchr.c" | |
| 2560 | 2564 | break; |
| 2561 | 2565 | case 46: /* attribute ::= STRING textposition */ |
| 2562 | -#line 606 "pikchr.y" | |
| 2566 | +#line 611 "pikchr.y" | |
| 2563 | 2567 | {pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy74);} |
| 2564 | -#line 2589 "pikchr.c" | |
| 2568 | +#line 2593 "pikchr.c" | |
| 2565 | 2569 | break; |
| 2566 | 2570 | case 47: /* attribute ::= FIT */ |
| 2567 | -#line 607 "pikchr.y" | |
| 2571 | +#line 612 "pikchr.y" | |
| 2568 | 2572 | {pik_size_to_fit(p,&yymsp[0].minor.yy0); } |
| 2569 | -#line 2594 "pikchr.c" | |
| 2573 | +#line 2598 "pikchr.c" | |
| 2570 | 2574 | break; |
| 2571 | 2575 | case 48: /* attribute ::= BEHIND object */ |
| 2572 | -#line 608 "pikchr.y" | |
| 2576 | +#line 613 "pikchr.y" | |
| 2573 | 2577 | {pik_behind(p,yymsp[0].minor.yy254);} |
| 2574 | -#line 2599 "pikchr.c" | |
| 2578 | +#line 2603 "pikchr.c" | |
| 2575 | 2579 | break; |
| 2576 | 2580 | case 49: /* withclause ::= DOT_E edge AT position */ |
| 2577 | 2581 | case 50: /* withclause ::= edge AT position */ yytestcase(yyruleno==50); |
| 2578 | -#line 616 "pikchr.y" | |
| 2582 | +#line 621 "pikchr.y" | |
| 2579 | 2583 | { pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy139,&yymsp[-1].minor.yy0); } |
| 2580 | -#line 2605 "pikchr.c" | |
| 2584 | +#line 2609 "pikchr.c" | |
| 2581 | 2585 | break; |
| 2582 | 2586 | case 51: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */ |
| 2583 | -#line 620 "pikchr.y" | |
| 2587 | +#line 625 "pikchr.y" | |
| 2584 | 2588 | {yylhsminor.yy0 = yymsp[0].minor.yy0;} |
| 2585 | -#line 2610 "pikchr.c" | |
| 2589 | +#line 2614 "pikchr.c" | |
| 2586 | 2590 | yymsp[0].minor.yy0 = yylhsminor.yy0; |
| 2587 | 2591 | break; |
| 2588 | 2592 | case 52: /* boolproperty ::= CW */ |
| 2589 | -#line 631 "pikchr.y" | |
| 2593 | +#line 636 "pikchr.y" | |
| 2590 | 2594 | {p->cur->cw = 1;} |
| 2591 | -#line 2616 "pikchr.c" | |
| 2595 | +#line 2620 "pikchr.c" | |
| 2592 | 2596 | break; |
| 2593 | 2597 | case 53: /* boolproperty ::= CCW */ |
| 2594 | -#line 632 "pikchr.y" | |
| 2598 | +#line 637 "pikchr.y" | |
| 2595 | 2599 | {p->cur->cw = 0;} |
| 2596 | -#line 2621 "pikchr.c" | |
| 2600 | +#line 2625 "pikchr.c" | |
| 2597 | 2601 | break; |
| 2598 | 2602 | case 54: /* boolproperty ::= LARROW */ |
| 2599 | -#line 633 "pikchr.y" | |
| 2603 | +#line 638 "pikchr.y" | |
| 2600 | 2604 | {p->cur->larrow=1; p->cur->rarrow=0; } |
| 2601 | -#line 2626 "pikchr.c" | |
| 2605 | +#line 2630 "pikchr.c" | |
| 2602 | 2606 | break; |
| 2603 | 2607 | case 55: /* boolproperty ::= RARROW */ |
| 2604 | -#line 634 "pikchr.y" | |
| 2608 | +#line 639 "pikchr.y" | |
| 2605 | 2609 | {p->cur->larrow=0; p->cur->rarrow=1; } |
| 2606 | -#line 2631 "pikchr.c" | |
| 2610 | +#line 2635 "pikchr.c" | |
| 2607 | 2611 | break; |
| 2608 | 2612 | case 56: /* boolproperty ::= LRARROW */ |
| 2609 | -#line 635 "pikchr.y" | |
| 2613 | +#line 640 "pikchr.y" | |
| 2610 | 2614 | {p->cur->larrow=1; p->cur->rarrow=1; } |
| 2611 | -#line 2636 "pikchr.c" | |
| 2615 | +#line 2640 "pikchr.c" | |
| 2612 | 2616 | break; |
| 2613 | 2617 | case 57: /* boolproperty ::= INVIS */ |
| 2614 | -#line 636 "pikchr.y" | |
| 2618 | +#line 641 "pikchr.y" | |
| 2615 | 2619 | {p->cur->sw = 0.0;} |
| 2616 | -#line 2641 "pikchr.c" | |
| 2620 | +#line 2645 "pikchr.c" | |
| 2617 | 2621 | break; |
| 2618 | 2622 | case 58: /* boolproperty ::= THICK */ |
| 2619 | -#line 637 "pikchr.y" | |
| 2623 | +#line 642 "pikchr.y" | |
| 2620 | 2624 | {p->cur->sw *= 1.5;} |
| 2621 | -#line 2646 "pikchr.c" | |
| 2625 | +#line 2650 "pikchr.c" | |
| 2622 | 2626 | break; |
| 2623 | 2627 | case 59: /* boolproperty ::= THIN */ |
| 2624 | -#line 638 "pikchr.y" | |
| 2628 | +#line 643 "pikchr.y" | |
| 2625 | 2629 | {p->cur->sw *= 0.67;} |
| 2626 | -#line 2651 "pikchr.c" | |
| 2630 | +#line 2655 "pikchr.c" | |
| 2627 | 2631 | break; |
| 2628 | 2632 | case 60: /* textposition ::= */ |
| 2629 | -#line 640 "pikchr.y" | |
| 2633 | +#line 645 "pikchr.y" | |
| 2630 | 2634 | {yymsp[1].minor.yy74 = 0;} |
| 2631 | -#line 2656 "pikchr.c" | |
| 2635 | +#line 2660 "pikchr.c" | |
| 2632 | 2636 | break; |
| 2633 | 2637 | case 61: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */ |
| 2634 | -#line 643 "pikchr.y" | |
| 2635 | -{yylhsminor.yy74 = pik_text_position(p,yymsp[-1].minor.yy74,&yymsp[0].minor.yy0);} | |
| 2636 | -#line 2661 "pikchr.c" | |
| 2638 | +#line 648 "pikchr.y" | |
| 2639 | +{yylhsminor.yy74 = pik_text_position(yymsp[-1].minor.yy74,&yymsp[0].minor.yy0);} | |
| 2640 | +#line 2665 "pikchr.c" | |
| 2637 | 2641 | yymsp[-1].minor.yy74 = yylhsminor.yy74; |
| 2638 | 2642 | break; |
| 2639 | 2643 | case 62: /* position ::= expr COMMA expr */ |
| 2640 | -#line 646 "pikchr.y" | |
| 2644 | +#line 651 "pikchr.y" | |
| 2641 | 2645 | {yylhsminor.yy139.x=yymsp[-2].minor.yy73; yylhsminor.yy139.y=yymsp[0].minor.yy73;} |
| 2642 | -#line 2667 "pikchr.c" | |
| 2646 | +#line 2671 "pikchr.c" | |
| 2643 | 2647 | yymsp[-2].minor.yy139 = yylhsminor.yy139; |
| 2644 | 2648 | break; |
| 2645 | 2649 | case 63: /* position ::= place PLUS expr COMMA expr */ |
| 2646 | -#line 648 "pikchr.y" | |
| 2650 | +#line 653 "pikchr.y" | |
| 2647 | 2651 | {yylhsminor.yy139.x=yymsp[-4].minor.yy139.x+yymsp[-2].minor.yy73; yylhsminor.yy139.y=yymsp[-4].minor.yy139.y+yymsp[0].minor.yy73;} |
| 2648 | -#line 2673 "pikchr.c" | |
| 2652 | +#line 2677 "pikchr.c" | |
| 2649 | 2653 | yymsp[-4].minor.yy139 = yylhsminor.yy139; |
| 2650 | 2654 | break; |
| 2651 | 2655 | case 64: /* position ::= place MINUS expr COMMA expr */ |
| 2652 | -#line 649 "pikchr.y" | |
| 2656 | +#line 654 "pikchr.y" | |
| 2653 | 2657 | {yylhsminor.yy139.x=yymsp[-4].minor.yy139.x-yymsp[-2].minor.yy73; yylhsminor.yy139.y=yymsp[-4].minor.yy139.y-yymsp[0].minor.yy73;} |
| 2654 | -#line 2679 "pikchr.c" | |
| 2658 | +#line 2683 "pikchr.c" | |
| 2655 | 2659 | yymsp[-4].minor.yy139 = yylhsminor.yy139; |
| 2656 | 2660 | break; |
| 2657 | 2661 | case 65: /* position ::= place PLUS LP expr COMMA expr RP */ |
| 2658 | -#line 651 "pikchr.y" | |
| 2662 | +#line 656 "pikchr.y" | |
| 2659 | 2663 | {yylhsminor.yy139.x=yymsp[-6].minor.yy139.x+yymsp[-3].minor.yy73; yylhsminor.yy139.y=yymsp[-6].minor.yy139.y+yymsp[-1].minor.yy73;} |
| 2660 | -#line 2685 "pikchr.c" | |
| 2664 | +#line 2689 "pikchr.c" | |
| 2661 | 2665 | yymsp[-6].minor.yy139 = yylhsminor.yy139; |
| 2662 | 2666 | break; |
| 2663 | 2667 | case 66: /* position ::= place MINUS LP expr COMMA expr RP */ |
| 2664 | -#line 653 "pikchr.y" | |
| 2668 | +#line 658 "pikchr.y" | |
| 2665 | 2669 | {yylhsminor.yy139.x=yymsp[-6].minor.yy139.x-yymsp[-3].minor.yy73; yylhsminor.yy139.y=yymsp[-6].minor.yy139.y-yymsp[-1].minor.yy73;} |
| 2666 | -#line 2691 "pikchr.c" | |
| 2670 | +#line 2695 "pikchr.c" | |
| 2667 | 2671 | yymsp[-6].minor.yy139 = yylhsminor.yy139; |
| 2668 | 2672 | break; |
| 2669 | 2673 | case 67: /* position ::= LP position COMMA position RP */ |
| 2670 | -#line 654 "pikchr.y" | |
| 2674 | +#line 659 "pikchr.y" | |
| 2671 | 2675 | {yymsp[-4].minor.yy139.x=yymsp[-3].minor.yy139.x; yymsp[-4].minor.yy139.y=yymsp[-1].minor.yy139.y;} |
| 2672 | -#line 2697 "pikchr.c" | |
| 2676 | +#line 2701 "pikchr.c" | |
| 2673 | 2677 | break; |
| 2674 | 2678 | case 68: /* position ::= LP position RP */ |
| 2675 | -#line 655 "pikchr.y" | |
| 2679 | +#line 660 "pikchr.y" | |
| 2676 | 2680 | {yymsp[-2].minor.yy139=yymsp[-1].minor.yy139;} |
| 2677 | -#line 2702 "pikchr.c" | |
| 2681 | +#line 2706 "pikchr.c" | |
| 2678 | 2682 | break; |
| 2679 | 2683 | case 69: /* position ::= expr between position AND position */ |
| 2680 | -#line 657 "pikchr.y" | |
| 2681 | -{yylhsminor.yy139 = pik_position_between(p,yymsp[-4].minor.yy73,yymsp[-2].minor.yy139,yymsp[0].minor.yy139);} | |
| 2682 | -#line 2707 "pikchr.c" | |
| 2684 | +#line 662 "pikchr.y" | |
| 2685 | +{yylhsminor.yy139 = pik_position_between(yymsp[-4].minor.yy73,yymsp[-2].minor.yy139,yymsp[0].minor.yy139);} | |
| 2686 | +#line 2711 "pikchr.c" | |
| 2683 | 2687 | yymsp[-4].minor.yy139 = yylhsminor.yy139; |
| 2684 | 2688 | break; |
| 2685 | 2689 | case 70: /* position ::= expr LT position COMMA position GT */ |
| 2686 | -#line 659 "pikchr.y" | |
| 2687 | -{yylhsminor.yy139 = pik_position_between(p,yymsp[-5].minor.yy73,yymsp[-3].minor.yy139,yymsp[-1].minor.yy139);} | |
| 2688 | -#line 2713 "pikchr.c" | |
| 2690 | +#line 664 "pikchr.y" | |
| 2691 | +{yylhsminor.yy139 = pik_position_between(yymsp[-5].minor.yy73,yymsp[-3].minor.yy139,yymsp[-1].minor.yy139);} | |
| 2692 | +#line 2717 "pikchr.c" | |
| 2689 | 2693 | yymsp[-5].minor.yy139 = yylhsminor.yy139; |
| 2690 | 2694 | break; |
| 2691 | 2695 | case 71: /* position ::= expr ABOVE position */ |
| 2692 | -#line 660 "pikchr.y" | |
| 2696 | +#line 665 "pikchr.y" | |
| 2693 | 2697 | {yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.y += yymsp[-2].minor.yy73;} |
| 2694 | -#line 2719 "pikchr.c" | |
| 2698 | +#line 2723 "pikchr.c" | |
| 2695 | 2699 | yymsp[-2].minor.yy139 = yylhsminor.yy139; |
| 2696 | 2700 | break; |
| 2697 | 2701 | case 72: /* position ::= expr BELOW position */ |
| 2698 | -#line 661 "pikchr.y" | |
| 2702 | +#line 666 "pikchr.y" | |
| 2699 | 2703 | {yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.y -= yymsp[-2].minor.yy73;} |
| 2700 | -#line 2725 "pikchr.c" | |
| 2704 | +#line 2729 "pikchr.c" | |
| 2701 | 2705 | yymsp[-2].minor.yy139 = yylhsminor.yy139; |
| 2702 | 2706 | break; |
| 2703 | 2707 | case 73: /* position ::= expr LEFT OF position */ |
| 2704 | -#line 662 "pikchr.y" | |
| 2708 | +#line 667 "pikchr.y" | |
| 2705 | 2709 | {yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.x -= yymsp[-3].minor.yy73;} |
| 2706 | -#line 2731 "pikchr.c" | |
| 2710 | +#line 2735 "pikchr.c" | |
| 2707 | 2711 | yymsp[-3].minor.yy139 = yylhsminor.yy139; |
| 2708 | 2712 | break; |
| 2709 | 2713 | case 74: /* position ::= expr RIGHT OF position */ |
| 2710 | -#line 663 "pikchr.y" | |
| 2714 | +#line 668 "pikchr.y" | |
| 2711 | 2715 | {yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.x += yymsp[-3].minor.yy73;} |
| 2712 | -#line 2737 "pikchr.c" | |
| 2716 | +#line 2741 "pikchr.c" | |
| 2713 | 2717 | yymsp[-3].minor.yy139 = yylhsminor.yy139; |
| 2714 | 2718 | break; |
| 2715 | 2719 | case 75: /* position ::= expr ON HEADING EDGEPT OF position */ |
| 2716 | -#line 665 "pikchr.y" | |
| 2717 | -{yylhsminor.yy139 = pik_position_at_hdg(p,yymsp[-5].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);} | |
| 2718 | -#line 2743 "pikchr.c" | |
| 2720 | +#line 670 "pikchr.y" | |
| 2721 | +{yylhsminor.yy139 = pik_position_at_hdg(yymsp[-5].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);} | |
| 2722 | +#line 2747 "pikchr.c" | |
| 2719 | 2723 | yymsp[-5].minor.yy139 = yylhsminor.yy139; |
| 2720 | 2724 | break; |
| 2721 | 2725 | case 76: /* position ::= expr HEADING EDGEPT OF position */ |
| 2722 | -#line 667 "pikchr.y" | |
| 2723 | -{yylhsminor.yy139 = pik_position_at_hdg(p,yymsp[-4].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);} | |
| 2724 | -#line 2749 "pikchr.c" | |
| 2726 | +#line 672 "pikchr.y" | |
| 2727 | +{yylhsminor.yy139 = pik_position_at_hdg(yymsp[-4].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);} | |
| 2728 | +#line 2753 "pikchr.c" | |
| 2725 | 2729 | yymsp[-4].minor.yy139 = yylhsminor.yy139; |
| 2726 | 2730 | break; |
| 2727 | 2731 | case 77: /* position ::= expr EDGEPT OF position */ |
| 2728 | -#line 669 "pikchr.y" | |
| 2729 | -{yylhsminor.yy139 = pik_position_at_hdg(p,yymsp[-3].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);} | |
| 2730 | -#line 2755 "pikchr.c" | |
| 2732 | +#line 674 "pikchr.y" | |
| 2733 | +{yylhsminor.yy139 = pik_position_at_hdg(yymsp[-3].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);} | |
| 2734 | +#line 2759 "pikchr.c" | |
| 2731 | 2735 | yymsp[-3].minor.yy139 = yylhsminor.yy139; |
| 2732 | 2736 | break; |
| 2733 | 2737 | case 78: /* position ::= expr ON HEADING expr FROM position */ |
| 2734 | -#line 671 "pikchr.y" | |
| 2735 | -{yylhsminor.yy139 = pik_position_at_angle(p,yymsp[-5].minor.yy73,yymsp[-2].minor.yy73,yymsp[0].minor.yy139);} | |
| 2736 | -#line 2761 "pikchr.c" | |
| 2738 | +#line 676 "pikchr.y" | |
| 2739 | +{yylhsminor.yy139 = pik_position_at_angle(yymsp[-5].minor.yy73,yymsp[-2].minor.yy73,yymsp[0].minor.yy139);} | |
| 2740 | +#line 2765 "pikchr.c" | |
| 2737 | 2741 | yymsp[-5].minor.yy139 = yylhsminor.yy139; |
| 2738 | 2742 | break; |
| 2739 | 2743 | case 79: /* position ::= expr HEADING expr FROM position */ |
| 2740 | -#line 673 "pikchr.y" | |
| 2741 | -{yylhsminor.yy139 = pik_position_at_angle(p,yymsp[-4].minor.yy73,yymsp[-2].minor.yy73,yymsp[0].minor.yy139);} | |
| 2742 | -#line 2767 "pikchr.c" | |
| 2744 | +#line 678 "pikchr.y" | |
| 2745 | +{yylhsminor.yy139 = pik_position_at_angle(yymsp[-4].minor.yy73,yymsp[-2].minor.yy73,yymsp[0].minor.yy139);} | |
| 2746 | +#line 2771 "pikchr.c" | |
| 2743 | 2747 | yymsp[-4].minor.yy139 = yylhsminor.yy139; |
| 2744 | 2748 | break; |
| 2745 | 2749 | case 80: /* place ::= edge OF object */ |
| 2746 | -#line 685 "pikchr.y" | |
| 2750 | +#line 690 "pikchr.y" | |
| 2747 | 2751 | {yylhsminor.yy139 = pik_place_of_elem(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0);} |
| 2748 | -#line 2773 "pikchr.c" | |
| 2752 | +#line 2777 "pikchr.c" | |
| 2749 | 2753 | yymsp[-2].minor.yy139 = yylhsminor.yy139; |
| 2750 | 2754 | break; |
| 2751 | 2755 | case 81: /* place2 ::= object */ |
| 2752 | -#line 686 "pikchr.y" | |
| 2756 | +#line 691 "pikchr.y" | |
| 2753 | 2757 | {yylhsminor.yy139 = pik_place_of_elem(p,yymsp[0].minor.yy254,0);} |
| 2754 | -#line 2779 "pikchr.c" | |
| 2758 | +#line 2783 "pikchr.c" | |
| 2755 | 2759 | yymsp[0].minor.yy139 = yylhsminor.yy139; |
| 2756 | 2760 | break; |
| 2757 | 2761 | case 82: /* place2 ::= object DOT_E edge */ |
| 2758 | -#line 687 "pikchr.y" | |
| 2762 | +#line 692 "pikchr.y" | |
| 2759 | 2763 | {yylhsminor.yy139 = pik_place_of_elem(p,yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);} |
| 2760 | -#line 2785 "pikchr.c" | |
| 2764 | +#line 2789 "pikchr.c" | |
| 2761 | 2765 | yymsp[-2].minor.yy139 = yylhsminor.yy139; |
| 2762 | 2766 | break; |
| 2763 | 2767 | case 83: /* place2 ::= NTH VERTEX OF object */ |
| 2764 | -#line 688 "pikchr.y" | |
| 2768 | +#line 693 "pikchr.y" | |
| 2765 | 2769 | {yylhsminor.yy139 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy254);} |
| 2766 | -#line 2791 "pikchr.c" | |
| 2770 | +#line 2795 "pikchr.c" | |
| 2767 | 2771 | yymsp[-3].minor.yy139 = yylhsminor.yy139; |
| 2768 | 2772 | break; |
| 2769 | 2773 | case 84: /* object ::= nth */ |
| 2770 | -#line 700 "pikchr.y" | |
| 2774 | +#line 705 "pikchr.y" | |
| 2771 | 2775 | {yylhsminor.yy254 = pik_find_nth(p,0,&yymsp[0].minor.yy0);} |
| 2772 | -#line 2797 "pikchr.c" | |
| 2776 | +#line 2801 "pikchr.c" | |
| 2773 | 2777 | yymsp[0].minor.yy254 = yylhsminor.yy254; |
| 2774 | 2778 | break; |
| 2775 | 2779 | case 85: /* object ::= nth OF|IN object */ |
| 2776 | -#line 701 "pikchr.y" | |
| 2780 | +#line 706 "pikchr.y" | |
| 2777 | 2781 | {yylhsminor.yy254 = pik_find_nth(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0);} |
| 2778 | -#line 2803 "pikchr.c" | |
| 2782 | +#line 2807 "pikchr.c" | |
| 2779 | 2783 | yymsp[-2].minor.yy254 = yylhsminor.yy254; |
| 2780 | 2784 | break; |
| 2781 | 2785 | case 86: /* objectname ::= PLACENAME */ |
| 2782 | -#line 703 "pikchr.y" | |
| 2786 | +#line 708 "pikchr.y" | |
| 2783 | 2787 | {yylhsminor.yy254 = pik_find_byname(p,0,&yymsp[0].minor.yy0);} |
| 2784 | -#line 2809 "pikchr.c" | |
| 2788 | +#line 2813 "pikchr.c" | |
| 2785 | 2789 | yymsp[0].minor.yy254 = yylhsminor.yy254; |
| 2786 | 2790 | break; |
| 2787 | 2791 | case 87: /* objectname ::= objectname DOT_U PLACENAME */ |
| 2788 | -#line 705 "pikchr.y" | |
| 2792 | +#line 710 "pikchr.y" | |
| 2789 | 2793 | {yylhsminor.yy254 = pik_find_byname(p,yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);} |
| 2790 | -#line 2815 "pikchr.c" | |
| 2794 | +#line 2819 "pikchr.c" | |
| 2791 | 2795 | yymsp[-2].minor.yy254 = yylhsminor.yy254; |
| 2792 | 2796 | break; |
| 2793 | 2797 | case 88: /* nth ::= NTH CLASSNAME */ |
| 2794 | -#line 707 "pikchr.y" | |
| 2798 | +#line 712 "pikchr.y" | |
| 2795 | 2799 | {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); } |
| 2796 | -#line 2821 "pikchr.c" | |
| 2800 | +#line 2825 "pikchr.c" | |
| 2797 | 2801 | yymsp[-1].minor.yy0 = yylhsminor.yy0; |
| 2798 | 2802 | break; |
| 2799 | 2803 | case 89: /* nth ::= NTH LAST CLASSNAME */ |
| 2800 | -#line 708 "pikchr.y" | |
| 2804 | +#line 713 "pikchr.y" | |
| 2801 | 2805 | {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); } |
| 2802 | -#line 2827 "pikchr.c" | |
| 2806 | +#line 2831 "pikchr.c" | |
| 2803 | 2807 | yymsp[-2].minor.yy0 = yylhsminor.yy0; |
| 2804 | 2808 | break; |
| 2805 | 2809 | case 90: /* nth ::= LAST CLASSNAME */ |
| 2806 | -#line 709 "pikchr.y" | |
| 2810 | +#line 714 "pikchr.y" | |
| 2807 | 2811 | {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;} |
| 2808 | -#line 2833 "pikchr.c" | |
| 2812 | +#line 2837 "pikchr.c" | |
| 2809 | 2813 | break; |
| 2810 | 2814 | case 91: /* nth ::= LAST */ |
| 2811 | -#line 710 "pikchr.y" | |
| 2815 | +#line 715 "pikchr.y" | |
| 2812 | 2816 | {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;} |
| 2813 | -#line 2838 "pikchr.c" | |
| 2817 | +#line 2842 "pikchr.c" | |
| 2814 | 2818 | yymsp[0].minor.yy0 = yylhsminor.yy0; |
| 2815 | 2819 | break; |
| 2816 | 2820 | case 92: /* nth ::= NTH LB RB */ |
| 2817 | -#line 711 "pikchr.y" | |
| 2821 | +#line 716 "pikchr.y" | |
| 2818 | 2822 | {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);} |
| 2819 | -#line 2844 "pikchr.c" | |
| 2823 | +#line 2848 "pikchr.c" | |
| 2820 | 2824 | yymsp[-2].minor.yy0 = yylhsminor.yy0; |
| 2821 | 2825 | break; |
| 2822 | 2826 | case 93: /* nth ::= NTH LAST LB RB */ |
| 2823 | -#line 712 "pikchr.y" | |
| 2827 | +#line 717 "pikchr.y" | |
| 2824 | 2828 | {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);} |
| 2825 | -#line 2850 "pikchr.c" | |
| 2829 | +#line 2854 "pikchr.c" | |
| 2826 | 2830 | yymsp[-3].minor.yy0 = yylhsminor.yy0; |
| 2827 | 2831 | break; |
| 2828 | 2832 | case 94: /* nth ::= LAST LB RB */ |
| 2829 | -#line 713 "pikchr.y" | |
| 2833 | +#line 718 "pikchr.y" | |
| 2830 | 2834 | {yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; } |
| 2831 | -#line 2856 "pikchr.c" | |
| 2835 | +#line 2860 "pikchr.c" | |
| 2832 | 2836 | break; |
| 2833 | 2837 | case 95: /* expr ::= expr PLUS expr */ |
| 2834 | -#line 715 "pikchr.y" | |
| 2838 | +#line 720 "pikchr.y" | |
| 2835 | 2839 | {yylhsminor.yy73=yymsp[-2].minor.yy73+yymsp[0].minor.yy73;} |
| 2836 | -#line 2861 "pikchr.c" | |
| 2840 | +#line 2865 "pikchr.c" | |
| 2837 | 2841 | yymsp[-2].minor.yy73 = yylhsminor.yy73; |
| 2838 | 2842 | break; |
| 2839 | 2843 | case 96: /* expr ::= expr MINUS expr */ |
| 2840 | -#line 716 "pikchr.y" | |
| 2844 | +#line 721 "pikchr.y" | |
| 2841 | 2845 | {yylhsminor.yy73=yymsp[-2].minor.yy73-yymsp[0].minor.yy73;} |
| 2842 | -#line 2867 "pikchr.c" | |
| 2846 | +#line 2871 "pikchr.c" | |
| 2843 | 2847 | yymsp[-2].minor.yy73 = yylhsminor.yy73; |
| 2844 | 2848 | break; |
| 2845 | 2849 | case 97: /* expr ::= expr STAR expr */ |
| 2846 | -#line 717 "pikchr.y" | |
| 2850 | +#line 722 "pikchr.y" | |
| 2847 | 2851 | {yylhsminor.yy73=yymsp[-2].minor.yy73*yymsp[0].minor.yy73;} |
| 2848 | -#line 2873 "pikchr.c" | |
| 2852 | +#line 2877 "pikchr.c" | |
| 2849 | 2853 | yymsp[-2].minor.yy73 = yylhsminor.yy73; |
| 2850 | 2854 | break; |
| 2851 | 2855 | case 98: /* expr ::= expr SLASH expr */ |
| 2852 | -#line 718 "pikchr.y" | |
| 2856 | +#line 723 "pikchr.y" | |
| 2853 | 2857 | { |
| 2854 | 2858 | if( yymsp[0].minor.yy73==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy73 = 0.0; } |
| 2855 | 2859 | else{ yylhsminor.yy73 = yymsp[-2].minor.yy73/yymsp[0].minor.yy73; } |
| 2856 | 2860 | } |
| 2857 | -#line 2882 "pikchr.c" | |
| 2861 | +#line 2886 "pikchr.c" | |
| 2858 | 2862 | yymsp[-2].minor.yy73 = yylhsminor.yy73; |
| 2859 | 2863 | break; |
| 2860 | 2864 | case 99: /* expr ::= MINUS expr */ |
| 2861 | -#line 722 "pikchr.y" | |
| 2865 | +#line 727 "pikchr.y" | |
| 2862 | 2866 | {yymsp[-1].minor.yy73=-yymsp[0].minor.yy73;} |
| 2863 | -#line 2888 "pikchr.c" | |
| 2867 | +#line 2892 "pikchr.c" | |
| 2864 | 2868 | break; |
| 2865 | 2869 | case 100: /* expr ::= PLUS expr */ |
| 2866 | -#line 723 "pikchr.y" | |
| 2870 | +#line 728 "pikchr.y" | |
| 2867 | 2871 | {yymsp[-1].minor.yy73=yymsp[0].minor.yy73;} |
| 2868 | -#line 2893 "pikchr.c" | |
| 2872 | +#line 2897 "pikchr.c" | |
| 2869 | 2873 | break; |
| 2870 | 2874 | case 101: /* expr ::= LP expr RP */ |
| 2871 | -#line 724 "pikchr.y" | |
| 2875 | +#line 729 "pikchr.y" | |
| 2872 | 2876 | {yymsp[-2].minor.yy73=yymsp[-1].minor.yy73;} |
| 2873 | -#line 2898 "pikchr.c" | |
| 2877 | +#line 2902 "pikchr.c" | |
| 2874 | 2878 | break; |
| 2875 | 2879 | case 102: /* expr ::= NUMBER */ |
| 2876 | -#line 725 "pikchr.y" | |
| 2877 | -{yylhsminor.yy73=pik_atof(p,&yymsp[0].minor.yy0);} | |
| 2878 | -#line 2903 "pikchr.c" | |
| 2880 | +#line 730 "pikchr.y" | |
| 2881 | +{yylhsminor.yy73=pik_atof(&yymsp[0].minor.yy0);} | |
| 2882 | +#line 2907 "pikchr.c" | |
| 2879 | 2883 | yymsp[0].minor.yy73 = yylhsminor.yy73; |
| 2880 | 2884 | break; |
| 2881 | 2885 | case 103: /* expr ::= ID */ |
| 2882 | -#line 726 "pikchr.y" | |
| 2886 | +#line 731 "pikchr.y" | |
| 2883 | 2887 | {yylhsminor.yy73=pik_get_var(p,&yymsp[0].minor.yy0);} |
| 2884 | -#line 2909 "pikchr.c" | |
| 2888 | +#line 2913 "pikchr.c" | |
| 2885 | 2889 | yymsp[0].minor.yy73 = yylhsminor.yy73; |
| 2886 | 2890 | break; |
| 2887 | 2891 | case 104: /* expr ::= FUNC1 LP expr RP */ |
| 2888 | -#line 727 "pikchr.y" | |
| 2892 | +#line 732 "pikchr.y" | |
| 2889 | 2893 | {yylhsminor.yy73 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy73,0.0);} |
| 2890 | -#line 2915 "pikchr.c" | |
| 2894 | +#line 2919 "pikchr.c" | |
| 2891 | 2895 | yymsp[-3].minor.yy73 = yylhsminor.yy73; |
| 2892 | 2896 | break; |
| 2893 | 2897 | case 105: /* expr ::= FUNC2 LP expr COMMA expr RP */ |
| 2894 | -#line 728 "pikchr.y" | |
| 2898 | +#line 733 "pikchr.y" | |
| 2895 | 2899 | {yylhsminor.yy73 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy73,yymsp[-1].minor.yy73);} |
| 2896 | -#line 2921 "pikchr.c" | |
| 2900 | +#line 2925 "pikchr.c" | |
| 2897 | 2901 | yymsp[-5].minor.yy73 = yylhsminor.yy73; |
| 2898 | 2902 | break; |
| 2899 | 2903 | case 106: /* expr ::= place2 DOT_XY X */ |
| 2900 | -#line 729 "pikchr.y" | |
| 2904 | +#line 734 "pikchr.y" | |
| 2901 | 2905 | {yylhsminor.yy73 = yymsp[-2].minor.yy139.x;} |
| 2902 | -#line 2927 "pikchr.c" | |
| 2906 | +#line 2931 "pikchr.c" | |
| 2903 | 2907 | yymsp[-2].minor.yy73 = yylhsminor.yy73; |
| 2904 | 2908 | break; |
| 2905 | 2909 | case 107: /* expr ::= place2 DOT_XY Y */ |
| 2906 | -#line 730 "pikchr.y" | |
| 2910 | +#line 735 "pikchr.y" | |
| 2907 | 2911 | {yylhsminor.yy73 = yymsp[-2].minor.yy139.y;} |
| 2908 | -#line 2933 "pikchr.c" | |
| 2912 | +#line 2937 "pikchr.c" | |
| 2909 | 2913 | yymsp[-2].minor.yy73 = yylhsminor.yy73; |
| 2910 | 2914 | break; |
| 2911 | 2915 | case 108: /* expr ::= object DOT_L numproperty */ |
| 2912 | 2916 | case 109: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==109); |
| 2913 | 2917 | case 110: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==110); |
| 2914 | -#line 731 "pikchr.y" | |
| 2915 | -{yylhsminor.yy73=pik_property_of(p,yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);} | |
| 2916 | -#line 2941 "pikchr.c" | |
| 2918 | +#line 736 "pikchr.y" | |
| 2919 | +{yylhsminor.yy73=pik_property_of(yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);} | |
| 2920 | +#line 2945 "pikchr.c" | |
| 2917 | 2921 | yymsp[-2].minor.yy73 = yylhsminor.yy73; |
| 2918 | 2922 | break; |
| 2919 | 2923 | default: |
| 2920 | 2924 | /* (111) lvalue ::= ID */ yytestcase(yyruleno==111); |
| 2921 | 2925 | /* (112) lvalue ::= FILL */ yytestcase(yyruleno==112); |
| @@ -3014,18 +3018,19 @@ | ||
| 3014 | 3018 | ){ |
| 3015 | 3019 | pik_parserARG_FETCH |
| 3016 | 3020 | pik_parserCTX_FETCH |
| 3017 | 3021 | #define TOKEN yyminor |
| 3018 | 3022 | /************ Begin %syntax_error code ****************************************/ |
| 3019 | -#line 498 "pikchr.y" | |
| 3023 | +#line 502 "pikchr.y" | |
| 3020 | 3024 | |
| 3021 | 3025 | if( TOKEN.z && TOKEN.z[0] ){ |
| 3022 | 3026 | pik_error(p, &TOKEN, "syntax error"); |
| 3023 | 3027 | }else{ |
| 3024 | 3028 | pik_error(p, 0, "syntax error"); |
| 3025 | 3029 | } |
| 3026 | -#line 3051 "pikchr.c" | |
| 3030 | + UNUSED_PARAMETER(yymajor); | |
| 3031 | +#line 3056 "pikchr.c" | |
| 3027 | 3032 | /************ End %syntax_error code ******************************************/ |
| 3028 | 3033 | pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */ |
| 3029 | 3034 | pik_parserCTX_STORE |
| 3030 | 3035 | } |
| 3031 | 3036 | |
| @@ -3254,11 +3259,11 @@ | ||
| 3254 | 3259 | #else |
| 3255 | 3260 | (void)iToken; |
| 3256 | 3261 | return 0; |
| 3257 | 3262 | #endif |
| 3258 | 3263 | } |
| 3259 | -#line 736 "pikchr.y" | |
| 3264 | +#line 741 "pikchr.y" | |
| 3260 | 3265 | |
| 3261 | 3266 | |
| 3262 | 3267 | |
| 3263 | 3268 | /* Chart of the 140 official HTML color names with their |
| 3264 | 3269 | ** corresponding RGB value. |
| @@ -3534,33 +3539,10 @@ | ||
| 3534 | 3539 | static void boxInit(Pik *p, PElem *pElem){ |
| 3535 | 3540 | pElem->w = pik_value(p, "boxwid",6,0); |
| 3536 | 3541 | pElem->h = pik_value(p, "boxht",5,0); |
| 3537 | 3542 | pElem->rad = pik_value(p, "boxrad",6,0); |
| 3538 | 3543 | } |
| 3539 | -/* Translate the CP_START and CP_END reference points into the | |
| 3540 | -** corresponding compass point based on the direction. | |
| 3541 | -*/ | |
| 3542 | -static int boxTranslateEndPoint(PElem *pElem, int cp){ | |
| 3543 | -#if 0 | |
| 3544 | - if( cp==CP_START ){ | |
| 3545 | - switch( pElem->inDir ){ | |
| 3546 | - case DIR_RIGHT: cp = CP_W; break; | |
| 3547 | - case DIR_DOWN: cp = CP_N; break; | |
| 3548 | - case DIR_LEFT: cp = CP_E; break; | |
| 3549 | - case DIR_UP: cp = CP_S; break; | |
| 3550 | - } | |
| 3551 | - }else if( cp==CP_END ){ | |
| 3552 | - switch( pElem->outDir ){ | |
| 3553 | - case DIR_RIGHT: cp = CP_E; break; | |
| 3554 | - case DIR_DOWN: cp = CP_S; break; | |
| 3555 | - case DIR_LEFT: cp = CP_W; break; | |
| 3556 | - case DIR_UP: cp = CP_N; break; | |
| 3557 | - } | |
| 3558 | - } | |
| 3559 | -#endif | |
| 3560 | - return cp; | |
| 3561 | -} | |
| 3562 | 3544 | /* Return offset from the center of the box to the compass point |
| 3563 | 3545 | ** given by parameter cp */ |
| 3564 | 3546 | static PPoint boxOffset(Pik *p, PElem *pElem, int cp){ |
| 3565 | 3547 | PPoint pt; |
| 3566 | 3548 | PNum w2 = 0.5*pElem->w; |
| @@ -3573,11 +3555,11 @@ | ||
| 3573 | 3555 | if( rad>w2 ) rad = w2; |
| 3574 | 3556 | if( rad>h2 ) rad = h2; |
| 3575 | 3557 | rx = 0.29289321881345252392*rad; |
| 3576 | 3558 | } |
| 3577 | 3559 | pt.x = pt.y = 0.0; |
| 3578 | - switch( boxTranslateEndPoint(pElem,cp) ){ | |
| 3560 | + switch( cp ){ | |
| 3579 | 3561 | case CP_C: pt.x = 0.0; pt.y = 0.0; break; |
| 3580 | 3562 | case CP_N: pt.x = 0.0; pt.y = h2; break; |
| 3581 | 3563 | case CP_NE: pt.x = w2-rx; pt.y = h2-rx; break; |
| 3582 | 3564 | case CP_E: pt.x = w2; pt.y = 0.0; break; |
| 3583 | 3565 | case CP_SE: pt.x = w2-rx; pt.y = rx-h2; break; |
| @@ -3584,10 +3566,11 @@ | ||
| 3584 | 3566 | case CP_S: pt.x = 0.0; pt.y = -h2; break; |
| 3585 | 3567 | case CP_SW: pt.x = rx-w2; pt.y = rx-h2; break; |
| 3586 | 3568 | case CP_W: pt.x = -w2; pt.y = 0.0; break; |
| 3587 | 3569 | case CP_NW: pt.x = rx-w2; pt.y = h2-rx; break; |
| 3588 | 3570 | } |
| 3571 | + UNUSED_PARAMETER(p); | |
| 3589 | 3572 | return pt; |
| 3590 | 3573 | } |
| 3591 | 3574 | static PPoint boxChop(Pik *p, PElem *pElem, PPoint *pPt){ |
| 3592 | 3575 | PNum dx, dy; |
| 3593 | 3576 | int cp = CP_C; |
| @@ -3627,10 +3610,11 @@ | ||
| 3627 | 3610 | return chop; |
| 3628 | 3611 | } |
| 3629 | 3612 | static void boxFit(Pik *p, PElem *pElem, PNum w, PNum h){ |
| 3630 | 3613 | if( w>0 ) pElem->w = w; |
| 3631 | 3614 | if( h>0 ) pElem->h = h; |
| 3615 | + UNUSED_PARAMETER(p); | |
| 3632 | 3616 | } |
| 3633 | 3617 | static void boxRender(Pik *p, PElem *pElem){ |
| 3634 | 3618 | PNum w2 = 0.5*pElem->w; |
| 3635 | 3619 | PNum h2 = 0.5*pElem->h; |
| 3636 | 3620 | PNum rad = pElem->rad; |
| @@ -3704,19 +3688,21 @@ | ||
| 3704 | 3688 | case T_HEIGHT: |
| 3705 | 3689 | pElem->w = pElem->h; |
| 3706 | 3690 | pElem->rad = 0.5*pElem->w; |
| 3707 | 3691 | break; |
| 3708 | 3692 | } |
| 3693 | + UNUSED_PARAMETER(p); | |
| 3709 | 3694 | } |
| 3710 | 3695 | static PPoint circleChop(Pik *p, PElem *pElem, PPoint *pPt){ |
| 3711 | 3696 | PPoint chop; |
| 3712 | 3697 | PNum dx = pPt->x - pElem->ptAt.x; |
| 3713 | 3698 | PNum dy = pPt->y - pElem->ptAt.y; |
| 3714 | 3699 | PNum dist = hypot(dx,dy); |
| 3715 | 3700 | if( dist<pElem->rad ) return pElem->ptAt; |
| 3716 | 3701 | chop.x = pElem->ptAt.x + dx*pElem->rad/dist; |
| 3717 | 3702 | chop.y = pElem->ptAt.y + dy*pElem->rad/dist; |
| 3703 | + UNUSED_PARAMETER(p); | |
| 3718 | 3704 | return chop; |
| 3719 | 3705 | } |
| 3720 | 3706 | static void circleFit(Pik *p, PElem *pElem, PNum w, PNum h){ |
| 3721 | 3707 | PNum mx = 0.0; |
| 3722 | 3708 | if( w>0 ) mx = w; |
| @@ -3726,10 +3712,11 @@ | ||
| 3726 | 3712 | } |
| 3727 | 3713 | if( mx>0.0 ){ |
| 3728 | 3714 | pElem->rad = 0.5*mx; |
| 3729 | 3715 | pElem->w = pElem->h = mx; |
| 3730 | 3716 | } |
| 3717 | + UNUSED_PARAMETER(p); | |
| 3731 | 3718 | } |
| 3732 | 3719 | |
| 3733 | 3720 | static void circleRender(Pik *p, PElem *pElem){ |
| 3734 | 3721 | PNum r = pElem->rad; |
| 3735 | 3722 | PPoint pt = pElem->ptAt; |
| @@ -3770,11 +3757,11 @@ | ||
| 3770 | 3757 | static PPoint cylinderOffset(Pik *p, PElem *pElem, int cp){ |
| 3771 | 3758 | PPoint pt; |
| 3772 | 3759 | PNum w2 = pElem->w*0.5; |
| 3773 | 3760 | PNum h1 = pElem->h*0.5; |
| 3774 | 3761 | PNum h2 = h1 - pElem->rad; |
| 3775 | - switch( boxTranslateEndPoint(pElem,cp) ){ | |
| 3762 | + switch( cp ){ | |
| 3776 | 3763 | case CP_C: pt.x = 0.0; pt.y = 0.0; break; |
| 3777 | 3764 | case CP_N: pt.x = 0.0; pt.y = h1; break; |
| 3778 | 3765 | case CP_NE: pt.x = w2; pt.y = h2; break; |
| 3779 | 3766 | case CP_E: pt.x = w2; pt.y = 0.0; break; |
| 3780 | 3767 | case CP_SE: pt.x = w2; pt.y = -h2; break; |
| @@ -3781,10 +3768,11 @@ | ||
| 3781 | 3768 | case CP_S: pt.x = 0.0; pt.y = -h1; break; |
| 3782 | 3769 | case CP_SW: pt.x = -w2; pt.y = -h2; break; |
| 3783 | 3770 | case CP_W: pt.x = -w2; pt.y = 0.0; break; |
| 3784 | 3771 | case CP_NW: pt.x = -w2; pt.y = h2; break; |
| 3785 | 3772 | } |
| 3773 | + UNUSED_PARAMETER(p); | |
| 3786 | 3774 | return pt; |
| 3787 | 3775 | } |
| 3788 | 3776 | |
| 3789 | 3777 | /* Methods for the "dot" class */ |
| 3790 | 3778 | static void dotInit(Pik *p, PElem *pElem){ |
| @@ -3799,19 +3787,24 @@ | ||
| 3799 | 3787 | break; |
| 3800 | 3788 | case T_FILL: |
| 3801 | 3789 | pElem->color = pElem->fill; |
| 3802 | 3790 | break; |
| 3803 | 3791 | } |
| 3792 | + UNUSED_PARAMETER(p); | |
| 3804 | 3793 | } |
| 3805 | 3794 | static void dotCheck(Pik *p, PElem *pElem){ |
| 3806 | 3795 | pElem->w = pElem->h = 0; |
| 3807 | 3796 | pik_bbox_addellipse(&pElem->bbox, pElem->ptAt.x, pElem->ptAt.y, |
| 3808 | 3797 | pElem->rad, pElem->rad); |
| 3798 | + UNUSED_PARAMETER(p); | |
| 3809 | 3799 | } |
| 3810 | 3800 | static PPoint dotOffset(Pik *p, PElem *pElem, int cp){ |
| 3811 | 3801 | PPoint zero; |
| 3812 | 3802 | zero.x = zero.y = 0; |
| 3803 | + UNUSED_PARAMETER(p); | |
| 3804 | + UNUSED_PARAMETER(pElem); | |
| 3805 | + UNUSED_PARAMETER(cp); | |
| 3813 | 3806 | return zero; |
| 3814 | 3807 | } |
| 3815 | 3808 | static void dotRender(Pik *p, PElem *pElem){ |
| 3816 | 3809 | PNum r = pElem->rad; |
| 3817 | 3810 | PPoint pt = pElem->ptAt; |
| @@ -3843,19 +3836,20 @@ | ||
| 3843 | 3836 | dq = dx*s; |
| 3844 | 3837 | dist = hypot(dq,dy); |
| 3845 | 3838 | if( dist<pElem->h ) return pElem->ptAt; |
| 3846 | 3839 | chop.x = pElem->ptAt.x + 0.5*dq*pElem->h/(dist*s); |
| 3847 | 3840 | chop.y = pElem->ptAt.y + 0.5*dy*pElem->h/dist; |
| 3841 | + UNUSED_PARAMETER(p); | |
| 3848 | 3842 | return chop; |
| 3849 | 3843 | } |
| 3850 | 3844 | static PPoint ellipseOffset(Pik *p, PElem *pElem, int cp){ |
| 3851 | 3845 | PPoint pt; |
| 3852 | 3846 | PNum w = pElem->w*0.5; |
| 3853 | 3847 | PNum w2 = w*0.70710678118654747608; |
| 3854 | 3848 | PNum h = pElem->h*0.5; |
| 3855 | 3849 | PNum h2 = h*0.70710678118654747608; |
| 3856 | - switch( boxTranslateEndPoint(pElem,cp) ){ | |
| 3850 | + switch( cp ){ | |
| 3857 | 3851 | case CP_C: pt.x = 0.0; pt.y = 0.0; break; |
| 3858 | 3852 | case CP_N: pt.x = 0.0; pt.y = h; break; |
| 3859 | 3853 | case CP_NE: pt.x = w2; pt.y = h2; break; |
| 3860 | 3854 | case CP_E: pt.x = w; pt.y = 0.0; break; |
| 3861 | 3855 | case CP_SE: pt.x = w2; pt.y = -h2; break; |
| @@ -3862,10 +3856,11 @@ | ||
| 3862 | 3856 | case CP_S: pt.x = 0.0; pt.y = -h; break; |
| 3863 | 3857 | case CP_SW: pt.x = -w2; pt.y = -h2; break; |
| 3864 | 3858 | case CP_W: pt.x = -w; pt.y = 0.0; break; |
| 3865 | 3859 | case CP_NW: pt.x = -w2; pt.y = h2; break; |
| 3866 | 3860 | } |
| 3861 | + UNUSED_PARAMETER(p); | |
| 3867 | 3862 | return pt; |
| 3868 | 3863 | } |
| 3869 | 3864 | static void ellipseRender(Pik *p, PElem *pElem){ |
| 3870 | 3865 | PNum w = pElem->w; |
| 3871 | 3866 | PNum h = pElem->h; |
| @@ -3897,11 +3892,11 @@ | ||
| 3897 | 3892 | PNum mn = w2<h2 ? w2 : h2; |
| 3898 | 3893 | if( rx>mn ) rx = mn; |
| 3899 | 3894 | if( rx<mn*0.25 ) rx = mn*0.25; |
| 3900 | 3895 | pt.x = pt.y = 0.0; |
| 3901 | 3896 | rx *= 0.5; |
| 3902 | - switch( boxTranslateEndPoint(pElem,cp) ){ | |
| 3897 | + switch( cp ){ | |
| 3903 | 3898 | case CP_C: pt.x = 0.0; pt.y = 0.0; break; |
| 3904 | 3899 | case CP_N: pt.x = 0.0; pt.y = h2; break; |
| 3905 | 3900 | case CP_NE: pt.x = w2-rx; pt.y = h2-rx; break; |
| 3906 | 3901 | case CP_E: pt.x = w2; pt.y = 0.0; break; |
| 3907 | 3902 | case CP_SE: pt.x = w2; pt.y = -h2; break; |
| @@ -3908,15 +3903,17 @@ | ||
| 3908 | 3903 | case CP_S: pt.x = 0.0; pt.y = -h2; break; |
| 3909 | 3904 | case CP_SW: pt.x = -w2; pt.y = -h2; break; |
| 3910 | 3905 | case CP_W: pt.x = -w2; pt.y = 0.0; break; |
| 3911 | 3906 | case CP_NW: pt.x = -w2; pt.y = h2; break; |
| 3912 | 3907 | } |
| 3908 | + UNUSED_PARAMETER(p); | |
| 3913 | 3909 | return pt; |
| 3914 | 3910 | } |
| 3915 | 3911 | static void fileFit(Pik *p, PElem *pElem, PNum w, PNum h){ |
| 3916 | 3912 | if( w>0 ) pElem->w = w; |
| 3917 | 3913 | if( h>0 ) pElem->h = h + 2*pElem->rad; |
| 3914 | + UNUSED_PARAMETER(p); | |
| 3918 | 3915 | } |
| 3919 | 3916 | static void fileRender(Pik *p, PElem *pElem){ |
| 3920 | 3917 | PNum w2 = 0.5*pElem->w; |
| 3921 | 3918 | PNum h2 = 0.5*pElem->h; |
| 3922 | 3919 | PNum rad = pElem->rad; |
| @@ -3950,11 +3947,10 @@ | ||
| 3950 | 3947 | pElem->h = pik_value(p, "lineht",6,0); |
| 3951 | 3948 | pElem->rad = pik_value(p, "linerad",7,0); |
| 3952 | 3949 | pElem->fill = -1.0; |
| 3953 | 3950 | } |
| 3954 | 3951 | static PPoint lineOffset(Pik *p, PElem *pElem, int cp){ |
| 3955 | - | |
| 3956 | 3952 | #if 0 |
| 3957 | 3953 | /* In legacy PIC, the .center of an unclosed line is half way between |
| 3958 | 3954 | ** its .start and .end. */ |
| 3959 | 3955 | if( cp==CP_C && !pElem->bClose ){ |
| 3960 | 3956 | PPoint out; |
| @@ -3961,11 +3957,10 @@ | ||
| 3961 | 3957 | out.x = 0.5*(pElem->ptEnter.x + pElem->ptExit.x) - pElem->ptAt.x; |
| 3962 | 3958 | out.y = 0.5*(pElem->ptEnter.x + pElem->ptExit.y) - pElem->ptAt.y; |
| 3963 | 3959 | return out; |
| 3964 | 3960 | } |
| 3965 | 3961 | #endif |
| 3966 | - | |
| 3967 | 3962 | return boxOffset(p,pElem,cp); |
| 3968 | 3963 | } |
| 3969 | 3964 | static void lineRender(Pik *p, PElem *pElem){ |
| 3970 | 3965 | int i; |
| 3971 | 3966 | if( pElem->sw>0.0 ){ |
| @@ -4001,24 +3996,29 @@ | ||
| 4001 | 3996 | pElem->color = -1.0; |
| 4002 | 3997 | pElem->sw = -1.0; |
| 4003 | 3998 | } |
| 4004 | 3999 | static void moveRender(Pik *p, PElem *pElem){ |
| 4005 | 4000 | /* No-op */ |
| 4001 | + UNUSED_PARAMETER(p); | |
| 4002 | + UNUSED_PARAMETER(pElem); | |
| 4006 | 4003 | } |
| 4007 | 4004 | |
| 4008 | 4005 | /* Methods for the "oval" class */ |
| 4009 | 4006 | static void ovalInit(Pik *p, PElem *pElem){ |
| 4010 | 4007 | pElem->h = pik_value(p, "ovalht",6,0); |
| 4011 | 4008 | pElem->w = pik_value(p, "ovalwid",7,0); |
| 4012 | 4009 | pElem->rad = 0.5*(pElem->h<pElem->w?pElem->h:pElem->w); |
| 4013 | 4010 | } |
| 4014 | 4011 | static void ovalNumProp(Pik *p, PElem *pElem, PToken *pId){ |
| 4012 | + UNUSED_PARAMETER(p); | |
| 4013 | + UNUSED_PARAMETER(pId); | |
| 4015 | 4014 | /* Always adjust the radius to be half of the smaller of |
| 4016 | 4015 | ** the width and height. */ |
| 4017 | 4016 | pElem->rad = 0.5*(pElem->h<pElem->w?pElem->h:pElem->w); |
| 4018 | 4017 | } |
| 4019 | 4018 | static void ovalFit(Pik *p, PElem *pElem, PNum w, PNum h){ |
| 4019 | + UNUSED_PARAMETER(p); | |
| 4020 | 4020 | if( w>0 ) pElem->w = w; |
| 4021 | 4021 | if( h>0 ) pElem->h = h; |
| 4022 | 4022 | if( pElem->w<pElem->h ) pElem->w = pElem->h; |
| 4023 | 4023 | } |
| 4024 | 4024 | |
| @@ -4114,10 +4114,11 @@ | ||
| 4114 | 4114 | |
| 4115 | 4115 | /* Methods for the "sublist" class */ |
| 4116 | 4116 | static void sublistInit(Pik *p, PElem *pElem){ |
| 4117 | 4117 | PEList *pList = pElem->pSublist; |
| 4118 | 4118 | int i; |
| 4119 | + UNUSED_PARAMETER(p); | |
| 4119 | 4120 | pik_bbox_init(&pElem->bbox); |
| 4120 | 4121 | for(i=0; i<pList->n; i++){ |
| 4121 | 4122 | pik_bbox_addbox(&pElem->bbox, &pList->a[i]->bbox); |
| 4122 | 4123 | } |
| 4123 | 4124 | pElem->w = pElem->bbox.ne.x - pElem->bbox.sw.x; |
| @@ -4305,11 +4306,11 @@ | ||
| 4305 | 4306 | |
| 4306 | 4307 | /* |
| 4307 | 4308 | ** Reduce the length of the line segment by amt (if possible) by |
| 4308 | 4309 | ** modifying the location of *t. |
| 4309 | 4310 | */ |
| 4310 | -static void pik_chop(Pik *p, PPoint *f, PPoint *t, PNum amt){ | |
| 4311 | +static void pik_chop(PPoint *f, PPoint *t, PNum amt){ | |
| 4311 | 4312 | PNum dx = t->x - f->x; |
| 4312 | 4313 | PNum dy = t->y - f->y; |
| 4313 | 4314 | PNum dist = hypot(dx,dy); |
| 4314 | 4315 | PNum r; |
| 4315 | 4316 | if( dist<=amt ){ |
| @@ -4350,11 +4351,11 @@ | ||
| 4350 | 4351 | by = f->y + e1*dy; |
| 4351 | 4352 | pik_append_xy(p,"<polygon points=\"", t->x, t->y); |
| 4352 | 4353 | pik_append_xy(p," ",bx-ddx, by-ddy); |
| 4353 | 4354 | pik_append_xy(p," ",bx+ddx, by+ddy); |
| 4354 | 4355 | pik_append_clr(p,"\" style=\"fill:",pElem->color,"\"/>\n"); |
| 4355 | - pik_chop(p,f,t,h/2); | |
| 4356 | + pik_chop(f,t,h/2); | |
| 4356 | 4357 | } |
| 4357 | 4358 | |
| 4358 | 4359 | /* |
| 4359 | 4360 | ** Compute the relative offset to an edge location from the reference for a |
| 4360 | 4361 | ** an element. |
| @@ -4538,11 +4539,11 @@ | ||
| 4538 | 4539 | ** Compute the vertical locations for all text items in the |
| 4539 | 4540 | ** element pElem. In other words, set every pElem->aTxt[*].eCode |
| 4540 | 4541 | ** value to contain exactly one of: TP_ABOVE2, TP_ABOVE, TP_CENTER, |
| 4541 | 4542 | ** TP_BELOW, or TP_BELOW2 is set. |
| 4542 | 4543 | */ |
| 4543 | -static void pik_txt_vertical_layout(Pik *p, PElem *pElem){ | |
| 4544 | +static void pik_txt_vertical_layout(PElem *pElem){ | |
| 4544 | 4545 | int n, i; |
| 4545 | 4546 | PToken *aTxt; |
| 4546 | 4547 | n = pElem->nTxt; |
| 4547 | 4548 | if( n==0 ) return; |
| 4548 | 4549 | aTxt = pElem->aTxt; |
| @@ -4636,11 +4637,11 @@ | ||
| 4636 | 4637 | if( p->nErr ) return; |
| 4637 | 4638 | if( pElem->nTxt==0 ) return; |
| 4638 | 4639 | aTxt = pElem->aTxt; |
| 4639 | 4640 | dy = 0.5*p->charHeight; |
| 4640 | 4641 | n = pElem->nTxt; |
| 4641 | - pik_txt_vertical_layout(p, pElem); | |
| 4642 | + pik_txt_vertical_layout(pElem); | |
| 4642 | 4643 | x = pElem->ptAt.x; |
| 4643 | 4644 | for(i=0; i<n; i++){ |
| 4644 | 4645 | if( (pElem->aTxt[i].eCode & TP_CENTER)!=0 ) hasCenter = 1; |
| 4645 | 4646 | } |
| 4646 | 4647 | if( hasCenter ){ |
| @@ -4765,11 +4766,11 @@ | ||
| 4765 | 4766 | for(nExtra=0; (c = p->zIn[i+nExtra])!=0 && c!='\n'; nExtra++){} |
| 4766 | 4767 | pik_append(p, "<div><pre>\n", -1); |
| 4767 | 4768 | pik_append_text(p, p->zIn, i+nExtra, 3); |
| 4768 | 4769 | pik_append(p, "\n", 1); |
| 4769 | 4770 | for(i=0; i<iCol; i++){ pik_append(p, " ", 1); } |
| 4770 | - for(i=0; i<pErr->n; i++) pik_append(p, "^", 1); | |
| 4771 | + for(i=0; i<(int)pErr->n; i++) pik_append(p, "^", 1); | |
| 4771 | 4772 | pik_append(p, "\nERROR: ", -1); |
| 4772 | 4773 | pik_append_text(p, zMsg, -1, 0); |
| 4773 | 4774 | pik_append(p, "\n", 1); |
| 4774 | 4775 | pik_append(p, "\n</pre></div>\n", -1); |
| 4775 | 4776 | } |
| @@ -4841,18 +4842,18 @@ | ||
| 4841 | 4842 | ** (3) Hex integers: 0x000000 |
| 4842 | 4843 | ** |
| 4843 | 4844 | ** This routine returns the result in inches. If a different unit |
| 4844 | 4845 | ** is specified, the conversion happens automatically. |
| 4845 | 4846 | */ |
| 4846 | -PNum pik_atof(Pik *p, PToken *num){ | |
| 4847 | +PNum pik_atof(PToken *num){ | |
| 4847 | 4848 | char *endptr; |
| 4848 | 4849 | PNum ans; |
| 4849 | 4850 | if( num->n>=3 && num->z[0]=='0' && (num->z[1]=='x'||num->z[1]=='X') ){ |
| 4850 | 4851 | return (PNum)strtol(num->z+2, 0, 16); |
| 4851 | 4852 | } |
| 4852 | 4853 | ans = strtod(num->z, &endptr); |
| 4853 | - if( (int)(endptr - num->z)==num->n-2 ){ | |
| 4854 | + if( (int)(endptr - num->z)==(int)num->n-2 ){ | |
| 4854 | 4855 | char c1 = endptr[0]; |
| 4855 | 4856 | char c2 = endptr[1]; |
| 4856 | 4857 | if( c1=='c' && c2=='m' ){ |
| 4857 | 4858 | ans /= 2.54; |
| 4858 | 4859 | }else if( c1=='m' && c2=='m' ){ |
| @@ -5063,11 +5064,11 @@ | ||
| 5063 | 5064 | } |
| 5064 | 5065 | |
| 5065 | 5066 | /* |
| 5066 | 5067 | ** Set the output direction and exit point for an element. |
| 5067 | 5068 | */ |
| 5068 | -static void pik_elem_set_exit(Pik *p, PElem *pElem, int eDir){ | |
| 5069 | +static void pik_elem_set_exit(PElem *pElem, int eDir){ | |
| 5069 | 5070 | assert( ValidDir(eDir) ); |
| 5070 | 5071 | pElem->outDir = eDir; |
| 5071 | 5072 | if( !pElem->type->isLine || pElem->bClose ){ |
| 5072 | 5073 | pElem->ptExit = pElem->ptAt; |
| 5073 | 5074 | switch( pElem->outDir ){ |
| @@ -5097,11 +5098,11 @@ | ||
| 5097 | 5098 | ** You can make pikchr render the above exactly like PIC |
| 5098 | 5099 | ** by deleting the following three lines. But I (drh) think |
| 5099 | 5100 | ** it works better with those lines in place. |
| 5100 | 5101 | */ |
| 5101 | 5102 | if( p->list && p->list->n ){ |
| 5102 | - pik_elem_set_exit(p, p->list->a[p->list->n-1], eDir); | |
| 5103 | + pik_elem_set_exit(p->list->a[p->list->n-1], eDir); | |
| 5103 | 5104 | } |
| 5104 | 5105 | } |
| 5105 | 5106 | |
| 5106 | 5107 | /* Move all coordinates contained within an element (and within its |
| 5107 | 5108 | ** substructure) by dx, dy |
| @@ -5247,11 +5248,11 @@ | ||
| 5247 | 5248 | |
| 5248 | 5249 | /* |
| 5249 | 5250 | ** If the current path information came from a "same" or "same as" |
| 5250 | 5251 | ** reset it. |
| 5251 | 5252 | */ |
| 5252 | -static void pik_reset_samepath(Pik *p, PElem *pElem){ | |
| 5253 | +static void pik_reset_samepath(Pik *p){ | |
| 5253 | 5254 | if( p->samePath ){ |
| 5254 | 5255 | p->samePath = 0; |
| 5255 | 5256 | p->nTPath = 1; |
| 5256 | 5257 | } |
| 5257 | 5258 | } |
| @@ -5277,11 +5278,11 @@ | ||
| 5277 | 5278 | |
| 5278 | 5279 | /* Advance to the next entry in p->aTPath. Return its index. |
| 5279 | 5280 | */ |
| 5280 | 5281 | static int pik_next_rpath(Pik *p, PToken *pErr){ |
| 5281 | 5282 | int n = p->nTPath - 1; |
| 5282 | - if( n+1>=count(p->aTPath) ){ | |
| 5283 | + if( n+1>=(int)count(p->aTPath) ){ | |
| 5283 | 5284 | pik_error(0, pErr, "too many path elements"); |
| 5284 | 5285 | return n; |
| 5285 | 5286 | } |
| 5286 | 5287 | n++; |
| 5287 | 5288 | p->nTPath++; |
| @@ -5299,16 +5300,16 @@ | ||
| 5299 | 5300 | int dir; |
| 5300 | 5301 | if( !pElem->type->isLine ){ |
| 5301 | 5302 | if( pDir ){ |
| 5302 | 5303 | pik_error(p, pDir, "use with line-oriented objects only"); |
| 5303 | 5304 | }else{ |
| 5304 | - PToken x = pik_next_semantic_token(p, &pElem->errTok); | |
| 5305 | + PToken x = pik_next_semantic_token(&pElem->errTok); | |
| 5305 | 5306 | pik_error(p, &x, "syntax error"); |
| 5306 | 5307 | } |
| 5307 | 5308 | return; |
| 5308 | 5309 | } |
| 5309 | - pik_reset_samepath(p, pElem); | |
| 5310 | + pik_reset_samepath(p); | |
| 5310 | 5311 | n = p->nTPath - 1; |
| 5311 | 5312 | if( p->thenFlag || p->mTPath==3 || n==0 ){ |
| 5312 | 5313 | n = pik_next_rpath(p, pDir); |
| 5313 | 5314 | p->thenFlag = 0; |
| 5314 | 5315 | } |
| @@ -5357,11 +5358,11 @@ | ||
| 5357 | 5358 | PNum rDist = pDist->rAbs + pik_value(p,"linewid",7,0)*pDist->rRel; |
| 5358 | 5359 | if( !pElem->type->isLine ){ |
| 5359 | 5360 | pik_error(p, pErr, "use with line-oriented objects only"); |
| 5360 | 5361 | return; |
| 5361 | 5362 | } |
| 5362 | - pik_reset_samepath(p, pElem); | |
| 5363 | + pik_reset_samepath(p); | |
| 5363 | 5364 | do{ |
| 5364 | 5365 | n = pik_next_rpath(p, pErr); |
| 5365 | 5366 | }while( n<1 ); |
| 5366 | 5367 | if( pHeading ){ |
| 5367 | 5368 | if( rHdg<0.0 || rHdg>360.0 ){ |
| @@ -5403,11 +5404,11 @@ | ||
| 5403 | 5404 | int n; |
| 5404 | 5405 | if( !pElem->type->isLine ){ |
| 5405 | 5406 | pik_error(p, pDir, "use with line-oriented objects only"); |
| 5406 | 5407 | return; |
| 5407 | 5408 | } |
| 5408 | - pik_reset_samepath(p, pElem); | |
| 5409 | + pik_reset_samepath(p); | |
| 5409 | 5410 | n = p->nTPath - 1; |
| 5410 | 5411 | if( p->thenFlag || p->mTPath==3 || n==0 ){ |
| 5411 | 5412 | n = pik_next_rpath(p, pDir); |
| 5412 | 5413 | p->thenFlag = 0; |
| 5413 | 5414 | } |
| @@ -5515,11 +5516,11 @@ | ||
| 5515 | 5516 | if( pElem->mProp & A_AT ){ |
| 5516 | 5517 | pik_error(p, pErrTok, "location fixed by prior \"at\""); |
| 5517 | 5518 | return; |
| 5518 | 5519 | } |
| 5519 | 5520 | pElem->mProp |= A_AT; |
| 5520 | - pElem->eWith = pEdge ? boxTranslateEndPoint(pElem,pEdge->eEdge) : CP_C; | |
| 5521 | + pElem->eWith = pEdge ? pEdge->eEdge : CP_C; | |
| 5521 | 5522 | pElem->with = *pAt; |
| 5522 | 5523 | } |
| 5523 | 5524 | |
| 5524 | 5525 | /* |
| 5525 | 5526 | ** Try to add a text attribute to an element |
| @@ -5536,11 +5537,11 @@ | ||
| 5536 | 5537 | pT->eCode = iPos; |
| 5537 | 5538 | } |
| 5538 | 5539 | |
| 5539 | 5540 | /* Merge "text-position" flags |
| 5540 | 5541 | */ |
| 5541 | -static int pik_text_position(Pik *p, int iPrev, PToken *pFlag){ | |
| 5542 | +static int pik_text_position(int iPrev, PToken *pFlag){ | |
| 5542 | 5543 | int iRes = iPrev; |
| 5543 | 5544 | switch( pFlag->eType ){ |
| 5544 | 5545 | case T_LJUST: iRes = (iRes&~TP_JMASK) | TP_LJUST; break; |
| 5545 | 5546 | case T_RJUST: iRes = (iRes&~TP_JMASK) | TP_RJUST; break; |
| 5546 | 5547 | case T_ABOVE: iRes = (iRes&~TP_VMASK) | TP_ABOVE; break; |
| @@ -5610,11 +5611,11 @@ | ||
| 5610 | 5611 | if( pElem->type->xFit==0 ) return; |
| 5611 | 5612 | if( (pElem->mProp & A_HEIGHT)==0 ){ |
| 5612 | 5613 | int hasCenter = 0; |
| 5613 | 5614 | int hasSingleStack = 0; |
| 5614 | 5615 | int hasDoubleStack = 0; |
| 5615 | - pik_txt_vertical_layout(p, pElem); | |
| 5616 | + pik_txt_vertical_layout(pElem); | |
| 5616 | 5617 | for(i=0; i<pElem->nTxt; i++){ |
| 5617 | 5618 | if( pElem->aTxt[i].eCode & TP_CENTER ){ |
| 5618 | 5619 | hasCenter = 1; |
| 5619 | 5620 | }else if( pElem->aTxt[i].eCode & (TP_ABOVE2|TP_BELOW2) ){ |
| 5620 | 5621 | hasDoubleStack = 1; |
| @@ -5736,11 +5737,12 @@ | ||
| 5736 | 5737 | int first, last, mid, c = 0; |
| 5737 | 5738 | first = 0; |
| 5738 | 5739 | last = count(aColor)-1; |
| 5739 | 5740 | while( first<=last ){ |
| 5740 | 5741 | const char *zClr; |
| 5741 | - int c1, c2, i; | |
| 5742 | + int c1, c2; | |
| 5743 | + unsigned int i; | |
| 5742 | 5744 | mid = (first+last)/2; |
| 5743 | 5745 | zClr = aColor[mid].zName; |
| 5744 | 5746 | for(i=0; i<pId->n; i++){ |
| 5745 | 5747 | c1 = zClr[i]&0x7f; |
| 5746 | 5748 | if( isupper(c1) ) c1 = tolower(c1); |
| @@ -5970,11 +5972,11 @@ | ||
| 5970 | 5972 | } |
| 5971 | 5973 | } |
| 5972 | 5974 | |
| 5973 | 5975 | /* Do a linear interpolation of two positions. |
| 5974 | 5976 | */ |
| 5975 | -static PPoint pik_position_between(Pik *p, PNum x, PPoint p1, PPoint p2){ | |
| 5977 | +static PPoint pik_position_between(PNum x, PPoint p1, PPoint p2){ | |
| 5976 | 5978 | PPoint out; |
| 5977 | 5979 | if( x<0.0 ) x = 0.0; |
| 5978 | 5980 | if( x>1.0 ) x = 1.0; |
| 5979 | 5981 | out.x = p2.x*x + p1.x*(1.0 - x); |
| 5980 | 5982 | out.y = p2.y*x + p1.y*(1.0 - x); |
| @@ -5984,21 +5986,21 @@ | ||
| 5984 | 5986 | /* Compute the position that is dist away from pt at an heading angle of r |
| 5985 | 5987 | ** |
| 5986 | 5988 | ** The angle is a compass heading in degrees. North is 0 (or 360). |
| 5987 | 5989 | ** East is 90. South is 180. West is 270. And so forth. |
| 5988 | 5990 | */ |
| 5989 | -static PPoint pik_position_at_angle(Pik *p, PNum dist, PNum r, PPoint pt){ | |
| 5991 | +static PPoint pik_position_at_angle(PNum dist, PNum r, PPoint pt){ | |
| 5990 | 5992 | r *= 0.017453292519943295769; /* degrees to radians */ |
| 5991 | 5993 | pt.x += dist*sin(r); |
| 5992 | 5994 | pt.y += dist*cos(r); |
| 5993 | 5995 | return pt; |
| 5994 | 5996 | } |
| 5995 | 5997 | |
| 5996 | 5998 | /* Compute the position that is dist away at a compass point |
| 5997 | 5999 | */ |
| 5998 | -static PPoint pik_position_at_hdg(Pik *p, PNum dist, PToken *pD, PPoint pt){ | |
| 5999 | - return pik_position_at_angle(p, dist, pik_hdg_angle[pD->eEdge], pt); | |
| 6000 | +static PPoint pik_position_at_hdg(PNum dist, PToken *pD, PPoint pt){ | |
| 6001 | + return pik_position_at_angle(dist, pik_hdg_angle[pD->eEdge], pt); | |
| 6000 | 6002 | } |
| 6001 | 6003 | |
| 6002 | 6004 | /* Return the coordinates for the n-th vertex of a line. |
| 6003 | 6005 | */ |
| 6004 | 6006 | static PPoint pik_nth_vertex(Pik *p, PToken *pNth, PToken *pErr, PElem *pObj){ |
| @@ -6017,11 +6019,11 @@ | ||
| 6017 | 6019 | return pObj->aPath[n-1]; |
| 6018 | 6020 | } |
| 6019 | 6021 | |
| 6020 | 6022 | /* Return the value of a property of an object. |
| 6021 | 6023 | */ |
| 6022 | -static PNum pik_property_of(Pik *p, PElem *pElem, PToken *pProp){ | |
| 6024 | +static PNum pik_property_of(PElem *pElem, PToken *pProp){ | |
| 6023 | 6025 | PNum v = 0.0; |
| 6024 | 6026 | switch( pProp->eType ){ |
| 6025 | 6027 | case T_HEIGHT: v = pElem->h; break; |
| 6026 | 6028 | case T_WIDTH: v = pElem->w; break; |
| 6027 | 6029 | case T_RADIUS: v = pElem->rad; break; |
| @@ -6174,16 +6176,15 @@ | ||
| 6174 | 6176 | */ |
| 6175 | 6177 | if( pElem->type->isLine ){ |
| 6176 | 6178 | pElem->aPath = malloc( sizeof(PPoint)*p->nTPath ); |
| 6177 | 6179 | if( pElem->aPath==0 ){ |
| 6178 | 6180 | pik_error(p, 0, 0); |
| 6179 | - pElem->nPath = 0; | |
| 6181 | + return; | |
| 6180 | 6182 | }else{ |
| 6181 | 6183 | pElem->nPath = p->nTPath; |
| 6182 | 6184 | for(i=0; i<p->nTPath; i++){ |
| 6183 | 6185 | pElem->aPath[i] = p->aTPath[i]; |
| 6184 | - pik_bbox_add_xy(&pElem->bbox, pElem->aPath[i].x, pElem->aPath[i].y); | |
| 6185 | 6186 | } |
| 6186 | 6187 | } |
| 6187 | 6188 | |
| 6188 | 6189 | /* "chop" processing: |
| 6189 | 6190 | ** If the line goes to the center of an object with an |
| @@ -6193,15 +6194,18 @@ | ||
| 6193 | 6194 | int n = pElem->nPath; |
| 6194 | 6195 | pik_autochop(p, &pElem->aPath[n-2], &pElem->aPath[n-1]); |
| 6195 | 6196 | pik_autochop(p, &pElem->aPath[1], &pElem->aPath[0]); |
| 6196 | 6197 | } |
| 6197 | 6198 | |
| 6198 | - pElem->ptEnter = p->aTPath[0]; | |
| 6199 | - pElem->ptExit = p->aTPath[p->nTPath-1]; | |
| 6199 | + pElem->ptEnter = pElem->aPath[0]; | |
| 6200 | + pElem->ptExit = pElem->aPath[pElem->nPath-1]; | |
| 6200 | 6201 | |
| 6201 | 6202 | /* Compute the center of the line based on the bounding box over |
| 6202 | 6203 | ** the vertexes */ |
| 6204 | + for(i=0; i<pElem->nPath; i++){ | |
| 6205 | + pik_bbox_add_xy(&pElem->bbox, pElem->aPath[i].x, pElem->aPath[i].y); | |
| 6206 | + } | |
| 6203 | 6207 | pElem->ptAt.x = (pElem->bbox.ne.x + pElem->bbox.sw.x)/2.0; |
| 6204 | 6208 | pElem->ptAt.y = (pElem->bbox.ne.y + pElem->bbox.sw.y)/2.0; |
| 6205 | 6209 | |
| 6206 | 6210 | /* Reset the width and height of the object to be the width and height |
| 6207 | 6211 | ** of the bounding box over vertexes */ |
| @@ -6210,11 +6214,11 @@ | ||
| 6210 | 6214 | |
| 6211 | 6215 | /* If this is a polygon (if it has the "close" attribute), then |
| 6212 | 6216 | ** adjust the exit point */ |
| 6213 | 6217 | if( pElem->bClose ){ |
| 6214 | 6218 | /* "closed" lines work like block objects */ |
| 6215 | - pik_elem_set_exit(p, pElem, pElem->inDir); | |
| 6219 | + pik_elem_set_exit(pElem, pElem->inDir); | |
| 6216 | 6220 | }else{ |
| 6217 | 6221 | /* For an open line, the "center" is half way between |
| 6218 | 6222 | ** the .start and the .end */ |
| 6219 | 6223 | } |
| 6220 | 6224 | }else{ |
| @@ -6778,11 +6782,11 @@ | ||
| 6778 | 6782 | /* This is not an exp */ |
| 6779 | 6783 | i -= 2; |
| 6780 | 6784 | }else{ |
| 6781 | 6785 | i++; |
| 6782 | 6786 | isInt = 0; |
| 6783 | - while( (c = z[i])>=0 && c<='9' ){ i++; } | |
| 6787 | + while( (c = z[i])>='0' && c<='9' ){ i++; } | |
| 6784 | 6788 | } |
| 6785 | 6789 | } |
| 6786 | 6790 | c2 = c ? z[i+1] : 0; |
| 6787 | 6791 | if( isInt ){ |
| 6788 | 6792 | if( (c=='t' && c2=='h') |
| @@ -6837,11 +6841,11 @@ | ||
| 6837 | 6841 | |
| 6838 | 6842 | /* |
| 6839 | 6843 | ** Return a pointer to the next non-whitespace token after pThis. |
| 6840 | 6844 | ** This is used to help form error messages. |
| 6841 | 6845 | */ |
| 6842 | -static PToken pik_next_semantic_token(Pik *p, PToken *pThis){ | |
| 6846 | +static PToken pik_next_semantic_token(PToken *pThis){ | |
| 6843 | 6847 | PToken x; |
| 6844 | 6848 | int sz; |
| 6845 | 6849 | int i = pThis->n; |
| 6846 | 6850 | memset(&x, 0, sizeof(x)); |
| 6847 | 6851 | x.z = pThis->z; |
| @@ -7055,6 +7059,6 @@ | ||
| 7055 | 7059 | printf("</body></html>\n"); |
| 7056 | 7060 | return 0; |
| 7057 | 7061 | } |
| 7058 | 7062 | #endif /* PIKCHR_SHELL */ |
| 7059 | 7063 | |
| 7060 | -#line 7085 "pikchr.c" | |
| 7064 | +#line 7089 "pikchr.c" | |
| 7061 | 7065 |
| --- src/pikchr.c | |
| +++ src/pikchr.c | |
| @@ -124,10 +124,14 @@ | |
| 124 | #include <assert.h> |
| 125 | #define count(X) (sizeof(X)/sizeof(X[0])) |
| 126 | #ifndef M_PI |
| 127 | # define M_PI 3.1415926535897932385 |
| 128 | #endif |
| 129 | |
| 130 | typedef struct Pik Pik; /* Complete parsing context */ |
| 131 | typedef struct PToken PToken; /* A single token */ |
| 132 | typedef struct PElem PElem; /* A single diagram object or "element" */ |
| 133 | typedef struct PEList PEList; /* A list of elements */ |
| @@ -397,11 +401,11 @@ | |
| 397 | static void pik_append_arc(Pik*,PNum,PNum,PNum,PNum); |
| 398 | static void pik_append_clr(Pik*,const char*,PNum,const char*); |
| 399 | static void pik_append_style(Pik*,PElem*); |
| 400 | static void pik_append_txt(Pik*,PElem*, PBox*); |
| 401 | static void pik_draw_arrowhead(Pik*,PPoint*pFrom,PPoint*pTo,PElem*); |
| 402 | static void pik_chop(Pik*,PPoint*pFrom,PPoint*pTo,PNum); |
| 403 | static void pik_error(Pik*,PToken*,const char*); |
| 404 | static void pik_elist_free(Pik*,PEList*); |
| 405 | static void pik_elem_free(Pik*,PElem*); |
| 406 | static void pik_render(Pik*,PEList*); |
| 407 | static PEList *pik_elist_append(Pik*,PEList*,PElem*); |
| @@ -410,11 +414,11 @@ | |
| 410 | static void pik_elem_setname(Pik*,PElem*,PToken*); |
| 411 | static void pik_set_var(Pik*,PToken*,PNum,PToken*); |
| 412 | static PNum pik_value(Pik*,const char*,int,int*); |
| 413 | static PNum pik_lookup_color(Pik*,PToken*); |
| 414 | static PNum pik_get_var(Pik*,PToken*); |
| 415 | static PNum pik_atof(Pik*,PToken*); |
| 416 | static void pik_after_adding_attributes(Pik*,PElem*); |
| 417 | static void pik_elem_move(PElem*,PNum dx, PNum dy); |
| 418 | static void pik_elist_move(PEList*,PNum dx, PNum dy); |
| 419 | static void pik_set_numprop(Pik*,PToken*,PRel*); |
| 420 | static void pik_set_clrprop(Pik*,PToken*,PNum); |
| @@ -437,26 +441,26 @@ | |
| 437 | static void pik_bbox_add_xy(PBox*,PNum,PNum); |
| 438 | static void pik_bbox_addellipse(PBox*,PNum x,PNum y,PNum rx,PNum ry); |
| 439 | static void pik_add_txt(Pik*,PToken*,int); |
| 440 | static int pik_text_length(const PToken *pToken); |
| 441 | static void pik_size_to_fit(Pik*,PToken*); |
| 442 | static int pik_text_position(Pik*,int,PToken*); |
| 443 | static PNum pik_property_of(Pik*,PElem*,PToken*); |
| 444 | static PNum pik_func(Pik*,PToken*,PNum,PNum); |
| 445 | static PPoint pik_position_between(Pik *p, PNum x, PPoint p1, PPoint p2); |
| 446 | static PPoint pik_position_at_angle(Pik *p, PNum dist, PNum r, PPoint pt); |
| 447 | static PPoint pik_position_at_hdg(Pik *p, PNum dist, PToken *pD, PPoint pt); |
| 448 | static void pik_same(Pik *p, PElem*, PToken*); |
| 449 | static PPoint pik_nth_vertex(Pik *p, PToken *pNth, PToken *pErr, PElem *pElem); |
| 450 | static PToken pik_next_semantic_token(Pik *p, PToken *pThis); |
| 451 | static void pik_compute_layout_settings(Pik*); |
| 452 | static void pik_behind(Pik*,PElem*); |
| 453 | static PElem *pik_assert(Pik*,PNum,PToken*,PNum); |
| 454 | static PElem *pik_place_assert(Pik*,PPoint*,PToken*,PPoint*); |
| 455 | |
| 456 | |
| 457 | #line 483 "pikchr.c" |
| 458 | /**************** End of %include directives **********************************/ |
| 459 | /* These constants specify the various numeric values for terminal symbols. |
| 460 | ***************** Begin token definitions *************************************/ |
| 461 | #ifndef T_ID |
| 462 | #define T_ID 1 |
| @@ -1628,22 +1632,22 @@ | |
| 1628 | ** inside the C code. |
| 1629 | */ |
| 1630 | /********* Begin destructor definitions ***************************************/ |
| 1631 | case 94: /* element_list */ |
| 1632 | { |
| 1633 | #line 472 "pikchr.y" |
| 1634 | pik_elist_free(p,(yypminor->yy72)); |
| 1635 | #line 1660 "pikchr.c" |
| 1636 | } |
| 1637 | break; |
| 1638 | case 95: /* element */ |
| 1639 | case 96: /* unnamed_element */ |
| 1640 | case 97: /* basetype */ |
| 1641 | { |
| 1642 | #line 474 "pikchr.y" |
| 1643 | pik_elem_free(p,(yypminor->yy254)); |
| 1644 | #line 1669 "pikchr.c" |
| 1645 | } |
| 1646 | break; |
| 1647 | /********* End destructor definitions *****************************************/ |
| 1648 | default: break; /* If no destructor action specified: do nothing */ |
| 1649 | } |
| @@ -1806,11 +1810,11 @@ | |
| 1806 | } |
| 1807 | } |
| 1808 | #endif /* YYWILDCARD */ |
| 1809 | return yy_default[stateno]; |
| 1810 | }else{ |
| 1811 | assert( i>=0 && i<sizeof(yy_action)/sizeof(yy_action[0]) ); |
| 1812 | return yy_action[i]; |
| 1813 | } |
| 1814 | }while(1); |
| 1815 | } |
| 1816 | |
| @@ -1857,14 +1861,14 @@ | |
| 1857 | #endif |
| 1858 | while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser); |
| 1859 | /* Here code is inserted which will execute if the parser |
| 1860 | ** stack every overflows */ |
| 1861 | /******** Begin %stack_overflow code ******************************************/ |
| 1862 | #line 505 "pikchr.y" |
| 1863 | |
| 1864 | pik_error(p, 0, "parser stack overflow"); |
| 1865 | #line 1890 "pikchr.c" |
| 1866 | /******** End %stack_overflow code ********************************************/ |
| 1867 | pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */ |
| 1868 | pik_parserCTX_STORE |
| 1869 | } |
| 1870 | |
| @@ -2329,593 +2333,593 @@ | |
| 2329 | ** break; |
| 2330 | */ |
| 2331 | /********** Begin reduce actions **********************************************/ |
| 2332 | YYMINORTYPE yylhsminor; |
| 2333 | case 0: /* document ::= element_list */ |
| 2334 | #line 509 "pikchr.y" |
| 2335 | {pik_render(p,yymsp[0].minor.yy72);} |
| 2336 | #line 2361 "pikchr.c" |
| 2337 | break; |
| 2338 | case 1: /* element_list ::= element */ |
| 2339 | #line 512 "pikchr.y" |
| 2340 | { yylhsminor.yy72 = pik_elist_append(p,0,yymsp[0].minor.yy254); } |
| 2341 | #line 2366 "pikchr.c" |
| 2342 | yymsp[0].minor.yy72 = yylhsminor.yy72; |
| 2343 | break; |
| 2344 | case 2: /* element_list ::= element_list EOL element */ |
| 2345 | #line 514 "pikchr.y" |
| 2346 | { yylhsminor.yy72 = pik_elist_append(p,yymsp[-2].minor.yy72,yymsp[0].minor.yy254); } |
| 2347 | #line 2372 "pikchr.c" |
| 2348 | yymsp[-2].minor.yy72 = yylhsminor.yy72; |
| 2349 | break; |
| 2350 | case 3: /* element ::= */ |
| 2351 | #line 517 "pikchr.y" |
| 2352 | { yymsp[1].minor.yy254 = 0; } |
| 2353 | #line 2378 "pikchr.c" |
| 2354 | break; |
| 2355 | case 4: /* element ::= direction */ |
| 2356 | #line 518 "pikchr.y" |
| 2357 | { pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy254=0; } |
| 2358 | #line 2383 "pikchr.c" |
| 2359 | yymsp[0].minor.yy254 = yylhsminor.yy254; |
| 2360 | break; |
| 2361 | case 5: /* element ::= lvalue ASSIGN rvalue */ |
| 2362 | #line 519 "pikchr.y" |
| 2363 | {pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy73,&yymsp[-1].minor.yy0); yylhsminor.yy254=0;} |
| 2364 | #line 2389 "pikchr.c" |
| 2365 | yymsp[-2].minor.yy254 = yylhsminor.yy254; |
| 2366 | break; |
| 2367 | case 6: /* element ::= PLACENAME COLON unnamed_element */ |
| 2368 | #line 521 "pikchr.y" |
| 2369 | { yylhsminor.yy254 = yymsp[0].minor.yy254; pik_elem_setname(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0); } |
| 2370 | #line 2395 "pikchr.c" |
| 2371 | yymsp[-2].minor.yy254 = yylhsminor.yy254; |
| 2372 | break; |
| 2373 | case 7: /* element ::= PLACENAME COLON position */ |
| 2374 | #line 523 "pikchr.y" |
| 2375 | { yylhsminor.yy254 = pik_elem_new(p,0,0,0); |
| 2376 | if(yylhsminor.yy254){ yylhsminor.yy254->ptAt = yymsp[0].minor.yy139; pik_elem_setname(p,yylhsminor.yy254,&yymsp[-2].minor.yy0); }} |
| 2377 | #line 2402 "pikchr.c" |
| 2378 | yymsp[-2].minor.yy254 = yylhsminor.yy254; |
| 2379 | break; |
| 2380 | case 8: /* element ::= unnamed_element */ |
| 2381 | #line 525 "pikchr.y" |
| 2382 | {yylhsminor.yy254 = yymsp[0].minor.yy254;} |
| 2383 | #line 2408 "pikchr.c" |
| 2384 | yymsp[0].minor.yy254 = yylhsminor.yy254; |
| 2385 | break; |
| 2386 | case 9: /* element ::= print prlist */ |
| 2387 | #line 526 "pikchr.y" |
| 2388 | {pik_append(p,"<br>\n",5); yymsp[-1].minor.yy254=0;} |
| 2389 | #line 2414 "pikchr.c" |
| 2390 | break; |
| 2391 | case 10: /* element ::= ASSERT LP expr EQ expr RP */ |
| 2392 | #line 531 "pikchr.y" |
| 2393 | {yymsp[-5].minor.yy254=pik_assert(p,yymsp[-3].minor.yy73,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy73);} |
| 2394 | #line 2419 "pikchr.c" |
| 2395 | break; |
| 2396 | case 11: /* element ::= ASSERT LP place EQ place RP */ |
| 2397 | #line 533 "pikchr.y" |
| 2398 | {yymsp[-5].minor.yy254=pik_place_assert(p,&yymsp[-3].minor.yy139,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy139);} |
| 2399 | #line 2424 "pikchr.c" |
| 2400 | break; |
| 2401 | case 12: /* rvalue ::= PLACENAME */ |
| 2402 | #line 544 "pikchr.y" |
| 2403 | {yylhsminor.yy73 = pik_lookup_color(p,&yymsp[0].minor.yy0);} |
| 2404 | #line 2429 "pikchr.c" |
| 2405 | yymsp[0].minor.yy73 = yylhsminor.yy73; |
| 2406 | break; |
| 2407 | case 13: /* pritem ::= FILL */ |
| 2408 | case 14: /* pritem ::= COLOR */ yytestcase(yyruleno==14); |
| 2409 | case 15: /* pritem ::= THICKNESS */ yytestcase(yyruleno==15); |
| 2410 | #line 549 "pikchr.y" |
| 2411 | {pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));} |
| 2412 | #line 2437 "pikchr.c" |
| 2413 | break; |
| 2414 | case 16: /* pritem ::= rvalue */ |
| 2415 | #line 552 "pikchr.y" |
| 2416 | {pik_append_num(p,"",yymsp[0].minor.yy73);} |
| 2417 | #line 2442 "pikchr.c" |
| 2418 | break; |
| 2419 | case 17: /* pritem ::= STRING */ |
| 2420 | #line 553 "pikchr.y" |
| 2421 | {pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);} |
| 2422 | #line 2447 "pikchr.c" |
| 2423 | break; |
| 2424 | case 18: /* prsep ::= COMMA */ |
| 2425 | #line 554 "pikchr.y" |
| 2426 | {pik_append(p, " ", 1);} |
| 2427 | #line 2452 "pikchr.c" |
| 2428 | break; |
| 2429 | case 19: /* unnamed_element ::= basetype attribute_list */ |
| 2430 | #line 557 "pikchr.y" |
| 2431 | {yylhsminor.yy254 = yymsp[-1].minor.yy254; pik_after_adding_attributes(p,yylhsminor.yy254);} |
| 2432 | #line 2457 "pikchr.c" |
| 2433 | yymsp[-1].minor.yy254 = yylhsminor.yy254; |
| 2434 | break; |
| 2435 | case 20: /* basetype ::= CLASSNAME */ |
| 2436 | #line 559 "pikchr.y" |
| 2437 | {yylhsminor.yy254 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); } |
| 2438 | #line 2463 "pikchr.c" |
| 2439 | yymsp[0].minor.yy254 = yylhsminor.yy254; |
| 2440 | break; |
| 2441 | case 21: /* basetype ::= STRING textposition */ |
| 2442 | #line 561 "pikchr.y" |
| 2443 | {yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy74; yylhsminor.yy254 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); } |
| 2444 | #line 2469 "pikchr.c" |
| 2445 | yymsp[-1].minor.yy254 = yylhsminor.yy254; |
| 2446 | break; |
| 2447 | case 22: /* basetype ::= LB savelist element_list RB */ |
| 2448 | #line 563 "pikchr.y" |
| 2449 | { p->list = yymsp[-2].minor.yy72; yymsp[-3].minor.yy254 = pik_elem_new(p,0,0,yymsp[-1].minor.yy72); if(yymsp[-3].minor.yy254) yymsp[-3].minor.yy254->errTok = yymsp[0].minor.yy0; } |
| 2450 | #line 2475 "pikchr.c" |
| 2451 | break; |
| 2452 | case 23: /* savelist ::= */ |
| 2453 | #line 568 "pikchr.y" |
| 2454 | {yymsp[1].minor.yy72 = p->list; p->list = 0;} |
| 2455 | #line 2480 "pikchr.c" |
| 2456 | break; |
| 2457 | case 24: /* relexpr ::= expr */ |
| 2458 | #line 575 "pikchr.y" |
| 2459 | {yylhsminor.yy60.rAbs = yymsp[0].minor.yy73; yylhsminor.yy60.rRel = 0;} |
| 2460 | #line 2485 "pikchr.c" |
| 2461 | yymsp[0].minor.yy60 = yylhsminor.yy60; |
| 2462 | break; |
| 2463 | case 25: /* relexpr ::= expr PERCENT */ |
| 2464 | #line 576 "pikchr.y" |
| 2465 | {yylhsminor.yy60.rAbs = 0; yylhsminor.yy60.rRel = yymsp[-1].minor.yy73/100;} |
| 2466 | #line 2491 "pikchr.c" |
| 2467 | yymsp[-1].minor.yy60 = yylhsminor.yy60; |
| 2468 | break; |
| 2469 | case 26: /* optrelexpr ::= */ |
| 2470 | #line 578 "pikchr.y" |
| 2471 | {yymsp[1].minor.yy60.rAbs = 0; yymsp[1].minor.yy60.rRel = 1.0;} |
| 2472 | #line 2497 "pikchr.c" |
| 2473 | break; |
| 2474 | case 27: /* attribute_list ::= relexpr alist */ |
| 2475 | #line 580 "pikchr.y" |
| 2476 | {pik_add_direction(p,0,&yymsp[-1].minor.yy60);} |
| 2477 | #line 2502 "pikchr.c" |
| 2478 | break; |
| 2479 | case 28: /* attribute ::= numproperty relexpr */ |
| 2480 | #line 584 "pikchr.y" |
| 2481 | { pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy60); } |
| 2482 | #line 2507 "pikchr.c" |
| 2483 | break; |
| 2484 | case 29: /* attribute ::= dashproperty expr */ |
| 2485 | #line 585 "pikchr.y" |
| 2486 | { pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy73); } |
| 2487 | #line 2512 "pikchr.c" |
| 2488 | break; |
| 2489 | case 30: /* attribute ::= dashproperty */ |
| 2490 | #line 586 "pikchr.y" |
| 2491 | { pik_set_dashed(p,&yymsp[0].minor.yy0,0); } |
| 2492 | #line 2517 "pikchr.c" |
| 2493 | break; |
| 2494 | case 31: /* attribute ::= colorproperty rvalue */ |
| 2495 | #line 587 "pikchr.y" |
| 2496 | { pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy73); } |
| 2497 | #line 2522 "pikchr.c" |
| 2498 | break; |
| 2499 | case 32: /* attribute ::= go direction optrelexpr */ |
| 2500 | #line 588 "pikchr.y" |
| 2501 | { pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy60);} |
| 2502 | #line 2527 "pikchr.c" |
| 2503 | break; |
| 2504 | case 33: /* attribute ::= go direction even position */ |
| 2505 | #line 589 "pikchr.y" |
| 2506 | {pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy139);} |
| 2507 | #line 2532 "pikchr.c" |
| 2508 | break; |
| 2509 | case 34: /* attribute ::= CLOSE */ |
| 2510 | #line 590 "pikchr.y" |
| 2511 | { pik_close_path(p,&yymsp[0].minor.yy0); } |
| 2512 | #line 2537 "pikchr.c" |
| 2513 | break; |
| 2514 | case 35: /* attribute ::= CHOP */ |
| 2515 | #line 591 "pikchr.y" |
| 2516 | { p->cur->bChop = 1; } |
| 2517 | #line 2542 "pikchr.c" |
| 2518 | break; |
| 2519 | case 36: /* attribute ::= FROM position */ |
| 2520 | #line 592 "pikchr.y" |
| 2521 | { pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy139); } |
| 2522 | #line 2547 "pikchr.c" |
| 2523 | break; |
| 2524 | case 37: /* attribute ::= TO position */ |
| 2525 | #line 593 "pikchr.y" |
| 2526 | { pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy139); } |
| 2527 | #line 2552 "pikchr.c" |
| 2528 | break; |
| 2529 | case 38: /* attribute ::= THEN */ |
| 2530 | #line 594 "pikchr.y" |
| 2531 | { pik_then(p, &yymsp[0].minor.yy0, p->cur); } |
| 2532 | #line 2557 "pikchr.c" |
| 2533 | break; |
| 2534 | case 39: /* attribute ::= THEN optrelexpr HEADING expr */ |
| 2535 | case 41: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==41); |
| 2536 | #line 596 "pikchr.y" |
| 2537 | {pik_move_hdg(p,&yymsp[-2].minor.yy60,&yymsp[-1].minor.yy0,yymsp[0].minor.yy73,0,&yymsp[-3].minor.yy0);} |
| 2538 | #line 2563 "pikchr.c" |
| 2539 | break; |
| 2540 | case 40: /* attribute ::= THEN optrelexpr EDGEPT */ |
| 2541 | case 42: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==42); |
| 2542 | #line 597 "pikchr.y" |
| 2543 | {pik_move_hdg(p,&yymsp[-1].minor.yy60,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);} |
| 2544 | #line 2569 "pikchr.c" |
| 2545 | break; |
| 2546 | case 43: /* attribute ::= AT position */ |
| 2547 | #line 602 "pikchr.y" |
| 2548 | { pik_set_at(p,0,&yymsp[0].minor.yy139,&yymsp[-1].minor.yy0); } |
| 2549 | #line 2574 "pikchr.c" |
| 2550 | break; |
| 2551 | case 44: /* attribute ::= SAME */ |
| 2552 | #line 604 "pikchr.y" |
| 2553 | {pik_same(p,0,&yymsp[0].minor.yy0);} |
| 2554 | #line 2579 "pikchr.c" |
| 2555 | break; |
| 2556 | case 45: /* attribute ::= SAME AS object */ |
| 2557 | #line 605 "pikchr.y" |
| 2558 | {pik_same(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0);} |
| 2559 | #line 2584 "pikchr.c" |
| 2560 | break; |
| 2561 | case 46: /* attribute ::= STRING textposition */ |
| 2562 | #line 606 "pikchr.y" |
| 2563 | {pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy74);} |
| 2564 | #line 2589 "pikchr.c" |
| 2565 | break; |
| 2566 | case 47: /* attribute ::= FIT */ |
| 2567 | #line 607 "pikchr.y" |
| 2568 | {pik_size_to_fit(p,&yymsp[0].minor.yy0); } |
| 2569 | #line 2594 "pikchr.c" |
| 2570 | break; |
| 2571 | case 48: /* attribute ::= BEHIND object */ |
| 2572 | #line 608 "pikchr.y" |
| 2573 | {pik_behind(p,yymsp[0].minor.yy254);} |
| 2574 | #line 2599 "pikchr.c" |
| 2575 | break; |
| 2576 | case 49: /* withclause ::= DOT_E edge AT position */ |
| 2577 | case 50: /* withclause ::= edge AT position */ yytestcase(yyruleno==50); |
| 2578 | #line 616 "pikchr.y" |
| 2579 | { pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy139,&yymsp[-1].minor.yy0); } |
| 2580 | #line 2605 "pikchr.c" |
| 2581 | break; |
| 2582 | case 51: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */ |
| 2583 | #line 620 "pikchr.y" |
| 2584 | {yylhsminor.yy0 = yymsp[0].minor.yy0;} |
| 2585 | #line 2610 "pikchr.c" |
| 2586 | yymsp[0].minor.yy0 = yylhsminor.yy0; |
| 2587 | break; |
| 2588 | case 52: /* boolproperty ::= CW */ |
| 2589 | #line 631 "pikchr.y" |
| 2590 | {p->cur->cw = 1;} |
| 2591 | #line 2616 "pikchr.c" |
| 2592 | break; |
| 2593 | case 53: /* boolproperty ::= CCW */ |
| 2594 | #line 632 "pikchr.y" |
| 2595 | {p->cur->cw = 0;} |
| 2596 | #line 2621 "pikchr.c" |
| 2597 | break; |
| 2598 | case 54: /* boolproperty ::= LARROW */ |
| 2599 | #line 633 "pikchr.y" |
| 2600 | {p->cur->larrow=1; p->cur->rarrow=0; } |
| 2601 | #line 2626 "pikchr.c" |
| 2602 | break; |
| 2603 | case 55: /* boolproperty ::= RARROW */ |
| 2604 | #line 634 "pikchr.y" |
| 2605 | {p->cur->larrow=0; p->cur->rarrow=1; } |
| 2606 | #line 2631 "pikchr.c" |
| 2607 | break; |
| 2608 | case 56: /* boolproperty ::= LRARROW */ |
| 2609 | #line 635 "pikchr.y" |
| 2610 | {p->cur->larrow=1; p->cur->rarrow=1; } |
| 2611 | #line 2636 "pikchr.c" |
| 2612 | break; |
| 2613 | case 57: /* boolproperty ::= INVIS */ |
| 2614 | #line 636 "pikchr.y" |
| 2615 | {p->cur->sw = 0.0;} |
| 2616 | #line 2641 "pikchr.c" |
| 2617 | break; |
| 2618 | case 58: /* boolproperty ::= THICK */ |
| 2619 | #line 637 "pikchr.y" |
| 2620 | {p->cur->sw *= 1.5;} |
| 2621 | #line 2646 "pikchr.c" |
| 2622 | break; |
| 2623 | case 59: /* boolproperty ::= THIN */ |
| 2624 | #line 638 "pikchr.y" |
| 2625 | {p->cur->sw *= 0.67;} |
| 2626 | #line 2651 "pikchr.c" |
| 2627 | break; |
| 2628 | case 60: /* textposition ::= */ |
| 2629 | #line 640 "pikchr.y" |
| 2630 | {yymsp[1].minor.yy74 = 0;} |
| 2631 | #line 2656 "pikchr.c" |
| 2632 | break; |
| 2633 | case 61: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */ |
| 2634 | #line 643 "pikchr.y" |
| 2635 | {yylhsminor.yy74 = pik_text_position(p,yymsp[-1].minor.yy74,&yymsp[0].minor.yy0);} |
| 2636 | #line 2661 "pikchr.c" |
| 2637 | yymsp[-1].minor.yy74 = yylhsminor.yy74; |
| 2638 | break; |
| 2639 | case 62: /* position ::= expr COMMA expr */ |
| 2640 | #line 646 "pikchr.y" |
| 2641 | {yylhsminor.yy139.x=yymsp[-2].minor.yy73; yylhsminor.yy139.y=yymsp[0].minor.yy73;} |
| 2642 | #line 2667 "pikchr.c" |
| 2643 | yymsp[-2].minor.yy139 = yylhsminor.yy139; |
| 2644 | break; |
| 2645 | case 63: /* position ::= place PLUS expr COMMA expr */ |
| 2646 | #line 648 "pikchr.y" |
| 2647 | {yylhsminor.yy139.x=yymsp[-4].minor.yy139.x+yymsp[-2].minor.yy73; yylhsminor.yy139.y=yymsp[-4].minor.yy139.y+yymsp[0].minor.yy73;} |
| 2648 | #line 2673 "pikchr.c" |
| 2649 | yymsp[-4].minor.yy139 = yylhsminor.yy139; |
| 2650 | break; |
| 2651 | case 64: /* position ::= place MINUS expr COMMA expr */ |
| 2652 | #line 649 "pikchr.y" |
| 2653 | {yylhsminor.yy139.x=yymsp[-4].minor.yy139.x-yymsp[-2].minor.yy73; yylhsminor.yy139.y=yymsp[-4].minor.yy139.y-yymsp[0].minor.yy73;} |
| 2654 | #line 2679 "pikchr.c" |
| 2655 | yymsp[-4].minor.yy139 = yylhsminor.yy139; |
| 2656 | break; |
| 2657 | case 65: /* position ::= place PLUS LP expr COMMA expr RP */ |
| 2658 | #line 651 "pikchr.y" |
| 2659 | {yylhsminor.yy139.x=yymsp[-6].minor.yy139.x+yymsp[-3].minor.yy73; yylhsminor.yy139.y=yymsp[-6].minor.yy139.y+yymsp[-1].minor.yy73;} |
| 2660 | #line 2685 "pikchr.c" |
| 2661 | yymsp[-6].minor.yy139 = yylhsminor.yy139; |
| 2662 | break; |
| 2663 | case 66: /* position ::= place MINUS LP expr COMMA expr RP */ |
| 2664 | #line 653 "pikchr.y" |
| 2665 | {yylhsminor.yy139.x=yymsp[-6].minor.yy139.x-yymsp[-3].minor.yy73; yylhsminor.yy139.y=yymsp[-6].minor.yy139.y-yymsp[-1].minor.yy73;} |
| 2666 | #line 2691 "pikchr.c" |
| 2667 | yymsp[-6].minor.yy139 = yylhsminor.yy139; |
| 2668 | break; |
| 2669 | case 67: /* position ::= LP position COMMA position RP */ |
| 2670 | #line 654 "pikchr.y" |
| 2671 | {yymsp[-4].minor.yy139.x=yymsp[-3].minor.yy139.x; yymsp[-4].minor.yy139.y=yymsp[-1].minor.yy139.y;} |
| 2672 | #line 2697 "pikchr.c" |
| 2673 | break; |
| 2674 | case 68: /* position ::= LP position RP */ |
| 2675 | #line 655 "pikchr.y" |
| 2676 | {yymsp[-2].minor.yy139=yymsp[-1].minor.yy139;} |
| 2677 | #line 2702 "pikchr.c" |
| 2678 | break; |
| 2679 | case 69: /* position ::= expr between position AND position */ |
| 2680 | #line 657 "pikchr.y" |
| 2681 | {yylhsminor.yy139 = pik_position_between(p,yymsp[-4].minor.yy73,yymsp[-2].minor.yy139,yymsp[0].minor.yy139);} |
| 2682 | #line 2707 "pikchr.c" |
| 2683 | yymsp[-4].minor.yy139 = yylhsminor.yy139; |
| 2684 | break; |
| 2685 | case 70: /* position ::= expr LT position COMMA position GT */ |
| 2686 | #line 659 "pikchr.y" |
| 2687 | {yylhsminor.yy139 = pik_position_between(p,yymsp[-5].minor.yy73,yymsp[-3].minor.yy139,yymsp[-1].minor.yy139);} |
| 2688 | #line 2713 "pikchr.c" |
| 2689 | yymsp[-5].minor.yy139 = yylhsminor.yy139; |
| 2690 | break; |
| 2691 | case 71: /* position ::= expr ABOVE position */ |
| 2692 | #line 660 "pikchr.y" |
| 2693 | {yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.y += yymsp[-2].minor.yy73;} |
| 2694 | #line 2719 "pikchr.c" |
| 2695 | yymsp[-2].minor.yy139 = yylhsminor.yy139; |
| 2696 | break; |
| 2697 | case 72: /* position ::= expr BELOW position */ |
| 2698 | #line 661 "pikchr.y" |
| 2699 | {yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.y -= yymsp[-2].minor.yy73;} |
| 2700 | #line 2725 "pikchr.c" |
| 2701 | yymsp[-2].minor.yy139 = yylhsminor.yy139; |
| 2702 | break; |
| 2703 | case 73: /* position ::= expr LEFT OF position */ |
| 2704 | #line 662 "pikchr.y" |
| 2705 | {yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.x -= yymsp[-3].minor.yy73;} |
| 2706 | #line 2731 "pikchr.c" |
| 2707 | yymsp[-3].minor.yy139 = yylhsminor.yy139; |
| 2708 | break; |
| 2709 | case 74: /* position ::= expr RIGHT OF position */ |
| 2710 | #line 663 "pikchr.y" |
| 2711 | {yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.x += yymsp[-3].minor.yy73;} |
| 2712 | #line 2737 "pikchr.c" |
| 2713 | yymsp[-3].minor.yy139 = yylhsminor.yy139; |
| 2714 | break; |
| 2715 | case 75: /* position ::= expr ON HEADING EDGEPT OF position */ |
| 2716 | #line 665 "pikchr.y" |
| 2717 | {yylhsminor.yy139 = pik_position_at_hdg(p,yymsp[-5].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);} |
| 2718 | #line 2743 "pikchr.c" |
| 2719 | yymsp[-5].minor.yy139 = yylhsminor.yy139; |
| 2720 | break; |
| 2721 | case 76: /* position ::= expr HEADING EDGEPT OF position */ |
| 2722 | #line 667 "pikchr.y" |
| 2723 | {yylhsminor.yy139 = pik_position_at_hdg(p,yymsp[-4].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);} |
| 2724 | #line 2749 "pikchr.c" |
| 2725 | yymsp[-4].minor.yy139 = yylhsminor.yy139; |
| 2726 | break; |
| 2727 | case 77: /* position ::= expr EDGEPT OF position */ |
| 2728 | #line 669 "pikchr.y" |
| 2729 | {yylhsminor.yy139 = pik_position_at_hdg(p,yymsp[-3].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);} |
| 2730 | #line 2755 "pikchr.c" |
| 2731 | yymsp[-3].minor.yy139 = yylhsminor.yy139; |
| 2732 | break; |
| 2733 | case 78: /* position ::= expr ON HEADING expr FROM position */ |
| 2734 | #line 671 "pikchr.y" |
| 2735 | {yylhsminor.yy139 = pik_position_at_angle(p,yymsp[-5].minor.yy73,yymsp[-2].minor.yy73,yymsp[0].minor.yy139);} |
| 2736 | #line 2761 "pikchr.c" |
| 2737 | yymsp[-5].minor.yy139 = yylhsminor.yy139; |
| 2738 | break; |
| 2739 | case 79: /* position ::= expr HEADING expr FROM position */ |
| 2740 | #line 673 "pikchr.y" |
| 2741 | {yylhsminor.yy139 = pik_position_at_angle(p,yymsp[-4].minor.yy73,yymsp[-2].minor.yy73,yymsp[0].minor.yy139);} |
| 2742 | #line 2767 "pikchr.c" |
| 2743 | yymsp[-4].minor.yy139 = yylhsminor.yy139; |
| 2744 | break; |
| 2745 | case 80: /* place ::= edge OF object */ |
| 2746 | #line 685 "pikchr.y" |
| 2747 | {yylhsminor.yy139 = pik_place_of_elem(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0);} |
| 2748 | #line 2773 "pikchr.c" |
| 2749 | yymsp[-2].minor.yy139 = yylhsminor.yy139; |
| 2750 | break; |
| 2751 | case 81: /* place2 ::= object */ |
| 2752 | #line 686 "pikchr.y" |
| 2753 | {yylhsminor.yy139 = pik_place_of_elem(p,yymsp[0].minor.yy254,0);} |
| 2754 | #line 2779 "pikchr.c" |
| 2755 | yymsp[0].minor.yy139 = yylhsminor.yy139; |
| 2756 | break; |
| 2757 | case 82: /* place2 ::= object DOT_E edge */ |
| 2758 | #line 687 "pikchr.y" |
| 2759 | {yylhsminor.yy139 = pik_place_of_elem(p,yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);} |
| 2760 | #line 2785 "pikchr.c" |
| 2761 | yymsp[-2].minor.yy139 = yylhsminor.yy139; |
| 2762 | break; |
| 2763 | case 83: /* place2 ::= NTH VERTEX OF object */ |
| 2764 | #line 688 "pikchr.y" |
| 2765 | {yylhsminor.yy139 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy254);} |
| 2766 | #line 2791 "pikchr.c" |
| 2767 | yymsp[-3].minor.yy139 = yylhsminor.yy139; |
| 2768 | break; |
| 2769 | case 84: /* object ::= nth */ |
| 2770 | #line 700 "pikchr.y" |
| 2771 | {yylhsminor.yy254 = pik_find_nth(p,0,&yymsp[0].minor.yy0);} |
| 2772 | #line 2797 "pikchr.c" |
| 2773 | yymsp[0].minor.yy254 = yylhsminor.yy254; |
| 2774 | break; |
| 2775 | case 85: /* object ::= nth OF|IN object */ |
| 2776 | #line 701 "pikchr.y" |
| 2777 | {yylhsminor.yy254 = pik_find_nth(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0);} |
| 2778 | #line 2803 "pikchr.c" |
| 2779 | yymsp[-2].minor.yy254 = yylhsminor.yy254; |
| 2780 | break; |
| 2781 | case 86: /* objectname ::= PLACENAME */ |
| 2782 | #line 703 "pikchr.y" |
| 2783 | {yylhsminor.yy254 = pik_find_byname(p,0,&yymsp[0].minor.yy0);} |
| 2784 | #line 2809 "pikchr.c" |
| 2785 | yymsp[0].minor.yy254 = yylhsminor.yy254; |
| 2786 | break; |
| 2787 | case 87: /* objectname ::= objectname DOT_U PLACENAME */ |
| 2788 | #line 705 "pikchr.y" |
| 2789 | {yylhsminor.yy254 = pik_find_byname(p,yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);} |
| 2790 | #line 2815 "pikchr.c" |
| 2791 | yymsp[-2].minor.yy254 = yylhsminor.yy254; |
| 2792 | break; |
| 2793 | case 88: /* nth ::= NTH CLASSNAME */ |
| 2794 | #line 707 "pikchr.y" |
| 2795 | {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); } |
| 2796 | #line 2821 "pikchr.c" |
| 2797 | yymsp[-1].minor.yy0 = yylhsminor.yy0; |
| 2798 | break; |
| 2799 | case 89: /* nth ::= NTH LAST CLASSNAME */ |
| 2800 | #line 708 "pikchr.y" |
| 2801 | {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); } |
| 2802 | #line 2827 "pikchr.c" |
| 2803 | yymsp[-2].minor.yy0 = yylhsminor.yy0; |
| 2804 | break; |
| 2805 | case 90: /* nth ::= LAST CLASSNAME */ |
| 2806 | #line 709 "pikchr.y" |
| 2807 | {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;} |
| 2808 | #line 2833 "pikchr.c" |
| 2809 | break; |
| 2810 | case 91: /* nth ::= LAST */ |
| 2811 | #line 710 "pikchr.y" |
| 2812 | {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;} |
| 2813 | #line 2838 "pikchr.c" |
| 2814 | yymsp[0].minor.yy0 = yylhsminor.yy0; |
| 2815 | break; |
| 2816 | case 92: /* nth ::= NTH LB RB */ |
| 2817 | #line 711 "pikchr.y" |
| 2818 | {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);} |
| 2819 | #line 2844 "pikchr.c" |
| 2820 | yymsp[-2].minor.yy0 = yylhsminor.yy0; |
| 2821 | break; |
| 2822 | case 93: /* nth ::= NTH LAST LB RB */ |
| 2823 | #line 712 "pikchr.y" |
| 2824 | {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);} |
| 2825 | #line 2850 "pikchr.c" |
| 2826 | yymsp[-3].minor.yy0 = yylhsminor.yy0; |
| 2827 | break; |
| 2828 | case 94: /* nth ::= LAST LB RB */ |
| 2829 | #line 713 "pikchr.y" |
| 2830 | {yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; } |
| 2831 | #line 2856 "pikchr.c" |
| 2832 | break; |
| 2833 | case 95: /* expr ::= expr PLUS expr */ |
| 2834 | #line 715 "pikchr.y" |
| 2835 | {yylhsminor.yy73=yymsp[-2].minor.yy73+yymsp[0].minor.yy73;} |
| 2836 | #line 2861 "pikchr.c" |
| 2837 | yymsp[-2].minor.yy73 = yylhsminor.yy73; |
| 2838 | break; |
| 2839 | case 96: /* expr ::= expr MINUS expr */ |
| 2840 | #line 716 "pikchr.y" |
| 2841 | {yylhsminor.yy73=yymsp[-2].minor.yy73-yymsp[0].minor.yy73;} |
| 2842 | #line 2867 "pikchr.c" |
| 2843 | yymsp[-2].minor.yy73 = yylhsminor.yy73; |
| 2844 | break; |
| 2845 | case 97: /* expr ::= expr STAR expr */ |
| 2846 | #line 717 "pikchr.y" |
| 2847 | {yylhsminor.yy73=yymsp[-2].minor.yy73*yymsp[0].minor.yy73;} |
| 2848 | #line 2873 "pikchr.c" |
| 2849 | yymsp[-2].minor.yy73 = yylhsminor.yy73; |
| 2850 | break; |
| 2851 | case 98: /* expr ::= expr SLASH expr */ |
| 2852 | #line 718 "pikchr.y" |
| 2853 | { |
| 2854 | if( yymsp[0].minor.yy73==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy73 = 0.0; } |
| 2855 | else{ yylhsminor.yy73 = yymsp[-2].minor.yy73/yymsp[0].minor.yy73; } |
| 2856 | } |
| 2857 | #line 2882 "pikchr.c" |
| 2858 | yymsp[-2].minor.yy73 = yylhsminor.yy73; |
| 2859 | break; |
| 2860 | case 99: /* expr ::= MINUS expr */ |
| 2861 | #line 722 "pikchr.y" |
| 2862 | {yymsp[-1].minor.yy73=-yymsp[0].minor.yy73;} |
| 2863 | #line 2888 "pikchr.c" |
| 2864 | break; |
| 2865 | case 100: /* expr ::= PLUS expr */ |
| 2866 | #line 723 "pikchr.y" |
| 2867 | {yymsp[-1].minor.yy73=yymsp[0].minor.yy73;} |
| 2868 | #line 2893 "pikchr.c" |
| 2869 | break; |
| 2870 | case 101: /* expr ::= LP expr RP */ |
| 2871 | #line 724 "pikchr.y" |
| 2872 | {yymsp[-2].minor.yy73=yymsp[-1].minor.yy73;} |
| 2873 | #line 2898 "pikchr.c" |
| 2874 | break; |
| 2875 | case 102: /* expr ::= NUMBER */ |
| 2876 | #line 725 "pikchr.y" |
| 2877 | {yylhsminor.yy73=pik_atof(p,&yymsp[0].minor.yy0);} |
| 2878 | #line 2903 "pikchr.c" |
| 2879 | yymsp[0].minor.yy73 = yylhsminor.yy73; |
| 2880 | break; |
| 2881 | case 103: /* expr ::= ID */ |
| 2882 | #line 726 "pikchr.y" |
| 2883 | {yylhsminor.yy73=pik_get_var(p,&yymsp[0].minor.yy0);} |
| 2884 | #line 2909 "pikchr.c" |
| 2885 | yymsp[0].minor.yy73 = yylhsminor.yy73; |
| 2886 | break; |
| 2887 | case 104: /* expr ::= FUNC1 LP expr RP */ |
| 2888 | #line 727 "pikchr.y" |
| 2889 | {yylhsminor.yy73 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy73,0.0);} |
| 2890 | #line 2915 "pikchr.c" |
| 2891 | yymsp[-3].minor.yy73 = yylhsminor.yy73; |
| 2892 | break; |
| 2893 | case 105: /* expr ::= FUNC2 LP expr COMMA expr RP */ |
| 2894 | #line 728 "pikchr.y" |
| 2895 | {yylhsminor.yy73 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy73,yymsp[-1].minor.yy73);} |
| 2896 | #line 2921 "pikchr.c" |
| 2897 | yymsp[-5].minor.yy73 = yylhsminor.yy73; |
| 2898 | break; |
| 2899 | case 106: /* expr ::= place2 DOT_XY X */ |
| 2900 | #line 729 "pikchr.y" |
| 2901 | {yylhsminor.yy73 = yymsp[-2].minor.yy139.x;} |
| 2902 | #line 2927 "pikchr.c" |
| 2903 | yymsp[-2].minor.yy73 = yylhsminor.yy73; |
| 2904 | break; |
| 2905 | case 107: /* expr ::= place2 DOT_XY Y */ |
| 2906 | #line 730 "pikchr.y" |
| 2907 | {yylhsminor.yy73 = yymsp[-2].minor.yy139.y;} |
| 2908 | #line 2933 "pikchr.c" |
| 2909 | yymsp[-2].minor.yy73 = yylhsminor.yy73; |
| 2910 | break; |
| 2911 | case 108: /* expr ::= object DOT_L numproperty */ |
| 2912 | case 109: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==109); |
| 2913 | case 110: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==110); |
| 2914 | #line 731 "pikchr.y" |
| 2915 | {yylhsminor.yy73=pik_property_of(p,yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);} |
| 2916 | #line 2941 "pikchr.c" |
| 2917 | yymsp[-2].minor.yy73 = yylhsminor.yy73; |
| 2918 | break; |
| 2919 | default: |
| 2920 | /* (111) lvalue ::= ID */ yytestcase(yyruleno==111); |
| 2921 | /* (112) lvalue ::= FILL */ yytestcase(yyruleno==112); |
| @@ -3014,18 +3018,19 @@ | |
| 3014 | ){ |
| 3015 | pik_parserARG_FETCH |
| 3016 | pik_parserCTX_FETCH |
| 3017 | #define TOKEN yyminor |
| 3018 | /************ Begin %syntax_error code ****************************************/ |
| 3019 | #line 498 "pikchr.y" |
| 3020 | |
| 3021 | if( TOKEN.z && TOKEN.z[0] ){ |
| 3022 | pik_error(p, &TOKEN, "syntax error"); |
| 3023 | }else{ |
| 3024 | pik_error(p, 0, "syntax error"); |
| 3025 | } |
| 3026 | #line 3051 "pikchr.c" |
| 3027 | /************ End %syntax_error code ******************************************/ |
| 3028 | pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */ |
| 3029 | pik_parserCTX_STORE |
| 3030 | } |
| 3031 | |
| @@ -3254,11 +3259,11 @@ | |
| 3254 | #else |
| 3255 | (void)iToken; |
| 3256 | return 0; |
| 3257 | #endif |
| 3258 | } |
| 3259 | #line 736 "pikchr.y" |
| 3260 | |
| 3261 | |
| 3262 | |
| 3263 | /* Chart of the 140 official HTML color names with their |
| 3264 | ** corresponding RGB value. |
| @@ -3534,33 +3539,10 @@ | |
| 3534 | static void boxInit(Pik *p, PElem *pElem){ |
| 3535 | pElem->w = pik_value(p, "boxwid",6,0); |
| 3536 | pElem->h = pik_value(p, "boxht",5,0); |
| 3537 | pElem->rad = pik_value(p, "boxrad",6,0); |
| 3538 | } |
| 3539 | /* Translate the CP_START and CP_END reference points into the |
| 3540 | ** corresponding compass point based on the direction. |
| 3541 | */ |
| 3542 | static int boxTranslateEndPoint(PElem *pElem, int cp){ |
| 3543 | #if 0 |
| 3544 | if( cp==CP_START ){ |
| 3545 | switch( pElem->inDir ){ |
| 3546 | case DIR_RIGHT: cp = CP_W; break; |
| 3547 | case DIR_DOWN: cp = CP_N; break; |
| 3548 | case DIR_LEFT: cp = CP_E; break; |
| 3549 | case DIR_UP: cp = CP_S; break; |
| 3550 | } |
| 3551 | }else if( cp==CP_END ){ |
| 3552 | switch( pElem->outDir ){ |
| 3553 | case DIR_RIGHT: cp = CP_E; break; |
| 3554 | case DIR_DOWN: cp = CP_S; break; |
| 3555 | case DIR_LEFT: cp = CP_W; break; |
| 3556 | case DIR_UP: cp = CP_N; break; |
| 3557 | } |
| 3558 | } |
| 3559 | #endif |
| 3560 | return cp; |
| 3561 | } |
| 3562 | /* Return offset from the center of the box to the compass point |
| 3563 | ** given by parameter cp */ |
| 3564 | static PPoint boxOffset(Pik *p, PElem *pElem, int cp){ |
| 3565 | PPoint pt; |
| 3566 | PNum w2 = 0.5*pElem->w; |
| @@ -3573,11 +3555,11 @@ | |
| 3573 | if( rad>w2 ) rad = w2; |
| 3574 | if( rad>h2 ) rad = h2; |
| 3575 | rx = 0.29289321881345252392*rad; |
| 3576 | } |
| 3577 | pt.x = pt.y = 0.0; |
| 3578 | switch( boxTranslateEndPoint(pElem,cp) ){ |
| 3579 | case CP_C: pt.x = 0.0; pt.y = 0.0; break; |
| 3580 | case CP_N: pt.x = 0.0; pt.y = h2; break; |
| 3581 | case CP_NE: pt.x = w2-rx; pt.y = h2-rx; break; |
| 3582 | case CP_E: pt.x = w2; pt.y = 0.0; break; |
| 3583 | case CP_SE: pt.x = w2-rx; pt.y = rx-h2; break; |
| @@ -3584,10 +3566,11 @@ | |
| 3584 | case CP_S: pt.x = 0.0; pt.y = -h2; break; |
| 3585 | case CP_SW: pt.x = rx-w2; pt.y = rx-h2; break; |
| 3586 | case CP_W: pt.x = -w2; pt.y = 0.0; break; |
| 3587 | case CP_NW: pt.x = rx-w2; pt.y = h2-rx; break; |
| 3588 | } |
| 3589 | return pt; |
| 3590 | } |
| 3591 | static PPoint boxChop(Pik *p, PElem *pElem, PPoint *pPt){ |
| 3592 | PNum dx, dy; |
| 3593 | int cp = CP_C; |
| @@ -3627,10 +3610,11 @@ | |
| 3627 | return chop; |
| 3628 | } |
| 3629 | static void boxFit(Pik *p, PElem *pElem, PNum w, PNum h){ |
| 3630 | if( w>0 ) pElem->w = w; |
| 3631 | if( h>0 ) pElem->h = h; |
| 3632 | } |
| 3633 | static void boxRender(Pik *p, PElem *pElem){ |
| 3634 | PNum w2 = 0.5*pElem->w; |
| 3635 | PNum h2 = 0.5*pElem->h; |
| 3636 | PNum rad = pElem->rad; |
| @@ -3704,19 +3688,21 @@ | |
| 3704 | case T_HEIGHT: |
| 3705 | pElem->w = pElem->h; |
| 3706 | pElem->rad = 0.5*pElem->w; |
| 3707 | break; |
| 3708 | } |
| 3709 | } |
| 3710 | static PPoint circleChop(Pik *p, PElem *pElem, PPoint *pPt){ |
| 3711 | PPoint chop; |
| 3712 | PNum dx = pPt->x - pElem->ptAt.x; |
| 3713 | PNum dy = pPt->y - pElem->ptAt.y; |
| 3714 | PNum dist = hypot(dx,dy); |
| 3715 | if( dist<pElem->rad ) return pElem->ptAt; |
| 3716 | chop.x = pElem->ptAt.x + dx*pElem->rad/dist; |
| 3717 | chop.y = pElem->ptAt.y + dy*pElem->rad/dist; |
| 3718 | return chop; |
| 3719 | } |
| 3720 | static void circleFit(Pik *p, PElem *pElem, PNum w, PNum h){ |
| 3721 | PNum mx = 0.0; |
| 3722 | if( w>0 ) mx = w; |
| @@ -3726,10 +3712,11 @@ | |
| 3726 | } |
| 3727 | if( mx>0.0 ){ |
| 3728 | pElem->rad = 0.5*mx; |
| 3729 | pElem->w = pElem->h = mx; |
| 3730 | } |
| 3731 | } |
| 3732 | |
| 3733 | static void circleRender(Pik *p, PElem *pElem){ |
| 3734 | PNum r = pElem->rad; |
| 3735 | PPoint pt = pElem->ptAt; |
| @@ -3770,11 +3757,11 @@ | |
| 3770 | static PPoint cylinderOffset(Pik *p, PElem *pElem, int cp){ |
| 3771 | PPoint pt; |
| 3772 | PNum w2 = pElem->w*0.5; |
| 3773 | PNum h1 = pElem->h*0.5; |
| 3774 | PNum h2 = h1 - pElem->rad; |
| 3775 | switch( boxTranslateEndPoint(pElem,cp) ){ |
| 3776 | case CP_C: pt.x = 0.0; pt.y = 0.0; break; |
| 3777 | case CP_N: pt.x = 0.0; pt.y = h1; break; |
| 3778 | case CP_NE: pt.x = w2; pt.y = h2; break; |
| 3779 | case CP_E: pt.x = w2; pt.y = 0.0; break; |
| 3780 | case CP_SE: pt.x = w2; pt.y = -h2; break; |
| @@ -3781,10 +3768,11 @@ | |
| 3781 | case CP_S: pt.x = 0.0; pt.y = -h1; break; |
| 3782 | case CP_SW: pt.x = -w2; pt.y = -h2; break; |
| 3783 | case CP_W: pt.x = -w2; pt.y = 0.0; break; |
| 3784 | case CP_NW: pt.x = -w2; pt.y = h2; break; |
| 3785 | } |
| 3786 | return pt; |
| 3787 | } |
| 3788 | |
| 3789 | /* Methods for the "dot" class */ |
| 3790 | static void dotInit(Pik *p, PElem *pElem){ |
| @@ -3799,19 +3787,24 @@ | |
| 3799 | break; |
| 3800 | case T_FILL: |
| 3801 | pElem->color = pElem->fill; |
| 3802 | break; |
| 3803 | } |
| 3804 | } |
| 3805 | static void dotCheck(Pik *p, PElem *pElem){ |
| 3806 | pElem->w = pElem->h = 0; |
| 3807 | pik_bbox_addellipse(&pElem->bbox, pElem->ptAt.x, pElem->ptAt.y, |
| 3808 | pElem->rad, pElem->rad); |
| 3809 | } |
| 3810 | static PPoint dotOffset(Pik *p, PElem *pElem, int cp){ |
| 3811 | PPoint zero; |
| 3812 | zero.x = zero.y = 0; |
| 3813 | return zero; |
| 3814 | } |
| 3815 | static void dotRender(Pik *p, PElem *pElem){ |
| 3816 | PNum r = pElem->rad; |
| 3817 | PPoint pt = pElem->ptAt; |
| @@ -3843,19 +3836,20 @@ | |
| 3843 | dq = dx*s; |
| 3844 | dist = hypot(dq,dy); |
| 3845 | if( dist<pElem->h ) return pElem->ptAt; |
| 3846 | chop.x = pElem->ptAt.x + 0.5*dq*pElem->h/(dist*s); |
| 3847 | chop.y = pElem->ptAt.y + 0.5*dy*pElem->h/dist; |
| 3848 | return chop; |
| 3849 | } |
| 3850 | static PPoint ellipseOffset(Pik *p, PElem *pElem, int cp){ |
| 3851 | PPoint pt; |
| 3852 | PNum w = pElem->w*0.5; |
| 3853 | PNum w2 = w*0.70710678118654747608; |
| 3854 | PNum h = pElem->h*0.5; |
| 3855 | PNum h2 = h*0.70710678118654747608; |
| 3856 | switch( boxTranslateEndPoint(pElem,cp) ){ |
| 3857 | case CP_C: pt.x = 0.0; pt.y = 0.0; break; |
| 3858 | case CP_N: pt.x = 0.0; pt.y = h; break; |
| 3859 | case CP_NE: pt.x = w2; pt.y = h2; break; |
| 3860 | case CP_E: pt.x = w; pt.y = 0.0; break; |
| 3861 | case CP_SE: pt.x = w2; pt.y = -h2; break; |
| @@ -3862,10 +3856,11 @@ | |
| 3862 | case CP_S: pt.x = 0.0; pt.y = -h; break; |
| 3863 | case CP_SW: pt.x = -w2; pt.y = -h2; break; |
| 3864 | case CP_W: pt.x = -w; pt.y = 0.0; break; |
| 3865 | case CP_NW: pt.x = -w2; pt.y = h2; break; |
| 3866 | } |
| 3867 | return pt; |
| 3868 | } |
| 3869 | static void ellipseRender(Pik *p, PElem *pElem){ |
| 3870 | PNum w = pElem->w; |
| 3871 | PNum h = pElem->h; |
| @@ -3897,11 +3892,11 @@ | |
| 3897 | PNum mn = w2<h2 ? w2 : h2; |
| 3898 | if( rx>mn ) rx = mn; |
| 3899 | if( rx<mn*0.25 ) rx = mn*0.25; |
| 3900 | pt.x = pt.y = 0.0; |
| 3901 | rx *= 0.5; |
| 3902 | switch( boxTranslateEndPoint(pElem,cp) ){ |
| 3903 | case CP_C: pt.x = 0.0; pt.y = 0.0; break; |
| 3904 | case CP_N: pt.x = 0.0; pt.y = h2; break; |
| 3905 | case CP_NE: pt.x = w2-rx; pt.y = h2-rx; break; |
| 3906 | case CP_E: pt.x = w2; pt.y = 0.0; break; |
| 3907 | case CP_SE: pt.x = w2; pt.y = -h2; break; |
| @@ -3908,15 +3903,17 @@ | |
| 3908 | case CP_S: pt.x = 0.0; pt.y = -h2; break; |
| 3909 | case CP_SW: pt.x = -w2; pt.y = -h2; break; |
| 3910 | case CP_W: pt.x = -w2; pt.y = 0.0; break; |
| 3911 | case CP_NW: pt.x = -w2; pt.y = h2; break; |
| 3912 | } |
| 3913 | return pt; |
| 3914 | } |
| 3915 | static void fileFit(Pik *p, PElem *pElem, PNum w, PNum h){ |
| 3916 | if( w>0 ) pElem->w = w; |
| 3917 | if( h>0 ) pElem->h = h + 2*pElem->rad; |
| 3918 | } |
| 3919 | static void fileRender(Pik *p, PElem *pElem){ |
| 3920 | PNum w2 = 0.5*pElem->w; |
| 3921 | PNum h2 = 0.5*pElem->h; |
| 3922 | PNum rad = pElem->rad; |
| @@ -3950,11 +3947,10 @@ | |
| 3950 | pElem->h = pik_value(p, "lineht",6,0); |
| 3951 | pElem->rad = pik_value(p, "linerad",7,0); |
| 3952 | pElem->fill = -1.0; |
| 3953 | } |
| 3954 | static PPoint lineOffset(Pik *p, PElem *pElem, int cp){ |
| 3955 | |
| 3956 | #if 0 |
| 3957 | /* In legacy PIC, the .center of an unclosed line is half way between |
| 3958 | ** its .start and .end. */ |
| 3959 | if( cp==CP_C && !pElem->bClose ){ |
| 3960 | PPoint out; |
| @@ -3961,11 +3957,10 @@ | |
| 3961 | out.x = 0.5*(pElem->ptEnter.x + pElem->ptExit.x) - pElem->ptAt.x; |
| 3962 | out.y = 0.5*(pElem->ptEnter.x + pElem->ptExit.y) - pElem->ptAt.y; |
| 3963 | return out; |
| 3964 | } |
| 3965 | #endif |
| 3966 | |
| 3967 | return boxOffset(p,pElem,cp); |
| 3968 | } |
| 3969 | static void lineRender(Pik *p, PElem *pElem){ |
| 3970 | int i; |
| 3971 | if( pElem->sw>0.0 ){ |
| @@ -4001,24 +3996,29 @@ | |
| 4001 | pElem->color = -1.0; |
| 4002 | pElem->sw = -1.0; |
| 4003 | } |
| 4004 | static void moveRender(Pik *p, PElem *pElem){ |
| 4005 | /* No-op */ |
| 4006 | } |
| 4007 | |
| 4008 | /* Methods for the "oval" class */ |
| 4009 | static void ovalInit(Pik *p, PElem *pElem){ |
| 4010 | pElem->h = pik_value(p, "ovalht",6,0); |
| 4011 | pElem->w = pik_value(p, "ovalwid",7,0); |
| 4012 | pElem->rad = 0.5*(pElem->h<pElem->w?pElem->h:pElem->w); |
| 4013 | } |
| 4014 | static void ovalNumProp(Pik *p, PElem *pElem, PToken *pId){ |
| 4015 | /* Always adjust the radius to be half of the smaller of |
| 4016 | ** the width and height. */ |
| 4017 | pElem->rad = 0.5*(pElem->h<pElem->w?pElem->h:pElem->w); |
| 4018 | } |
| 4019 | static void ovalFit(Pik *p, PElem *pElem, PNum w, PNum h){ |
| 4020 | if( w>0 ) pElem->w = w; |
| 4021 | if( h>0 ) pElem->h = h; |
| 4022 | if( pElem->w<pElem->h ) pElem->w = pElem->h; |
| 4023 | } |
| 4024 | |
| @@ -4114,10 +4114,11 @@ | |
| 4114 | |
| 4115 | /* Methods for the "sublist" class */ |
| 4116 | static void sublistInit(Pik *p, PElem *pElem){ |
| 4117 | PEList *pList = pElem->pSublist; |
| 4118 | int i; |
| 4119 | pik_bbox_init(&pElem->bbox); |
| 4120 | for(i=0; i<pList->n; i++){ |
| 4121 | pik_bbox_addbox(&pElem->bbox, &pList->a[i]->bbox); |
| 4122 | } |
| 4123 | pElem->w = pElem->bbox.ne.x - pElem->bbox.sw.x; |
| @@ -4305,11 +4306,11 @@ | |
| 4305 | |
| 4306 | /* |
| 4307 | ** Reduce the length of the line segment by amt (if possible) by |
| 4308 | ** modifying the location of *t. |
| 4309 | */ |
| 4310 | static void pik_chop(Pik *p, PPoint *f, PPoint *t, PNum amt){ |
| 4311 | PNum dx = t->x - f->x; |
| 4312 | PNum dy = t->y - f->y; |
| 4313 | PNum dist = hypot(dx,dy); |
| 4314 | PNum r; |
| 4315 | if( dist<=amt ){ |
| @@ -4350,11 +4351,11 @@ | |
| 4350 | by = f->y + e1*dy; |
| 4351 | pik_append_xy(p,"<polygon points=\"", t->x, t->y); |
| 4352 | pik_append_xy(p," ",bx-ddx, by-ddy); |
| 4353 | pik_append_xy(p," ",bx+ddx, by+ddy); |
| 4354 | pik_append_clr(p,"\" style=\"fill:",pElem->color,"\"/>\n"); |
| 4355 | pik_chop(p,f,t,h/2); |
| 4356 | } |
| 4357 | |
| 4358 | /* |
| 4359 | ** Compute the relative offset to an edge location from the reference for a |
| 4360 | ** an element. |
| @@ -4538,11 +4539,11 @@ | |
| 4538 | ** Compute the vertical locations for all text items in the |
| 4539 | ** element pElem. In other words, set every pElem->aTxt[*].eCode |
| 4540 | ** value to contain exactly one of: TP_ABOVE2, TP_ABOVE, TP_CENTER, |
| 4541 | ** TP_BELOW, or TP_BELOW2 is set. |
| 4542 | */ |
| 4543 | static void pik_txt_vertical_layout(Pik *p, PElem *pElem){ |
| 4544 | int n, i; |
| 4545 | PToken *aTxt; |
| 4546 | n = pElem->nTxt; |
| 4547 | if( n==0 ) return; |
| 4548 | aTxt = pElem->aTxt; |
| @@ -4636,11 +4637,11 @@ | |
| 4636 | if( p->nErr ) return; |
| 4637 | if( pElem->nTxt==0 ) return; |
| 4638 | aTxt = pElem->aTxt; |
| 4639 | dy = 0.5*p->charHeight; |
| 4640 | n = pElem->nTxt; |
| 4641 | pik_txt_vertical_layout(p, pElem); |
| 4642 | x = pElem->ptAt.x; |
| 4643 | for(i=0; i<n; i++){ |
| 4644 | if( (pElem->aTxt[i].eCode & TP_CENTER)!=0 ) hasCenter = 1; |
| 4645 | } |
| 4646 | if( hasCenter ){ |
| @@ -4765,11 +4766,11 @@ | |
| 4765 | for(nExtra=0; (c = p->zIn[i+nExtra])!=0 && c!='\n'; nExtra++){} |
| 4766 | pik_append(p, "<div><pre>\n", -1); |
| 4767 | pik_append_text(p, p->zIn, i+nExtra, 3); |
| 4768 | pik_append(p, "\n", 1); |
| 4769 | for(i=0; i<iCol; i++){ pik_append(p, " ", 1); } |
| 4770 | for(i=0; i<pErr->n; i++) pik_append(p, "^", 1); |
| 4771 | pik_append(p, "\nERROR: ", -1); |
| 4772 | pik_append_text(p, zMsg, -1, 0); |
| 4773 | pik_append(p, "\n", 1); |
| 4774 | pik_append(p, "\n</pre></div>\n", -1); |
| 4775 | } |
| @@ -4841,18 +4842,18 @@ | |
| 4841 | ** (3) Hex integers: 0x000000 |
| 4842 | ** |
| 4843 | ** This routine returns the result in inches. If a different unit |
| 4844 | ** is specified, the conversion happens automatically. |
| 4845 | */ |
| 4846 | PNum pik_atof(Pik *p, PToken *num){ |
| 4847 | char *endptr; |
| 4848 | PNum ans; |
| 4849 | if( num->n>=3 && num->z[0]=='0' && (num->z[1]=='x'||num->z[1]=='X') ){ |
| 4850 | return (PNum)strtol(num->z+2, 0, 16); |
| 4851 | } |
| 4852 | ans = strtod(num->z, &endptr); |
| 4853 | if( (int)(endptr - num->z)==num->n-2 ){ |
| 4854 | char c1 = endptr[0]; |
| 4855 | char c2 = endptr[1]; |
| 4856 | if( c1=='c' && c2=='m' ){ |
| 4857 | ans /= 2.54; |
| 4858 | }else if( c1=='m' && c2=='m' ){ |
| @@ -5063,11 +5064,11 @@ | |
| 5063 | } |
| 5064 | |
| 5065 | /* |
| 5066 | ** Set the output direction and exit point for an element. |
| 5067 | */ |
| 5068 | static void pik_elem_set_exit(Pik *p, PElem *pElem, int eDir){ |
| 5069 | assert( ValidDir(eDir) ); |
| 5070 | pElem->outDir = eDir; |
| 5071 | if( !pElem->type->isLine || pElem->bClose ){ |
| 5072 | pElem->ptExit = pElem->ptAt; |
| 5073 | switch( pElem->outDir ){ |
| @@ -5097,11 +5098,11 @@ | |
| 5097 | ** You can make pikchr render the above exactly like PIC |
| 5098 | ** by deleting the following three lines. But I (drh) think |
| 5099 | ** it works better with those lines in place. |
| 5100 | */ |
| 5101 | if( p->list && p->list->n ){ |
| 5102 | pik_elem_set_exit(p, p->list->a[p->list->n-1], eDir); |
| 5103 | } |
| 5104 | } |
| 5105 | |
| 5106 | /* Move all coordinates contained within an element (and within its |
| 5107 | ** substructure) by dx, dy |
| @@ -5247,11 +5248,11 @@ | |
| 5247 | |
| 5248 | /* |
| 5249 | ** If the current path information came from a "same" or "same as" |
| 5250 | ** reset it. |
| 5251 | */ |
| 5252 | static void pik_reset_samepath(Pik *p, PElem *pElem){ |
| 5253 | if( p->samePath ){ |
| 5254 | p->samePath = 0; |
| 5255 | p->nTPath = 1; |
| 5256 | } |
| 5257 | } |
| @@ -5277,11 +5278,11 @@ | |
| 5277 | |
| 5278 | /* Advance to the next entry in p->aTPath. Return its index. |
| 5279 | */ |
| 5280 | static int pik_next_rpath(Pik *p, PToken *pErr){ |
| 5281 | int n = p->nTPath - 1; |
| 5282 | if( n+1>=count(p->aTPath) ){ |
| 5283 | pik_error(0, pErr, "too many path elements"); |
| 5284 | return n; |
| 5285 | } |
| 5286 | n++; |
| 5287 | p->nTPath++; |
| @@ -5299,16 +5300,16 @@ | |
| 5299 | int dir; |
| 5300 | if( !pElem->type->isLine ){ |
| 5301 | if( pDir ){ |
| 5302 | pik_error(p, pDir, "use with line-oriented objects only"); |
| 5303 | }else{ |
| 5304 | PToken x = pik_next_semantic_token(p, &pElem->errTok); |
| 5305 | pik_error(p, &x, "syntax error"); |
| 5306 | } |
| 5307 | return; |
| 5308 | } |
| 5309 | pik_reset_samepath(p, pElem); |
| 5310 | n = p->nTPath - 1; |
| 5311 | if( p->thenFlag || p->mTPath==3 || n==0 ){ |
| 5312 | n = pik_next_rpath(p, pDir); |
| 5313 | p->thenFlag = 0; |
| 5314 | } |
| @@ -5357,11 +5358,11 @@ | |
| 5357 | PNum rDist = pDist->rAbs + pik_value(p,"linewid",7,0)*pDist->rRel; |
| 5358 | if( !pElem->type->isLine ){ |
| 5359 | pik_error(p, pErr, "use with line-oriented objects only"); |
| 5360 | return; |
| 5361 | } |
| 5362 | pik_reset_samepath(p, pElem); |
| 5363 | do{ |
| 5364 | n = pik_next_rpath(p, pErr); |
| 5365 | }while( n<1 ); |
| 5366 | if( pHeading ){ |
| 5367 | if( rHdg<0.0 || rHdg>360.0 ){ |
| @@ -5403,11 +5404,11 @@ | |
| 5403 | int n; |
| 5404 | if( !pElem->type->isLine ){ |
| 5405 | pik_error(p, pDir, "use with line-oriented objects only"); |
| 5406 | return; |
| 5407 | } |
| 5408 | pik_reset_samepath(p, pElem); |
| 5409 | n = p->nTPath - 1; |
| 5410 | if( p->thenFlag || p->mTPath==3 || n==0 ){ |
| 5411 | n = pik_next_rpath(p, pDir); |
| 5412 | p->thenFlag = 0; |
| 5413 | } |
| @@ -5515,11 +5516,11 @@ | |
| 5515 | if( pElem->mProp & A_AT ){ |
| 5516 | pik_error(p, pErrTok, "location fixed by prior \"at\""); |
| 5517 | return; |
| 5518 | } |
| 5519 | pElem->mProp |= A_AT; |
| 5520 | pElem->eWith = pEdge ? boxTranslateEndPoint(pElem,pEdge->eEdge) : CP_C; |
| 5521 | pElem->with = *pAt; |
| 5522 | } |
| 5523 | |
| 5524 | /* |
| 5525 | ** Try to add a text attribute to an element |
| @@ -5536,11 +5537,11 @@ | |
| 5536 | pT->eCode = iPos; |
| 5537 | } |
| 5538 | |
| 5539 | /* Merge "text-position" flags |
| 5540 | */ |
| 5541 | static int pik_text_position(Pik *p, int iPrev, PToken *pFlag){ |
| 5542 | int iRes = iPrev; |
| 5543 | switch( pFlag->eType ){ |
| 5544 | case T_LJUST: iRes = (iRes&~TP_JMASK) | TP_LJUST; break; |
| 5545 | case T_RJUST: iRes = (iRes&~TP_JMASK) | TP_RJUST; break; |
| 5546 | case T_ABOVE: iRes = (iRes&~TP_VMASK) | TP_ABOVE; break; |
| @@ -5610,11 +5611,11 @@ | |
| 5610 | if( pElem->type->xFit==0 ) return; |
| 5611 | if( (pElem->mProp & A_HEIGHT)==0 ){ |
| 5612 | int hasCenter = 0; |
| 5613 | int hasSingleStack = 0; |
| 5614 | int hasDoubleStack = 0; |
| 5615 | pik_txt_vertical_layout(p, pElem); |
| 5616 | for(i=0; i<pElem->nTxt; i++){ |
| 5617 | if( pElem->aTxt[i].eCode & TP_CENTER ){ |
| 5618 | hasCenter = 1; |
| 5619 | }else if( pElem->aTxt[i].eCode & (TP_ABOVE2|TP_BELOW2) ){ |
| 5620 | hasDoubleStack = 1; |
| @@ -5736,11 +5737,12 @@ | |
| 5736 | int first, last, mid, c = 0; |
| 5737 | first = 0; |
| 5738 | last = count(aColor)-1; |
| 5739 | while( first<=last ){ |
| 5740 | const char *zClr; |
| 5741 | int c1, c2, i; |
| 5742 | mid = (first+last)/2; |
| 5743 | zClr = aColor[mid].zName; |
| 5744 | for(i=0; i<pId->n; i++){ |
| 5745 | c1 = zClr[i]&0x7f; |
| 5746 | if( isupper(c1) ) c1 = tolower(c1); |
| @@ -5970,11 +5972,11 @@ | |
| 5970 | } |
| 5971 | } |
| 5972 | |
| 5973 | /* Do a linear interpolation of two positions. |
| 5974 | */ |
| 5975 | static PPoint pik_position_between(Pik *p, PNum x, PPoint p1, PPoint p2){ |
| 5976 | PPoint out; |
| 5977 | if( x<0.0 ) x = 0.0; |
| 5978 | if( x>1.0 ) x = 1.0; |
| 5979 | out.x = p2.x*x + p1.x*(1.0 - x); |
| 5980 | out.y = p2.y*x + p1.y*(1.0 - x); |
| @@ -5984,21 +5986,21 @@ | |
| 5984 | /* Compute the position that is dist away from pt at an heading angle of r |
| 5985 | ** |
| 5986 | ** The angle is a compass heading in degrees. North is 0 (or 360). |
| 5987 | ** East is 90. South is 180. West is 270. And so forth. |
| 5988 | */ |
| 5989 | static PPoint pik_position_at_angle(Pik *p, PNum dist, PNum r, PPoint pt){ |
| 5990 | r *= 0.017453292519943295769; /* degrees to radians */ |
| 5991 | pt.x += dist*sin(r); |
| 5992 | pt.y += dist*cos(r); |
| 5993 | return pt; |
| 5994 | } |
| 5995 | |
| 5996 | /* Compute the position that is dist away at a compass point |
| 5997 | */ |
| 5998 | static PPoint pik_position_at_hdg(Pik *p, PNum dist, PToken *pD, PPoint pt){ |
| 5999 | return pik_position_at_angle(p, dist, pik_hdg_angle[pD->eEdge], pt); |
| 6000 | } |
| 6001 | |
| 6002 | /* Return the coordinates for the n-th vertex of a line. |
| 6003 | */ |
| 6004 | static PPoint pik_nth_vertex(Pik *p, PToken *pNth, PToken *pErr, PElem *pObj){ |
| @@ -6017,11 +6019,11 @@ | |
| 6017 | return pObj->aPath[n-1]; |
| 6018 | } |
| 6019 | |
| 6020 | /* Return the value of a property of an object. |
| 6021 | */ |
| 6022 | static PNum pik_property_of(Pik *p, PElem *pElem, PToken *pProp){ |
| 6023 | PNum v = 0.0; |
| 6024 | switch( pProp->eType ){ |
| 6025 | case T_HEIGHT: v = pElem->h; break; |
| 6026 | case T_WIDTH: v = pElem->w; break; |
| 6027 | case T_RADIUS: v = pElem->rad; break; |
| @@ -6174,16 +6176,15 @@ | |
| 6174 | */ |
| 6175 | if( pElem->type->isLine ){ |
| 6176 | pElem->aPath = malloc( sizeof(PPoint)*p->nTPath ); |
| 6177 | if( pElem->aPath==0 ){ |
| 6178 | pik_error(p, 0, 0); |
| 6179 | pElem->nPath = 0; |
| 6180 | }else{ |
| 6181 | pElem->nPath = p->nTPath; |
| 6182 | for(i=0; i<p->nTPath; i++){ |
| 6183 | pElem->aPath[i] = p->aTPath[i]; |
| 6184 | pik_bbox_add_xy(&pElem->bbox, pElem->aPath[i].x, pElem->aPath[i].y); |
| 6185 | } |
| 6186 | } |
| 6187 | |
| 6188 | /* "chop" processing: |
| 6189 | ** If the line goes to the center of an object with an |
| @@ -6193,15 +6194,18 @@ | |
| 6193 | int n = pElem->nPath; |
| 6194 | pik_autochop(p, &pElem->aPath[n-2], &pElem->aPath[n-1]); |
| 6195 | pik_autochop(p, &pElem->aPath[1], &pElem->aPath[0]); |
| 6196 | } |
| 6197 | |
| 6198 | pElem->ptEnter = p->aTPath[0]; |
| 6199 | pElem->ptExit = p->aTPath[p->nTPath-1]; |
| 6200 | |
| 6201 | /* Compute the center of the line based on the bounding box over |
| 6202 | ** the vertexes */ |
| 6203 | pElem->ptAt.x = (pElem->bbox.ne.x + pElem->bbox.sw.x)/2.0; |
| 6204 | pElem->ptAt.y = (pElem->bbox.ne.y + pElem->bbox.sw.y)/2.0; |
| 6205 | |
| 6206 | /* Reset the width and height of the object to be the width and height |
| 6207 | ** of the bounding box over vertexes */ |
| @@ -6210,11 +6214,11 @@ | |
| 6210 | |
| 6211 | /* If this is a polygon (if it has the "close" attribute), then |
| 6212 | ** adjust the exit point */ |
| 6213 | if( pElem->bClose ){ |
| 6214 | /* "closed" lines work like block objects */ |
| 6215 | pik_elem_set_exit(p, pElem, pElem->inDir); |
| 6216 | }else{ |
| 6217 | /* For an open line, the "center" is half way between |
| 6218 | ** the .start and the .end */ |
| 6219 | } |
| 6220 | }else{ |
| @@ -6778,11 +6782,11 @@ | |
| 6778 | /* This is not an exp */ |
| 6779 | i -= 2; |
| 6780 | }else{ |
| 6781 | i++; |
| 6782 | isInt = 0; |
| 6783 | while( (c = z[i])>=0 && c<='9' ){ i++; } |
| 6784 | } |
| 6785 | } |
| 6786 | c2 = c ? z[i+1] : 0; |
| 6787 | if( isInt ){ |
| 6788 | if( (c=='t' && c2=='h') |
| @@ -6837,11 +6841,11 @@ | |
| 6837 | |
| 6838 | /* |
| 6839 | ** Return a pointer to the next non-whitespace token after pThis. |
| 6840 | ** This is used to help form error messages. |
| 6841 | */ |
| 6842 | static PToken pik_next_semantic_token(Pik *p, PToken *pThis){ |
| 6843 | PToken x; |
| 6844 | int sz; |
| 6845 | int i = pThis->n; |
| 6846 | memset(&x, 0, sizeof(x)); |
| 6847 | x.z = pThis->z; |
| @@ -7055,6 +7059,6 @@ | |
| 7055 | printf("</body></html>\n"); |
| 7056 | return 0; |
| 7057 | } |
| 7058 | #endif /* PIKCHR_SHELL */ |
| 7059 | |
| 7060 | #line 7085 "pikchr.c" |
| 7061 |
| --- src/pikchr.c | |
| +++ src/pikchr.c | |
| @@ -124,10 +124,14 @@ | |
| 124 | #include <assert.h> |
| 125 | #define count(X) (sizeof(X)/sizeof(X[0])) |
| 126 | #ifndef M_PI |
| 127 | # define M_PI 3.1415926535897932385 |
| 128 | #endif |
| 129 | |
| 130 | /* Tag intentionally unused parameters with this macro to prevent |
| 131 | ** compiler warnings with -Wextra */ |
| 132 | #define UNUSED_PARAMETER(X) (void)(X) |
| 133 | |
| 134 | typedef struct Pik Pik; /* Complete parsing context */ |
| 135 | typedef struct PToken PToken; /* A single token */ |
| 136 | typedef struct PElem PElem; /* A single diagram object or "element" */ |
| 137 | typedef struct PEList PEList; /* A list of elements */ |
| @@ -397,11 +401,11 @@ | |
| 401 | static void pik_append_arc(Pik*,PNum,PNum,PNum,PNum); |
| 402 | static void pik_append_clr(Pik*,const char*,PNum,const char*); |
| 403 | static void pik_append_style(Pik*,PElem*); |
| 404 | static void pik_append_txt(Pik*,PElem*, PBox*); |
| 405 | static void pik_draw_arrowhead(Pik*,PPoint*pFrom,PPoint*pTo,PElem*); |
| 406 | static void pik_chop(PPoint*pFrom,PPoint*pTo,PNum); |
| 407 | static void pik_error(Pik*,PToken*,const char*); |
| 408 | static void pik_elist_free(Pik*,PEList*); |
| 409 | static void pik_elem_free(Pik*,PElem*); |
| 410 | static void pik_render(Pik*,PEList*); |
| 411 | static PEList *pik_elist_append(Pik*,PEList*,PElem*); |
| @@ -410,11 +414,11 @@ | |
| 414 | static void pik_elem_setname(Pik*,PElem*,PToken*); |
| 415 | static void pik_set_var(Pik*,PToken*,PNum,PToken*); |
| 416 | static PNum pik_value(Pik*,const char*,int,int*); |
| 417 | static PNum pik_lookup_color(Pik*,PToken*); |
| 418 | static PNum pik_get_var(Pik*,PToken*); |
| 419 | static PNum pik_atof(PToken*); |
| 420 | static void pik_after_adding_attributes(Pik*,PElem*); |
| 421 | static void pik_elem_move(PElem*,PNum dx, PNum dy); |
| 422 | static void pik_elist_move(PEList*,PNum dx, PNum dy); |
| 423 | static void pik_set_numprop(Pik*,PToken*,PRel*); |
| 424 | static void pik_set_clrprop(Pik*,PToken*,PNum); |
| @@ -437,26 +441,26 @@ | |
| 441 | static void pik_bbox_add_xy(PBox*,PNum,PNum); |
| 442 | static void pik_bbox_addellipse(PBox*,PNum x,PNum y,PNum rx,PNum ry); |
| 443 | static void pik_add_txt(Pik*,PToken*,int); |
| 444 | static int pik_text_length(const PToken *pToken); |
| 445 | static void pik_size_to_fit(Pik*,PToken*); |
| 446 | static int pik_text_position(int,PToken*); |
| 447 | static PNum pik_property_of(PElem*,PToken*); |
| 448 | static PNum pik_func(Pik*,PToken*,PNum,PNum); |
| 449 | static PPoint pik_position_between(PNum x, PPoint p1, PPoint p2); |
| 450 | static PPoint pik_position_at_angle(PNum dist, PNum r, PPoint pt); |
| 451 | static PPoint pik_position_at_hdg(PNum dist, PToken *pD, PPoint pt); |
| 452 | static void pik_same(Pik *p, PElem*, PToken*); |
| 453 | static PPoint pik_nth_vertex(Pik *p, PToken *pNth, PToken *pErr, PElem *pElem); |
| 454 | static PToken pik_next_semantic_token(PToken *pThis); |
| 455 | static void pik_compute_layout_settings(Pik*); |
| 456 | static void pik_behind(Pik*,PElem*); |
| 457 | static PElem *pik_assert(Pik*,PNum,PToken*,PNum); |
| 458 | static PElem *pik_place_assert(Pik*,PPoint*,PToken*,PPoint*); |
| 459 | |
| 460 | |
| 461 | #line 487 "pikchr.c" |
| 462 | /**************** End of %include directives **********************************/ |
| 463 | /* These constants specify the various numeric values for terminal symbols. |
| 464 | ***************** Begin token definitions *************************************/ |
| 465 | #ifndef T_ID |
| 466 | #define T_ID 1 |
| @@ -1628,22 +1632,22 @@ | |
| 1632 | ** inside the C code. |
| 1633 | */ |
| 1634 | /********* Begin destructor definitions ***************************************/ |
| 1635 | case 94: /* element_list */ |
| 1636 | { |
| 1637 | #line 476 "pikchr.y" |
| 1638 | pik_elist_free(p,(yypminor->yy72)); |
| 1639 | #line 1664 "pikchr.c" |
| 1640 | } |
| 1641 | break; |
| 1642 | case 95: /* element */ |
| 1643 | case 96: /* unnamed_element */ |
| 1644 | case 97: /* basetype */ |
| 1645 | { |
| 1646 | #line 478 "pikchr.y" |
| 1647 | pik_elem_free(p,(yypminor->yy254)); |
| 1648 | #line 1673 "pikchr.c" |
| 1649 | } |
| 1650 | break; |
| 1651 | /********* End destructor definitions *****************************************/ |
| 1652 | default: break; /* If no destructor action specified: do nothing */ |
| 1653 | } |
| @@ -1806,11 +1810,11 @@ | |
| 1810 | } |
| 1811 | } |
| 1812 | #endif /* YYWILDCARD */ |
| 1813 | return yy_default[stateno]; |
| 1814 | }else{ |
| 1815 | assert( i>=0 && i<(int)(sizeof(yy_action)/sizeof(yy_action[0])) ); |
| 1816 | return yy_action[i]; |
| 1817 | } |
| 1818 | }while(1); |
| 1819 | } |
| 1820 | |
| @@ -1857,14 +1861,14 @@ | |
| 1861 | #endif |
| 1862 | while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser); |
| 1863 | /* Here code is inserted which will execute if the parser |
| 1864 | ** stack every overflows */ |
| 1865 | /******** Begin %stack_overflow code ******************************************/ |
| 1866 | #line 510 "pikchr.y" |
| 1867 | |
| 1868 | pik_error(p, 0, "parser stack overflow"); |
| 1869 | #line 1894 "pikchr.c" |
| 1870 | /******** End %stack_overflow code ********************************************/ |
| 1871 | pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */ |
| 1872 | pik_parserCTX_STORE |
| 1873 | } |
| 1874 | |
| @@ -2329,593 +2333,593 @@ | |
| 2333 | ** break; |
| 2334 | */ |
| 2335 | /********** Begin reduce actions **********************************************/ |
| 2336 | YYMINORTYPE yylhsminor; |
| 2337 | case 0: /* document ::= element_list */ |
| 2338 | #line 514 "pikchr.y" |
| 2339 | {pik_render(p,yymsp[0].minor.yy72);} |
| 2340 | #line 2365 "pikchr.c" |
| 2341 | break; |
| 2342 | case 1: /* element_list ::= element */ |
| 2343 | #line 517 "pikchr.y" |
| 2344 | { yylhsminor.yy72 = pik_elist_append(p,0,yymsp[0].minor.yy254); } |
| 2345 | #line 2370 "pikchr.c" |
| 2346 | yymsp[0].minor.yy72 = yylhsminor.yy72; |
| 2347 | break; |
| 2348 | case 2: /* element_list ::= element_list EOL element */ |
| 2349 | #line 519 "pikchr.y" |
| 2350 | { yylhsminor.yy72 = pik_elist_append(p,yymsp[-2].minor.yy72,yymsp[0].minor.yy254); } |
| 2351 | #line 2376 "pikchr.c" |
| 2352 | yymsp[-2].minor.yy72 = yylhsminor.yy72; |
| 2353 | break; |
| 2354 | case 3: /* element ::= */ |
| 2355 | #line 522 "pikchr.y" |
| 2356 | { yymsp[1].minor.yy254 = 0; } |
| 2357 | #line 2382 "pikchr.c" |
| 2358 | break; |
| 2359 | case 4: /* element ::= direction */ |
| 2360 | #line 523 "pikchr.y" |
| 2361 | { pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy254=0; } |
| 2362 | #line 2387 "pikchr.c" |
| 2363 | yymsp[0].minor.yy254 = yylhsminor.yy254; |
| 2364 | break; |
| 2365 | case 5: /* element ::= lvalue ASSIGN rvalue */ |
| 2366 | #line 524 "pikchr.y" |
| 2367 | {pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy73,&yymsp[-1].minor.yy0); yylhsminor.yy254=0;} |
| 2368 | #line 2393 "pikchr.c" |
| 2369 | yymsp[-2].minor.yy254 = yylhsminor.yy254; |
| 2370 | break; |
| 2371 | case 6: /* element ::= PLACENAME COLON unnamed_element */ |
| 2372 | #line 526 "pikchr.y" |
| 2373 | { yylhsminor.yy254 = yymsp[0].minor.yy254; pik_elem_setname(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0); } |
| 2374 | #line 2399 "pikchr.c" |
| 2375 | yymsp[-2].minor.yy254 = yylhsminor.yy254; |
| 2376 | break; |
| 2377 | case 7: /* element ::= PLACENAME COLON position */ |
| 2378 | #line 528 "pikchr.y" |
| 2379 | { yylhsminor.yy254 = pik_elem_new(p,0,0,0); |
| 2380 | if(yylhsminor.yy254){ yylhsminor.yy254->ptAt = yymsp[0].minor.yy139; pik_elem_setname(p,yylhsminor.yy254,&yymsp[-2].minor.yy0); }} |
| 2381 | #line 2406 "pikchr.c" |
| 2382 | yymsp[-2].minor.yy254 = yylhsminor.yy254; |
| 2383 | break; |
| 2384 | case 8: /* element ::= unnamed_element */ |
| 2385 | #line 530 "pikchr.y" |
| 2386 | {yylhsminor.yy254 = yymsp[0].minor.yy254;} |
| 2387 | #line 2412 "pikchr.c" |
| 2388 | yymsp[0].minor.yy254 = yylhsminor.yy254; |
| 2389 | break; |
| 2390 | case 9: /* element ::= print prlist */ |
| 2391 | #line 531 "pikchr.y" |
| 2392 | {pik_append(p,"<br>\n",5); yymsp[-1].minor.yy254=0;} |
| 2393 | #line 2418 "pikchr.c" |
| 2394 | break; |
| 2395 | case 10: /* element ::= ASSERT LP expr EQ expr RP */ |
| 2396 | #line 536 "pikchr.y" |
| 2397 | {yymsp[-5].minor.yy254=pik_assert(p,yymsp[-3].minor.yy73,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy73);} |
| 2398 | #line 2423 "pikchr.c" |
| 2399 | break; |
| 2400 | case 11: /* element ::= ASSERT LP place EQ place RP */ |
| 2401 | #line 538 "pikchr.y" |
| 2402 | {yymsp[-5].minor.yy254=pik_place_assert(p,&yymsp[-3].minor.yy139,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy139);} |
| 2403 | #line 2428 "pikchr.c" |
| 2404 | break; |
| 2405 | case 12: /* rvalue ::= PLACENAME */ |
| 2406 | #line 549 "pikchr.y" |
| 2407 | {yylhsminor.yy73 = pik_lookup_color(p,&yymsp[0].minor.yy0);} |
| 2408 | #line 2433 "pikchr.c" |
| 2409 | yymsp[0].minor.yy73 = yylhsminor.yy73; |
| 2410 | break; |
| 2411 | case 13: /* pritem ::= FILL */ |
| 2412 | case 14: /* pritem ::= COLOR */ yytestcase(yyruleno==14); |
| 2413 | case 15: /* pritem ::= THICKNESS */ yytestcase(yyruleno==15); |
| 2414 | #line 554 "pikchr.y" |
| 2415 | {pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));} |
| 2416 | #line 2441 "pikchr.c" |
| 2417 | break; |
| 2418 | case 16: /* pritem ::= rvalue */ |
| 2419 | #line 557 "pikchr.y" |
| 2420 | {pik_append_num(p,"",yymsp[0].minor.yy73);} |
| 2421 | #line 2446 "pikchr.c" |
| 2422 | break; |
| 2423 | case 17: /* pritem ::= STRING */ |
| 2424 | #line 558 "pikchr.y" |
| 2425 | {pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);} |
| 2426 | #line 2451 "pikchr.c" |
| 2427 | break; |
| 2428 | case 18: /* prsep ::= COMMA */ |
| 2429 | #line 559 "pikchr.y" |
| 2430 | {pik_append(p, " ", 1);} |
| 2431 | #line 2456 "pikchr.c" |
| 2432 | break; |
| 2433 | case 19: /* unnamed_element ::= basetype attribute_list */ |
| 2434 | #line 562 "pikchr.y" |
| 2435 | {yylhsminor.yy254 = yymsp[-1].minor.yy254; pik_after_adding_attributes(p,yylhsminor.yy254);} |
| 2436 | #line 2461 "pikchr.c" |
| 2437 | yymsp[-1].minor.yy254 = yylhsminor.yy254; |
| 2438 | break; |
| 2439 | case 20: /* basetype ::= CLASSNAME */ |
| 2440 | #line 564 "pikchr.y" |
| 2441 | {yylhsminor.yy254 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); } |
| 2442 | #line 2467 "pikchr.c" |
| 2443 | yymsp[0].minor.yy254 = yylhsminor.yy254; |
| 2444 | break; |
| 2445 | case 21: /* basetype ::= STRING textposition */ |
| 2446 | #line 566 "pikchr.y" |
| 2447 | {yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy74; yylhsminor.yy254 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); } |
| 2448 | #line 2473 "pikchr.c" |
| 2449 | yymsp[-1].minor.yy254 = yylhsminor.yy254; |
| 2450 | break; |
| 2451 | case 22: /* basetype ::= LB savelist element_list RB */ |
| 2452 | #line 568 "pikchr.y" |
| 2453 | { p->list = yymsp[-2].minor.yy72; yymsp[-3].minor.yy254 = pik_elem_new(p,0,0,yymsp[-1].minor.yy72); if(yymsp[-3].minor.yy254) yymsp[-3].minor.yy254->errTok = yymsp[0].minor.yy0; } |
| 2454 | #line 2479 "pikchr.c" |
| 2455 | break; |
| 2456 | case 23: /* savelist ::= */ |
| 2457 | #line 573 "pikchr.y" |
| 2458 | {yymsp[1].minor.yy72 = p->list; p->list = 0;} |
| 2459 | #line 2484 "pikchr.c" |
| 2460 | break; |
| 2461 | case 24: /* relexpr ::= expr */ |
| 2462 | #line 580 "pikchr.y" |
| 2463 | {yylhsminor.yy60.rAbs = yymsp[0].minor.yy73; yylhsminor.yy60.rRel = 0;} |
| 2464 | #line 2489 "pikchr.c" |
| 2465 | yymsp[0].minor.yy60 = yylhsminor.yy60; |
| 2466 | break; |
| 2467 | case 25: /* relexpr ::= expr PERCENT */ |
| 2468 | #line 581 "pikchr.y" |
| 2469 | {yylhsminor.yy60.rAbs = 0; yylhsminor.yy60.rRel = yymsp[-1].minor.yy73/100;} |
| 2470 | #line 2495 "pikchr.c" |
| 2471 | yymsp[-1].minor.yy60 = yylhsminor.yy60; |
| 2472 | break; |
| 2473 | case 26: /* optrelexpr ::= */ |
| 2474 | #line 583 "pikchr.y" |
| 2475 | {yymsp[1].minor.yy60.rAbs = 0; yymsp[1].minor.yy60.rRel = 1.0;} |
| 2476 | #line 2501 "pikchr.c" |
| 2477 | break; |
| 2478 | case 27: /* attribute_list ::= relexpr alist */ |
| 2479 | #line 585 "pikchr.y" |
| 2480 | {pik_add_direction(p,0,&yymsp[-1].minor.yy60);} |
| 2481 | #line 2506 "pikchr.c" |
| 2482 | break; |
| 2483 | case 28: /* attribute ::= numproperty relexpr */ |
| 2484 | #line 589 "pikchr.y" |
| 2485 | { pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy60); } |
| 2486 | #line 2511 "pikchr.c" |
| 2487 | break; |
| 2488 | case 29: /* attribute ::= dashproperty expr */ |
| 2489 | #line 590 "pikchr.y" |
| 2490 | { pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy73); } |
| 2491 | #line 2516 "pikchr.c" |
| 2492 | break; |
| 2493 | case 30: /* attribute ::= dashproperty */ |
| 2494 | #line 591 "pikchr.y" |
| 2495 | { pik_set_dashed(p,&yymsp[0].minor.yy0,0); } |
| 2496 | #line 2521 "pikchr.c" |
| 2497 | break; |
| 2498 | case 31: /* attribute ::= colorproperty rvalue */ |
| 2499 | #line 592 "pikchr.y" |
| 2500 | { pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy73); } |
| 2501 | #line 2526 "pikchr.c" |
| 2502 | break; |
| 2503 | case 32: /* attribute ::= go direction optrelexpr */ |
| 2504 | #line 593 "pikchr.y" |
| 2505 | { pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy60);} |
| 2506 | #line 2531 "pikchr.c" |
| 2507 | break; |
| 2508 | case 33: /* attribute ::= go direction even position */ |
| 2509 | #line 594 "pikchr.y" |
| 2510 | {pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy139);} |
| 2511 | #line 2536 "pikchr.c" |
| 2512 | break; |
| 2513 | case 34: /* attribute ::= CLOSE */ |
| 2514 | #line 595 "pikchr.y" |
| 2515 | { pik_close_path(p,&yymsp[0].minor.yy0); } |
| 2516 | #line 2541 "pikchr.c" |
| 2517 | break; |
| 2518 | case 35: /* attribute ::= CHOP */ |
| 2519 | #line 596 "pikchr.y" |
| 2520 | { p->cur->bChop = 1; } |
| 2521 | #line 2546 "pikchr.c" |
| 2522 | break; |
| 2523 | case 36: /* attribute ::= FROM position */ |
| 2524 | #line 597 "pikchr.y" |
| 2525 | { pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy139); } |
| 2526 | #line 2551 "pikchr.c" |
| 2527 | break; |
| 2528 | case 37: /* attribute ::= TO position */ |
| 2529 | #line 598 "pikchr.y" |
| 2530 | { pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy139); } |
| 2531 | #line 2556 "pikchr.c" |
| 2532 | break; |
| 2533 | case 38: /* attribute ::= THEN */ |
| 2534 | #line 599 "pikchr.y" |
| 2535 | { pik_then(p, &yymsp[0].minor.yy0, p->cur); } |
| 2536 | #line 2561 "pikchr.c" |
| 2537 | break; |
| 2538 | case 39: /* attribute ::= THEN optrelexpr HEADING expr */ |
| 2539 | case 41: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==41); |
| 2540 | #line 601 "pikchr.y" |
| 2541 | {pik_move_hdg(p,&yymsp[-2].minor.yy60,&yymsp[-1].minor.yy0,yymsp[0].minor.yy73,0,&yymsp[-3].minor.yy0);} |
| 2542 | #line 2567 "pikchr.c" |
| 2543 | break; |
| 2544 | case 40: /* attribute ::= THEN optrelexpr EDGEPT */ |
| 2545 | case 42: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==42); |
| 2546 | #line 602 "pikchr.y" |
| 2547 | {pik_move_hdg(p,&yymsp[-1].minor.yy60,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);} |
| 2548 | #line 2573 "pikchr.c" |
| 2549 | break; |
| 2550 | case 43: /* attribute ::= AT position */ |
| 2551 | #line 607 "pikchr.y" |
| 2552 | { pik_set_at(p,0,&yymsp[0].minor.yy139,&yymsp[-1].minor.yy0); } |
| 2553 | #line 2578 "pikchr.c" |
| 2554 | break; |
| 2555 | case 44: /* attribute ::= SAME */ |
| 2556 | #line 609 "pikchr.y" |
| 2557 | {pik_same(p,0,&yymsp[0].minor.yy0);} |
| 2558 | #line 2583 "pikchr.c" |
| 2559 | break; |
| 2560 | case 45: /* attribute ::= SAME AS object */ |
| 2561 | #line 610 "pikchr.y" |
| 2562 | {pik_same(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0);} |
| 2563 | #line 2588 "pikchr.c" |
| 2564 | break; |
| 2565 | case 46: /* attribute ::= STRING textposition */ |
| 2566 | #line 611 "pikchr.y" |
| 2567 | {pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy74);} |
| 2568 | #line 2593 "pikchr.c" |
| 2569 | break; |
| 2570 | case 47: /* attribute ::= FIT */ |
| 2571 | #line 612 "pikchr.y" |
| 2572 | {pik_size_to_fit(p,&yymsp[0].minor.yy0); } |
| 2573 | #line 2598 "pikchr.c" |
| 2574 | break; |
| 2575 | case 48: /* attribute ::= BEHIND object */ |
| 2576 | #line 613 "pikchr.y" |
| 2577 | {pik_behind(p,yymsp[0].minor.yy254);} |
| 2578 | #line 2603 "pikchr.c" |
| 2579 | break; |
| 2580 | case 49: /* withclause ::= DOT_E edge AT position */ |
| 2581 | case 50: /* withclause ::= edge AT position */ yytestcase(yyruleno==50); |
| 2582 | #line 621 "pikchr.y" |
| 2583 | { pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy139,&yymsp[-1].minor.yy0); } |
| 2584 | #line 2609 "pikchr.c" |
| 2585 | break; |
| 2586 | case 51: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */ |
| 2587 | #line 625 "pikchr.y" |
| 2588 | {yylhsminor.yy0 = yymsp[0].minor.yy0;} |
| 2589 | #line 2614 "pikchr.c" |
| 2590 | yymsp[0].minor.yy0 = yylhsminor.yy0; |
| 2591 | break; |
| 2592 | case 52: /* boolproperty ::= CW */ |
| 2593 | #line 636 "pikchr.y" |
| 2594 | {p->cur->cw = 1;} |
| 2595 | #line 2620 "pikchr.c" |
| 2596 | break; |
| 2597 | case 53: /* boolproperty ::= CCW */ |
| 2598 | #line 637 "pikchr.y" |
| 2599 | {p->cur->cw = 0;} |
| 2600 | #line 2625 "pikchr.c" |
| 2601 | break; |
| 2602 | case 54: /* boolproperty ::= LARROW */ |
| 2603 | #line 638 "pikchr.y" |
| 2604 | {p->cur->larrow=1; p->cur->rarrow=0; } |
| 2605 | #line 2630 "pikchr.c" |
| 2606 | break; |
| 2607 | case 55: /* boolproperty ::= RARROW */ |
| 2608 | #line 639 "pikchr.y" |
| 2609 | {p->cur->larrow=0; p->cur->rarrow=1; } |
| 2610 | #line 2635 "pikchr.c" |
| 2611 | break; |
| 2612 | case 56: /* boolproperty ::= LRARROW */ |
| 2613 | #line 640 "pikchr.y" |
| 2614 | {p->cur->larrow=1; p->cur->rarrow=1; } |
| 2615 | #line 2640 "pikchr.c" |
| 2616 | break; |
| 2617 | case 57: /* boolproperty ::= INVIS */ |
| 2618 | #line 641 "pikchr.y" |
| 2619 | {p->cur->sw = 0.0;} |
| 2620 | #line 2645 "pikchr.c" |
| 2621 | break; |
| 2622 | case 58: /* boolproperty ::= THICK */ |
| 2623 | #line 642 "pikchr.y" |
| 2624 | {p->cur->sw *= 1.5;} |
| 2625 | #line 2650 "pikchr.c" |
| 2626 | break; |
| 2627 | case 59: /* boolproperty ::= THIN */ |
| 2628 | #line 643 "pikchr.y" |
| 2629 | {p->cur->sw *= 0.67;} |
| 2630 | #line 2655 "pikchr.c" |
| 2631 | break; |
| 2632 | case 60: /* textposition ::= */ |
| 2633 | #line 645 "pikchr.y" |
| 2634 | {yymsp[1].minor.yy74 = 0;} |
| 2635 | #line 2660 "pikchr.c" |
| 2636 | break; |
| 2637 | case 61: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */ |
| 2638 | #line 648 "pikchr.y" |
| 2639 | {yylhsminor.yy74 = pik_text_position(yymsp[-1].minor.yy74,&yymsp[0].minor.yy0);} |
| 2640 | #line 2665 "pikchr.c" |
| 2641 | yymsp[-1].minor.yy74 = yylhsminor.yy74; |
| 2642 | break; |
| 2643 | case 62: /* position ::= expr COMMA expr */ |
| 2644 | #line 651 "pikchr.y" |
| 2645 | {yylhsminor.yy139.x=yymsp[-2].minor.yy73; yylhsminor.yy139.y=yymsp[0].minor.yy73;} |
| 2646 | #line 2671 "pikchr.c" |
| 2647 | yymsp[-2].minor.yy139 = yylhsminor.yy139; |
| 2648 | break; |
| 2649 | case 63: /* position ::= place PLUS expr COMMA expr */ |
| 2650 | #line 653 "pikchr.y" |
| 2651 | {yylhsminor.yy139.x=yymsp[-4].minor.yy139.x+yymsp[-2].minor.yy73; yylhsminor.yy139.y=yymsp[-4].minor.yy139.y+yymsp[0].minor.yy73;} |
| 2652 | #line 2677 "pikchr.c" |
| 2653 | yymsp[-4].minor.yy139 = yylhsminor.yy139; |
| 2654 | break; |
| 2655 | case 64: /* position ::= place MINUS expr COMMA expr */ |
| 2656 | #line 654 "pikchr.y" |
| 2657 | {yylhsminor.yy139.x=yymsp[-4].minor.yy139.x-yymsp[-2].minor.yy73; yylhsminor.yy139.y=yymsp[-4].minor.yy139.y-yymsp[0].minor.yy73;} |
| 2658 | #line 2683 "pikchr.c" |
| 2659 | yymsp[-4].minor.yy139 = yylhsminor.yy139; |
| 2660 | break; |
| 2661 | case 65: /* position ::= place PLUS LP expr COMMA expr RP */ |
| 2662 | #line 656 "pikchr.y" |
| 2663 | {yylhsminor.yy139.x=yymsp[-6].minor.yy139.x+yymsp[-3].minor.yy73; yylhsminor.yy139.y=yymsp[-6].minor.yy139.y+yymsp[-1].minor.yy73;} |
| 2664 | #line 2689 "pikchr.c" |
| 2665 | yymsp[-6].minor.yy139 = yylhsminor.yy139; |
| 2666 | break; |
| 2667 | case 66: /* position ::= place MINUS LP expr COMMA expr RP */ |
| 2668 | #line 658 "pikchr.y" |
| 2669 | {yylhsminor.yy139.x=yymsp[-6].minor.yy139.x-yymsp[-3].minor.yy73; yylhsminor.yy139.y=yymsp[-6].minor.yy139.y-yymsp[-1].minor.yy73;} |
| 2670 | #line 2695 "pikchr.c" |
| 2671 | yymsp[-6].minor.yy139 = yylhsminor.yy139; |
| 2672 | break; |
| 2673 | case 67: /* position ::= LP position COMMA position RP */ |
| 2674 | #line 659 "pikchr.y" |
| 2675 | {yymsp[-4].minor.yy139.x=yymsp[-3].minor.yy139.x; yymsp[-4].minor.yy139.y=yymsp[-1].minor.yy139.y;} |
| 2676 | #line 2701 "pikchr.c" |
| 2677 | break; |
| 2678 | case 68: /* position ::= LP position RP */ |
| 2679 | #line 660 "pikchr.y" |
| 2680 | {yymsp[-2].minor.yy139=yymsp[-1].minor.yy139;} |
| 2681 | #line 2706 "pikchr.c" |
| 2682 | break; |
| 2683 | case 69: /* position ::= expr between position AND position */ |
| 2684 | #line 662 "pikchr.y" |
| 2685 | {yylhsminor.yy139 = pik_position_between(yymsp[-4].minor.yy73,yymsp[-2].minor.yy139,yymsp[0].minor.yy139);} |
| 2686 | #line 2711 "pikchr.c" |
| 2687 | yymsp[-4].minor.yy139 = yylhsminor.yy139; |
| 2688 | break; |
| 2689 | case 70: /* position ::= expr LT position COMMA position GT */ |
| 2690 | #line 664 "pikchr.y" |
| 2691 | {yylhsminor.yy139 = pik_position_between(yymsp[-5].minor.yy73,yymsp[-3].minor.yy139,yymsp[-1].minor.yy139);} |
| 2692 | #line 2717 "pikchr.c" |
| 2693 | yymsp[-5].minor.yy139 = yylhsminor.yy139; |
| 2694 | break; |
| 2695 | case 71: /* position ::= expr ABOVE position */ |
| 2696 | #line 665 "pikchr.y" |
| 2697 | {yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.y += yymsp[-2].minor.yy73;} |
| 2698 | #line 2723 "pikchr.c" |
| 2699 | yymsp[-2].minor.yy139 = yylhsminor.yy139; |
| 2700 | break; |
| 2701 | case 72: /* position ::= expr BELOW position */ |
| 2702 | #line 666 "pikchr.y" |
| 2703 | {yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.y -= yymsp[-2].minor.yy73;} |
| 2704 | #line 2729 "pikchr.c" |
| 2705 | yymsp[-2].minor.yy139 = yylhsminor.yy139; |
| 2706 | break; |
| 2707 | case 73: /* position ::= expr LEFT OF position */ |
| 2708 | #line 667 "pikchr.y" |
| 2709 | {yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.x -= yymsp[-3].minor.yy73;} |
| 2710 | #line 2735 "pikchr.c" |
| 2711 | yymsp[-3].minor.yy139 = yylhsminor.yy139; |
| 2712 | break; |
| 2713 | case 74: /* position ::= expr RIGHT OF position */ |
| 2714 | #line 668 "pikchr.y" |
| 2715 | {yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.x += yymsp[-3].minor.yy73;} |
| 2716 | #line 2741 "pikchr.c" |
| 2717 | yymsp[-3].minor.yy139 = yylhsminor.yy139; |
| 2718 | break; |
| 2719 | case 75: /* position ::= expr ON HEADING EDGEPT OF position */ |
| 2720 | #line 670 "pikchr.y" |
| 2721 | {yylhsminor.yy139 = pik_position_at_hdg(yymsp[-5].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);} |
| 2722 | #line 2747 "pikchr.c" |
| 2723 | yymsp[-5].minor.yy139 = yylhsminor.yy139; |
| 2724 | break; |
| 2725 | case 76: /* position ::= expr HEADING EDGEPT OF position */ |
| 2726 | #line 672 "pikchr.y" |
| 2727 | {yylhsminor.yy139 = pik_position_at_hdg(yymsp[-4].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);} |
| 2728 | #line 2753 "pikchr.c" |
| 2729 | yymsp[-4].minor.yy139 = yylhsminor.yy139; |
| 2730 | break; |
| 2731 | case 77: /* position ::= expr EDGEPT OF position */ |
| 2732 | #line 674 "pikchr.y" |
| 2733 | {yylhsminor.yy139 = pik_position_at_hdg(yymsp[-3].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);} |
| 2734 | #line 2759 "pikchr.c" |
| 2735 | yymsp[-3].minor.yy139 = yylhsminor.yy139; |
| 2736 | break; |
| 2737 | case 78: /* position ::= expr ON HEADING expr FROM position */ |
| 2738 | #line 676 "pikchr.y" |
| 2739 | {yylhsminor.yy139 = pik_position_at_angle(yymsp[-5].minor.yy73,yymsp[-2].minor.yy73,yymsp[0].minor.yy139);} |
| 2740 | #line 2765 "pikchr.c" |
| 2741 | yymsp[-5].minor.yy139 = yylhsminor.yy139; |
| 2742 | break; |
| 2743 | case 79: /* position ::= expr HEADING expr FROM position */ |
| 2744 | #line 678 "pikchr.y" |
| 2745 | {yylhsminor.yy139 = pik_position_at_angle(yymsp[-4].minor.yy73,yymsp[-2].minor.yy73,yymsp[0].minor.yy139);} |
| 2746 | #line 2771 "pikchr.c" |
| 2747 | yymsp[-4].minor.yy139 = yylhsminor.yy139; |
| 2748 | break; |
| 2749 | case 80: /* place ::= edge OF object */ |
| 2750 | #line 690 "pikchr.y" |
| 2751 | {yylhsminor.yy139 = pik_place_of_elem(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0);} |
| 2752 | #line 2777 "pikchr.c" |
| 2753 | yymsp[-2].minor.yy139 = yylhsminor.yy139; |
| 2754 | break; |
| 2755 | case 81: /* place2 ::= object */ |
| 2756 | #line 691 "pikchr.y" |
| 2757 | {yylhsminor.yy139 = pik_place_of_elem(p,yymsp[0].minor.yy254,0);} |
| 2758 | #line 2783 "pikchr.c" |
| 2759 | yymsp[0].minor.yy139 = yylhsminor.yy139; |
| 2760 | break; |
| 2761 | case 82: /* place2 ::= object DOT_E edge */ |
| 2762 | #line 692 "pikchr.y" |
| 2763 | {yylhsminor.yy139 = pik_place_of_elem(p,yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);} |
| 2764 | #line 2789 "pikchr.c" |
| 2765 | yymsp[-2].minor.yy139 = yylhsminor.yy139; |
| 2766 | break; |
| 2767 | case 83: /* place2 ::= NTH VERTEX OF object */ |
| 2768 | #line 693 "pikchr.y" |
| 2769 | {yylhsminor.yy139 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy254);} |
| 2770 | #line 2795 "pikchr.c" |
| 2771 | yymsp[-3].minor.yy139 = yylhsminor.yy139; |
| 2772 | break; |
| 2773 | case 84: /* object ::= nth */ |
| 2774 | #line 705 "pikchr.y" |
| 2775 | {yylhsminor.yy254 = pik_find_nth(p,0,&yymsp[0].minor.yy0);} |
| 2776 | #line 2801 "pikchr.c" |
| 2777 | yymsp[0].minor.yy254 = yylhsminor.yy254; |
| 2778 | break; |
| 2779 | case 85: /* object ::= nth OF|IN object */ |
| 2780 | #line 706 "pikchr.y" |
| 2781 | {yylhsminor.yy254 = pik_find_nth(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0);} |
| 2782 | #line 2807 "pikchr.c" |
| 2783 | yymsp[-2].minor.yy254 = yylhsminor.yy254; |
| 2784 | break; |
| 2785 | case 86: /* objectname ::= PLACENAME */ |
| 2786 | #line 708 "pikchr.y" |
| 2787 | {yylhsminor.yy254 = pik_find_byname(p,0,&yymsp[0].minor.yy0);} |
| 2788 | #line 2813 "pikchr.c" |
| 2789 | yymsp[0].minor.yy254 = yylhsminor.yy254; |
| 2790 | break; |
| 2791 | case 87: /* objectname ::= objectname DOT_U PLACENAME */ |
| 2792 | #line 710 "pikchr.y" |
| 2793 | {yylhsminor.yy254 = pik_find_byname(p,yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);} |
| 2794 | #line 2819 "pikchr.c" |
| 2795 | yymsp[-2].minor.yy254 = yylhsminor.yy254; |
| 2796 | break; |
| 2797 | case 88: /* nth ::= NTH CLASSNAME */ |
| 2798 | #line 712 "pikchr.y" |
| 2799 | {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); } |
| 2800 | #line 2825 "pikchr.c" |
| 2801 | yymsp[-1].minor.yy0 = yylhsminor.yy0; |
| 2802 | break; |
| 2803 | case 89: /* nth ::= NTH LAST CLASSNAME */ |
| 2804 | #line 713 "pikchr.y" |
| 2805 | {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); } |
| 2806 | #line 2831 "pikchr.c" |
| 2807 | yymsp[-2].minor.yy0 = yylhsminor.yy0; |
| 2808 | break; |
| 2809 | case 90: /* nth ::= LAST CLASSNAME */ |
| 2810 | #line 714 "pikchr.y" |
| 2811 | {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;} |
| 2812 | #line 2837 "pikchr.c" |
| 2813 | break; |
| 2814 | case 91: /* nth ::= LAST */ |
| 2815 | #line 715 "pikchr.y" |
| 2816 | {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;} |
| 2817 | #line 2842 "pikchr.c" |
| 2818 | yymsp[0].minor.yy0 = yylhsminor.yy0; |
| 2819 | break; |
| 2820 | case 92: /* nth ::= NTH LB RB */ |
| 2821 | #line 716 "pikchr.y" |
| 2822 | {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);} |
| 2823 | #line 2848 "pikchr.c" |
| 2824 | yymsp[-2].minor.yy0 = yylhsminor.yy0; |
| 2825 | break; |
| 2826 | case 93: /* nth ::= NTH LAST LB RB */ |
| 2827 | #line 717 "pikchr.y" |
| 2828 | {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);} |
| 2829 | #line 2854 "pikchr.c" |
| 2830 | yymsp[-3].minor.yy0 = yylhsminor.yy0; |
| 2831 | break; |
| 2832 | case 94: /* nth ::= LAST LB RB */ |
| 2833 | #line 718 "pikchr.y" |
| 2834 | {yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; } |
| 2835 | #line 2860 "pikchr.c" |
| 2836 | break; |
| 2837 | case 95: /* expr ::= expr PLUS expr */ |
| 2838 | #line 720 "pikchr.y" |
| 2839 | {yylhsminor.yy73=yymsp[-2].minor.yy73+yymsp[0].minor.yy73;} |
| 2840 | #line 2865 "pikchr.c" |
| 2841 | yymsp[-2].minor.yy73 = yylhsminor.yy73; |
| 2842 | break; |
| 2843 | case 96: /* expr ::= expr MINUS expr */ |
| 2844 | #line 721 "pikchr.y" |
| 2845 | {yylhsminor.yy73=yymsp[-2].minor.yy73-yymsp[0].minor.yy73;} |
| 2846 | #line 2871 "pikchr.c" |
| 2847 | yymsp[-2].minor.yy73 = yylhsminor.yy73; |
| 2848 | break; |
| 2849 | case 97: /* expr ::= expr STAR expr */ |
| 2850 | #line 722 "pikchr.y" |
| 2851 | {yylhsminor.yy73=yymsp[-2].minor.yy73*yymsp[0].minor.yy73;} |
| 2852 | #line 2877 "pikchr.c" |
| 2853 | yymsp[-2].minor.yy73 = yylhsminor.yy73; |
| 2854 | break; |
| 2855 | case 98: /* expr ::= expr SLASH expr */ |
| 2856 | #line 723 "pikchr.y" |
| 2857 | { |
| 2858 | if( yymsp[0].minor.yy73==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy73 = 0.0; } |
| 2859 | else{ yylhsminor.yy73 = yymsp[-2].minor.yy73/yymsp[0].minor.yy73; } |
| 2860 | } |
| 2861 | #line 2886 "pikchr.c" |
| 2862 | yymsp[-2].minor.yy73 = yylhsminor.yy73; |
| 2863 | break; |
| 2864 | case 99: /* expr ::= MINUS expr */ |
| 2865 | #line 727 "pikchr.y" |
| 2866 | {yymsp[-1].minor.yy73=-yymsp[0].minor.yy73;} |
| 2867 | #line 2892 "pikchr.c" |
| 2868 | break; |
| 2869 | case 100: /* expr ::= PLUS expr */ |
| 2870 | #line 728 "pikchr.y" |
| 2871 | {yymsp[-1].minor.yy73=yymsp[0].minor.yy73;} |
| 2872 | #line 2897 "pikchr.c" |
| 2873 | break; |
| 2874 | case 101: /* expr ::= LP expr RP */ |
| 2875 | #line 729 "pikchr.y" |
| 2876 | {yymsp[-2].minor.yy73=yymsp[-1].minor.yy73;} |
| 2877 | #line 2902 "pikchr.c" |
| 2878 | break; |
| 2879 | case 102: /* expr ::= NUMBER */ |
| 2880 | #line 730 "pikchr.y" |
| 2881 | {yylhsminor.yy73=pik_atof(&yymsp[0].minor.yy0);} |
| 2882 | #line 2907 "pikchr.c" |
| 2883 | yymsp[0].minor.yy73 = yylhsminor.yy73; |
| 2884 | break; |
| 2885 | case 103: /* expr ::= ID */ |
| 2886 | #line 731 "pikchr.y" |
| 2887 | {yylhsminor.yy73=pik_get_var(p,&yymsp[0].minor.yy0);} |
| 2888 | #line 2913 "pikchr.c" |
| 2889 | yymsp[0].minor.yy73 = yylhsminor.yy73; |
| 2890 | break; |
| 2891 | case 104: /* expr ::= FUNC1 LP expr RP */ |
| 2892 | #line 732 "pikchr.y" |
| 2893 | {yylhsminor.yy73 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy73,0.0);} |
| 2894 | #line 2919 "pikchr.c" |
| 2895 | yymsp[-3].minor.yy73 = yylhsminor.yy73; |
| 2896 | break; |
| 2897 | case 105: /* expr ::= FUNC2 LP expr COMMA expr RP */ |
| 2898 | #line 733 "pikchr.y" |
| 2899 | {yylhsminor.yy73 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy73,yymsp[-1].minor.yy73);} |
| 2900 | #line 2925 "pikchr.c" |
| 2901 | yymsp[-5].minor.yy73 = yylhsminor.yy73; |
| 2902 | break; |
| 2903 | case 106: /* expr ::= place2 DOT_XY X */ |
| 2904 | #line 734 "pikchr.y" |
| 2905 | {yylhsminor.yy73 = yymsp[-2].minor.yy139.x;} |
| 2906 | #line 2931 "pikchr.c" |
| 2907 | yymsp[-2].minor.yy73 = yylhsminor.yy73; |
| 2908 | break; |
| 2909 | case 107: /* expr ::= place2 DOT_XY Y */ |
| 2910 | #line 735 "pikchr.y" |
| 2911 | {yylhsminor.yy73 = yymsp[-2].minor.yy139.y;} |
| 2912 | #line 2937 "pikchr.c" |
| 2913 | yymsp[-2].minor.yy73 = yylhsminor.yy73; |
| 2914 | break; |
| 2915 | case 108: /* expr ::= object DOT_L numproperty */ |
| 2916 | case 109: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==109); |
| 2917 | case 110: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==110); |
| 2918 | #line 736 "pikchr.y" |
| 2919 | {yylhsminor.yy73=pik_property_of(yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);} |
| 2920 | #line 2945 "pikchr.c" |
| 2921 | yymsp[-2].minor.yy73 = yylhsminor.yy73; |
| 2922 | break; |
| 2923 | default: |
| 2924 | /* (111) lvalue ::= ID */ yytestcase(yyruleno==111); |
| 2925 | /* (112) lvalue ::= FILL */ yytestcase(yyruleno==112); |
| @@ -3014,18 +3018,19 @@ | |
| 3018 | ){ |
| 3019 | pik_parserARG_FETCH |
| 3020 | pik_parserCTX_FETCH |
| 3021 | #define TOKEN yyminor |
| 3022 | /************ Begin %syntax_error code ****************************************/ |
| 3023 | #line 502 "pikchr.y" |
| 3024 | |
| 3025 | if( TOKEN.z && TOKEN.z[0] ){ |
| 3026 | pik_error(p, &TOKEN, "syntax error"); |
| 3027 | }else{ |
| 3028 | pik_error(p, 0, "syntax error"); |
| 3029 | } |
| 3030 | UNUSED_PARAMETER(yymajor); |
| 3031 | #line 3056 "pikchr.c" |
| 3032 | /************ End %syntax_error code ******************************************/ |
| 3033 | pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */ |
| 3034 | pik_parserCTX_STORE |
| 3035 | } |
| 3036 | |
| @@ -3254,11 +3259,11 @@ | |
| 3259 | #else |
| 3260 | (void)iToken; |
| 3261 | return 0; |
| 3262 | #endif |
| 3263 | } |
| 3264 | #line 741 "pikchr.y" |
| 3265 | |
| 3266 | |
| 3267 | |
| 3268 | /* Chart of the 140 official HTML color names with their |
| 3269 | ** corresponding RGB value. |
| @@ -3534,33 +3539,10 @@ | |
| 3539 | static void boxInit(Pik *p, PElem *pElem){ |
| 3540 | pElem->w = pik_value(p, "boxwid",6,0); |
| 3541 | pElem->h = pik_value(p, "boxht",5,0); |
| 3542 | pElem->rad = pik_value(p, "boxrad",6,0); |
| 3543 | } |
| 3544 | /* Return offset from the center of the box to the compass point |
| 3545 | ** given by parameter cp */ |
| 3546 | static PPoint boxOffset(Pik *p, PElem *pElem, int cp){ |
| 3547 | PPoint pt; |
| 3548 | PNum w2 = 0.5*pElem->w; |
| @@ -3573,11 +3555,11 @@ | |
| 3555 | if( rad>w2 ) rad = w2; |
| 3556 | if( rad>h2 ) rad = h2; |
| 3557 | rx = 0.29289321881345252392*rad; |
| 3558 | } |
| 3559 | pt.x = pt.y = 0.0; |
| 3560 | switch( cp ){ |
| 3561 | case CP_C: pt.x = 0.0; pt.y = 0.0; break; |
| 3562 | case CP_N: pt.x = 0.0; pt.y = h2; break; |
| 3563 | case CP_NE: pt.x = w2-rx; pt.y = h2-rx; break; |
| 3564 | case CP_E: pt.x = w2; pt.y = 0.0; break; |
| 3565 | case CP_SE: pt.x = w2-rx; pt.y = rx-h2; break; |
| @@ -3584,10 +3566,11 @@ | |
| 3566 | case CP_S: pt.x = 0.0; pt.y = -h2; break; |
| 3567 | case CP_SW: pt.x = rx-w2; pt.y = rx-h2; break; |
| 3568 | case CP_W: pt.x = -w2; pt.y = 0.0; break; |
| 3569 | case CP_NW: pt.x = rx-w2; pt.y = h2-rx; break; |
| 3570 | } |
| 3571 | UNUSED_PARAMETER(p); |
| 3572 | return pt; |
| 3573 | } |
| 3574 | static PPoint boxChop(Pik *p, PElem *pElem, PPoint *pPt){ |
| 3575 | PNum dx, dy; |
| 3576 | int cp = CP_C; |
| @@ -3627,10 +3610,11 @@ | |
| 3610 | return chop; |
| 3611 | } |
| 3612 | static void boxFit(Pik *p, PElem *pElem, PNum w, PNum h){ |
| 3613 | if( w>0 ) pElem->w = w; |
| 3614 | if( h>0 ) pElem->h = h; |
| 3615 | UNUSED_PARAMETER(p); |
| 3616 | } |
| 3617 | static void boxRender(Pik *p, PElem *pElem){ |
| 3618 | PNum w2 = 0.5*pElem->w; |
| 3619 | PNum h2 = 0.5*pElem->h; |
| 3620 | PNum rad = pElem->rad; |
| @@ -3704,19 +3688,21 @@ | |
| 3688 | case T_HEIGHT: |
| 3689 | pElem->w = pElem->h; |
| 3690 | pElem->rad = 0.5*pElem->w; |
| 3691 | break; |
| 3692 | } |
| 3693 | UNUSED_PARAMETER(p); |
| 3694 | } |
| 3695 | static PPoint circleChop(Pik *p, PElem *pElem, PPoint *pPt){ |
| 3696 | PPoint chop; |
| 3697 | PNum dx = pPt->x - pElem->ptAt.x; |
| 3698 | PNum dy = pPt->y - pElem->ptAt.y; |
| 3699 | PNum dist = hypot(dx,dy); |
| 3700 | if( dist<pElem->rad ) return pElem->ptAt; |
| 3701 | chop.x = pElem->ptAt.x + dx*pElem->rad/dist; |
| 3702 | chop.y = pElem->ptAt.y + dy*pElem->rad/dist; |
| 3703 | UNUSED_PARAMETER(p); |
| 3704 | return chop; |
| 3705 | } |
| 3706 | static void circleFit(Pik *p, PElem *pElem, PNum w, PNum h){ |
| 3707 | PNum mx = 0.0; |
| 3708 | if( w>0 ) mx = w; |
| @@ -3726,10 +3712,11 @@ | |
| 3712 | } |
| 3713 | if( mx>0.0 ){ |
| 3714 | pElem->rad = 0.5*mx; |
| 3715 | pElem->w = pElem->h = mx; |
| 3716 | } |
| 3717 | UNUSED_PARAMETER(p); |
| 3718 | } |
| 3719 | |
| 3720 | static void circleRender(Pik *p, PElem *pElem){ |
| 3721 | PNum r = pElem->rad; |
| 3722 | PPoint pt = pElem->ptAt; |
| @@ -3770,11 +3757,11 @@ | |
| 3757 | static PPoint cylinderOffset(Pik *p, PElem *pElem, int cp){ |
| 3758 | PPoint pt; |
| 3759 | PNum w2 = pElem->w*0.5; |
| 3760 | PNum h1 = pElem->h*0.5; |
| 3761 | PNum h2 = h1 - pElem->rad; |
| 3762 | switch( cp ){ |
| 3763 | case CP_C: pt.x = 0.0; pt.y = 0.0; break; |
| 3764 | case CP_N: pt.x = 0.0; pt.y = h1; break; |
| 3765 | case CP_NE: pt.x = w2; pt.y = h2; break; |
| 3766 | case CP_E: pt.x = w2; pt.y = 0.0; break; |
| 3767 | case CP_SE: pt.x = w2; pt.y = -h2; break; |
| @@ -3781,10 +3768,11 @@ | |
| 3768 | case CP_S: pt.x = 0.0; pt.y = -h1; break; |
| 3769 | case CP_SW: pt.x = -w2; pt.y = -h2; break; |
| 3770 | case CP_W: pt.x = -w2; pt.y = 0.0; break; |
| 3771 | case CP_NW: pt.x = -w2; pt.y = h2; break; |
| 3772 | } |
| 3773 | UNUSED_PARAMETER(p); |
| 3774 | return pt; |
| 3775 | } |
| 3776 | |
| 3777 | /* Methods for the "dot" class */ |
| 3778 | static void dotInit(Pik *p, PElem *pElem){ |
| @@ -3799,19 +3787,24 @@ | |
| 3787 | break; |
| 3788 | case T_FILL: |
| 3789 | pElem->color = pElem->fill; |
| 3790 | break; |
| 3791 | } |
| 3792 | UNUSED_PARAMETER(p); |
| 3793 | } |
| 3794 | static void dotCheck(Pik *p, PElem *pElem){ |
| 3795 | pElem->w = pElem->h = 0; |
| 3796 | pik_bbox_addellipse(&pElem->bbox, pElem->ptAt.x, pElem->ptAt.y, |
| 3797 | pElem->rad, pElem->rad); |
| 3798 | UNUSED_PARAMETER(p); |
| 3799 | } |
| 3800 | static PPoint dotOffset(Pik *p, PElem *pElem, int cp){ |
| 3801 | PPoint zero; |
| 3802 | zero.x = zero.y = 0; |
| 3803 | UNUSED_PARAMETER(p); |
| 3804 | UNUSED_PARAMETER(pElem); |
| 3805 | UNUSED_PARAMETER(cp); |
| 3806 | return zero; |
| 3807 | } |
| 3808 | static void dotRender(Pik *p, PElem *pElem){ |
| 3809 | PNum r = pElem->rad; |
| 3810 | PPoint pt = pElem->ptAt; |
| @@ -3843,19 +3836,20 @@ | |
| 3836 | dq = dx*s; |
| 3837 | dist = hypot(dq,dy); |
| 3838 | if( dist<pElem->h ) return pElem->ptAt; |
| 3839 | chop.x = pElem->ptAt.x + 0.5*dq*pElem->h/(dist*s); |
| 3840 | chop.y = pElem->ptAt.y + 0.5*dy*pElem->h/dist; |
| 3841 | UNUSED_PARAMETER(p); |
| 3842 | return chop; |
| 3843 | } |
| 3844 | static PPoint ellipseOffset(Pik *p, PElem *pElem, int cp){ |
| 3845 | PPoint pt; |
| 3846 | PNum w = pElem->w*0.5; |
| 3847 | PNum w2 = w*0.70710678118654747608; |
| 3848 | PNum h = pElem->h*0.5; |
| 3849 | PNum h2 = h*0.70710678118654747608; |
| 3850 | switch( cp ){ |
| 3851 | case CP_C: pt.x = 0.0; pt.y = 0.0; break; |
| 3852 | case CP_N: pt.x = 0.0; pt.y = h; break; |
| 3853 | case CP_NE: pt.x = w2; pt.y = h2; break; |
| 3854 | case CP_E: pt.x = w; pt.y = 0.0; break; |
| 3855 | case CP_SE: pt.x = w2; pt.y = -h2; break; |
| @@ -3862,10 +3856,11 @@ | |
| 3856 | case CP_S: pt.x = 0.0; pt.y = -h; break; |
| 3857 | case CP_SW: pt.x = -w2; pt.y = -h2; break; |
| 3858 | case CP_W: pt.x = -w; pt.y = 0.0; break; |
| 3859 | case CP_NW: pt.x = -w2; pt.y = h2; break; |
| 3860 | } |
| 3861 | UNUSED_PARAMETER(p); |
| 3862 | return pt; |
| 3863 | } |
| 3864 | static void ellipseRender(Pik *p, PElem *pElem){ |
| 3865 | PNum w = pElem->w; |
| 3866 | PNum h = pElem->h; |
| @@ -3897,11 +3892,11 @@ | |
| 3892 | PNum mn = w2<h2 ? w2 : h2; |
| 3893 | if( rx>mn ) rx = mn; |
| 3894 | if( rx<mn*0.25 ) rx = mn*0.25; |
| 3895 | pt.x = pt.y = 0.0; |
| 3896 | rx *= 0.5; |
| 3897 | switch( cp ){ |
| 3898 | case CP_C: pt.x = 0.0; pt.y = 0.0; break; |
| 3899 | case CP_N: pt.x = 0.0; pt.y = h2; break; |
| 3900 | case CP_NE: pt.x = w2-rx; pt.y = h2-rx; break; |
| 3901 | case CP_E: pt.x = w2; pt.y = 0.0; break; |
| 3902 | case CP_SE: pt.x = w2; pt.y = -h2; break; |
| @@ -3908,15 +3903,17 @@ | |
| 3903 | case CP_S: pt.x = 0.0; pt.y = -h2; break; |
| 3904 | case CP_SW: pt.x = -w2; pt.y = -h2; break; |
| 3905 | case CP_W: pt.x = -w2; pt.y = 0.0; break; |
| 3906 | case CP_NW: pt.x = -w2; pt.y = h2; break; |
| 3907 | } |
| 3908 | UNUSED_PARAMETER(p); |
| 3909 | return pt; |
| 3910 | } |
| 3911 | static void fileFit(Pik *p, PElem *pElem, PNum w, PNum h){ |
| 3912 | if( w>0 ) pElem->w = w; |
| 3913 | if( h>0 ) pElem->h = h + 2*pElem->rad; |
| 3914 | UNUSED_PARAMETER(p); |
| 3915 | } |
| 3916 | static void fileRender(Pik *p, PElem *pElem){ |
| 3917 | PNum w2 = 0.5*pElem->w; |
| 3918 | PNum h2 = 0.5*pElem->h; |
| 3919 | PNum rad = pElem->rad; |
| @@ -3950,11 +3947,10 @@ | |
| 3947 | pElem->h = pik_value(p, "lineht",6,0); |
| 3948 | pElem->rad = pik_value(p, "linerad",7,0); |
| 3949 | pElem->fill = -1.0; |
| 3950 | } |
| 3951 | static PPoint lineOffset(Pik *p, PElem *pElem, int cp){ |
| 3952 | #if 0 |
| 3953 | /* In legacy PIC, the .center of an unclosed line is half way between |
| 3954 | ** its .start and .end. */ |
| 3955 | if( cp==CP_C && !pElem->bClose ){ |
| 3956 | PPoint out; |
| @@ -3961,11 +3957,10 @@ | |
| 3957 | out.x = 0.5*(pElem->ptEnter.x + pElem->ptExit.x) - pElem->ptAt.x; |
| 3958 | out.y = 0.5*(pElem->ptEnter.x + pElem->ptExit.y) - pElem->ptAt.y; |
| 3959 | return out; |
| 3960 | } |
| 3961 | #endif |
| 3962 | return boxOffset(p,pElem,cp); |
| 3963 | } |
| 3964 | static void lineRender(Pik *p, PElem *pElem){ |
| 3965 | int i; |
| 3966 | if( pElem->sw>0.0 ){ |
| @@ -4001,24 +3996,29 @@ | |
| 3996 | pElem->color = -1.0; |
| 3997 | pElem->sw = -1.0; |
| 3998 | } |
| 3999 | static void moveRender(Pik *p, PElem *pElem){ |
| 4000 | /* No-op */ |
| 4001 | UNUSED_PARAMETER(p); |
| 4002 | UNUSED_PARAMETER(pElem); |
| 4003 | } |
| 4004 | |
| 4005 | /* Methods for the "oval" class */ |
| 4006 | static void ovalInit(Pik *p, PElem *pElem){ |
| 4007 | pElem->h = pik_value(p, "ovalht",6,0); |
| 4008 | pElem->w = pik_value(p, "ovalwid",7,0); |
| 4009 | pElem->rad = 0.5*(pElem->h<pElem->w?pElem->h:pElem->w); |
| 4010 | } |
| 4011 | static void ovalNumProp(Pik *p, PElem *pElem, PToken *pId){ |
| 4012 | UNUSED_PARAMETER(p); |
| 4013 | UNUSED_PARAMETER(pId); |
| 4014 | /* Always adjust the radius to be half of the smaller of |
| 4015 | ** the width and height. */ |
| 4016 | pElem->rad = 0.5*(pElem->h<pElem->w?pElem->h:pElem->w); |
| 4017 | } |
| 4018 | static void ovalFit(Pik *p, PElem *pElem, PNum w, PNum h){ |
| 4019 | UNUSED_PARAMETER(p); |
| 4020 | if( w>0 ) pElem->w = w; |
| 4021 | if( h>0 ) pElem->h = h; |
| 4022 | if( pElem->w<pElem->h ) pElem->w = pElem->h; |
| 4023 | } |
| 4024 | |
| @@ -4114,10 +4114,11 @@ | |
| 4114 | |
| 4115 | /* Methods for the "sublist" class */ |
| 4116 | static void sublistInit(Pik *p, PElem *pElem){ |
| 4117 | PEList *pList = pElem->pSublist; |
| 4118 | int i; |
| 4119 | UNUSED_PARAMETER(p); |
| 4120 | pik_bbox_init(&pElem->bbox); |
| 4121 | for(i=0; i<pList->n; i++){ |
| 4122 | pik_bbox_addbox(&pElem->bbox, &pList->a[i]->bbox); |
| 4123 | } |
| 4124 | pElem->w = pElem->bbox.ne.x - pElem->bbox.sw.x; |
| @@ -4305,11 +4306,11 @@ | |
| 4306 | |
| 4307 | /* |
| 4308 | ** Reduce the length of the line segment by amt (if possible) by |
| 4309 | ** modifying the location of *t. |
| 4310 | */ |
| 4311 | static void pik_chop(PPoint *f, PPoint *t, PNum amt){ |
| 4312 | PNum dx = t->x - f->x; |
| 4313 | PNum dy = t->y - f->y; |
| 4314 | PNum dist = hypot(dx,dy); |
| 4315 | PNum r; |
| 4316 | if( dist<=amt ){ |
| @@ -4350,11 +4351,11 @@ | |
| 4351 | by = f->y + e1*dy; |
| 4352 | pik_append_xy(p,"<polygon points=\"", t->x, t->y); |
| 4353 | pik_append_xy(p," ",bx-ddx, by-ddy); |
| 4354 | pik_append_xy(p," ",bx+ddx, by+ddy); |
| 4355 | pik_append_clr(p,"\" style=\"fill:",pElem->color,"\"/>\n"); |
| 4356 | pik_chop(f,t,h/2); |
| 4357 | } |
| 4358 | |
| 4359 | /* |
| 4360 | ** Compute the relative offset to an edge location from the reference for a |
| 4361 | ** an element. |
| @@ -4538,11 +4539,11 @@ | |
| 4539 | ** Compute the vertical locations for all text items in the |
| 4540 | ** element pElem. In other words, set every pElem->aTxt[*].eCode |
| 4541 | ** value to contain exactly one of: TP_ABOVE2, TP_ABOVE, TP_CENTER, |
| 4542 | ** TP_BELOW, or TP_BELOW2 is set. |
| 4543 | */ |
| 4544 | static void pik_txt_vertical_layout(PElem *pElem){ |
| 4545 | int n, i; |
| 4546 | PToken *aTxt; |
| 4547 | n = pElem->nTxt; |
| 4548 | if( n==0 ) return; |
| 4549 | aTxt = pElem->aTxt; |
| @@ -4636,11 +4637,11 @@ | |
| 4637 | if( p->nErr ) return; |
| 4638 | if( pElem->nTxt==0 ) return; |
| 4639 | aTxt = pElem->aTxt; |
| 4640 | dy = 0.5*p->charHeight; |
| 4641 | n = pElem->nTxt; |
| 4642 | pik_txt_vertical_layout(pElem); |
| 4643 | x = pElem->ptAt.x; |
| 4644 | for(i=0; i<n; i++){ |
| 4645 | if( (pElem->aTxt[i].eCode & TP_CENTER)!=0 ) hasCenter = 1; |
| 4646 | } |
| 4647 | if( hasCenter ){ |
| @@ -4765,11 +4766,11 @@ | |
| 4766 | for(nExtra=0; (c = p->zIn[i+nExtra])!=0 && c!='\n'; nExtra++){} |
| 4767 | pik_append(p, "<div><pre>\n", -1); |
| 4768 | pik_append_text(p, p->zIn, i+nExtra, 3); |
| 4769 | pik_append(p, "\n", 1); |
| 4770 | for(i=0; i<iCol; i++){ pik_append(p, " ", 1); } |
| 4771 | for(i=0; i<(int)pErr->n; i++) pik_append(p, "^", 1); |
| 4772 | pik_append(p, "\nERROR: ", -1); |
| 4773 | pik_append_text(p, zMsg, -1, 0); |
| 4774 | pik_append(p, "\n", 1); |
| 4775 | pik_append(p, "\n</pre></div>\n", -1); |
| 4776 | } |
| @@ -4841,18 +4842,18 @@ | |
| 4842 | ** (3) Hex integers: 0x000000 |
| 4843 | ** |
| 4844 | ** This routine returns the result in inches. If a different unit |
| 4845 | ** is specified, the conversion happens automatically. |
| 4846 | */ |
| 4847 | PNum pik_atof(PToken *num){ |
| 4848 | char *endptr; |
| 4849 | PNum ans; |
| 4850 | if( num->n>=3 && num->z[0]=='0' && (num->z[1]=='x'||num->z[1]=='X') ){ |
| 4851 | return (PNum)strtol(num->z+2, 0, 16); |
| 4852 | } |
| 4853 | ans = strtod(num->z, &endptr); |
| 4854 | if( (int)(endptr - num->z)==(int)num->n-2 ){ |
| 4855 | char c1 = endptr[0]; |
| 4856 | char c2 = endptr[1]; |
| 4857 | if( c1=='c' && c2=='m' ){ |
| 4858 | ans /= 2.54; |
| 4859 | }else if( c1=='m' && c2=='m' ){ |
| @@ -5063,11 +5064,11 @@ | |
| 5064 | } |
| 5065 | |
| 5066 | /* |
| 5067 | ** Set the output direction and exit point for an element. |
| 5068 | */ |
| 5069 | static void pik_elem_set_exit(PElem *pElem, int eDir){ |
| 5070 | assert( ValidDir(eDir) ); |
| 5071 | pElem->outDir = eDir; |
| 5072 | if( !pElem->type->isLine || pElem->bClose ){ |
| 5073 | pElem->ptExit = pElem->ptAt; |
| 5074 | switch( pElem->outDir ){ |
| @@ -5097,11 +5098,11 @@ | |
| 5098 | ** You can make pikchr render the above exactly like PIC |
| 5099 | ** by deleting the following three lines. But I (drh) think |
| 5100 | ** it works better with those lines in place. |
| 5101 | */ |
| 5102 | if( p->list && p->list->n ){ |
| 5103 | pik_elem_set_exit(p->list->a[p->list->n-1], eDir); |
| 5104 | } |
| 5105 | } |
| 5106 | |
| 5107 | /* Move all coordinates contained within an element (and within its |
| 5108 | ** substructure) by dx, dy |
| @@ -5247,11 +5248,11 @@ | |
| 5248 | |
| 5249 | /* |
| 5250 | ** If the current path information came from a "same" or "same as" |
| 5251 | ** reset it. |
| 5252 | */ |
| 5253 | static void pik_reset_samepath(Pik *p){ |
| 5254 | if( p->samePath ){ |
| 5255 | p->samePath = 0; |
| 5256 | p->nTPath = 1; |
| 5257 | } |
| 5258 | } |
| @@ -5277,11 +5278,11 @@ | |
| 5278 | |
| 5279 | /* Advance to the next entry in p->aTPath. Return its index. |
| 5280 | */ |
| 5281 | static int pik_next_rpath(Pik *p, PToken *pErr){ |
| 5282 | int n = p->nTPath - 1; |
| 5283 | if( n+1>=(int)count(p->aTPath) ){ |
| 5284 | pik_error(0, pErr, "too many path elements"); |
| 5285 | return n; |
| 5286 | } |
| 5287 | n++; |
| 5288 | p->nTPath++; |
| @@ -5299,16 +5300,16 @@ | |
| 5300 | int dir; |
| 5301 | if( !pElem->type->isLine ){ |
| 5302 | if( pDir ){ |
| 5303 | pik_error(p, pDir, "use with line-oriented objects only"); |
| 5304 | }else{ |
| 5305 | PToken x = pik_next_semantic_token(&pElem->errTok); |
| 5306 | pik_error(p, &x, "syntax error"); |
| 5307 | } |
| 5308 | return; |
| 5309 | } |
| 5310 | pik_reset_samepath(p); |
| 5311 | n = p->nTPath - 1; |
| 5312 | if( p->thenFlag || p->mTPath==3 || n==0 ){ |
| 5313 | n = pik_next_rpath(p, pDir); |
| 5314 | p->thenFlag = 0; |
| 5315 | } |
| @@ -5357,11 +5358,11 @@ | |
| 5358 | PNum rDist = pDist->rAbs + pik_value(p,"linewid",7,0)*pDist->rRel; |
| 5359 | if( !pElem->type->isLine ){ |
| 5360 | pik_error(p, pErr, "use with line-oriented objects only"); |
| 5361 | return; |
| 5362 | } |
| 5363 | pik_reset_samepath(p); |
| 5364 | do{ |
| 5365 | n = pik_next_rpath(p, pErr); |
| 5366 | }while( n<1 ); |
| 5367 | if( pHeading ){ |
| 5368 | if( rHdg<0.0 || rHdg>360.0 ){ |
| @@ -5403,11 +5404,11 @@ | |
| 5404 | int n; |
| 5405 | if( !pElem->type->isLine ){ |
| 5406 | pik_error(p, pDir, "use with line-oriented objects only"); |
| 5407 | return; |
| 5408 | } |
| 5409 | pik_reset_samepath(p); |
| 5410 | n = p->nTPath - 1; |
| 5411 | if( p->thenFlag || p->mTPath==3 || n==0 ){ |
| 5412 | n = pik_next_rpath(p, pDir); |
| 5413 | p->thenFlag = 0; |
| 5414 | } |
| @@ -5515,11 +5516,11 @@ | |
| 5516 | if( pElem->mProp & A_AT ){ |
| 5517 | pik_error(p, pErrTok, "location fixed by prior \"at\""); |
| 5518 | return; |
| 5519 | } |
| 5520 | pElem->mProp |= A_AT; |
| 5521 | pElem->eWith = pEdge ? pEdge->eEdge : CP_C; |
| 5522 | pElem->with = *pAt; |
| 5523 | } |
| 5524 | |
| 5525 | /* |
| 5526 | ** Try to add a text attribute to an element |
| @@ -5536,11 +5537,11 @@ | |
| 5537 | pT->eCode = iPos; |
| 5538 | } |
| 5539 | |
| 5540 | /* Merge "text-position" flags |
| 5541 | */ |
| 5542 | static int pik_text_position(int iPrev, PToken *pFlag){ |
| 5543 | int iRes = iPrev; |
| 5544 | switch( pFlag->eType ){ |
| 5545 | case T_LJUST: iRes = (iRes&~TP_JMASK) | TP_LJUST; break; |
| 5546 | case T_RJUST: iRes = (iRes&~TP_JMASK) | TP_RJUST; break; |
| 5547 | case T_ABOVE: iRes = (iRes&~TP_VMASK) | TP_ABOVE; break; |
| @@ -5610,11 +5611,11 @@ | |
| 5611 | if( pElem->type->xFit==0 ) return; |
| 5612 | if( (pElem->mProp & A_HEIGHT)==0 ){ |
| 5613 | int hasCenter = 0; |
| 5614 | int hasSingleStack = 0; |
| 5615 | int hasDoubleStack = 0; |
| 5616 | pik_txt_vertical_layout(pElem); |
| 5617 | for(i=0; i<pElem->nTxt; i++){ |
| 5618 | if( pElem->aTxt[i].eCode & TP_CENTER ){ |
| 5619 | hasCenter = 1; |
| 5620 | }else if( pElem->aTxt[i].eCode & (TP_ABOVE2|TP_BELOW2) ){ |
| 5621 | hasDoubleStack = 1; |
| @@ -5736,11 +5737,12 @@ | |
| 5737 | int first, last, mid, c = 0; |
| 5738 | first = 0; |
| 5739 | last = count(aColor)-1; |
| 5740 | while( first<=last ){ |
| 5741 | const char *zClr; |
| 5742 | int c1, c2; |
| 5743 | unsigned int i; |
| 5744 | mid = (first+last)/2; |
| 5745 | zClr = aColor[mid].zName; |
| 5746 | for(i=0; i<pId->n; i++){ |
| 5747 | c1 = zClr[i]&0x7f; |
| 5748 | if( isupper(c1) ) c1 = tolower(c1); |
| @@ -5970,11 +5972,11 @@ | |
| 5972 | } |
| 5973 | } |
| 5974 | |
| 5975 | /* Do a linear interpolation of two positions. |
| 5976 | */ |
| 5977 | static PPoint pik_position_between(PNum x, PPoint p1, PPoint p2){ |
| 5978 | PPoint out; |
| 5979 | if( x<0.0 ) x = 0.0; |
| 5980 | if( x>1.0 ) x = 1.0; |
| 5981 | out.x = p2.x*x + p1.x*(1.0 - x); |
| 5982 | out.y = p2.y*x + p1.y*(1.0 - x); |
| @@ -5984,21 +5986,21 @@ | |
| 5986 | /* Compute the position that is dist away from pt at an heading angle of r |
| 5987 | ** |
| 5988 | ** The angle is a compass heading in degrees. North is 0 (or 360). |
| 5989 | ** East is 90. South is 180. West is 270. And so forth. |
| 5990 | */ |
| 5991 | static PPoint pik_position_at_angle(PNum dist, PNum r, PPoint pt){ |
| 5992 | r *= 0.017453292519943295769; /* degrees to radians */ |
| 5993 | pt.x += dist*sin(r); |
| 5994 | pt.y += dist*cos(r); |
| 5995 | return pt; |
| 5996 | } |
| 5997 | |
| 5998 | /* Compute the position that is dist away at a compass point |
| 5999 | */ |
| 6000 | static PPoint pik_position_at_hdg(PNum dist, PToken *pD, PPoint pt){ |
| 6001 | return pik_position_at_angle(dist, pik_hdg_angle[pD->eEdge], pt); |
| 6002 | } |
| 6003 | |
| 6004 | /* Return the coordinates for the n-th vertex of a line. |
| 6005 | */ |
| 6006 | static PPoint pik_nth_vertex(Pik *p, PToken *pNth, PToken *pErr, PElem *pObj){ |
| @@ -6017,11 +6019,11 @@ | |
| 6019 | return pObj->aPath[n-1]; |
| 6020 | } |
| 6021 | |
| 6022 | /* Return the value of a property of an object. |
| 6023 | */ |
| 6024 | static PNum pik_property_of(PElem *pElem, PToken *pProp){ |
| 6025 | PNum v = 0.0; |
| 6026 | switch( pProp->eType ){ |
| 6027 | case T_HEIGHT: v = pElem->h; break; |
| 6028 | case T_WIDTH: v = pElem->w; break; |
| 6029 | case T_RADIUS: v = pElem->rad; break; |
| @@ -6174,16 +6176,15 @@ | |
| 6176 | */ |
| 6177 | if( pElem->type->isLine ){ |
| 6178 | pElem->aPath = malloc( sizeof(PPoint)*p->nTPath ); |
| 6179 | if( pElem->aPath==0 ){ |
| 6180 | pik_error(p, 0, 0); |
| 6181 | return; |
| 6182 | }else{ |
| 6183 | pElem->nPath = p->nTPath; |
| 6184 | for(i=0; i<p->nTPath; i++){ |
| 6185 | pElem->aPath[i] = p->aTPath[i]; |
| 6186 | } |
| 6187 | } |
| 6188 | |
| 6189 | /* "chop" processing: |
| 6190 | ** If the line goes to the center of an object with an |
| @@ -6193,15 +6194,18 @@ | |
| 6194 | int n = pElem->nPath; |
| 6195 | pik_autochop(p, &pElem->aPath[n-2], &pElem->aPath[n-1]); |
| 6196 | pik_autochop(p, &pElem->aPath[1], &pElem->aPath[0]); |
| 6197 | } |
| 6198 | |
| 6199 | pElem->ptEnter = pElem->aPath[0]; |
| 6200 | pElem->ptExit = pElem->aPath[pElem->nPath-1]; |
| 6201 | |
| 6202 | /* Compute the center of the line based on the bounding box over |
| 6203 | ** the vertexes */ |
| 6204 | for(i=0; i<pElem->nPath; i++){ |
| 6205 | pik_bbox_add_xy(&pElem->bbox, pElem->aPath[i].x, pElem->aPath[i].y); |
| 6206 | } |
| 6207 | pElem->ptAt.x = (pElem->bbox.ne.x + pElem->bbox.sw.x)/2.0; |
| 6208 | pElem->ptAt.y = (pElem->bbox.ne.y + pElem->bbox.sw.y)/2.0; |
| 6209 | |
| 6210 | /* Reset the width and height of the object to be the width and height |
| 6211 | ** of the bounding box over vertexes */ |
| @@ -6210,11 +6214,11 @@ | |
| 6214 | |
| 6215 | /* If this is a polygon (if it has the "close" attribute), then |
| 6216 | ** adjust the exit point */ |
| 6217 | if( pElem->bClose ){ |
| 6218 | /* "closed" lines work like block objects */ |
| 6219 | pik_elem_set_exit(pElem, pElem->inDir); |
| 6220 | }else{ |
| 6221 | /* For an open line, the "center" is half way between |
| 6222 | ** the .start and the .end */ |
| 6223 | } |
| 6224 | }else{ |
| @@ -6778,11 +6782,11 @@ | |
| 6782 | /* This is not an exp */ |
| 6783 | i -= 2; |
| 6784 | }else{ |
| 6785 | i++; |
| 6786 | isInt = 0; |
| 6787 | while( (c = z[i])>='0' && c<='9' ){ i++; } |
| 6788 | } |
| 6789 | } |
| 6790 | c2 = c ? z[i+1] : 0; |
| 6791 | if( isInt ){ |
| 6792 | if( (c=='t' && c2=='h') |
| @@ -6837,11 +6841,11 @@ | |
| 6841 | |
| 6842 | /* |
| 6843 | ** Return a pointer to the next non-whitespace token after pThis. |
| 6844 | ** This is used to help form error messages. |
| 6845 | */ |
| 6846 | static PToken pik_next_semantic_token(PToken *pThis){ |
| 6847 | PToken x; |
| 6848 | int sz; |
| 6849 | int i = pThis->n; |
| 6850 | memset(&x, 0, sizeof(x)); |
| 6851 | x.z = pThis->z; |
| @@ -7055,6 +7059,6 @@ | |
| 7059 | printf("</body></html>\n"); |
| 7060 | return 0; |
| 7061 | } |
| 7062 | #endif /* PIKCHR_SHELL */ |
| 7063 | |
| 7064 | #line 7089 "pikchr.c" |
| 7065 |