Fossil SCM

Update Pikchr to include fixes to autofit on diamond objects.

drh 2024-02-08 20:45 trunk
Commit f4ec8e0f05f28b3732fa1986cca7a0c6618cd9dc6a8a5e6dc59878688eb0dbe1
+321 -289
--- extsrc/pikchr.c
+++ extsrc/pikchr.c
@@ -1,7 +1,8 @@
11
/* This file is automatically generated by Lemon from input grammar
2
-** source file "pikchr.y". */
2
+** source file "pikchr.y".
3
+*/
34
/*
45
** Zero-Clause BSD license:
56
**
67
** Copyright (C) 2020-09-01 by D. Richard Hipp <[email protected]>
78
**
@@ -319,10 +320,11 @@
319320
char cw; /* True for clockwise arc */
320321
char larrow; /* Arrow at beginning (<- or <->) */
321322
char rarrow; /* Arrow at end (-> or <->) */
322323
char bClose; /* True if "close" is seen */
323324
char bChop; /* True if "chop" is seen */
325
+ char bAltAutoFit; /* Always send both h and w into xFit() */
324326
unsigned char nTxt; /* Number of text values */
325327
unsigned mProp; /* Masks of properties set so far */
326328
unsigned mCalc; /* Values computed from other constraints */
327329
PToken aTxt[5]; /* Text with .eCode holding TP flags */
328330
int iLayer; /* Rendering order */
@@ -490,11 +492,11 @@
490492
static PObj *pik_position_assert(Pik*,PPoint*,PToken*,PPoint*);
491493
static PNum pik_dist(PPoint*,PPoint*);
492494
static void pik_add_macro(Pik*,PToken *pId,PToken *pCode);
493495
494496
495
-#line 521 "pikchr.c"
497
+#line 523 "pikchr.c"
496498
/**************** End of %include directives **********************************/
497499
/* These constants specify the various numeric values for terminal symbols.
498500
***************** Begin token definitions *************************************/
499501
#ifndef T_ID
500502
#define T_ID 1
@@ -634,10 +636,13 @@
634636
** pik_parserARG_PDECL A parameter declaration for the %extra_argument
635637
** pik_parserARG_PARAM Code to pass %extra_argument as a subroutine parameter
636638
** pik_parserARG_STORE Code to store %extra_argument into yypParser
637639
** pik_parserARG_FETCH Code to extract %extra_argument from yypParser
638640
** pik_parserCTX_* As pik_parserARG_ except for %extra_context
641
+** YYREALLOC Name of the realloc() function to use
642
+** YYFREE Name of the free() function to use
643
+** YYDYNSTACK True if stack space should be extended on heap
639644
** YYERRORSYMBOL is the code number of the error symbol. If not
640645
** defined, then do no error processing.
641646
** YYNSTATE the combined number of states.
642647
** YYNRULE the number of rules in the grammar
643648
** YYNTOKEN Number of terminal symbols
@@ -647,10 +652,12 @@
647652
** YY_ERROR_ACTION The yy_action[] code for syntax error
648653
** YY_ACCEPT_ACTION The yy_action[] code for accept
649654
** YY_NO_ACTION The yy_action[] code for no-op
650655
** YY_MIN_REDUCE Minimum value for reduce actions
651656
** YY_MAX_REDUCE Maximum value for reduce actions
657
+** YY_MIN_DSTRCTR Minimum symbol value that has a destructor
658
+** YY_MAX_DSTRCTR Maximum symbol value that has a destructor
652659
*/
653660
#ifndef INTERFACE
654661
# define INTERFACE 1
655662
#endif
656663
/************* Begin control #defines *****************************************/
@@ -674,10 +681,13 @@
674681
#define pik_parserARG_SDECL
675682
#define pik_parserARG_PDECL
676683
#define pik_parserARG_PARAM
677684
#define pik_parserARG_FETCH
678685
#define pik_parserARG_STORE
686
+#define YYREALLOC realloc
687
+#define YYFREE free
688
+#define YYDYNSTACK 0
679689
#define pik_parserCTX_SDECL Pik *p;
680690
#define pik_parserCTX_PDECL ,Pik *p
681691
#define pik_parserCTX_PARAM ,p
682692
#define pik_parserCTX_FETCH Pik *p=yypParser->p;
683693
#define pik_parserCTX_STORE yypParser->p=p;
@@ -692,10 +702,12 @@
692702
#define YY_ERROR_ACTION 443
693703
#define YY_ACCEPT_ACTION 444
694704
#define YY_NO_ACTION 445
695705
#define YY_MIN_REDUCE 446
696706
#define YY_MAX_REDUCE 601
707
+#define YY_MIN_DSTRCTR 100
708
+#define YY_MAX_DSTRCTR 103
697709
/************* End control #defines *******************************************/
698710
#define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0])))
699711
700712
/* Define the yytestcase() macro to be a no-op if is not already defined
701713
** otherwise.
@@ -706,10 +718,26 @@
706718
** for testing.
707719
*/
708720
#ifndef yytestcase
709721
# define yytestcase(X)
710722
#endif
723
+
724
+/* Macro to determine if stack space has the ability to grow using
725
+** heap memory.
726
+*/
727
+#if YYSTACKDEPTH<=0 || YYDYNSTACK
728
+# define YYGROWABLESTACK 1
729
+#else
730
+# define YYGROWABLESTACK 0
731
+#endif
732
+
733
+/* Guarantee a minimum number of initial stack slots.
734
+*/
735
+#if YYSTACKDEPTH<=0
736
+# undef YYSTACKDEPTH
737
+# define YYSTACKDEPTH 2 /* Need a minimum stack size */
738
+#endif
711739
712740
713741
/* Next are the tables used to determine what action to take based on the
714742
** current state and lookahead token. These tables are used to implement
715743
** functions that take a state number and lookahead value and return an
@@ -1250,18 +1278,13 @@
12501278
#ifndef YYNOERRORRECOVERY
12511279
int yyerrcnt; /* Shifts left before out of the error */
12521280
#endif
12531281
pik_parserARG_SDECL /* A place to hold %extra_argument */
12541282
pik_parserCTX_SDECL /* A place to hold %extra_context */
1255
-#if YYSTACKDEPTH<=0
1256
- int yystksz; /* Current side of the stack */
1257
- yyStackEntry *yystack; /* The parser's stack */
1258
- yyStackEntry yystk0; /* First stack entry */
1259
-#else
1260
- yyStackEntry yystack[YYSTACKDEPTH]; /* The parser's stack */
1261
- yyStackEntry *yystackEnd; /* Last entry in the stack */
1262
-#endif
1283
+ yyStackEntry *yystackEnd; /* Last entry in the stack */
1284
+ yyStackEntry *yystack; /* The parser stack */
1285
+ yyStackEntry yystk0[YYSTACKDEPTH]; /* Initial stack space */
12631286
};
12641287
typedef struct yyParser yyParser;
12651288
12661289
#include <assert.h>
12671290
#ifndef NDEBUG
@@ -1601,41 +1624,49 @@
16011624
/* 155 */ "object ::= objectname",
16021625
};
16031626
#endif /* NDEBUG */
16041627
16051628
1606
-#if YYSTACKDEPTH<=0
1629
+#if YYGROWABLESTACK
16071630
/*
16081631
** Try to increase the size of the parser stack. Return the number
16091632
** of errors. Return 0 on success.
16101633
*/
16111634
static int yyGrowStack(yyParser *p){
1635
+ int oldSize = 1 + (int)(p->yystackEnd - p->yystack);
16121636
int newSize;
16131637
int idx;
16141638
yyStackEntry *pNew;
16151639
1616
- newSize = p->yystksz*2 + 100;
1617
- idx = p->yytos ? (int)(p->yytos - p->yystack) : 0;
1618
- if( p->yystack==&p->yystk0 ){
1619
- pNew = malloc(newSize*sizeof(pNew[0]));
1620
- if( pNew ) pNew[0] = p->yystk0;
1640
+ newSize = oldSize*2 + 100;
1641
+ idx = (int)(p->yytos - p->yystack);
1642
+ if( p->yystack==p->yystk0 ){
1643
+ pNew = YYREALLOC(0, newSize*sizeof(pNew[0]));
1644
+ if( pNew==0 ) return 1;
1645
+ memcpy(pNew, p->yystack, oldSize*sizeof(pNew[0]));
16211646
}else{
1622
- pNew = realloc(p->yystack, newSize*sizeof(pNew[0]));
1647
+ pNew = YYREALLOC(p->yystack, newSize*sizeof(pNew[0]));
1648
+ if( pNew==0 ) return 1;
16231649
}
1624
- if( pNew ){
1625
- p->yystack = pNew;
1626
- p->yytos = &p->yystack[idx];
1650
+ p->yystack = pNew;
1651
+ p->yytos = &p->yystack[idx];
16271652
#ifndef NDEBUG
1628
- if( yyTraceFILE ){
1629
- fprintf(yyTraceFILE,"%sStack grows from %d to %d entries.\n",
1630
- yyTracePrompt, p->yystksz, newSize);
1631
- }
1653
+ if( yyTraceFILE ){
1654
+ fprintf(yyTraceFILE,"%sStack grows from %d to %d entries.\n",
1655
+ yyTracePrompt, oldSize, newSize);
1656
+ }
16321657
#endif
1633
- p->yystksz = newSize;
1634
- }
1635
- return pNew==0;
1658
+ p->yystackEnd = &p->yystack[newSize-1];
1659
+ return 0;
16361660
}
1661
+#endif /* YYGROWABLESTACK */
1662
+
1663
+#if !YYGROWABLESTACK
1664
+/* For builds that do no have a growable stack, yyGrowStack always
1665
+** returns an error.
1666
+*/
1667
+# define yyGrowStack(X) 1
16371668
#endif
16381669
16391670
/* Datatype of the argument to the memory allocated passed as the
16401671
** second argument to pik_parserAlloc() below. This can be changed by
16411672
** putting an appropriate #define in the %include section of the input
@@ -1651,28 +1682,18 @@
16511682
yyParser *yypParser = (yyParser*)yypRawParser;
16521683
pik_parserCTX_STORE
16531684
#ifdef YYTRACKMAXSTACKDEPTH
16541685
yypParser->yyhwm = 0;
16551686
#endif
1656
-#if YYSTACKDEPTH<=0
1657
- yypParser->yytos = NULL;
1658
- yypParser->yystack = NULL;
1659
- yypParser->yystksz = 0;
1660
- if( yyGrowStack(yypParser) ){
1661
- yypParser->yystack = &yypParser->yystk0;
1662
- yypParser->yystksz = 1;
1663
- }
1664
-#endif
1687
+ yypParser->yystack = yypParser->yystk0;
1688
+ yypParser->yystackEnd = &yypParser->yystack[YYSTACKDEPTH-1];
16651689
#ifndef YYNOERRORRECOVERY
16661690
yypParser->yyerrcnt = -1;
16671691
#endif
16681692
yypParser->yytos = yypParser->yystack;
16691693
yypParser->yystack[0].stateno = 0;
16701694
yypParser->yystack[0].major = 0;
1671
-#if YYSTACKDEPTH>0
1672
- yypParser->yystackEnd = &yypParser->yystack[YYSTACKDEPTH-1];
1673
-#endif
16741695
}
16751696
16761697
#ifndef pik_parser_ENGINEALWAYSONSTACK
16771698
/*
16781699
** This function allocates a new parser.
@@ -1724,22 +1745,22 @@
17241745
** inside the C code.
17251746
*/
17261747
/********* Begin destructor definitions ***************************************/
17271748
case 100: /* statement_list */
17281749
{
1729
-#line 510 "pikchr.y"
1750
+#line 511 "pikchr.y"
17301751
pik_elist_free(p,(yypminor->yy235));
1731
-#line 1756 "pikchr.c"
1752
+#line 1777 "pikchr.c"
17321753
}
17331754
break;
17341755
case 101: /* statement */
17351756
case 102: /* unnamed_statement */
17361757
case 103: /* basetype */
17371758
{
1738
-#line 512 "pikchr.y"
1759
+#line 513 "pikchr.y"
17391760
pik_elem_free(p,(yypminor->yy162));
1740
-#line 1765 "pikchr.c"
1761
+#line 1786 "pikchr.c"
17411762
}
17421763
break;
17431764
/********* End destructor definitions *****************************************/
17441765
default: break; /* If no destructor action specified: do nothing */
17451766
}
@@ -1769,13 +1790,30 @@
17691790
/*
17701791
** Clear all secondary memory allocations from the parser
17711792
*/
17721793
void pik_parserFinalize(void *p){
17731794
yyParser *pParser = (yyParser*)p;
1774
- while( pParser->yytos>pParser->yystack ) yy_pop_parser_stack(pParser);
1775
-#if YYSTACKDEPTH<=0
1776
- if( pParser->yystack!=&pParser->yystk0 ) free(pParser->yystack);
1795
+
1796
+ /* In-lined version of calling yy_pop_parser_stack() for each
1797
+ ** element left in the stack */
1798
+ yyStackEntry *yytos = pParser->yytos;
1799
+ while( yytos>pParser->yystack ){
1800
+#ifndef NDEBUG
1801
+ if( yyTraceFILE ){
1802
+ fprintf(yyTraceFILE,"%sPopping %s\n",
1803
+ yyTracePrompt,
1804
+ yyTokenName[yytos->major]);
1805
+ }
1806
+#endif
1807
+ if( yytos->major>=YY_MIN_DSTRCTR ){
1808
+ yy_destructor(pParser, yytos->major, &yytos->minor);
1809
+ }
1810
+ yytos--;
1811
+ }
1812
+
1813
+#if YYGROWABLESTACK
1814
+ if( pParser->yystack!=pParser->yystk0 ) YYFREE(pParser->yystack);
17771815
#endif
17781816
}
17791817
17801818
#ifndef pik_parser_ENGINEALWAYSONSTACK
17811819
/*
@@ -1953,14 +1991,14 @@
19531991
#endif
19541992
while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
19551993
/* Here code is inserted which will execute if the parser
19561994
** stack every overflows */
19571995
/******** Begin %stack_overflow code ******************************************/
1958
-#line 544 "pikchr.y"
1996
+#line 545 "pikchr.y"
19591997
19601998
pik_error(p, 0, "parser stack overflow");
1961
-#line 1986 "pikchr.c"
1999
+#line 2024 "pikchr.c"
19622000
/******** End %stack_overflow code ********************************************/
19632001
pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
19642002
pik_parserCTX_STORE
19652003
}
19662004
@@ -2000,29 +2038,23 @@
20002038
if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){
20012039
yypParser->yyhwm++;
20022040
assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack) );
20032041
}
20042042
#endif
2005
-#if YYSTACKDEPTH>0
2006
- if( yypParser->yytos>yypParser->yystackEnd ){
2007
- yypParser->yytos--;
2008
- yyStackOverflow(yypParser);
2009
- return;
2010
- }
2011
-#else
2012
- if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz] ){
2043
+ yytos = yypParser->yytos;
2044
+ if( yytos>yypParser->yystackEnd ){
20132045
if( yyGrowStack(yypParser) ){
20142046
yypParser->yytos--;
20152047
yyStackOverflow(yypParser);
20162048
return;
20172049
}
2050
+ yytos = yypParser->yytos;
2051
+ assert( yytos <= yypParser->yystackEnd );
20182052
}
2019
-#endif
20202053
if( yyNewState > YY_MAX_SHIFT ){
20212054
yyNewState += YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE;
20222055
}
2023
- yytos = yypParser->yytos;
20242056
yytos->stateno = yyNewState;
20252057
yytos->major = yyMajor;
20262058
yytos->minor.yy0 = yyMinor;
20272059
yyTraceShift(yypParser, yyNewState, "Shift");
20282060
}
@@ -2387,619 +2419,619 @@
23872419
** break;
23882420
*/
23892421
/********** Begin reduce actions **********************************************/
23902422
YYMINORTYPE yylhsminor;
23912423
case 0: /* document ::= statement_list */
2392
-#line 548 "pikchr.y"
2424
+#line 549 "pikchr.y"
23932425
{pik_render(p,yymsp[0].minor.yy235);}
2394
-#line 2419 "pikchr.c"
2426
+#line 2451 "pikchr.c"
23952427
break;
23962428
case 1: /* statement_list ::= statement */
2397
-#line 551 "pikchr.y"
2429
+#line 552 "pikchr.y"
23982430
{ yylhsminor.yy235 = pik_elist_append(p,0,yymsp[0].minor.yy162); }
2399
-#line 2424 "pikchr.c"
2431
+#line 2456 "pikchr.c"
24002432
yymsp[0].minor.yy235 = yylhsminor.yy235;
24012433
break;
24022434
case 2: /* statement_list ::= statement_list EOL statement */
2403
-#line 553 "pikchr.y"
2435
+#line 554 "pikchr.y"
24042436
{ yylhsminor.yy235 = pik_elist_append(p,yymsp[-2].minor.yy235,yymsp[0].minor.yy162); }
2405
-#line 2430 "pikchr.c"
2437
+#line 2462 "pikchr.c"
24062438
yymsp[-2].minor.yy235 = yylhsminor.yy235;
24072439
break;
24082440
case 3: /* statement ::= */
2409
-#line 556 "pikchr.y"
2441
+#line 557 "pikchr.y"
24102442
{ yymsp[1].minor.yy162 = 0; }
2411
-#line 2436 "pikchr.c"
2443
+#line 2468 "pikchr.c"
24122444
break;
24132445
case 4: /* statement ::= direction */
2414
-#line 557 "pikchr.y"
2446
+#line 558 "pikchr.y"
24152447
{ pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy162=0; }
2416
-#line 2441 "pikchr.c"
2448
+#line 2473 "pikchr.c"
24172449
yymsp[0].minor.yy162 = yylhsminor.yy162;
24182450
break;
24192451
case 5: /* statement ::= lvalue ASSIGN rvalue */
2420
-#line 558 "pikchr.y"
2452
+#line 559 "pikchr.y"
24212453
{pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy21,&yymsp[-1].minor.yy0); yylhsminor.yy162=0;}
2422
-#line 2447 "pikchr.c"
2454
+#line 2479 "pikchr.c"
24232455
yymsp[-2].minor.yy162 = yylhsminor.yy162;
24242456
break;
24252457
case 6: /* statement ::= PLACENAME COLON unnamed_statement */
2426
-#line 560 "pikchr.y"
2458
+#line 561 "pikchr.y"
24272459
{ yylhsminor.yy162 = yymsp[0].minor.yy162; pik_elem_setname(p,yymsp[0].minor.yy162,&yymsp[-2].minor.yy0); }
2428
-#line 2453 "pikchr.c"
2460
+#line 2485 "pikchr.c"
24292461
yymsp[-2].minor.yy162 = yylhsminor.yy162;
24302462
break;
24312463
case 7: /* statement ::= PLACENAME COLON position */
2432
-#line 562 "pikchr.y"
2464
+#line 563 "pikchr.y"
24332465
{ yylhsminor.yy162 = pik_elem_new(p,0,0,0);
24342466
if(yylhsminor.yy162){ yylhsminor.yy162->ptAt = yymsp[0].minor.yy63; pik_elem_setname(p,yylhsminor.yy162,&yymsp[-2].minor.yy0); }}
2435
-#line 2460 "pikchr.c"
2467
+#line 2492 "pikchr.c"
24362468
yymsp[-2].minor.yy162 = yylhsminor.yy162;
24372469
break;
24382470
case 8: /* statement ::= unnamed_statement */
2439
-#line 564 "pikchr.y"
2471
+#line 565 "pikchr.y"
24402472
{yylhsminor.yy162 = yymsp[0].minor.yy162;}
2441
-#line 2466 "pikchr.c"
2473
+#line 2498 "pikchr.c"
24422474
yymsp[0].minor.yy162 = yylhsminor.yy162;
24432475
break;
24442476
case 9: /* statement ::= print prlist */
2445
-#line 565 "pikchr.y"
2477
+#line 566 "pikchr.y"
24462478
{pik_append(p,"<br>\n",5); yymsp[-1].minor.yy162=0;}
2447
-#line 2472 "pikchr.c"
2479
+#line 2504 "pikchr.c"
24482480
break;
24492481
case 10: /* statement ::= ASSERT LP expr EQ expr RP */
2450
-#line 570 "pikchr.y"
2482
+#line 571 "pikchr.y"
24512483
{yymsp[-5].minor.yy162=pik_assert(p,yymsp[-3].minor.yy21,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy21);}
2452
-#line 2477 "pikchr.c"
2484
+#line 2509 "pikchr.c"
24532485
break;
24542486
case 11: /* statement ::= ASSERT LP position EQ position RP */
2455
-#line 572 "pikchr.y"
2487
+#line 573 "pikchr.y"
24562488
{yymsp[-5].minor.yy162=pik_position_assert(p,&yymsp[-3].minor.yy63,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy63);}
2457
-#line 2482 "pikchr.c"
2489
+#line 2514 "pikchr.c"
24582490
break;
24592491
case 12: /* statement ::= DEFINE ID CODEBLOCK */
2460
-#line 573 "pikchr.y"
2492
+#line 574 "pikchr.y"
24612493
{yymsp[-2].minor.yy162=0; pik_add_macro(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
2462
-#line 2487 "pikchr.c"
2494
+#line 2519 "pikchr.c"
24632495
break;
24642496
case 13: /* rvalue ::= PLACENAME */
2465
-#line 584 "pikchr.y"
2497
+#line 585 "pikchr.y"
24662498
{yylhsminor.yy21 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2467
-#line 2492 "pikchr.c"
2499
+#line 2524 "pikchr.c"
24682500
yymsp[0].minor.yy21 = yylhsminor.yy21;
24692501
break;
24702502
case 14: /* pritem ::= FILL */
24712503
case 15: /* pritem ::= COLOR */ yytestcase(yyruleno==15);
24722504
case 16: /* pritem ::= THICKNESS */ yytestcase(yyruleno==16);
2473
-#line 589 "pikchr.y"
2505
+#line 590 "pikchr.y"
24742506
{pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2475
-#line 2500 "pikchr.c"
2507
+#line 2532 "pikchr.c"
24762508
break;
24772509
case 17: /* pritem ::= rvalue */
2478
-#line 592 "pikchr.y"
2510
+#line 593 "pikchr.y"
24792511
{pik_append_num(p,"",yymsp[0].minor.yy21);}
2480
-#line 2505 "pikchr.c"
2512
+#line 2537 "pikchr.c"
24812513
break;
24822514
case 18: /* pritem ::= STRING */
2483
-#line 593 "pikchr.y"
2515
+#line 594 "pikchr.y"
24842516
{pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2485
-#line 2510 "pikchr.c"
2517
+#line 2542 "pikchr.c"
24862518
break;
24872519
case 19: /* prsep ::= COMMA */
2488
-#line 594 "pikchr.y"
2520
+#line 595 "pikchr.y"
24892521
{pik_append(p, " ", 1);}
2490
-#line 2515 "pikchr.c"
2522
+#line 2547 "pikchr.c"
24912523
break;
24922524
case 20: /* unnamed_statement ::= basetype attribute_list */
2493
-#line 597 "pikchr.y"
2525
+#line 598 "pikchr.y"
24942526
{yylhsminor.yy162 = yymsp[-1].minor.yy162; pik_after_adding_attributes(p,yylhsminor.yy162);}
2495
-#line 2520 "pikchr.c"
2527
+#line 2552 "pikchr.c"
24962528
yymsp[-1].minor.yy162 = yylhsminor.yy162;
24972529
break;
24982530
case 21: /* basetype ::= CLASSNAME */
2499
-#line 599 "pikchr.y"
2531
+#line 600 "pikchr.y"
25002532
{yylhsminor.yy162 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2501
-#line 2526 "pikchr.c"
2533
+#line 2558 "pikchr.c"
25022534
yymsp[0].minor.yy162 = yylhsminor.yy162;
25032535
break;
25042536
case 22: /* basetype ::= STRING textposition */
2505
-#line 601 "pikchr.y"
2537
+#line 602 "pikchr.y"
25062538
{yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy188; yylhsminor.yy162 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2507
-#line 2532 "pikchr.c"
2539
+#line 2564 "pikchr.c"
25082540
yymsp[-1].minor.yy162 = yylhsminor.yy162;
25092541
break;
25102542
case 23: /* basetype ::= LB savelist statement_list RB */
2511
-#line 603 "pikchr.y"
2543
+#line 604 "pikchr.y"
25122544
{ p->list = yymsp[-2].minor.yy235; yymsp[-3].minor.yy162 = pik_elem_new(p,0,0,yymsp[-1].minor.yy235); if(yymsp[-3].minor.yy162) yymsp[-3].minor.yy162->errTok = yymsp[0].minor.yy0; }
2513
-#line 2538 "pikchr.c"
2545
+#line 2570 "pikchr.c"
25142546
break;
25152547
case 24: /* savelist ::= */
2516
-#line 608 "pikchr.y"
2548
+#line 609 "pikchr.y"
25172549
{yymsp[1].minor.yy235 = p->list; p->list = 0;}
2518
-#line 2543 "pikchr.c"
2550
+#line 2575 "pikchr.c"
25192551
break;
25202552
case 25: /* relexpr ::= expr */
2521
-#line 615 "pikchr.y"
2553
+#line 616 "pikchr.y"
25222554
{yylhsminor.yy72.rAbs = yymsp[0].minor.yy21; yylhsminor.yy72.rRel = 0;}
2523
-#line 2548 "pikchr.c"
2555
+#line 2580 "pikchr.c"
25242556
yymsp[0].minor.yy72 = yylhsminor.yy72;
25252557
break;
25262558
case 26: /* relexpr ::= expr PERCENT */
2527
-#line 616 "pikchr.y"
2559
+#line 617 "pikchr.y"
25282560
{yylhsminor.yy72.rAbs = 0; yylhsminor.yy72.rRel = yymsp[-1].minor.yy21/100;}
2529
-#line 2554 "pikchr.c"
2561
+#line 2586 "pikchr.c"
25302562
yymsp[-1].minor.yy72 = yylhsminor.yy72;
25312563
break;
25322564
case 27: /* optrelexpr ::= */
2533
-#line 618 "pikchr.y"
2565
+#line 619 "pikchr.y"
25342566
{yymsp[1].minor.yy72.rAbs = 0; yymsp[1].minor.yy72.rRel = 1.0;}
2535
-#line 2560 "pikchr.c"
2567
+#line 2592 "pikchr.c"
25362568
break;
25372569
case 28: /* attribute_list ::= relexpr alist */
2538
-#line 620 "pikchr.y"
2570
+#line 621 "pikchr.y"
25392571
{pik_add_direction(p,0,&yymsp[-1].minor.yy72);}
2540
-#line 2565 "pikchr.c"
2572
+#line 2597 "pikchr.c"
25412573
break;
25422574
case 29: /* attribute ::= numproperty relexpr */
2543
-#line 624 "pikchr.y"
2575
+#line 625 "pikchr.y"
25442576
{ pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy72); }
2545
-#line 2570 "pikchr.c"
2577
+#line 2602 "pikchr.c"
25462578
break;
25472579
case 30: /* attribute ::= dashproperty expr */
2548
-#line 625 "pikchr.y"
2580
+#line 626 "pikchr.y"
25492581
{ pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy21); }
2550
-#line 2575 "pikchr.c"
2582
+#line 2607 "pikchr.c"
25512583
break;
25522584
case 31: /* attribute ::= dashproperty */
2553
-#line 626 "pikchr.y"
2585
+#line 627 "pikchr.y"
25542586
{ pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2555
-#line 2580 "pikchr.c"
2587
+#line 2612 "pikchr.c"
25562588
break;
25572589
case 32: /* attribute ::= colorproperty rvalue */
2558
-#line 627 "pikchr.y"
2590
+#line 628 "pikchr.y"
25592591
{ pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy21); }
2560
-#line 2585 "pikchr.c"
2592
+#line 2617 "pikchr.c"
25612593
break;
25622594
case 33: /* attribute ::= go direction optrelexpr */
2563
-#line 628 "pikchr.y"
2595
+#line 629 "pikchr.y"
25642596
{ pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy72);}
2565
-#line 2590 "pikchr.c"
2597
+#line 2622 "pikchr.c"
25662598
break;
25672599
case 34: /* attribute ::= go direction even position */
2568
-#line 629 "pikchr.y"
2600
+#line 630 "pikchr.y"
25692601
{pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy63);}
2570
-#line 2595 "pikchr.c"
2602
+#line 2627 "pikchr.c"
25712603
break;
25722604
case 35: /* attribute ::= CLOSE */
2573
-#line 630 "pikchr.y"
2605
+#line 631 "pikchr.y"
25742606
{ pik_close_path(p,&yymsp[0].minor.yy0); }
2575
-#line 2600 "pikchr.c"
2607
+#line 2632 "pikchr.c"
25762608
break;
25772609
case 36: /* attribute ::= CHOP */
2578
-#line 631 "pikchr.y"
2610
+#line 632 "pikchr.y"
25792611
{ p->cur->bChop = 1; }
2580
-#line 2605 "pikchr.c"
2612
+#line 2637 "pikchr.c"
25812613
break;
25822614
case 37: /* attribute ::= FROM position */
2583
-#line 632 "pikchr.y"
2615
+#line 633 "pikchr.y"
25842616
{ pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy63); }
2585
-#line 2610 "pikchr.c"
2617
+#line 2642 "pikchr.c"
25862618
break;
25872619
case 38: /* attribute ::= TO position */
2588
-#line 633 "pikchr.y"
2620
+#line 634 "pikchr.y"
25892621
{ pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy63); }
2590
-#line 2615 "pikchr.c"
2622
+#line 2647 "pikchr.c"
25912623
break;
25922624
case 39: /* attribute ::= THEN */
2593
-#line 634 "pikchr.y"
2625
+#line 635 "pikchr.y"
25942626
{ pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2595
-#line 2620 "pikchr.c"
2627
+#line 2652 "pikchr.c"
25962628
break;
25972629
case 40: /* attribute ::= THEN optrelexpr HEADING expr */
25982630
case 42: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==42);
2599
-#line 636 "pikchr.y"
2631
+#line 637 "pikchr.y"
26002632
{pik_move_hdg(p,&yymsp[-2].minor.yy72,&yymsp[-1].minor.yy0,yymsp[0].minor.yy21,0,&yymsp[-3].minor.yy0);}
2601
-#line 2626 "pikchr.c"
2633
+#line 2658 "pikchr.c"
26022634
break;
26032635
case 41: /* attribute ::= THEN optrelexpr EDGEPT */
26042636
case 43: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==43);
2605
-#line 637 "pikchr.y"
2637
+#line 638 "pikchr.y"
26062638
{pik_move_hdg(p,&yymsp[-1].minor.yy72,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2607
-#line 2632 "pikchr.c"
2639
+#line 2664 "pikchr.c"
26082640
break;
26092641
case 44: /* attribute ::= AT position */
2610
-#line 642 "pikchr.y"
2642
+#line 643 "pikchr.y"
26112643
{ pik_set_at(p,0,&yymsp[0].minor.yy63,&yymsp[-1].minor.yy0); }
2612
-#line 2637 "pikchr.c"
2644
+#line 2669 "pikchr.c"
26132645
break;
26142646
case 45: /* attribute ::= SAME */
2615
-#line 644 "pikchr.y"
2647
+#line 645 "pikchr.y"
26162648
{pik_same(p,0,&yymsp[0].minor.yy0);}
2617
-#line 2642 "pikchr.c"
2649
+#line 2674 "pikchr.c"
26182650
break;
26192651
case 46: /* attribute ::= SAME AS object */
2620
-#line 645 "pikchr.y"
2652
+#line 646 "pikchr.y"
26212653
{pik_same(p,yymsp[0].minor.yy162,&yymsp[-2].minor.yy0);}
2622
-#line 2647 "pikchr.c"
2654
+#line 2679 "pikchr.c"
26232655
break;
26242656
case 47: /* attribute ::= STRING textposition */
2625
-#line 646 "pikchr.y"
2657
+#line 647 "pikchr.y"
26262658
{pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy188);}
2627
-#line 2652 "pikchr.c"
2659
+#line 2684 "pikchr.c"
26282660
break;
26292661
case 48: /* attribute ::= FIT */
2630
-#line 647 "pikchr.y"
2662
+#line 648 "pikchr.y"
26312663
{pik_size_to_fit(p,&yymsp[0].minor.yy0,3); }
2632
-#line 2657 "pikchr.c"
2664
+#line 2689 "pikchr.c"
26332665
break;
26342666
case 49: /* attribute ::= BEHIND object */
2635
-#line 648 "pikchr.y"
2667
+#line 649 "pikchr.y"
26362668
{pik_behind(p,yymsp[0].minor.yy162);}
2637
-#line 2662 "pikchr.c"
2669
+#line 2694 "pikchr.c"
26382670
break;
26392671
case 50: /* withclause ::= DOT_E edge AT position */
26402672
case 51: /* withclause ::= edge AT position */ yytestcase(yyruleno==51);
2641
-#line 656 "pikchr.y"
2673
+#line 657 "pikchr.y"
26422674
{ pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy63,&yymsp[-1].minor.yy0); }
2643
-#line 2668 "pikchr.c"
2675
+#line 2700 "pikchr.c"
26442676
break;
26452677
case 52: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2646
-#line 660 "pikchr.y"
2678
+#line 661 "pikchr.y"
26472679
{yylhsminor.yy0 = yymsp[0].minor.yy0;}
2648
-#line 2673 "pikchr.c"
2680
+#line 2705 "pikchr.c"
26492681
yymsp[0].minor.yy0 = yylhsminor.yy0;
26502682
break;
26512683
case 53: /* boolproperty ::= CW */
2652
-#line 671 "pikchr.y"
2684
+#line 672 "pikchr.y"
26532685
{p->cur->cw = 1;}
2654
-#line 2679 "pikchr.c"
2686
+#line 2711 "pikchr.c"
26552687
break;
26562688
case 54: /* boolproperty ::= CCW */
2657
-#line 672 "pikchr.y"
2689
+#line 673 "pikchr.y"
26582690
{p->cur->cw = 0;}
2659
-#line 2684 "pikchr.c"
2691
+#line 2716 "pikchr.c"
26602692
break;
26612693
case 55: /* boolproperty ::= LARROW */
2662
-#line 673 "pikchr.y"
2694
+#line 674 "pikchr.y"
26632695
{p->cur->larrow=1; p->cur->rarrow=0; }
2664
-#line 2689 "pikchr.c"
2696
+#line 2721 "pikchr.c"
26652697
break;
26662698
case 56: /* boolproperty ::= RARROW */
2667
-#line 674 "pikchr.y"
2699
+#line 675 "pikchr.y"
26682700
{p->cur->larrow=0; p->cur->rarrow=1; }
2669
-#line 2694 "pikchr.c"
2701
+#line 2726 "pikchr.c"
26702702
break;
26712703
case 57: /* boolproperty ::= LRARROW */
2672
-#line 675 "pikchr.y"
2704
+#line 676 "pikchr.y"
26732705
{p->cur->larrow=1; p->cur->rarrow=1; }
2674
-#line 2699 "pikchr.c"
2706
+#line 2731 "pikchr.c"
26752707
break;
26762708
case 58: /* boolproperty ::= INVIS */
2677
-#line 676 "pikchr.y"
2709
+#line 677 "pikchr.y"
26782710
{p->cur->sw = -0.00001;}
2679
-#line 2704 "pikchr.c"
2711
+#line 2736 "pikchr.c"
26802712
break;
26812713
case 59: /* boolproperty ::= THICK */
2682
-#line 677 "pikchr.y"
2714
+#line 678 "pikchr.y"
26832715
{p->cur->sw *= 1.5;}
2684
-#line 2709 "pikchr.c"
2716
+#line 2741 "pikchr.c"
26852717
break;
26862718
case 60: /* boolproperty ::= THIN */
2687
-#line 678 "pikchr.y"
2719
+#line 679 "pikchr.y"
26882720
{p->cur->sw *= 0.67;}
2689
-#line 2714 "pikchr.c"
2721
+#line 2746 "pikchr.c"
26902722
break;
26912723
case 61: /* boolproperty ::= SOLID */
2692
-#line 679 "pikchr.y"
2724
+#line 680 "pikchr.y"
26932725
{p->cur->sw = pik_value(p,"thickness",9,0);
26942726
p->cur->dotted = p->cur->dashed = 0.0;}
2695
-#line 2720 "pikchr.c"
2727
+#line 2752 "pikchr.c"
26962728
break;
26972729
case 62: /* textposition ::= */
2698
-#line 682 "pikchr.y"
2730
+#line 683 "pikchr.y"
26992731
{yymsp[1].minor.yy188 = 0;}
2700
-#line 2725 "pikchr.c"
2732
+#line 2757 "pikchr.c"
27012733
break;
27022734
case 63: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|MONO|ALIGNED|BIG|SMALL */
2703
-#line 685 "pikchr.y"
2735
+#line 686 "pikchr.y"
27042736
{yylhsminor.yy188 = (short int)pik_text_position(yymsp[-1].minor.yy188,&yymsp[0].minor.yy0);}
2705
-#line 2730 "pikchr.c"
2737
+#line 2762 "pikchr.c"
27062738
yymsp[-1].minor.yy188 = yylhsminor.yy188;
27072739
break;
27082740
case 64: /* position ::= expr COMMA expr */
2709
-#line 688 "pikchr.y"
2741
+#line 689 "pikchr.y"
27102742
{yylhsminor.yy63.x=yymsp[-2].minor.yy21; yylhsminor.yy63.y=yymsp[0].minor.yy21;}
2711
-#line 2736 "pikchr.c"
2743
+#line 2768 "pikchr.c"
27122744
yymsp[-2].minor.yy63 = yylhsminor.yy63;
27132745
break;
27142746
case 65: /* position ::= place PLUS expr COMMA expr */
2715
-#line 690 "pikchr.y"
2747
+#line 691 "pikchr.y"
27162748
{yylhsminor.yy63.x=yymsp[-4].minor.yy63.x+yymsp[-2].minor.yy21; yylhsminor.yy63.y=yymsp[-4].minor.yy63.y+yymsp[0].minor.yy21;}
2717
-#line 2742 "pikchr.c"
2749
+#line 2774 "pikchr.c"
27182750
yymsp[-4].minor.yy63 = yylhsminor.yy63;
27192751
break;
27202752
case 66: /* position ::= place MINUS expr COMMA expr */
2721
-#line 691 "pikchr.y"
2753
+#line 692 "pikchr.y"
27222754
{yylhsminor.yy63.x=yymsp[-4].minor.yy63.x-yymsp[-2].minor.yy21; yylhsminor.yy63.y=yymsp[-4].minor.yy63.y-yymsp[0].minor.yy21;}
2723
-#line 2748 "pikchr.c"
2755
+#line 2780 "pikchr.c"
27242756
yymsp[-4].minor.yy63 = yylhsminor.yy63;
27252757
break;
27262758
case 67: /* position ::= place PLUS LP expr COMMA expr RP */
2727
-#line 693 "pikchr.y"
2759
+#line 694 "pikchr.y"
27282760
{yylhsminor.yy63.x=yymsp[-6].minor.yy63.x+yymsp[-3].minor.yy21; yylhsminor.yy63.y=yymsp[-6].minor.yy63.y+yymsp[-1].minor.yy21;}
2729
-#line 2754 "pikchr.c"
2761
+#line 2786 "pikchr.c"
27302762
yymsp[-6].minor.yy63 = yylhsminor.yy63;
27312763
break;
27322764
case 68: /* position ::= place MINUS LP expr COMMA expr RP */
2733
-#line 695 "pikchr.y"
2765
+#line 696 "pikchr.y"
27342766
{yylhsminor.yy63.x=yymsp[-6].minor.yy63.x-yymsp[-3].minor.yy21; yylhsminor.yy63.y=yymsp[-6].minor.yy63.y-yymsp[-1].minor.yy21;}
2735
-#line 2760 "pikchr.c"
2767
+#line 2792 "pikchr.c"
27362768
yymsp[-6].minor.yy63 = yylhsminor.yy63;
27372769
break;
27382770
case 69: /* position ::= LP position COMMA position RP */
2739
-#line 696 "pikchr.y"
2771
+#line 697 "pikchr.y"
27402772
{yymsp[-4].minor.yy63.x=yymsp[-3].minor.yy63.x; yymsp[-4].minor.yy63.y=yymsp[-1].minor.yy63.y;}
2741
-#line 2766 "pikchr.c"
2773
+#line 2798 "pikchr.c"
27422774
break;
27432775
case 70: /* position ::= LP position RP */
2744
-#line 697 "pikchr.y"
2776
+#line 698 "pikchr.y"
27452777
{yymsp[-2].minor.yy63=yymsp[-1].minor.yy63;}
2746
-#line 2771 "pikchr.c"
2778
+#line 2803 "pikchr.c"
27472779
break;
27482780
case 71: /* position ::= expr between position AND position */
2749
-#line 699 "pikchr.y"
2781
+#line 700 "pikchr.y"
27502782
{yylhsminor.yy63 = pik_position_between(yymsp[-4].minor.yy21,yymsp[-2].minor.yy63,yymsp[0].minor.yy63);}
2751
-#line 2776 "pikchr.c"
2783
+#line 2808 "pikchr.c"
27522784
yymsp[-4].minor.yy63 = yylhsminor.yy63;
27532785
break;
27542786
case 72: /* position ::= expr LT position COMMA position GT */
2755
-#line 701 "pikchr.y"
2787
+#line 702 "pikchr.y"
27562788
{yylhsminor.yy63 = pik_position_between(yymsp[-5].minor.yy21,yymsp[-3].minor.yy63,yymsp[-1].minor.yy63);}
2757
-#line 2782 "pikchr.c"
2789
+#line 2814 "pikchr.c"
27582790
yymsp[-5].minor.yy63 = yylhsminor.yy63;
27592791
break;
27602792
case 73: /* position ::= expr ABOVE position */
2761
-#line 702 "pikchr.y"
2793
+#line 703 "pikchr.y"
27622794
{yylhsminor.yy63=yymsp[0].minor.yy63; yylhsminor.yy63.y += yymsp[-2].minor.yy21;}
2763
-#line 2788 "pikchr.c"
2795
+#line 2820 "pikchr.c"
27642796
yymsp[-2].minor.yy63 = yylhsminor.yy63;
27652797
break;
27662798
case 74: /* position ::= expr BELOW position */
2767
-#line 703 "pikchr.y"
2799
+#line 704 "pikchr.y"
27682800
{yylhsminor.yy63=yymsp[0].minor.yy63; yylhsminor.yy63.y -= yymsp[-2].minor.yy21;}
2769
-#line 2794 "pikchr.c"
2801
+#line 2826 "pikchr.c"
27702802
yymsp[-2].minor.yy63 = yylhsminor.yy63;
27712803
break;
27722804
case 75: /* position ::= expr LEFT OF position */
2773
-#line 704 "pikchr.y"
2805
+#line 705 "pikchr.y"
27742806
{yylhsminor.yy63=yymsp[0].minor.yy63; yylhsminor.yy63.x -= yymsp[-3].minor.yy21;}
2775
-#line 2800 "pikchr.c"
2807
+#line 2832 "pikchr.c"
27762808
yymsp[-3].minor.yy63 = yylhsminor.yy63;
27772809
break;
27782810
case 76: /* position ::= expr RIGHT OF position */
2779
-#line 705 "pikchr.y"
2811
+#line 706 "pikchr.y"
27802812
{yylhsminor.yy63=yymsp[0].minor.yy63; yylhsminor.yy63.x += yymsp[-3].minor.yy21;}
2781
-#line 2806 "pikchr.c"
2813
+#line 2838 "pikchr.c"
27822814
yymsp[-3].minor.yy63 = yylhsminor.yy63;
27832815
break;
27842816
case 77: /* position ::= expr ON HEADING EDGEPT OF position */
2785
-#line 707 "pikchr.y"
2817
+#line 708 "pikchr.y"
27862818
{yylhsminor.yy63 = pik_position_at_hdg(yymsp[-5].minor.yy21,&yymsp[-2].minor.yy0,yymsp[0].minor.yy63);}
2787
-#line 2812 "pikchr.c"
2819
+#line 2844 "pikchr.c"
27882820
yymsp[-5].minor.yy63 = yylhsminor.yy63;
27892821
break;
27902822
case 78: /* position ::= expr HEADING EDGEPT OF position */
2791
-#line 709 "pikchr.y"
2823
+#line 710 "pikchr.y"
27922824
{yylhsminor.yy63 = pik_position_at_hdg(yymsp[-4].minor.yy21,&yymsp[-2].minor.yy0,yymsp[0].minor.yy63);}
2793
-#line 2818 "pikchr.c"
2825
+#line 2850 "pikchr.c"
27942826
yymsp[-4].minor.yy63 = yylhsminor.yy63;
27952827
break;
27962828
case 79: /* position ::= expr EDGEPT OF position */
2797
-#line 711 "pikchr.y"
2829
+#line 712 "pikchr.y"
27982830
{yylhsminor.yy63 = pik_position_at_hdg(yymsp[-3].minor.yy21,&yymsp[-2].minor.yy0,yymsp[0].minor.yy63);}
2799
-#line 2824 "pikchr.c"
2831
+#line 2856 "pikchr.c"
28002832
yymsp[-3].minor.yy63 = yylhsminor.yy63;
28012833
break;
28022834
case 80: /* position ::= expr ON HEADING expr FROM position */
2803
-#line 713 "pikchr.y"
2835
+#line 714 "pikchr.y"
28042836
{yylhsminor.yy63 = pik_position_at_angle(yymsp[-5].minor.yy21,yymsp[-2].minor.yy21,yymsp[0].minor.yy63);}
2805
-#line 2830 "pikchr.c"
2837
+#line 2862 "pikchr.c"
28062838
yymsp[-5].minor.yy63 = yylhsminor.yy63;
28072839
break;
28082840
case 81: /* position ::= expr HEADING expr FROM position */
2809
-#line 715 "pikchr.y"
2841
+#line 716 "pikchr.y"
28102842
{yylhsminor.yy63 = pik_position_at_angle(yymsp[-4].minor.yy21,yymsp[-2].minor.yy21,yymsp[0].minor.yy63);}
2811
-#line 2836 "pikchr.c"
2843
+#line 2868 "pikchr.c"
28122844
yymsp[-4].minor.yy63 = yylhsminor.yy63;
28132845
break;
28142846
case 82: /* place ::= edge OF object */
2815
-#line 727 "pikchr.y"
2847
+#line 728 "pikchr.y"
28162848
{yylhsminor.yy63 = pik_place_of_elem(p,yymsp[0].minor.yy162,&yymsp[-2].minor.yy0);}
2817
-#line 2842 "pikchr.c"
2849
+#line 2874 "pikchr.c"
28182850
yymsp[-2].minor.yy63 = yylhsminor.yy63;
28192851
break;
28202852
case 83: /* place2 ::= object */
2821
-#line 728 "pikchr.y"
2853
+#line 729 "pikchr.y"
28222854
{yylhsminor.yy63 = pik_place_of_elem(p,yymsp[0].minor.yy162,0);}
2823
-#line 2848 "pikchr.c"
2855
+#line 2880 "pikchr.c"
28242856
yymsp[0].minor.yy63 = yylhsminor.yy63;
28252857
break;
28262858
case 84: /* place2 ::= object DOT_E edge */
2827
-#line 729 "pikchr.y"
2859
+#line 730 "pikchr.y"
28282860
{yylhsminor.yy63 = pik_place_of_elem(p,yymsp[-2].minor.yy162,&yymsp[0].minor.yy0);}
2829
-#line 2854 "pikchr.c"
2861
+#line 2886 "pikchr.c"
28302862
yymsp[-2].minor.yy63 = yylhsminor.yy63;
28312863
break;
28322864
case 85: /* place2 ::= NTH VERTEX OF object */
2833
-#line 730 "pikchr.y"
2865
+#line 731 "pikchr.y"
28342866
{yylhsminor.yy63 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy162);}
2835
-#line 2860 "pikchr.c"
2867
+#line 2892 "pikchr.c"
28362868
yymsp[-3].minor.yy63 = yylhsminor.yy63;
28372869
break;
28382870
case 86: /* object ::= nth */
2839
-#line 742 "pikchr.y"
2871
+#line 743 "pikchr.y"
28402872
{yylhsminor.yy162 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2841
-#line 2866 "pikchr.c"
2873
+#line 2898 "pikchr.c"
28422874
yymsp[0].minor.yy162 = yylhsminor.yy162;
28432875
break;
28442876
case 87: /* object ::= nth OF|IN object */
2845
-#line 743 "pikchr.y"
2877
+#line 744 "pikchr.y"
28462878
{yylhsminor.yy162 = pik_find_nth(p,yymsp[0].minor.yy162,&yymsp[-2].minor.yy0);}
2847
-#line 2872 "pikchr.c"
2879
+#line 2904 "pikchr.c"
28482880
yymsp[-2].minor.yy162 = yylhsminor.yy162;
28492881
break;
28502882
case 88: /* objectname ::= THIS */
2851
-#line 745 "pikchr.y"
2883
+#line 746 "pikchr.y"
28522884
{yymsp[0].minor.yy162 = p->cur;}
2853
-#line 2878 "pikchr.c"
2885
+#line 2910 "pikchr.c"
28542886
break;
28552887
case 89: /* objectname ::= PLACENAME */
2856
-#line 746 "pikchr.y"
2888
+#line 747 "pikchr.y"
28572889
{yylhsminor.yy162 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2858
-#line 2883 "pikchr.c"
2890
+#line 2915 "pikchr.c"
28592891
yymsp[0].minor.yy162 = yylhsminor.yy162;
28602892
break;
28612893
case 90: /* objectname ::= objectname DOT_U PLACENAME */
2862
-#line 748 "pikchr.y"
2894
+#line 749 "pikchr.y"
28632895
{yylhsminor.yy162 = pik_find_byname(p,yymsp[-2].minor.yy162,&yymsp[0].minor.yy0);}
2864
-#line 2889 "pikchr.c"
2896
+#line 2921 "pikchr.c"
28652897
yymsp[-2].minor.yy162 = yylhsminor.yy162;
28662898
break;
28672899
case 91: /* nth ::= NTH CLASSNAME */
2868
-#line 750 "pikchr.y"
2900
+#line 751 "pikchr.y"
28692901
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2870
-#line 2895 "pikchr.c"
2902
+#line 2927 "pikchr.c"
28712903
yymsp[-1].minor.yy0 = yylhsminor.yy0;
28722904
break;
28732905
case 92: /* nth ::= NTH LAST CLASSNAME */
2874
-#line 751 "pikchr.y"
2906
+#line 752 "pikchr.y"
28752907
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2876
-#line 2901 "pikchr.c"
2908
+#line 2933 "pikchr.c"
28772909
yymsp[-2].minor.yy0 = yylhsminor.yy0;
28782910
break;
28792911
case 93: /* nth ::= LAST CLASSNAME */
2880
-#line 752 "pikchr.y"
2912
+#line 753 "pikchr.y"
28812913
{yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2882
-#line 2907 "pikchr.c"
2914
+#line 2939 "pikchr.c"
28832915
break;
28842916
case 94: /* nth ::= LAST */
2885
-#line 753 "pikchr.y"
2917
+#line 754 "pikchr.y"
28862918
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2887
-#line 2912 "pikchr.c"
2919
+#line 2944 "pikchr.c"
28882920
yymsp[0].minor.yy0 = yylhsminor.yy0;
28892921
break;
28902922
case 95: /* nth ::= NTH LB RB */
2891
-#line 754 "pikchr.y"
2923
+#line 755 "pikchr.y"
28922924
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2893
-#line 2918 "pikchr.c"
2925
+#line 2950 "pikchr.c"
28942926
yymsp[-2].minor.yy0 = yylhsminor.yy0;
28952927
break;
28962928
case 96: /* nth ::= NTH LAST LB RB */
2897
-#line 755 "pikchr.y"
2929
+#line 756 "pikchr.y"
28982930
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2899
-#line 2924 "pikchr.c"
2931
+#line 2956 "pikchr.c"
29002932
yymsp[-3].minor.yy0 = yylhsminor.yy0;
29012933
break;
29022934
case 97: /* nth ::= LAST LB RB */
2903
-#line 756 "pikchr.y"
2935
+#line 757 "pikchr.y"
29042936
{yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2905
-#line 2930 "pikchr.c"
2937
+#line 2962 "pikchr.c"
29062938
break;
29072939
case 98: /* expr ::= expr PLUS expr */
2908
-#line 758 "pikchr.y"
2940
+#line 759 "pikchr.y"
29092941
{yylhsminor.yy21=yymsp[-2].minor.yy21+yymsp[0].minor.yy21;}
2910
-#line 2935 "pikchr.c"
2942
+#line 2967 "pikchr.c"
29112943
yymsp[-2].minor.yy21 = yylhsminor.yy21;
29122944
break;
29132945
case 99: /* expr ::= expr MINUS expr */
2914
-#line 759 "pikchr.y"
2946
+#line 760 "pikchr.y"
29152947
{yylhsminor.yy21=yymsp[-2].minor.yy21-yymsp[0].minor.yy21;}
2916
-#line 2941 "pikchr.c"
2948
+#line 2973 "pikchr.c"
29172949
yymsp[-2].minor.yy21 = yylhsminor.yy21;
29182950
break;
29192951
case 100: /* expr ::= expr STAR expr */
2920
-#line 760 "pikchr.y"
2952
+#line 761 "pikchr.y"
29212953
{yylhsminor.yy21=yymsp[-2].minor.yy21*yymsp[0].minor.yy21;}
2922
-#line 2947 "pikchr.c"
2954
+#line 2979 "pikchr.c"
29232955
yymsp[-2].minor.yy21 = yylhsminor.yy21;
29242956
break;
29252957
case 101: /* expr ::= expr SLASH expr */
2926
-#line 761 "pikchr.y"
2958
+#line 762 "pikchr.y"
29272959
{
29282960
if( yymsp[0].minor.yy21==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy21 = 0.0; }
29292961
else{ yylhsminor.yy21 = yymsp[-2].minor.yy21/yymsp[0].minor.yy21; }
29302962
}
2931
-#line 2956 "pikchr.c"
2963
+#line 2988 "pikchr.c"
29322964
yymsp[-2].minor.yy21 = yylhsminor.yy21;
29332965
break;
29342966
case 102: /* expr ::= MINUS expr */
2935
-#line 765 "pikchr.y"
2967
+#line 766 "pikchr.y"
29362968
{yymsp[-1].minor.yy21=-yymsp[0].minor.yy21;}
2937
-#line 2962 "pikchr.c"
2969
+#line 2994 "pikchr.c"
29382970
break;
29392971
case 103: /* expr ::= PLUS expr */
2940
-#line 766 "pikchr.y"
2972
+#line 767 "pikchr.y"
29412973
{yymsp[-1].minor.yy21=yymsp[0].minor.yy21;}
2942
-#line 2967 "pikchr.c"
2974
+#line 2999 "pikchr.c"
29432975
break;
29442976
case 104: /* expr ::= LP expr RP */
2945
-#line 767 "pikchr.y"
2977
+#line 768 "pikchr.y"
29462978
{yymsp[-2].minor.yy21=yymsp[-1].minor.yy21;}
2947
-#line 2972 "pikchr.c"
2979
+#line 3004 "pikchr.c"
29482980
break;
29492981
case 105: /* expr ::= LP FILL|COLOR|THICKNESS RP */
2950
-#line 768 "pikchr.y"
2982
+#line 769 "pikchr.y"
29512983
{yymsp[-2].minor.yy21=pik_get_var(p,&yymsp[-1].minor.yy0);}
2952
-#line 2977 "pikchr.c"
2984
+#line 3009 "pikchr.c"
29532985
break;
29542986
case 106: /* expr ::= NUMBER */
2955
-#line 769 "pikchr.y"
2987
+#line 770 "pikchr.y"
29562988
{yylhsminor.yy21=pik_atof(&yymsp[0].minor.yy0);}
2957
-#line 2982 "pikchr.c"
2989
+#line 3014 "pikchr.c"
29582990
yymsp[0].minor.yy21 = yylhsminor.yy21;
29592991
break;
29602992
case 107: /* expr ::= ID */
2961
-#line 770 "pikchr.y"
2993
+#line 771 "pikchr.y"
29622994
{yylhsminor.yy21=pik_get_var(p,&yymsp[0].minor.yy0);}
2963
-#line 2988 "pikchr.c"
2995
+#line 3020 "pikchr.c"
29642996
yymsp[0].minor.yy21 = yylhsminor.yy21;
29652997
break;
29662998
case 108: /* expr ::= FUNC1 LP expr RP */
2967
-#line 771 "pikchr.y"
2999
+#line 772 "pikchr.y"
29683000
{yylhsminor.yy21 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy21,0.0);}
2969
-#line 2994 "pikchr.c"
3001
+#line 3026 "pikchr.c"
29703002
yymsp[-3].minor.yy21 = yylhsminor.yy21;
29713003
break;
29723004
case 109: /* expr ::= FUNC2 LP expr COMMA expr RP */
2973
-#line 772 "pikchr.y"
3005
+#line 773 "pikchr.y"
29743006
{yylhsminor.yy21 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy21,yymsp[-1].minor.yy21);}
2975
-#line 3000 "pikchr.c"
3007
+#line 3032 "pikchr.c"
29763008
yymsp[-5].minor.yy21 = yylhsminor.yy21;
29773009
break;
29783010
case 110: /* expr ::= DIST LP position COMMA position RP */
2979
-#line 773 "pikchr.y"
3011
+#line 774 "pikchr.y"
29803012
{yymsp[-5].minor.yy21 = pik_dist(&yymsp[-3].minor.yy63,&yymsp[-1].minor.yy63);}
2981
-#line 3006 "pikchr.c"
3013
+#line 3038 "pikchr.c"
29823014
break;
29833015
case 111: /* expr ::= place2 DOT_XY X */
2984
-#line 774 "pikchr.y"
3016
+#line 775 "pikchr.y"
29853017
{yylhsminor.yy21 = yymsp[-2].minor.yy63.x;}
2986
-#line 3011 "pikchr.c"
3018
+#line 3043 "pikchr.c"
29873019
yymsp[-2].minor.yy21 = yylhsminor.yy21;
29883020
break;
29893021
case 112: /* expr ::= place2 DOT_XY Y */
2990
-#line 775 "pikchr.y"
3022
+#line 776 "pikchr.y"
29913023
{yylhsminor.yy21 = yymsp[-2].minor.yy63.y;}
2992
-#line 3017 "pikchr.c"
3024
+#line 3049 "pikchr.c"
29933025
yymsp[-2].minor.yy21 = yylhsminor.yy21;
29943026
break;
29953027
case 113: /* expr ::= object DOT_L numproperty */
29963028
case 114: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==114);
29973029
case 115: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==115);
2998
-#line 776 "pikchr.y"
3030
+#line 777 "pikchr.y"
29993031
{yylhsminor.yy21=pik_property_of(yymsp[-2].minor.yy162,&yymsp[0].minor.yy0);}
3000
-#line 3025 "pikchr.c"
3032
+#line 3057 "pikchr.c"
30013033
yymsp[-2].minor.yy21 = yylhsminor.yy21;
30023034
break;
30033035
default:
30043036
/* (116) lvalue ::= ID */ yytestcase(yyruleno==116);
30053037
/* (117) lvalue ::= FILL */ yytestcase(yyruleno==117);
@@ -3098,19 +3130,19 @@
30983130
){
30993131
pik_parserARG_FETCH
31003132
pik_parserCTX_FETCH
31013133
#define TOKEN yyminor
31023134
/************ Begin %syntax_error code ****************************************/
3103
-#line 536 "pikchr.y"
3135
+#line 537 "pikchr.y"
31043136
31053137
if( TOKEN.z && TOKEN.z[0] ){
31063138
pik_error(p, &TOKEN, "syntax error");
31073139
}else{
31083140
pik_error(p, 0, "syntax error");
31093141
}
31103142
UNUSED_PARAMETER(yymajor);
3111
-#line 3136 "pikchr.c"
3143
+#line 3168 "pikchr.c"
31123144
/************ End %syntax_error code ******************************************/
31133145
pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
31143146
pik_parserCTX_STORE
31153147
}
31163148
@@ -3227,23 +3259,16 @@
32273259
yypParser->yyhwm++;
32283260
assert( yypParser->yyhwm ==
32293261
(int)(yypParser->yytos - yypParser->yystack));
32303262
}
32313263
#endif
3232
-#if YYSTACKDEPTH>0
32333264
if( yypParser->yytos>=yypParser->yystackEnd ){
3234
- yyStackOverflow(yypParser);
3235
- break;
3236
- }
3237
-#else
3238
- if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz-1] ){
32393265
if( yyGrowStack(yypParser) ){
32403266
yyStackOverflow(yypParser);
32413267
break;
32423268
}
32433269
}
3244
-#endif
32453270
}
32463271
yyact = yy_reduce(yypParser,yyruleno,yymajor,yyminor pik_parserCTX_PARAM);
32473272
}else if( yyact <= YY_MAX_SHIFTREDUCE ){
32483273
yy_shift(yypParser,yyact,(YYCODETYPE)yymajor,yyminor);
32493274
#ifndef YYNOERRORRECOVERY
@@ -3382,11 +3407,11 @@
33823407
#else
33833408
(void)iToken;
33843409
return 0;
33853410
#endif
33863411
}
3387
-#line 781 "pikchr.y"
3412
+#line 782 "pikchr.y"
33883413
33893414
33903415
33913416
/* Chart of the 148 official CSS color names with their
33923417
** corresponding RGB values thru Color Module Level 4:
@@ -3963,10 +3988,11 @@
39633988
39643989
/* Methods for the "diamond" class */
39653990
static void diamondInit(Pik *p, PObj *pObj){
39663991
pObj->w = pik_value(p, "diamondwid",10,0);
39673992
pObj->h = pik_value(p, "diamondht",9,0);
3993
+ pObj->bAltAutoFit = 1;
39683994
}
39693995
/* Return offset from the center of the box to the compass point
39703996
** given by parameter cp */
39713997
static PPoint diamondOffset(Pik *p, PObj *pObj, int cp){
39723998
PPoint pt = cZeroPoint;
@@ -3988,10 +4014,12 @@
39884014
}
39894015
UNUSED_PARAMETER(p);
39904016
return pt;
39914017
}
39924018
static void diamondFit(Pik *p, PObj *pObj, PNum w, PNum h){
4019
+ if( pObj->w<=0 ) pObj->w = w*1.5;
4020
+ if( pObj->h<=0 ) pObj->h = h*1.5;
39934021
if( pObj->w>0 && pObj->h>0 ){
39944022
PNum x = pObj->w*h/pObj->h + w;
39954023
PNum y = pObj->h*x/pObj->w;
39964024
pObj->w = x;
39974025
pObj->h = y;
@@ -6334,12 +6362,16 @@
63346362
}
63356363
if( pObj->type->xFit==0 ) return;
63366364
pik_bbox_init(&bbox);
63376365
pik_compute_layout_settings(p);
63386366
pik_append_txt(p, pObj, &bbox);
6339
- w = (eWhich & 1)!=0 ? (bbox.ne.x - bbox.sw.x) + p->charWidth : 0;
6340
- if( eWhich & 2 ){
6367
+ if( (eWhich & 1)!=0 || pObj->bAltAutoFit ){
6368
+ w = (bbox.ne.x - bbox.sw.x) + p->charWidth;
6369
+ }else{
6370
+ w = 0;
6371
+ }
6372
+ if( (eWhich & 2)!=0 || pObj->bAltAutoFit ){
63416373
PNum h1, h2;
63426374
h1 = (bbox.ne.y - pObj->ptAt.y);
63436375
h2 = (pObj->ptAt.y - bbox.sw.y);
63446376
h = 2.0*( h1<h2 ? h2 : h1 ) + 0.5*p->charHeight;
63456377
}else{
@@ -8208,6 +8240,6 @@
82088240
82098241
82108242
#endif /* PIKCHR_TCL */
82118243
82128244
8213
-#line 8238 "pikchr.c"
8245
+#line 8270 "pikchr.c"
82148246
--- extsrc/pikchr.c
+++ extsrc/pikchr.c
@@ -1,7 +1,8 @@
1 /* This file is automatically generated by Lemon from input grammar
2 ** source file "pikchr.y". */
 
3 /*
4 ** Zero-Clause BSD license:
5 **
6 ** Copyright (C) 2020-09-01 by D. Richard Hipp <[email protected]>
7 **
@@ -319,10 +320,11 @@
319 char cw; /* True for clockwise arc */
320 char larrow; /* Arrow at beginning (<- or <->) */
321 char rarrow; /* Arrow at end (-> or <->) */
322 char bClose; /* True if "close" is seen */
323 char bChop; /* True if "chop" is seen */
 
324 unsigned char nTxt; /* Number of text values */
325 unsigned mProp; /* Masks of properties set so far */
326 unsigned mCalc; /* Values computed from other constraints */
327 PToken aTxt[5]; /* Text with .eCode holding TP flags */
328 int iLayer; /* Rendering order */
@@ -490,11 +492,11 @@
490 static PObj *pik_position_assert(Pik*,PPoint*,PToken*,PPoint*);
491 static PNum pik_dist(PPoint*,PPoint*);
492 static void pik_add_macro(Pik*,PToken *pId,PToken *pCode);
493
494
495 #line 521 "pikchr.c"
496 /**************** End of %include directives **********************************/
497 /* These constants specify the various numeric values for terminal symbols.
498 ***************** Begin token definitions *************************************/
499 #ifndef T_ID
500 #define T_ID 1
@@ -634,10 +636,13 @@
634 ** pik_parserARG_PDECL A parameter declaration for the %extra_argument
635 ** pik_parserARG_PARAM Code to pass %extra_argument as a subroutine parameter
636 ** pik_parserARG_STORE Code to store %extra_argument into yypParser
637 ** pik_parserARG_FETCH Code to extract %extra_argument from yypParser
638 ** pik_parserCTX_* As pik_parserARG_ except for %extra_context
 
 
 
639 ** YYERRORSYMBOL is the code number of the error symbol. If not
640 ** defined, then do no error processing.
641 ** YYNSTATE the combined number of states.
642 ** YYNRULE the number of rules in the grammar
643 ** YYNTOKEN Number of terminal symbols
@@ -647,10 +652,12 @@
647 ** YY_ERROR_ACTION The yy_action[] code for syntax error
648 ** YY_ACCEPT_ACTION The yy_action[] code for accept
649 ** YY_NO_ACTION The yy_action[] code for no-op
650 ** YY_MIN_REDUCE Minimum value for reduce actions
651 ** YY_MAX_REDUCE Maximum value for reduce actions
 
 
652 */
653 #ifndef INTERFACE
654 # define INTERFACE 1
655 #endif
656 /************* Begin control #defines *****************************************/
@@ -674,10 +681,13 @@
674 #define pik_parserARG_SDECL
675 #define pik_parserARG_PDECL
676 #define pik_parserARG_PARAM
677 #define pik_parserARG_FETCH
678 #define pik_parserARG_STORE
 
 
 
679 #define pik_parserCTX_SDECL Pik *p;
680 #define pik_parserCTX_PDECL ,Pik *p
681 #define pik_parserCTX_PARAM ,p
682 #define pik_parserCTX_FETCH Pik *p=yypParser->p;
683 #define pik_parserCTX_STORE yypParser->p=p;
@@ -692,10 +702,12 @@
692 #define YY_ERROR_ACTION 443
693 #define YY_ACCEPT_ACTION 444
694 #define YY_NO_ACTION 445
695 #define YY_MIN_REDUCE 446
696 #define YY_MAX_REDUCE 601
 
 
697 /************* End control #defines *******************************************/
698 #define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0])))
699
700 /* Define the yytestcase() macro to be a no-op if is not already defined
701 ** otherwise.
@@ -706,10 +718,26 @@
706 ** for testing.
707 */
708 #ifndef yytestcase
709 # define yytestcase(X)
710 #endif
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
711
712
713 /* Next are the tables used to determine what action to take based on the
714 ** current state and lookahead token. These tables are used to implement
715 ** functions that take a state number and lookahead value and return an
@@ -1250,18 +1278,13 @@
1250 #ifndef YYNOERRORRECOVERY
1251 int yyerrcnt; /* Shifts left before out of the error */
1252 #endif
1253 pik_parserARG_SDECL /* A place to hold %extra_argument */
1254 pik_parserCTX_SDECL /* A place to hold %extra_context */
1255 #if YYSTACKDEPTH<=0
1256 int yystksz; /* Current side of the stack */
1257 yyStackEntry *yystack; /* The parser's stack */
1258 yyStackEntry yystk0; /* First stack entry */
1259 #else
1260 yyStackEntry yystack[YYSTACKDEPTH]; /* The parser's stack */
1261 yyStackEntry *yystackEnd; /* Last entry in the stack */
1262 #endif
1263 };
1264 typedef struct yyParser yyParser;
1265
1266 #include <assert.h>
1267 #ifndef NDEBUG
@@ -1601,41 +1624,49 @@
1601 /* 155 */ "object ::= objectname",
1602 };
1603 #endif /* NDEBUG */
1604
1605
1606 #if YYSTACKDEPTH<=0
1607 /*
1608 ** Try to increase the size of the parser stack. Return the number
1609 ** of errors. Return 0 on success.
1610 */
1611 static int yyGrowStack(yyParser *p){
 
1612 int newSize;
1613 int idx;
1614 yyStackEntry *pNew;
1615
1616 newSize = p->yystksz*2 + 100;
1617 idx = p->yytos ? (int)(p->yytos - p->yystack) : 0;
1618 if( p->yystack==&p->yystk0 ){
1619 pNew = malloc(newSize*sizeof(pNew[0]));
1620 if( pNew ) pNew[0] = p->yystk0;
 
1621 }else{
1622 pNew = realloc(p->yystack, newSize*sizeof(pNew[0]));
 
1623 }
1624 if( pNew ){
1625 p->yystack = pNew;
1626 p->yytos = &p->yystack[idx];
1627 #ifndef NDEBUG
1628 if( yyTraceFILE ){
1629 fprintf(yyTraceFILE,"%sStack grows from %d to %d entries.\n",
1630 yyTracePrompt, p->yystksz, newSize);
1631 }
1632 #endif
1633 p->yystksz = newSize;
1634 }
1635 return pNew==0;
1636 }
 
 
 
 
 
 
 
1637 #endif
1638
1639 /* Datatype of the argument to the memory allocated passed as the
1640 ** second argument to pik_parserAlloc() below. This can be changed by
1641 ** putting an appropriate #define in the %include section of the input
@@ -1651,28 +1682,18 @@
1651 yyParser *yypParser = (yyParser*)yypRawParser;
1652 pik_parserCTX_STORE
1653 #ifdef YYTRACKMAXSTACKDEPTH
1654 yypParser->yyhwm = 0;
1655 #endif
1656 #if YYSTACKDEPTH<=0
1657 yypParser->yytos = NULL;
1658 yypParser->yystack = NULL;
1659 yypParser->yystksz = 0;
1660 if( yyGrowStack(yypParser) ){
1661 yypParser->yystack = &yypParser->yystk0;
1662 yypParser->yystksz = 1;
1663 }
1664 #endif
1665 #ifndef YYNOERRORRECOVERY
1666 yypParser->yyerrcnt = -1;
1667 #endif
1668 yypParser->yytos = yypParser->yystack;
1669 yypParser->yystack[0].stateno = 0;
1670 yypParser->yystack[0].major = 0;
1671 #if YYSTACKDEPTH>0
1672 yypParser->yystackEnd = &yypParser->yystack[YYSTACKDEPTH-1];
1673 #endif
1674 }
1675
1676 #ifndef pik_parser_ENGINEALWAYSONSTACK
1677 /*
1678 ** This function allocates a new parser.
@@ -1724,22 +1745,22 @@
1724 ** inside the C code.
1725 */
1726 /********* Begin destructor definitions ***************************************/
1727 case 100: /* statement_list */
1728 {
1729 #line 510 "pikchr.y"
1730 pik_elist_free(p,(yypminor->yy235));
1731 #line 1756 "pikchr.c"
1732 }
1733 break;
1734 case 101: /* statement */
1735 case 102: /* unnamed_statement */
1736 case 103: /* basetype */
1737 {
1738 #line 512 "pikchr.y"
1739 pik_elem_free(p,(yypminor->yy162));
1740 #line 1765 "pikchr.c"
1741 }
1742 break;
1743 /********* End destructor definitions *****************************************/
1744 default: break; /* If no destructor action specified: do nothing */
1745 }
@@ -1769,13 +1790,30 @@
1769 /*
1770 ** Clear all secondary memory allocations from the parser
1771 */
1772 void pik_parserFinalize(void *p){
1773 yyParser *pParser = (yyParser*)p;
1774 while( pParser->yytos>pParser->yystack ) yy_pop_parser_stack(pParser);
1775 #if YYSTACKDEPTH<=0
1776 if( pParser->yystack!=&pParser->yystk0 ) free(pParser->yystack);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1777 #endif
1778 }
1779
1780 #ifndef pik_parser_ENGINEALWAYSONSTACK
1781 /*
@@ -1953,14 +1991,14 @@
1953 #endif
1954 while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
1955 /* Here code is inserted which will execute if the parser
1956 ** stack every overflows */
1957 /******** Begin %stack_overflow code ******************************************/
1958 #line 544 "pikchr.y"
1959
1960 pik_error(p, 0, "parser stack overflow");
1961 #line 1986 "pikchr.c"
1962 /******** End %stack_overflow code ********************************************/
1963 pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
1964 pik_parserCTX_STORE
1965 }
1966
@@ -2000,29 +2038,23 @@
2000 if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){
2001 yypParser->yyhwm++;
2002 assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack) );
2003 }
2004 #endif
2005 #if YYSTACKDEPTH>0
2006 if( yypParser->yytos>yypParser->yystackEnd ){
2007 yypParser->yytos--;
2008 yyStackOverflow(yypParser);
2009 return;
2010 }
2011 #else
2012 if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz] ){
2013 if( yyGrowStack(yypParser) ){
2014 yypParser->yytos--;
2015 yyStackOverflow(yypParser);
2016 return;
2017 }
 
 
2018 }
2019 #endif
2020 if( yyNewState > YY_MAX_SHIFT ){
2021 yyNewState += YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE;
2022 }
2023 yytos = yypParser->yytos;
2024 yytos->stateno = yyNewState;
2025 yytos->major = yyMajor;
2026 yytos->minor.yy0 = yyMinor;
2027 yyTraceShift(yypParser, yyNewState, "Shift");
2028 }
@@ -2387,619 +2419,619 @@
2387 ** break;
2388 */
2389 /********** Begin reduce actions **********************************************/
2390 YYMINORTYPE yylhsminor;
2391 case 0: /* document ::= statement_list */
2392 #line 548 "pikchr.y"
2393 {pik_render(p,yymsp[0].minor.yy235);}
2394 #line 2419 "pikchr.c"
2395 break;
2396 case 1: /* statement_list ::= statement */
2397 #line 551 "pikchr.y"
2398 { yylhsminor.yy235 = pik_elist_append(p,0,yymsp[0].minor.yy162); }
2399 #line 2424 "pikchr.c"
2400 yymsp[0].minor.yy235 = yylhsminor.yy235;
2401 break;
2402 case 2: /* statement_list ::= statement_list EOL statement */
2403 #line 553 "pikchr.y"
2404 { yylhsminor.yy235 = pik_elist_append(p,yymsp[-2].minor.yy235,yymsp[0].minor.yy162); }
2405 #line 2430 "pikchr.c"
2406 yymsp[-2].minor.yy235 = yylhsminor.yy235;
2407 break;
2408 case 3: /* statement ::= */
2409 #line 556 "pikchr.y"
2410 { yymsp[1].minor.yy162 = 0; }
2411 #line 2436 "pikchr.c"
2412 break;
2413 case 4: /* statement ::= direction */
2414 #line 557 "pikchr.y"
2415 { pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy162=0; }
2416 #line 2441 "pikchr.c"
2417 yymsp[0].minor.yy162 = yylhsminor.yy162;
2418 break;
2419 case 5: /* statement ::= lvalue ASSIGN rvalue */
2420 #line 558 "pikchr.y"
2421 {pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy21,&yymsp[-1].minor.yy0); yylhsminor.yy162=0;}
2422 #line 2447 "pikchr.c"
2423 yymsp[-2].minor.yy162 = yylhsminor.yy162;
2424 break;
2425 case 6: /* statement ::= PLACENAME COLON unnamed_statement */
2426 #line 560 "pikchr.y"
2427 { yylhsminor.yy162 = yymsp[0].minor.yy162; pik_elem_setname(p,yymsp[0].minor.yy162,&yymsp[-2].minor.yy0); }
2428 #line 2453 "pikchr.c"
2429 yymsp[-2].minor.yy162 = yylhsminor.yy162;
2430 break;
2431 case 7: /* statement ::= PLACENAME COLON position */
2432 #line 562 "pikchr.y"
2433 { yylhsminor.yy162 = pik_elem_new(p,0,0,0);
2434 if(yylhsminor.yy162){ yylhsminor.yy162->ptAt = yymsp[0].minor.yy63; pik_elem_setname(p,yylhsminor.yy162,&yymsp[-2].minor.yy0); }}
2435 #line 2460 "pikchr.c"
2436 yymsp[-2].minor.yy162 = yylhsminor.yy162;
2437 break;
2438 case 8: /* statement ::= unnamed_statement */
2439 #line 564 "pikchr.y"
2440 {yylhsminor.yy162 = yymsp[0].minor.yy162;}
2441 #line 2466 "pikchr.c"
2442 yymsp[0].minor.yy162 = yylhsminor.yy162;
2443 break;
2444 case 9: /* statement ::= print prlist */
2445 #line 565 "pikchr.y"
2446 {pik_append(p,"<br>\n",5); yymsp[-1].minor.yy162=0;}
2447 #line 2472 "pikchr.c"
2448 break;
2449 case 10: /* statement ::= ASSERT LP expr EQ expr RP */
2450 #line 570 "pikchr.y"
2451 {yymsp[-5].minor.yy162=pik_assert(p,yymsp[-3].minor.yy21,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy21);}
2452 #line 2477 "pikchr.c"
2453 break;
2454 case 11: /* statement ::= ASSERT LP position EQ position RP */
2455 #line 572 "pikchr.y"
2456 {yymsp[-5].minor.yy162=pik_position_assert(p,&yymsp[-3].minor.yy63,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy63);}
2457 #line 2482 "pikchr.c"
2458 break;
2459 case 12: /* statement ::= DEFINE ID CODEBLOCK */
2460 #line 573 "pikchr.y"
2461 {yymsp[-2].minor.yy162=0; pik_add_macro(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
2462 #line 2487 "pikchr.c"
2463 break;
2464 case 13: /* rvalue ::= PLACENAME */
2465 #line 584 "pikchr.y"
2466 {yylhsminor.yy21 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2467 #line 2492 "pikchr.c"
2468 yymsp[0].minor.yy21 = yylhsminor.yy21;
2469 break;
2470 case 14: /* pritem ::= FILL */
2471 case 15: /* pritem ::= COLOR */ yytestcase(yyruleno==15);
2472 case 16: /* pritem ::= THICKNESS */ yytestcase(yyruleno==16);
2473 #line 589 "pikchr.y"
2474 {pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2475 #line 2500 "pikchr.c"
2476 break;
2477 case 17: /* pritem ::= rvalue */
2478 #line 592 "pikchr.y"
2479 {pik_append_num(p,"",yymsp[0].minor.yy21);}
2480 #line 2505 "pikchr.c"
2481 break;
2482 case 18: /* pritem ::= STRING */
2483 #line 593 "pikchr.y"
2484 {pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2485 #line 2510 "pikchr.c"
2486 break;
2487 case 19: /* prsep ::= COMMA */
2488 #line 594 "pikchr.y"
2489 {pik_append(p, " ", 1);}
2490 #line 2515 "pikchr.c"
2491 break;
2492 case 20: /* unnamed_statement ::= basetype attribute_list */
2493 #line 597 "pikchr.y"
2494 {yylhsminor.yy162 = yymsp[-1].minor.yy162; pik_after_adding_attributes(p,yylhsminor.yy162);}
2495 #line 2520 "pikchr.c"
2496 yymsp[-1].minor.yy162 = yylhsminor.yy162;
2497 break;
2498 case 21: /* basetype ::= CLASSNAME */
2499 #line 599 "pikchr.y"
2500 {yylhsminor.yy162 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2501 #line 2526 "pikchr.c"
2502 yymsp[0].minor.yy162 = yylhsminor.yy162;
2503 break;
2504 case 22: /* basetype ::= STRING textposition */
2505 #line 601 "pikchr.y"
2506 {yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy188; yylhsminor.yy162 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2507 #line 2532 "pikchr.c"
2508 yymsp[-1].minor.yy162 = yylhsminor.yy162;
2509 break;
2510 case 23: /* basetype ::= LB savelist statement_list RB */
2511 #line 603 "pikchr.y"
2512 { p->list = yymsp[-2].minor.yy235; yymsp[-3].minor.yy162 = pik_elem_new(p,0,0,yymsp[-1].minor.yy235); if(yymsp[-3].minor.yy162) yymsp[-3].minor.yy162->errTok = yymsp[0].minor.yy0; }
2513 #line 2538 "pikchr.c"
2514 break;
2515 case 24: /* savelist ::= */
2516 #line 608 "pikchr.y"
2517 {yymsp[1].minor.yy235 = p->list; p->list = 0;}
2518 #line 2543 "pikchr.c"
2519 break;
2520 case 25: /* relexpr ::= expr */
2521 #line 615 "pikchr.y"
2522 {yylhsminor.yy72.rAbs = yymsp[0].minor.yy21; yylhsminor.yy72.rRel = 0;}
2523 #line 2548 "pikchr.c"
2524 yymsp[0].minor.yy72 = yylhsminor.yy72;
2525 break;
2526 case 26: /* relexpr ::= expr PERCENT */
2527 #line 616 "pikchr.y"
2528 {yylhsminor.yy72.rAbs = 0; yylhsminor.yy72.rRel = yymsp[-1].minor.yy21/100;}
2529 #line 2554 "pikchr.c"
2530 yymsp[-1].minor.yy72 = yylhsminor.yy72;
2531 break;
2532 case 27: /* optrelexpr ::= */
2533 #line 618 "pikchr.y"
2534 {yymsp[1].minor.yy72.rAbs = 0; yymsp[1].minor.yy72.rRel = 1.0;}
2535 #line 2560 "pikchr.c"
2536 break;
2537 case 28: /* attribute_list ::= relexpr alist */
2538 #line 620 "pikchr.y"
2539 {pik_add_direction(p,0,&yymsp[-1].minor.yy72);}
2540 #line 2565 "pikchr.c"
2541 break;
2542 case 29: /* attribute ::= numproperty relexpr */
2543 #line 624 "pikchr.y"
2544 { pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy72); }
2545 #line 2570 "pikchr.c"
2546 break;
2547 case 30: /* attribute ::= dashproperty expr */
2548 #line 625 "pikchr.y"
2549 { pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy21); }
2550 #line 2575 "pikchr.c"
2551 break;
2552 case 31: /* attribute ::= dashproperty */
2553 #line 626 "pikchr.y"
2554 { pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2555 #line 2580 "pikchr.c"
2556 break;
2557 case 32: /* attribute ::= colorproperty rvalue */
2558 #line 627 "pikchr.y"
2559 { pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy21); }
2560 #line 2585 "pikchr.c"
2561 break;
2562 case 33: /* attribute ::= go direction optrelexpr */
2563 #line 628 "pikchr.y"
2564 { pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy72);}
2565 #line 2590 "pikchr.c"
2566 break;
2567 case 34: /* attribute ::= go direction even position */
2568 #line 629 "pikchr.y"
2569 {pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy63);}
2570 #line 2595 "pikchr.c"
2571 break;
2572 case 35: /* attribute ::= CLOSE */
2573 #line 630 "pikchr.y"
2574 { pik_close_path(p,&yymsp[0].minor.yy0); }
2575 #line 2600 "pikchr.c"
2576 break;
2577 case 36: /* attribute ::= CHOP */
2578 #line 631 "pikchr.y"
2579 { p->cur->bChop = 1; }
2580 #line 2605 "pikchr.c"
2581 break;
2582 case 37: /* attribute ::= FROM position */
2583 #line 632 "pikchr.y"
2584 { pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy63); }
2585 #line 2610 "pikchr.c"
2586 break;
2587 case 38: /* attribute ::= TO position */
2588 #line 633 "pikchr.y"
2589 { pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy63); }
2590 #line 2615 "pikchr.c"
2591 break;
2592 case 39: /* attribute ::= THEN */
2593 #line 634 "pikchr.y"
2594 { pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2595 #line 2620 "pikchr.c"
2596 break;
2597 case 40: /* attribute ::= THEN optrelexpr HEADING expr */
2598 case 42: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==42);
2599 #line 636 "pikchr.y"
2600 {pik_move_hdg(p,&yymsp[-2].minor.yy72,&yymsp[-1].minor.yy0,yymsp[0].minor.yy21,0,&yymsp[-3].minor.yy0);}
2601 #line 2626 "pikchr.c"
2602 break;
2603 case 41: /* attribute ::= THEN optrelexpr EDGEPT */
2604 case 43: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==43);
2605 #line 637 "pikchr.y"
2606 {pik_move_hdg(p,&yymsp[-1].minor.yy72,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2607 #line 2632 "pikchr.c"
2608 break;
2609 case 44: /* attribute ::= AT position */
2610 #line 642 "pikchr.y"
2611 { pik_set_at(p,0,&yymsp[0].minor.yy63,&yymsp[-1].minor.yy0); }
2612 #line 2637 "pikchr.c"
2613 break;
2614 case 45: /* attribute ::= SAME */
2615 #line 644 "pikchr.y"
2616 {pik_same(p,0,&yymsp[0].minor.yy0);}
2617 #line 2642 "pikchr.c"
2618 break;
2619 case 46: /* attribute ::= SAME AS object */
2620 #line 645 "pikchr.y"
2621 {pik_same(p,yymsp[0].minor.yy162,&yymsp[-2].minor.yy0);}
2622 #line 2647 "pikchr.c"
2623 break;
2624 case 47: /* attribute ::= STRING textposition */
2625 #line 646 "pikchr.y"
2626 {pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy188);}
2627 #line 2652 "pikchr.c"
2628 break;
2629 case 48: /* attribute ::= FIT */
2630 #line 647 "pikchr.y"
2631 {pik_size_to_fit(p,&yymsp[0].minor.yy0,3); }
2632 #line 2657 "pikchr.c"
2633 break;
2634 case 49: /* attribute ::= BEHIND object */
2635 #line 648 "pikchr.y"
2636 {pik_behind(p,yymsp[0].minor.yy162);}
2637 #line 2662 "pikchr.c"
2638 break;
2639 case 50: /* withclause ::= DOT_E edge AT position */
2640 case 51: /* withclause ::= edge AT position */ yytestcase(yyruleno==51);
2641 #line 656 "pikchr.y"
2642 { pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy63,&yymsp[-1].minor.yy0); }
2643 #line 2668 "pikchr.c"
2644 break;
2645 case 52: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2646 #line 660 "pikchr.y"
2647 {yylhsminor.yy0 = yymsp[0].minor.yy0;}
2648 #line 2673 "pikchr.c"
2649 yymsp[0].minor.yy0 = yylhsminor.yy0;
2650 break;
2651 case 53: /* boolproperty ::= CW */
2652 #line 671 "pikchr.y"
2653 {p->cur->cw = 1;}
2654 #line 2679 "pikchr.c"
2655 break;
2656 case 54: /* boolproperty ::= CCW */
2657 #line 672 "pikchr.y"
2658 {p->cur->cw = 0;}
2659 #line 2684 "pikchr.c"
2660 break;
2661 case 55: /* boolproperty ::= LARROW */
2662 #line 673 "pikchr.y"
2663 {p->cur->larrow=1; p->cur->rarrow=0; }
2664 #line 2689 "pikchr.c"
2665 break;
2666 case 56: /* boolproperty ::= RARROW */
2667 #line 674 "pikchr.y"
2668 {p->cur->larrow=0; p->cur->rarrow=1; }
2669 #line 2694 "pikchr.c"
2670 break;
2671 case 57: /* boolproperty ::= LRARROW */
2672 #line 675 "pikchr.y"
2673 {p->cur->larrow=1; p->cur->rarrow=1; }
2674 #line 2699 "pikchr.c"
2675 break;
2676 case 58: /* boolproperty ::= INVIS */
2677 #line 676 "pikchr.y"
2678 {p->cur->sw = -0.00001;}
2679 #line 2704 "pikchr.c"
2680 break;
2681 case 59: /* boolproperty ::= THICK */
2682 #line 677 "pikchr.y"
2683 {p->cur->sw *= 1.5;}
2684 #line 2709 "pikchr.c"
2685 break;
2686 case 60: /* boolproperty ::= THIN */
2687 #line 678 "pikchr.y"
2688 {p->cur->sw *= 0.67;}
2689 #line 2714 "pikchr.c"
2690 break;
2691 case 61: /* boolproperty ::= SOLID */
2692 #line 679 "pikchr.y"
2693 {p->cur->sw = pik_value(p,"thickness",9,0);
2694 p->cur->dotted = p->cur->dashed = 0.0;}
2695 #line 2720 "pikchr.c"
2696 break;
2697 case 62: /* textposition ::= */
2698 #line 682 "pikchr.y"
2699 {yymsp[1].minor.yy188 = 0;}
2700 #line 2725 "pikchr.c"
2701 break;
2702 case 63: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|MONO|ALIGNED|BIG|SMALL */
2703 #line 685 "pikchr.y"
2704 {yylhsminor.yy188 = (short int)pik_text_position(yymsp[-1].minor.yy188,&yymsp[0].minor.yy0);}
2705 #line 2730 "pikchr.c"
2706 yymsp[-1].minor.yy188 = yylhsminor.yy188;
2707 break;
2708 case 64: /* position ::= expr COMMA expr */
2709 #line 688 "pikchr.y"
2710 {yylhsminor.yy63.x=yymsp[-2].minor.yy21; yylhsminor.yy63.y=yymsp[0].minor.yy21;}
2711 #line 2736 "pikchr.c"
2712 yymsp[-2].minor.yy63 = yylhsminor.yy63;
2713 break;
2714 case 65: /* position ::= place PLUS expr COMMA expr */
2715 #line 690 "pikchr.y"
2716 {yylhsminor.yy63.x=yymsp[-4].minor.yy63.x+yymsp[-2].minor.yy21; yylhsminor.yy63.y=yymsp[-4].minor.yy63.y+yymsp[0].minor.yy21;}
2717 #line 2742 "pikchr.c"
2718 yymsp[-4].minor.yy63 = yylhsminor.yy63;
2719 break;
2720 case 66: /* position ::= place MINUS expr COMMA expr */
2721 #line 691 "pikchr.y"
2722 {yylhsminor.yy63.x=yymsp[-4].minor.yy63.x-yymsp[-2].minor.yy21; yylhsminor.yy63.y=yymsp[-4].minor.yy63.y-yymsp[0].minor.yy21;}
2723 #line 2748 "pikchr.c"
2724 yymsp[-4].minor.yy63 = yylhsminor.yy63;
2725 break;
2726 case 67: /* position ::= place PLUS LP expr COMMA expr RP */
2727 #line 693 "pikchr.y"
2728 {yylhsminor.yy63.x=yymsp[-6].minor.yy63.x+yymsp[-3].minor.yy21; yylhsminor.yy63.y=yymsp[-6].minor.yy63.y+yymsp[-1].minor.yy21;}
2729 #line 2754 "pikchr.c"
2730 yymsp[-6].minor.yy63 = yylhsminor.yy63;
2731 break;
2732 case 68: /* position ::= place MINUS LP expr COMMA expr RP */
2733 #line 695 "pikchr.y"
2734 {yylhsminor.yy63.x=yymsp[-6].minor.yy63.x-yymsp[-3].minor.yy21; yylhsminor.yy63.y=yymsp[-6].minor.yy63.y-yymsp[-1].minor.yy21;}
2735 #line 2760 "pikchr.c"
2736 yymsp[-6].minor.yy63 = yylhsminor.yy63;
2737 break;
2738 case 69: /* position ::= LP position COMMA position RP */
2739 #line 696 "pikchr.y"
2740 {yymsp[-4].minor.yy63.x=yymsp[-3].minor.yy63.x; yymsp[-4].minor.yy63.y=yymsp[-1].minor.yy63.y;}
2741 #line 2766 "pikchr.c"
2742 break;
2743 case 70: /* position ::= LP position RP */
2744 #line 697 "pikchr.y"
2745 {yymsp[-2].minor.yy63=yymsp[-1].minor.yy63;}
2746 #line 2771 "pikchr.c"
2747 break;
2748 case 71: /* position ::= expr between position AND position */
2749 #line 699 "pikchr.y"
2750 {yylhsminor.yy63 = pik_position_between(yymsp[-4].minor.yy21,yymsp[-2].minor.yy63,yymsp[0].minor.yy63);}
2751 #line 2776 "pikchr.c"
2752 yymsp[-4].minor.yy63 = yylhsminor.yy63;
2753 break;
2754 case 72: /* position ::= expr LT position COMMA position GT */
2755 #line 701 "pikchr.y"
2756 {yylhsminor.yy63 = pik_position_between(yymsp[-5].minor.yy21,yymsp[-3].minor.yy63,yymsp[-1].minor.yy63);}
2757 #line 2782 "pikchr.c"
2758 yymsp[-5].minor.yy63 = yylhsminor.yy63;
2759 break;
2760 case 73: /* position ::= expr ABOVE position */
2761 #line 702 "pikchr.y"
2762 {yylhsminor.yy63=yymsp[0].minor.yy63; yylhsminor.yy63.y += yymsp[-2].minor.yy21;}
2763 #line 2788 "pikchr.c"
2764 yymsp[-2].minor.yy63 = yylhsminor.yy63;
2765 break;
2766 case 74: /* position ::= expr BELOW position */
2767 #line 703 "pikchr.y"
2768 {yylhsminor.yy63=yymsp[0].minor.yy63; yylhsminor.yy63.y -= yymsp[-2].minor.yy21;}
2769 #line 2794 "pikchr.c"
2770 yymsp[-2].minor.yy63 = yylhsminor.yy63;
2771 break;
2772 case 75: /* position ::= expr LEFT OF position */
2773 #line 704 "pikchr.y"
2774 {yylhsminor.yy63=yymsp[0].minor.yy63; yylhsminor.yy63.x -= yymsp[-3].minor.yy21;}
2775 #line 2800 "pikchr.c"
2776 yymsp[-3].minor.yy63 = yylhsminor.yy63;
2777 break;
2778 case 76: /* position ::= expr RIGHT OF position */
2779 #line 705 "pikchr.y"
2780 {yylhsminor.yy63=yymsp[0].minor.yy63; yylhsminor.yy63.x += yymsp[-3].minor.yy21;}
2781 #line 2806 "pikchr.c"
2782 yymsp[-3].minor.yy63 = yylhsminor.yy63;
2783 break;
2784 case 77: /* position ::= expr ON HEADING EDGEPT OF position */
2785 #line 707 "pikchr.y"
2786 {yylhsminor.yy63 = pik_position_at_hdg(yymsp[-5].minor.yy21,&yymsp[-2].minor.yy0,yymsp[0].minor.yy63);}
2787 #line 2812 "pikchr.c"
2788 yymsp[-5].minor.yy63 = yylhsminor.yy63;
2789 break;
2790 case 78: /* position ::= expr HEADING EDGEPT OF position */
2791 #line 709 "pikchr.y"
2792 {yylhsminor.yy63 = pik_position_at_hdg(yymsp[-4].minor.yy21,&yymsp[-2].minor.yy0,yymsp[0].minor.yy63);}
2793 #line 2818 "pikchr.c"
2794 yymsp[-4].minor.yy63 = yylhsminor.yy63;
2795 break;
2796 case 79: /* position ::= expr EDGEPT OF position */
2797 #line 711 "pikchr.y"
2798 {yylhsminor.yy63 = pik_position_at_hdg(yymsp[-3].minor.yy21,&yymsp[-2].minor.yy0,yymsp[0].minor.yy63);}
2799 #line 2824 "pikchr.c"
2800 yymsp[-3].minor.yy63 = yylhsminor.yy63;
2801 break;
2802 case 80: /* position ::= expr ON HEADING expr FROM position */
2803 #line 713 "pikchr.y"
2804 {yylhsminor.yy63 = pik_position_at_angle(yymsp[-5].minor.yy21,yymsp[-2].minor.yy21,yymsp[0].minor.yy63);}
2805 #line 2830 "pikchr.c"
2806 yymsp[-5].minor.yy63 = yylhsminor.yy63;
2807 break;
2808 case 81: /* position ::= expr HEADING expr FROM position */
2809 #line 715 "pikchr.y"
2810 {yylhsminor.yy63 = pik_position_at_angle(yymsp[-4].minor.yy21,yymsp[-2].minor.yy21,yymsp[0].minor.yy63);}
2811 #line 2836 "pikchr.c"
2812 yymsp[-4].minor.yy63 = yylhsminor.yy63;
2813 break;
2814 case 82: /* place ::= edge OF object */
2815 #line 727 "pikchr.y"
2816 {yylhsminor.yy63 = pik_place_of_elem(p,yymsp[0].minor.yy162,&yymsp[-2].minor.yy0);}
2817 #line 2842 "pikchr.c"
2818 yymsp[-2].minor.yy63 = yylhsminor.yy63;
2819 break;
2820 case 83: /* place2 ::= object */
2821 #line 728 "pikchr.y"
2822 {yylhsminor.yy63 = pik_place_of_elem(p,yymsp[0].minor.yy162,0);}
2823 #line 2848 "pikchr.c"
2824 yymsp[0].minor.yy63 = yylhsminor.yy63;
2825 break;
2826 case 84: /* place2 ::= object DOT_E edge */
2827 #line 729 "pikchr.y"
2828 {yylhsminor.yy63 = pik_place_of_elem(p,yymsp[-2].minor.yy162,&yymsp[0].minor.yy0);}
2829 #line 2854 "pikchr.c"
2830 yymsp[-2].minor.yy63 = yylhsminor.yy63;
2831 break;
2832 case 85: /* place2 ::= NTH VERTEX OF object */
2833 #line 730 "pikchr.y"
2834 {yylhsminor.yy63 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy162);}
2835 #line 2860 "pikchr.c"
2836 yymsp[-3].minor.yy63 = yylhsminor.yy63;
2837 break;
2838 case 86: /* object ::= nth */
2839 #line 742 "pikchr.y"
2840 {yylhsminor.yy162 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2841 #line 2866 "pikchr.c"
2842 yymsp[0].minor.yy162 = yylhsminor.yy162;
2843 break;
2844 case 87: /* object ::= nth OF|IN object */
2845 #line 743 "pikchr.y"
2846 {yylhsminor.yy162 = pik_find_nth(p,yymsp[0].minor.yy162,&yymsp[-2].minor.yy0);}
2847 #line 2872 "pikchr.c"
2848 yymsp[-2].minor.yy162 = yylhsminor.yy162;
2849 break;
2850 case 88: /* objectname ::= THIS */
2851 #line 745 "pikchr.y"
2852 {yymsp[0].minor.yy162 = p->cur;}
2853 #line 2878 "pikchr.c"
2854 break;
2855 case 89: /* objectname ::= PLACENAME */
2856 #line 746 "pikchr.y"
2857 {yylhsminor.yy162 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2858 #line 2883 "pikchr.c"
2859 yymsp[0].minor.yy162 = yylhsminor.yy162;
2860 break;
2861 case 90: /* objectname ::= objectname DOT_U PLACENAME */
2862 #line 748 "pikchr.y"
2863 {yylhsminor.yy162 = pik_find_byname(p,yymsp[-2].minor.yy162,&yymsp[0].minor.yy0);}
2864 #line 2889 "pikchr.c"
2865 yymsp[-2].minor.yy162 = yylhsminor.yy162;
2866 break;
2867 case 91: /* nth ::= NTH CLASSNAME */
2868 #line 750 "pikchr.y"
2869 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2870 #line 2895 "pikchr.c"
2871 yymsp[-1].minor.yy0 = yylhsminor.yy0;
2872 break;
2873 case 92: /* nth ::= NTH LAST CLASSNAME */
2874 #line 751 "pikchr.y"
2875 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2876 #line 2901 "pikchr.c"
2877 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2878 break;
2879 case 93: /* nth ::= LAST CLASSNAME */
2880 #line 752 "pikchr.y"
2881 {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2882 #line 2907 "pikchr.c"
2883 break;
2884 case 94: /* nth ::= LAST */
2885 #line 753 "pikchr.y"
2886 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2887 #line 2912 "pikchr.c"
2888 yymsp[0].minor.yy0 = yylhsminor.yy0;
2889 break;
2890 case 95: /* nth ::= NTH LB RB */
2891 #line 754 "pikchr.y"
2892 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2893 #line 2918 "pikchr.c"
2894 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2895 break;
2896 case 96: /* nth ::= NTH LAST LB RB */
2897 #line 755 "pikchr.y"
2898 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2899 #line 2924 "pikchr.c"
2900 yymsp[-3].minor.yy0 = yylhsminor.yy0;
2901 break;
2902 case 97: /* nth ::= LAST LB RB */
2903 #line 756 "pikchr.y"
2904 {yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2905 #line 2930 "pikchr.c"
2906 break;
2907 case 98: /* expr ::= expr PLUS expr */
2908 #line 758 "pikchr.y"
2909 {yylhsminor.yy21=yymsp[-2].minor.yy21+yymsp[0].minor.yy21;}
2910 #line 2935 "pikchr.c"
2911 yymsp[-2].minor.yy21 = yylhsminor.yy21;
2912 break;
2913 case 99: /* expr ::= expr MINUS expr */
2914 #line 759 "pikchr.y"
2915 {yylhsminor.yy21=yymsp[-2].minor.yy21-yymsp[0].minor.yy21;}
2916 #line 2941 "pikchr.c"
2917 yymsp[-2].minor.yy21 = yylhsminor.yy21;
2918 break;
2919 case 100: /* expr ::= expr STAR expr */
2920 #line 760 "pikchr.y"
2921 {yylhsminor.yy21=yymsp[-2].minor.yy21*yymsp[0].minor.yy21;}
2922 #line 2947 "pikchr.c"
2923 yymsp[-2].minor.yy21 = yylhsminor.yy21;
2924 break;
2925 case 101: /* expr ::= expr SLASH expr */
2926 #line 761 "pikchr.y"
2927 {
2928 if( yymsp[0].minor.yy21==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy21 = 0.0; }
2929 else{ yylhsminor.yy21 = yymsp[-2].minor.yy21/yymsp[0].minor.yy21; }
2930 }
2931 #line 2956 "pikchr.c"
2932 yymsp[-2].minor.yy21 = yylhsminor.yy21;
2933 break;
2934 case 102: /* expr ::= MINUS expr */
2935 #line 765 "pikchr.y"
2936 {yymsp[-1].minor.yy21=-yymsp[0].minor.yy21;}
2937 #line 2962 "pikchr.c"
2938 break;
2939 case 103: /* expr ::= PLUS expr */
2940 #line 766 "pikchr.y"
2941 {yymsp[-1].minor.yy21=yymsp[0].minor.yy21;}
2942 #line 2967 "pikchr.c"
2943 break;
2944 case 104: /* expr ::= LP expr RP */
2945 #line 767 "pikchr.y"
2946 {yymsp[-2].minor.yy21=yymsp[-1].minor.yy21;}
2947 #line 2972 "pikchr.c"
2948 break;
2949 case 105: /* expr ::= LP FILL|COLOR|THICKNESS RP */
2950 #line 768 "pikchr.y"
2951 {yymsp[-2].minor.yy21=pik_get_var(p,&yymsp[-1].minor.yy0);}
2952 #line 2977 "pikchr.c"
2953 break;
2954 case 106: /* expr ::= NUMBER */
2955 #line 769 "pikchr.y"
2956 {yylhsminor.yy21=pik_atof(&yymsp[0].minor.yy0);}
2957 #line 2982 "pikchr.c"
2958 yymsp[0].minor.yy21 = yylhsminor.yy21;
2959 break;
2960 case 107: /* expr ::= ID */
2961 #line 770 "pikchr.y"
2962 {yylhsminor.yy21=pik_get_var(p,&yymsp[0].minor.yy0);}
2963 #line 2988 "pikchr.c"
2964 yymsp[0].minor.yy21 = yylhsminor.yy21;
2965 break;
2966 case 108: /* expr ::= FUNC1 LP expr RP */
2967 #line 771 "pikchr.y"
2968 {yylhsminor.yy21 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy21,0.0);}
2969 #line 2994 "pikchr.c"
2970 yymsp[-3].minor.yy21 = yylhsminor.yy21;
2971 break;
2972 case 109: /* expr ::= FUNC2 LP expr COMMA expr RP */
2973 #line 772 "pikchr.y"
2974 {yylhsminor.yy21 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy21,yymsp[-1].minor.yy21);}
2975 #line 3000 "pikchr.c"
2976 yymsp[-5].minor.yy21 = yylhsminor.yy21;
2977 break;
2978 case 110: /* expr ::= DIST LP position COMMA position RP */
2979 #line 773 "pikchr.y"
2980 {yymsp[-5].minor.yy21 = pik_dist(&yymsp[-3].minor.yy63,&yymsp[-1].minor.yy63);}
2981 #line 3006 "pikchr.c"
2982 break;
2983 case 111: /* expr ::= place2 DOT_XY X */
2984 #line 774 "pikchr.y"
2985 {yylhsminor.yy21 = yymsp[-2].minor.yy63.x;}
2986 #line 3011 "pikchr.c"
2987 yymsp[-2].minor.yy21 = yylhsminor.yy21;
2988 break;
2989 case 112: /* expr ::= place2 DOT_XY Y */
2990 #line 775 "pikchr.y"
2991 {yylhsminor.yy21 = yymsp[-2].minor.yy63.y;}
2992 #line 3017 "pikchr.c"
2993 yymsp[-2].minor.yy21 = yylhsminor.yy21;
2994 break;
2995 case 113: /* expr ::= object DOT_L numproperty */
2996 case 114: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==114);
2997 case 115: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==115);
2998 #line 776 "pikchr.y"
2999 {yylhsminor.yy21=pik_property_of(yymsp[-2].minor.yy162,&yymsp[0].minor.yy0);}
3000 #line 3025 "pikchr.c"
3001 yymsp[-2].minor.yy21 = yylhsminor.yy21;
3002 break;
3003 default:
3004 /* (116) lvalue ::= ID */ yytestcase(yyruleno==116);
3005 /* (117) lvalue ::= FILL */ yytestcase(yyruleno==117);
@@ -3098,19 +3130,19 @@
3098 ){
3099 pik_parserARG_FETCH
3100 pik_parserCTX_FETCH
3101 #define TOKEN yyminor
3102 /************ Begin %syntax_error code ****************************************/
3103 #line 536 "pikchr.y"
3104
3105 if( TOKEN.z && TOKEN.z[0] ){
3106 pik_error(p, &TOKEN, "syntax error");
3107 }else{
3108 pik_error(p, 0, "syntax error");
3109 }
3110 UNUSED_PARAMETER(yymajor);
3111 #line 3136 "pikchr.c"
3112 /************ End %syntax_error code ******************************************/
3113 pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
3114 pik_parserCTX_STORE
3115 }
3116
@@ -3227,23 +3259,16 @@
3227 yypParser->yyhwm++;
3228 assert( yypParser->yyhwm ==
3229 (int)(yypParser->yytos - yypParser->yystack));
3230 }
3231 #endif
3232 #if YYSTACKDEPTH>0
3233 if( yypParser->yytos>=yypParser->yystackEnd ){
3234 yyStackOverflow(yypParser);
3235 break;
3236 }
3237 #else
3238 if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz-1] ){
3239 if( yyGrowStack(yypParser) ){
3240 yyStackOverflow(yypParser);
3241 break;
3242 }
3243 }
3244 #endif
3245 }
3246 yyact = yy_reduce(yypParser,yyruleno,yymajor,yyminor pik_parserCTX_PARAM);
3247 }else if( yyact <= YY_MAX_SHIFTREDUCE ){
3248 yy_shift(yypParser,yyact,(YYCODETYPE)yymajor,yyminor);
3249 #ifndef YYNOERRORRECOVERY
@@ -3382,11 +3407,11 @@
3382 #else
3383 (void)iToken;
3384 return 0;
3385 #endif
3386 }
3387 #line 781 "pikchr.y"
3388
3389
3390
3391 /* Chart of the 148 official CSS color names with their
3392 ** corresponding RGB values thru Color Module Level 4:
@@ -3963,10 +3988,11 @@
3963
3964 /* Methods for the "diamond" class */
3965 static void diamondInit(Pik *p, PObj *pObj){
3966 pObj->w = pik_value(p, "diamondwid",10,0);
3967 pObj->h = pik_value(p, "diamondht",9,0);
 
3968 }
3969 /* Return offset from the center of the box to the compass point
3970 ** given by parameter cp */
3971 static PPoint diamondOffset(Pik *p, PObj *pObj, int cp){
3972 PPoint pt = cZeroPoint;
@@ -3988,10 +4014,12 @@
3988 }
3989 UNUSED_PARAMETER(p);
3990 return pt;
3991 }
3992 static void diamondFit(Pik *p, PObj *pObj, PNum w, PNum h){
 
 
3993 if( pObj->w>0 && pObj->h>0 ){
3994 PNum x = pObj->w*h/pObj->h + w;
3995 PNum y = pObj->h*x/pObj->w;
3996 pObj->w = x;
3997 pObj->h = y;
@@ -6334,12 +6362,16 @@
6334 }
6335 if( pObj->type->xFit==0 ) return;
6336 pik_bbox_init(&bbox);
6337 pik_compute_layout_settings(p);
6338 pik_append_txt(p, pObj, &bbox);
6339 w = (eWhich & 1)!=0 ? (bbox.ne.x - bbox.sw.x) + p->charWidth : 0;
6340 if( eWhich & 2 ){
 
 
 
 
6341 PNum h1, h2;
6342 h1 = (bbox.ne.y - pObj->ptAt.y);
6343 h2 = (pObj->ptAt.y - bbox.sw.y);
6344 h = 2.0*( h1<h2 ? h2 : h1 ) + 0.5*p->charHeight;
6345 }else{
@@ -8208,6 +8240,6 @@
8208
8209
8210 #endif /* PIKCHR_TCL */
8211
8212
8213 #line 8238 "pikchr.c"
8214
--- extsrc/pikchr.c
+++ extsrc/pikchr.c
@@ -1,7 +1,8 @@
1 /* This file is automatically generated by Lemon from input grammar
2 ** source file "pikchr.y".
3 */
4 /*
5 ** Zero-Clause BSD license:
6 **
7 ** Copyright (C) 2020-09-01 by D. Richard Hipp <[email protected]>
8 **
@@ -319,10 +320,11 @@
320 char cw; /* True for clockwise arc */
321 char larrow; /* Arrow at beginning (<- or <->) */
322 char rarrow; /* Arrow at end (-> or <->) */
323 char bClose; /* True if "close" is seen */
324 char bChop; /* True if "chop" is seen */
325 char bAltAutoFit; /* Always send both h and w into xFit() */
326 unsigned char nTxt; /* Number of text values */
327 unsigned mProp; /* Masks of properties set so far */
328 unsigned mCalc; /* Values computed from other constraints */
329 PToken aTxt[5]; /* Text with .eCode holding TP flags */
330 int iLayer; /* Rendering order */
@@ -490,11 +492,11 @@
492 static PObj *pik_position_assert(Pik*,PPoint*,PToken*,PPoint*);
493 static PNum pik_dist(PPoint*,PPoint*);
494 static void pik_add_macro(Pik*,PToken *pId,PToken *pCode);
495
496
497 #line 523 "pikchr.c"
498 /**************** End of %include directives **********************************/
499 /* These constants specify the various numeric values for terminal symbols.
500 ***************** Begin token definitions *************************************/
501 #ifndef T_ID
502 #define T_ID 1
@@ -634,10 +636,13 @@
636 ** pik_parserARG_PDECL A parameter declaration for the %extra_argument
637 ** pik_parserARG_PARAM Code to pass %extra_argument as a subroutine parameter
638 ** pik_parserARG_STORE Code to store %extra_argument into yypParser
639 ** pik_parserARG_FETCH Code to extract %extra_argument from yypParser
640 ** pik_parserCTX_* As pik_parserARG_ except for %extra_context
641 ** YYREALLOC Name of the realloc() function to use
642 ** YYFREE Name of the free() function to use
643 ** YYDYNSTACK True if stack space should be extended on heap
644 ** YYERRORSYMBOL is the code number of the error symbol. If not
645 ** defined, then do no error processing.
646 ** YYNSTATE the combined number of states.
647 ** YYNRULE the number of rules in the grammar
648 ** YYNTOKEN Number of terminal symbols
@@ -647,10 +652,12 @@
652 ** YY_ERROR_ACTION The yy_action[] code for syntax error
653 ** YY_ACCEPT_ACTION The yy_action[] code for accept
654 ** YY_NO_ACTION The yy_action[] code for no-op
655 ** YY_MIN_REDUCE Minimum value for reduce actions
656 ** YY_MAX_REDUCE Maximum value for reduce actions
657 ** YY_MIN_DSTRCTR Minimum symbol value that has a destructor
658 ** YY_MAX_DSTRCTR Maximum symbol value that has a destructor
659 */
660 #ifndef INTERFACE
661 # define INTERFACE 1
662 #endif
663 /************* Begin control #defines *****************************************/
@@ -674,10 +681,13 @@
681 #define pik_parserARG_SDECL
682 #define pik_parserARG_PDECL
683 #define pik_parserARG_PARAM
684 #define pik_parserARG_FETCH
685 #define pik_parserARG_STORE
686 #define YYREALLOC realloc
687 #define YYFREE free
688 #define YYDYNSTACK 0
689 #define pik_parserCTX_SDECL Pik *p;
690 #define pik_parserCTX_PDECL ,Pik *p
691 #define pik_parserCTX_PARAM ,p
692 #define pik_parserCTX_FETCH Pik *p=yypParser->p;
693 #define pik_parserCTX_STORE yypParser->p=p;
@@ -692,10 +702,12 @@
702 #define YY_ERROR_ACTION 443
703 #define YY_ACCEPT_ACTION 444
704 #define YY_NO_ACTION 445
705 #define YY_MIN_REDUCE 446
706 #define YY_MAX_REDUCE 601
707 #define YY_MIN_DSTRCTR 100
708 #define YY_MAX_DSTRCTR 103
709 /************* End control #defines *******************************************/
710 #define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0])))
711
712 /* Define the yytestcase() macro to be a no-op if is not already defined
713 ** otherwise.
@@ -706,10 +718,26 @@
718 ** for testing.
719 */
720 #ifndef yytestcase
721 # define yytestcase(X)
722 #endif
723
724 /* Macro to determine if stack space has the ability to grow using
725 ** heap memory.
726 */
727 #if YYSTACKDEPTH<=0 || YYDYNSTACK
728 # define YYGROWABLESTACK 1
729 #else
730 # define YYGROWABLESTACK 0
731 #endif
732
733 /* Guarantee a minimum number of initial stack slots.
734 */
735 #if YYSTACKDEPTH<=0
736 # undef YYSTACKDEPTH
737 # define YYSTACKDEPTH 2 /* Need a minimum stack size */
738 #endif
739
740
741 /* Next are the tables used to determine what action to take based on the
742 ** current state and lookahead token. These tables are used to implement
743 ** functions that take a state number and lookahead value and return an
@@ -1250,18 +1278,13 @@
1278 #ifndef YYNOERRORRECOVERY
1279 int yyerrcnt; /* Shifts left before out of the error */
1280 #endif
1281 pik_parserARG_SDECL /* A place to hold %extra_argument */
1282 pik_parserCTX_SDECL /* A place to hold %extra_context */
1283 yyStackEntry *yystackEnd; /* Last entry in the stack */
1284 yyStackEntry *yystack; /* The parser stack */
1285 yyStackEntry yystk0[YYSTACKDEPTH]; /* Initial stack space */
 
 
 
 
 
1286 };
1287 typedef struct yyParser yyParser;
1288
1289 #include <assert.h>
1290 #ifndef NDEBUG
@@ -1601,41 +1624,49 @@
1624 /* 155 */ "object ::= objectname",
1625 };
1626 #endif /* NDEBUG */
1627
1628
1629 #if YYGROWABLESTACK
1630 /*
1631 ** Try to increase the size of the parser stack. Return the number
1632 ** of errors. Return 0 on success.
1633 */
1634 static int yyGrowStack(yyParser *p){
1635 int oldSize = 1 + (int)(p->yystackEnd - p->yystack);
1636 int newSize;
1637 int idx;
1638 yyStackEntry *pNew;
1639
1640 newSize = oldSize*2 + 100;
1641 idx = (int)(p->yytos - p->yystack);
1642 if( p->yystack==p->yystk0 ){
1643 pNew = YYREALLOC(0, newSize*sizeof(pNew[0]));
1644 if( pNew==0 ) return 1;
1645 memcpy(pNew, p->yystack, oldSize*sizeof(pNew[0]));
1646 }else{
1647 pNew = YYREALLOC(p->yystack, newSize*sizeof(pNew[0]));
1648 if( pNew==0 ) return 1;
1649 }
1650 p->yystack = pNew;
1651 p->yytos = &p->yystack[idx];
 
1652 #ifndef NDEBUG
1653 if( yyTraceFILE ){
1654 fprintf(yyTraceFILE,"%sStack grows from %d to %d entries.\n",
1655 yyTracePrompt, oldSize, newSize);
1656 }
1657 #endif
1658 p->yystackEnd = &p->yystack[newSize-1];
1659 return 0;
 
1660 }
1661 #endif /* YYGROWABLESTACK */
1662
1663 #if !YYGROWABLESTACK
1664 /* For builds that do no have a growable stack, yyGrowStack always
1665 ** returns an error.
1666 */
1667 # define yyGrowStack(X) 1
1668 #endif
1669
1670 /* Datatype of the argument to the memory allocated passed as the
1671 ** second argument to pik_parserAlloc() below. This can be changed by
1672 ** putting an appropriate #define in the %include section of the input
@@ -1651,28 +1682,18 @@
1682 yyParser *yypParser = (yyParser*)yypRawParser;
1683 pik_parserCTX_STORE
1684 #ifdef YYTRACKMAXSTACKDEPTH
1685 yypParser->yyhwm = 0;
1686 #endif
1687 yypParser->yystack = yypParser->yystk0;
1688 yypParser->yystackEnd = &yypParser->yystack[YYSTACKDEPTH-1];
 
 
 
 
 
 
 
1689 #ifndef YYNOERRORRECOVERY
1690 yypParser->yyerrcnt = -1;
1691 #endif
1692 yypParser->yytos = yypParser->yystack;
1693 yypParser->yystack[0].stateno = 0;
1694 yypParser->yystack[0].major = 0;
 
 
 
1695 }
1696
1697 #ifndef pik_parser_ENGINEALWAYSONSTACK
1698 /*
1699 ** This function allocates a new parser.
@@ -1724,22 +1745,22 @@
1745 ** inside the C code.
1746 */
1747 /********* Begin destructor definitions ***************************************/
1748 case 100: /* statement_list */
1749 {
1750 #line 511 "pikchr.y"
1751 pik_elist_free(p,(yypminor->yy235));
1752 #line 1777 "pikchr.c"
1753 }
1754 break;
1755 case 101: /* statement */
1756 case 102: /* unnamed_statement */
1757 case 103: /* basetype */
1758 {
1759 #line 513 "pikchr.y"
1760 pik_elem_free(p,(yypminor->yy162));
1761 #line 1786 "pikchr.c"
1762 }
1763 break;
1764 /********* End destructor definitions *****************************************/
1765 default: break; /* If no destructor action specified: do nothing */
1766 }
@@ -1769,13 +1790,30 @@
1790 /*
1791 ** Clear all secondary memory allocations from the parser
1792 */
1793 void pik_parserFinalize(void *p){
1794 yyParser *pParser = (yyParser*)p;
1795
1796 /* In-lined version of calling yy_pop_parser_stack() for each
1797 ** element left in the stack */
1798 yyStackEntry *yytos = pParser->yytos;
1799 while( yytos>pParser->yystack ){
1800 #ifndef NDEBUG
1801 if( yyTraceFILE ){
1802 fprintf(yyTraceFILE,"%sPopping %s\n",
1803 yyTracePrompt,
1804 yyTokenName[yytos->major]);
1805 }
1806 #endif
1807 if( yytos->major>=YY_MIN_DSTRCTR ){
1808 yy_destructor(pParser, yytos->major, &yytos->minor);
1809 }
1810 yytos--;
1811 }
1812
1813 #if YYGROWABLESTACK
1814 if( pParser->yystack!=pParser->yystk0 ) YYFREE(pParser->yystack);
1815 #endif
1816 }
1817
1818 #ifndef pik_parser_ENGINEALWAYSONSTACK
1819 /*
@@ -1953,14 +1991,14 @@
1991 #endif
1992 while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
1993 /* Here code is inserted which will execute if the parser
1994 ** stack every overflows */
1995 /******** Begin %stack_overflow code ******************************************/
1996 #line 545 "pikchr.y"
1997
1998 pik_error(p, 0, "parser stack overflow");
1999 #line 2024 "pikchr.c"
2000 /******** End %stack_overflow code ********************************************/
2001 pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
2002 pik_parserCTX_STORE
2003 }
2004
@@ -2000,29 +2038,23 @@
2038 if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){
2039 yypParser->yyhwm++;
2040 assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack) );
2041 }
2042 #endif
2043 yytos = yypParser->yytos;
2044 if( yytos>yypParser->yystackEnd ){
 
 
 
 
 
 
2045 if( yyGrowStack(yypParser) ){
2046 yypParser->yytos--;
2047 yyStackOverflow(yypParser);
2048 return;
2049 }
2050 yytos = yypParser->yytos;
2051 assert( yytos <= yypParser->yystackEnd );
2052 }
 
2053 if( yyNewState > YY_MAX_SHIFT ){
2054 yyNewState += YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE;
2055 }
 
2056 yytos->stateno = yyNewState;
2057 yytos->major = yyMajor;
2058 yytos->minor.yy0 = yyMinor;
2059 yyTraceShift(yypParser, yyNewState, "Shift");
2060 }
@@ -2387,619 +2419,619 @@
2419 ** break;
2420 */
2421 /********** Begin reduce actions **********************************************/
2422 YYMINORTYPE yylhsminor;
2423 case 0: /* document ::= statement_list */
2424 #line 549 "pikchr.y"
2425 {pik_render(p,yymsp[0].minor.yy235);}
2426 #line 2451 "pikchr.c"
2427 break;
2428 case 1: /* statement_list ::= statement */
2429 #line 552 "pikchr.y"
2430 { yylhsminor.yy235 = pik_elist_append(p,0,yymsp[0].minor.yy162); }
2431 #line 2456 "pikchr.c"
2432 yymsp[0].minor.yy235 = yylhsminor.yy235;
2433 break;
2434 case 2: /* statement_list ::= statement_list EOL statement */
2435 #line 554 "pikchr.y"
2436 { yylhsminor.yy235 = pik_elist_append(p,yymsp[-2].minor.yy235,yymsp[0].minor.yy162); }
2437 #line 2462 "pikchr.c"
2438 yymsp[-2].minor.yy235 = yylhsminor.yy235;
2439 break;
2440 case 3: /* statement ::= */
2441 #line 557 "pikchr.y"
2442 { yymsp[1].minor.yy162 = 0; }
2443 #line 2468 "pikchr.c"
2444 break;
2445 case 4: /* statement ::= direction */
2446 #line 558 "pikchr.y"
2447 { pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy162=0; }
2448 #line 2473 "pikchr.c"
2449 yymsp[0].minor.yy162 = yylhsminor.yy162;
2450 break;
2451 case 5: /* statement ::= lvalue ASSIGN rvalue */
2452 #line 559 "pikchr.y"
2453 {pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy21,&yymsp[-1].minor.yy0); yylhsminor.yy162=0;}
2454 #line 2479 "pikchr.c"
2455 yymsp[-2].minor.yy162 = yylhsminor.yy162;
2456 break;
2457 case 6: /* statement ::= PLACENAME COLON unnamed_statement */
2458 #line 561 "pikchr.y"
2459 { yylhsminor.yy162 = yymsp[0].minor.yy162; pik_elem_setname(p,yymsp[0].minor.yy162,&yymsp[-2].minor.yy0); }
2460 #line 2485 "pikchr.c"
2461 yymsp[-2].minor.yy162 = yylhsminor.yy162;
2462 break;
2463 case 7: /* statement ::= PLACENAME COLON position */
2464 #line 563 "pikchr.y"
2465 { yylhsminor.yy162 = pik_elem_new(p,0,0,0);
2466 if(yylhsminor.yy162){ yylhsminor.yy162->ptAt = yymsp[0].minor.yy63; pik_elem_setname(p,yylhsminor.yy162,&yymsp[-2].minor.yy0); }}
2467 #line 2492 "pikchr.c"
2468 yymsp[-2].minor.yy162 = yylhsminor.yy162;
2469 break;
2470 case 8: /* statement ::= unnamed_statement */
2471 #line 565 "pikchr.y"
2472 {yylhsminor.yy162 = yymsp[0].minor.yy162;}
2473 #line 2498 "pikchr.c"
2474 yymsp[0].minor.yy162 = yylhsminor.yy162;
2475 break;
2476 case 9: /* statement ::= print prlist */
2477 #line 566 "pikchr.y"
2478 {pik_append(p,"<br>\n",5); yymsp[-1].minor.yy162=0;}
2479 #line 2504 "pikchr.c"
2480 break;
2481 case 10: /* statement ::= ASSERT LP expr EQ expr RP */
2482 #line 571 "pikchr.y"
2483 {yymsp[-5].minor.yy162=pik_assert(p,yymsp[-3].minor.yy21,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy21);}
2484 #line 2509 "pikchr.c"
2485 break;
2486 case 11: /* statement ::= ASSERT LP position EQ position RP */
2487 #line 573 "pikchr.y"
2488 {yymsp[-5].minor.yy162=pik_position_assert(p,&yymsp[-3].minor.yy63,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy63);}
2489 #line 2514 "pikchr.c"
2490 break;
2491 case 12: /* statement ::= DEFINE ID CODEBLOCK */
2492 #line 574 "pikchr.y"
2493 {yymsp[-2].minor.yy162=0; pik_add_macro(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
2494 #line 2519 "pikchr.c"
2495 break;
2496 case 13: /* rvalue ::= PLACENAME */
2497 #line 585 "pikchr.y"
2498 {yylhsminor.yy21 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2499 #line 2524 "pikchr.c"
2500 yymsp[0].minor.yy21 = yylhsminor.yy21;
2501 break;
2502 case 14: /* pritem ::= FILL */
2503 case 15: /* pritem ::= COLOR */ yytestcase(yyruleno==15);
2504 case 16: /* pritem ::= THICKNESS */ yytestcase(yyruleno==16);
2505 #line 590 "pikchr.y"
2506 {pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2507 #line 2532 "pikchr.c"
2508 break;
2509 case 17: /* pritem ::= rvalue */
2510 #line 593 "pikchr.y"
2511 {pik_append_num(p,"",yymsp[0].minor.yy21);}
2512 #line 2537 "pikchr.c"
2513 break;
2514 case 18: /* pritem ::= STRING */
2515 #line 594 "pikchr.y"
2516 {pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2517 #line 2542 "pikchr.c"
2518 break;
2519 case 19: /* prsep ::= COMMA */
2520 #line 595 "pikchr.y"
2521 {pik_append(p, " ", 1);}
2522 #line 2547 "pikchr.c"
2523 break;
2524 case 20: /* unnamed_statement ::= basetype attribute_list */
2525 #line 598 "pikchr.y"
2526 {yylhsminor.yy162 = yymsp[-1].minor.yy162; pik_after_adding_attributes(p,yylhsminor.yy162);}
2527 #line 2552 "pikchr.c"
2528 yymsp[-1].minor.yy162 = yylhsminor.yy162;
2529 break;
2530 case 21: /* basetype ::= CLASSNAME */
2531 #line 600 "pikchr.y"
2532 {yylhsminor.yy162 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2533 #line 2558 "pikchr.c"
2534 yymsp[0].minor.yy162 = yylhsminor.yy162;
2535 break;
2536 case 22: /* basetype ::= STRING textposition */
2537 #line 602 "pikchr.y"
2538 {yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy188; yylhsminor.yy162 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2539 #line 2564 "pikchr.c"
2540 yymsp[-1].minor.yy162 = yylhsminor.yy162;
2541 break;
2542 case 23: /* basetype ::= LB savelist statement_list RB */
2543 #line 604 "pikchr.y"
2544 { p->list = yymsp[-2].minor.yy235; yymsp[-3].minor.yy162 = pik_elem_new(p,0,0,yymsp[-1].minor.yy235); if(yymsp[-3].minor.yy162) yymsp[-3].minor.yy162->errTok = yymsp[0].minor.yy0; }
2545 #line 2570 "pikchr.c"
2546 break;
2547 case 24: /* savelist ::= */
2548 #line 609 "pikchr.y"
2549 {yymsp[1].minor.yy235 = p->list; p->list = 0;}
2550 #line 2575 "pikchr.c"
2551 break;
2552 case 25: /* relexpr ::= expr */
2553 #line 616 "pikchr.y"
2554 {yylhsminor.yy72.rAbs = yymsp[0].minor.yy21; yylhsminor.yy72.rRel = 0;}
2555 #line 2580 "pikchr.c"
2556 yymsp[0].minor.yy72 = yylhsminor.yy72;
2557 break;
2558 case 26: /* relexpr ::= expr PERCENT */
2559 #line 617 "pikchr.y"
2560 {yylhsminor.yy72.rAbs = 0; yylhsminor.yy72.rRel = yymsp[-1].minor.yy21/100;}
2561 #line 2586 "pikchr.c"
2562 yymsp[-1].minor.yy72 = yylhsminor.yy72;
2563 break;
2564 case 27: /* optrelexpr ::= */
2565 #line 619 "pikchr.y"
2566 {yymsp[1].minor.yy72.rAbs = 0; yymsp[1].minor.yy72.rRel = 1.0;}
2567 #line 2592 "pikchr.c"
2568 break;
2569 case 28: /* attribute_list ::= relexpr alist */
2570 #line 621 "pikchr.y"
2571 {pik_add_direction(p,0,&yymsp[-1].minor.yy72);}
2572 #line 2597 "pikchr.c"
2573 break;
2574 case 29: /* attribute ::= numproperty relexpr */
2575 #line 625 "pikchr.y"
2576 { pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy72); }
2577 #line 2602 "pikchr.c"
2578 break;
2579 case 30: /* attribute ::= dashproperty expr */
2580 #line 626 "pikchr.y"
2581 { pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy21); }
2582 #line 2607 "pikchr.c"
2583 break;
2584 case 31: /* attribute ::= dashproperty */
2585 #line 627 "pikchr.y"
2586 { pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2587 #line 2612 "pikchr.c"
2588 break;
2589 case 32: /* attribute ::= colorproperty rvalue */
2590 #line 628 "pikchr.y"
2591 { pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy21); }
2592 #line 2617 "pikchr.c"
2593 break;
2594 case 33: /* attribute ::= go direction optrelexpr */
2595 #line 629 "pikchr.y"
2596 { pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy72);}
2597 #line 2622 "pikchr.c"
2598 break;
2599 case 34: /* attribute ::= go direction even position */
2600 #line 630 "pikchr.y"
2601 {pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy63);}
2602 #line 2627 "pikchr.c"
2603 break;
2604 case 35: /* attribute ::= CLOSE */
2605 #line 631 "pikchr.y"
2606 { pik_close_path(p,&yymsp[0].minor.yy0); }
2607 #line 2632 "pikchr.c"
2608 break;
2609 case 36: /* attribute ::= CHOP */
2610 #line 632 "pikchr.y"
2611 { p->cur->bChop = 1; }
2612 #line 2637 "pikchr.c"
2613 break;
2614 case 37: /* attribute ::= FROM position */
2615 #line 633 "pikchr.y"
2616 { pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy63); }
2617 #line 2642 "pikchr.c"
2618 break;
2619 case 38: /* attribute ::= TO position */
2620 #line 634 "pikchr.y"
2621 { pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy63); }
2622 #line 2647 "pikchr.c"
2623 break;
2624 case 39: /* attribute ::= THEN */
2625 #line 635 "pikchr.y"
2626 { pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2627 #line 2652 "pikchr.c"
2628 break;
2629 case 40: /* attribute ::= THEN optrelexpr HEADING expr */
2630 case 42: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==42);
2631 #line 637 "pikchr.y"
2632 {pik_move_hdg(p,&yymsp[-2].minor.yy72,&yymsp[-1].minor.yy0,yymsp[0].minor.yy21,0,&yymsp[-3].minor.yy0);}
2633 #line 2658 "pikchr.c"
2634 break;
2635 case 41: /* attribute ::= THEN optrelexpr EDGEPT */
2636 case 43: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==43);
2637 #line 638 "pikchr.y"
2638 {pik_move_hdg(p,&yymsp[-1].minor.yy72,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2639 #line 2664 "pikchr.c"
2640 break;
2641 case 44: /* attribute ::= AT position */
2642 #line 643 "pikchr.y"
2643 { pik_set_at(p,0,&yymsp[0].minor.yy63,&yymsp[-1].minor.yy0); }
2644 #line 2669 "pikchr.c"
2645 break;
2646 case 45: /* attribute ::= SAME */
2647 #line 645 "pikchr.y"
2648 {pik_same(p,0,&yymsp[0].minor.yy0);}
2649 #line 2674 "pikchr.c"
2650 break;
2651 case 46: /* attribute ::= SAME AS object */
2652 #line 646 "pikchr.y"
2653 {pik_same(p,yymsp[0].minor.yy162,&yymsp[-2].minor.yy0);}
2654 #line 2679 "pikchr.c"
2655 break;
2656 case 47: /* attribute ::= STRING textposition */
2657 #line 647 "pikchr.y"
2658 {pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy188);}
2659 #line 2684 "pikchr.c"
2660 break;
2661 case 48: /* attribute ::= FIT */
2662 #line 648 "pikchr.y"
2663 {pik_size_to_fit(p,&yymsp[0].minor.yy0,3); }
2664 #line 2689 "pikchr.c"
2665 break;
2666 case 49: /* attribute ::= BEHIND object */
2667 #line 649 "pikchr.y"
2668 {pik_behind(p,yymsp[0].minor.yy162);}
2669 #line 2694 "pikchr.c"
2670 break;
2671 case 50: /* withclause ::= DOT_E edge AT position */
2672 case 51: /* withclause ::= edge AT position */ yytestcase(yyruleno==51);
2673 #line 657 "pikchr.y"
2674 { pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy63,&yymsp[-1].minor.yy0); }
2675 #line 2700 "pikchr.c"
2676 break;
2677 case 52: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2678 #line 661 "pikchr.y"
2679 {yylhsminor.yy0 = yymsp[0].minor.yy0;}
2680 #line 2705 "pikchr.c"
2681 yymsp[0].minor.yy0 = yylhsminor.yy0;
2682 break;
2683 case 53: /* boolproperty ::= CW */
2684 #line 672 "pikchr.y"
2685 {p->cur->cw = 1;}
2686 #line 2711 "pikchr.c"
2687 break;
2688 case 54: /* boolproperty ::= CCW */
2689 #line 673 "pikchr.y"
2690 {p->cur->cw = 0;}
2691 #line 2716 "pikchr.c"
2692 break;
2693 case 55: /* boolproperty ::= LARROW */
2694 #line 674 "pikchr.y"
2695 {p->cur->larrow=1; p->cur->rarrow=0; }
2696 #line 2721 "pikchr.c"
2697 break;
2698 case 56: /* boolproperty ::= RARROW */
2699 #line 675 "pikchr.y"
2700 {p->cur->larrow=0; p->cur->rarrow=1; }
2701 #line 2726 "pikchr.c"
2702 break;
2703 case 57: /* boolproperty ::= LRARROW */
2704 #line 676 "pikchr.y"
2705 {p->cur->larrow=1; p->cur->rarrow=1; }
2706 #line 2731 "pikchr.c"
2707 break;
2708 case 58: /* boolproperty ::= INVIS */
2709 #line 677 "pikchr.y"
2710 {p->cur->sw = -0.00001;}
2711 #line 2736 "pikchr.c"
2712 break;
2713 case 59: /* boolproperty ::= THICK */
2714 #line 678 "pikchr.y"
2715 {p->cur->sw *= 1.5;}
2716 #line 2741 "pikchr.c"
2717 break;
2718 case 60: /* boolproperty ::= THIN */
2719 #line 679 "pikchr.y"
2720 {p->cur->sw *= 0.67;}
2721 #line 2746 "pikchr.c"
2722 break;
2723 case 61: /* boolproperty ::= SOLID */
2724 #line 680 "pikchr.y"
2725 {p->cur->sw = pik_value(p,"thickness",9,0);
2726 p->cur->dotted = p->cur->dashed = 0.0;}
2727 #line 2752 "pikchr.c"
2728 break;
2729 case 62: /* textposition ::= */
2730 #line 683 "pikchr.y"
2731 {yymsp[1].minor.yy188 = 0;}
2732 #line 2757 "pikchr.c"
2733 break;
2734 case 63: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|MONO|ALIGNED|BIG|SMALL */
2735 #line 686 "pikchr.y"
2736 {yylhsminor.yy188 = (short int)pik_text_position(yymsp[-1].minor.yy188,&yymsp[0].minor.yy0);}
2737 #line 2762 "pikchr.c"
2738 yymsp[-1].minor.yy188 = yylhsminor.yy188;
2739 break;
2740 case 64: /* position ::= expr COMMA expr */
2741 #line 689 "pikchr.y"
2742 {yylhsminor.yy63.x=yymsp[-2].minor.yy21; yylhsminor.yy63.y=yymsp[0].minor.yy21;}
2743 #line 2768 "pikchr.c"
2744 yymsp[-2].minor.yy63 = yylhsminor.yy63;
2745 break;
2746 case 65: /* position ::= place PLUS expr COMMA expr */
2747 #line 691 "pikchr.y"
2748 {yylhsminor.yy63.x=yymsp[-4].minor.yy63.x+yymsp[-2].minor.yy21; yylhsminor.yy63.y=yymsp[-4].minor.yy63.y+yymsp[0].minor.yy21;}
2749 #line 2774 "pikchr.c"
2750 yymsp[-4].minor.yy63 = yylhsminor.yy63;
2751 break;
2752 case 66: /* position ::= place MINUS expr COMMA expr */
2753 #line 692 "pikchr.y"
2754 {yylhsminor.yy63.x=yymsp[-4].minor.yy63.x-yymsp[-2].minor.yy21; yylhsminor.yy63.y=yymsp[-4].minor.yy63.y-yymsp[0].minor.yy21;}
2755 #line 2780 "pikchr.c"
2756 yymsp[-4].minor.yy63 = yylhsminor.yy63;
2757 break;
2758 case 67: /* position ::= place PLUS LP expr COMMA expr RP */
2759 #line 694 "pikchr.y"
2760 {yylhsminor.yy63.x=yymsp[-6].minor.yy63.x+yymsp[-3].minor.yy21; yylhsminor.yy63.y=yymsp[-6].minor.yy63.y+yymsp[-1].minor.yy21;}
2761 #line 2786 "pikchr.c"
2762 yymsp[-6].minor.yy63 = yylhsminor.yy63;
2763 break;
2764 case 68: /* position ::= place MINUS LP expr COMMA expr RP */
2765 #line 696 "pikchr.y"
2766 {yylhsminor.yy63.x=yymsp[-6].minor.yy63.x-yymsp[-3].minor.yy21; yylhsminor.yy63.y=yymsp[-6].minor.yy63.y-yymsp[-1].minor.yy21;}
2767 #line 2792 "pikchr.c"
2768 yymsp[-6].minor.yy63 = yylhsminor.yy63;
2769 break;
2770 case 69: /* position ::= LP position COMMA position RP */
2771 #line 697 "pikchr.y"
2772 {yymsp[-4].minor.yy63.x=yymsp[-3].minor.yy63.x; yymsp[-4].minor.yy63.y=yymsp[-1].minor.yy63.y;}
2773 #line 2798 "pikchr.c"
2774 break;
2775 case 70: /* position ::= LP position RP */
2776 #line 698 "pikchr.y"
2777 {yymsp[-2].minor.yy63=yymsp[-1].minor.yy63;}
2778 #line 2803 "pikchr.c"
2779 break;
2780 case 71: /* position ::= expr between position AND position */
2781 #line 700 "pikchr.y"
2782 {yylhsminor.yy63 = pik_position_between(yymsp[-4].minor.yy21,yymsp[-2].minor.yy63,yymsp[0].minor.yy63);}
2783 #line 2808 "pikchr.c"
2784 yymsp[-4].minor.yy63 = yylhsminor.yy63;
2785 break;
2786 case 72: /* position ::= expr LT position COMMA position GT */
2787 #line 702 "pikchr.y"
2788 {yylhsminor.yy63 = pik_position_between(yymsp[-5].minor.yy21,yymsp[-3].minor.yy63,yymsp[-1].minor.yy63);}
2789 #line 2814 "pikchr.c"
2790 yymsp[-5].minor.yy63 = yylhsminor.yy63;
2791 break;
2792 case 73: /* position ::= expr ABOVE position */
2793 #line 703 "pikchr.y"
2794 {yylhsminor.yy63=yymsp[0].minor.yy63; yylhsminor.yy63.y += yymsp[-2].minor.yy21;}
2795 #line 2820 "pikchr.c"
2796 yymsp[-2].minor.yy63 = yylhsminor.yy63;
2797 break;
2798 case 74: /* position ::= expr BELOW position */
2799 #line 704 "pikchr.y"
2800 {yylhsminor.yy63=yymsp[0].minor.yy63; yylhsminor.yy63.y -= yymsp[-2].minor.yy21;}
2801 #line 2826 "pikchr.c"
2802 yymsp[-2].minor.yy63 = yylhsminor.yy63;
2803 break;
2804 case 75: /* position ::= expr LEFT OF position */
2805 #line 705 "pikchr.y"
2806 {yylhsminor.yy63=yymsp[0].minor.yy63; yylhsminor.yy63.x -= yymsp[-3].minor.yy21;}
2807 #line 2832 "pikchr.c"
2808 yymsp[-3].minor.yy63 = yylhsminor.yy63;
2809 break;
2810 case 76: /* position ::= expr RIGHT OF position */
2811 #line 706 "pikchr.y"
2812 {yylhsminor.yy63=yymsp[0].minor.yy63; yylhsminor.yy63.x += yymsp[-3].minor.yy21;}
2813 #line 2838 "pikchr.c"
2814 yymsp[-3].minor.yy63 = yylhsminor.yy63;
2815 break;
2816 case 77: /* position ::= expr ON HEADING EDGEPT OF position */
2817 #line 708 "pikchr.y"
2818 {yylhsminor.yy63 = pik_position_at_hdg(yymsp[-5].minor.yy21,&yymsp[-2].minor.yy0,yymsp[0].minor.yy63);}
2819 #line 2844 "pikchr.c"
2820 yymsp[-5].minor.yy63 = yylhsminor.yy63;
2821 break;
2822 case 78: /* position ::= expr HEADING EDGEPT OF position */
2823 #line 710 "pikchr.y"
2824 {yylhsminor.yy63 = pik_position_at_hdg(yymsp[-4].minor.yy21,&yymsp[-2].minor.yy0,yymsp[0].minor.yy63);}
2825 #line 2850 "pikchr.c"
2826 yymsp[-4].minor.yy63 = yylhsminor.yy63;
2827 break;
2828 case 79: /* position ::= expr EDGEPT OF position */
2829 #line 712 "pikchr.y"
2830 {yylhsminor.yy63 = pik_position_at_hdg(yymsp[-3].minor.yy21,&yymsp[-2].minor.yy0,yymsp[0].minor.yy63);}
2831 #line 2856 "pikchr.c"
2832 yymsp[-3].minor.yy63 = yylhsminor.yy63;
2833 break;
2834 case 80: /* position ::= expr ON HEADING expr FROM position */
2835 #line 714 "pikchr.y"
2836 {yylhsminor.yy63 = pik_position_at_angle(yymsp[-5].minor.yy21,yymsp[-2].minor.yy21,yymsp[0].minor.yy63);}
2837 #line 2862 "pikchr.c"
2838 yymsp[-5].minor.yy63 = yylhsminor.yy63;
2839 break;
2840 case 81: /* position ::= expr HEADING expr FROM position */
2841 #line 716 "pikchr.y"
2842 {yylhsminor.yy63 = pik_position_at_angle(yymsp[-4].minor.yy21,yymsp[-2].minor.yy21,yymsp[0].minor.yy63);}
2843 #line 2868 "pikchr.c"
2844 yymsp[-4].minor.yy63 = yylhsminor.yy63;
2845 break;
2846 case 82: /* place ::= edge OF object */
2847 #line 728 "pikchr.y"
2848 {yylhsminor.yy63 = pik_place_of_elem(p,yymsp[0].minor.yy162,&yymsp[-2].minor.yy0);}
2849 #line 2874 "pikchr.c"
2850 yymsp[-2].minor.yy63 = yylhsminor.yy63;
2851 break;
2852 case 83: /* place2 ::= object */
2853 #line 729 "pikchr.y"
2854 {yylhsminor.yy63 = pik_place_of_elem(p,yymsp[0].minor.yy162,0);}
2855 #line 2880 "pikchr.c"
2856 yymsp[0].minor.yy63 = yylhsminor.yy63;
2857 break;
2858 case 84: /* place2 ::= object DOT_E edge */
2859 #line 730 "pikchr.y"
2860 {yylhsminor.yy63 = pik_place_of_elem(p,yymsp[-2].minor.yy162,&yymsp[0].minor.yy0);}
2861 #line 2886 "pikchr.c"
2862 yymsp[-2].minor.yy63 = yylhsminor.yy63;
2863 break;
2864 case 85: /* place2 ::= NTH VERTEX OF object */
2865 #line 731 "pikchr.y"
2866 {yylhsminor.yy63 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy162);}
2867 #line 2892 "pikchr.c"
2868 yymsp[-3].minor.yy63 = yylhsminor.yy63;
2869 break;
2870 case 86: /* object ::= nth */
2871 #line 743 "pikchr.y"
2872 {yylhsminor.yy162 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2873 #line 2898 "pikchr.c"
2874 yymsp[0].minor.yy162 = yylhsminor.yy162;
2875 break;
2876 case 87: /* object ::= nth OF|IN object */
2877 #line 744 "pikchr.y"
2878 {yylhsminor.yy162 = pik_find_nth(p,yymsp[0].minor.yy162,&yymsp[-2].minor.yy0);}
2879 #line 2904 "pikchr.c"
2880 yymsp[-2].minor.yy162 = yylhsminor.yy162;
2881 break;
2882 case 88: /* objectname ::= THIS */
2883 #line 746 "pikchr.y"
2884 {yymsp[0].minor.yy162 = p->cur;}
2885 #line 2910 "pikchr.c"
2886 break;
2887 case 89: /* objectname ::= PLACENAME */
2888 #line 747 "pikchr.y"
2889 {yylhsminor.yy162 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2890 #line 2915 "pikchr.c"
2891 yymsp[0].minor.yy162 = yylhsminor.yy162;
2892 break;
2893 case 90: /* objectname ::= objectname DOT_U PLACENAME */
2894 #line 749 "pikchr.y"
2895 {yylhsminor.yy162 = pik_find_byname(p,yymsp[-2].minor.yy162,&yymsp[0].minor.yy0);}
2896 #line 2921 "pikchr.c"
2897 yymsp[-2].minor.yy162 = yylhsminor.yy162;
2898 break;
2899 case 91: /* nth ::= NTH CLASSNAME */
2900 #line 751 "pikchr.y"
2901 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2902 #line 2927 "pikchr.c"
2903 yymsp[-1].minor.yy0 = yylhsminor.yy0;
2904 break;
2905 case 92: /* nth ::= NTH LAST CLASSNAME */
2906 #line 752 "pikchr.y"
2907 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2908 #line 2933 "pikchr.c"
2909 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2910 break;
2911 case 93: /* nth ::= LAST CLASSNAME */
2912 #line 753 "pikchr.y"
2913 {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2914 #line 2939 "pikchr.c"
2915 break;
2916 case 94: /* nth ::= LAST */
2917 #line 754 "pikchr.y"
2918 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2919 #line 2944 "pikchr.c"
2920 yymsp[0].minor.yy0 = yylhsminor.yy0;
2921 break;
2922 case 95: /* nth ::= NTH LB RB */
2923 #line 755 "pikchr.y"
2924 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2925 #line 2950 "pikchr.c"
2926 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2927 break;
2928 case 96: /* nth ::= NTH LAST LB RB */
2929 #line 756 "pikchr.y"
2930 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2931 #line 2956 "pikchr.c"
2932 yymsp[-3].minor.yy0 = yylhsminor.yy0;
2933 break;
2934 case 97: /* nth ::= LAST LB RB */
2935 #line 757 "pikchr.y"
2936 {yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2937 #line 2962 "pikchr.c"
2938 break;
2939 case 98: /* expr ::= expr PLUS expr */
2940 #line 759 "pikchr.y"
2941 {yylhsminor.yy21=yymsp[-2].minor.yy21+yymsp[0].minor.yy21;}
2942 #line 2967 "pikchr.c"
2943 yymsp[-2].minor.yy21 = yylhsminor.yy21;
2944 break;
2945 case 99: /* expr ::= expr MINUS expr */
2946 #line 760 "pikchr.y"
2947 {yylhsminor.yy21=yymsp[-2].minor.yy21-yymsp[0].minor.yy21;}
2948 #line 2973 "pikchr.c"
2949 yymsp[-2].minor.yy21 = yylhsminor.yy21;
2950 break;
2951 case 100: /* expr ::= expr STAR expr */
2952 #line 761 "pikchr.y"
2953 {yylhsminor.yy21=yymsp[-2].minor.yy21*yymsp[0].minor.yy21;}
2954 #line 2979 "pikchr.c"
2955 yymsp[-2].minor.yy21 = yylhsminor.yy21;
2956 break;
2957 case 101: /* expr ::= expr SLASH expr */
2958 #line 762 "pikchr.y"
2959 {
2960 if( yymsp[0].minor.yy21==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy21 = 0.0; }
2961 else{ yylhsminor.yy21 = yymsp[-2].minor.yy21/yymsp[0].minor.yy21; }
2962 }
2963 #line 2988 "pikchr.c"
2964 yymsp[-2].minor.yy21 = yylhsminor.yy21;
2965 break;
2966 case 102: /* expr ::= MINUS expr */
2967 #line 766 "pikchr.y"
2968 {yymsp[-1].minor.yy21=-yymsp[0].minor.yy21;}
2969 #line 2994 "pikchr.c"
2970 break;
2971 case 103: /* expr ::= PLUS expr */
2972 #line 767 "pikchr.y"
2973 {yymsp[-1].minor.yy21=yymsp[0].minor.yy21;}
2974 #line 2999 "pikchr.c"
2975 break;
2976 case 104: /* expr ::= LP expr RP */
2977 #line 768 "pikchr.y"
2978 {yymsp[-2].minor.yy21=yymsp[-1].minor.yy21;}
2979 #line 3004 "pikchr.c"
2980 break;
2981 case 105: /* expr ::= LP FILL|COLOR|THICKNESS RP */
2982 #line 769 "pikchr.y"
2983 {yymsp[-2].minor.yy21=pik_get_var(p,&yymsp[-1].minor.yy0);}
2984 #line 3009 "pikchr.c"
2985 break;
2986 case 106: /* expr ::= NUMBER */
2987 #line 770 "pikchr.y"
2988 {yylhsminor.yy21=pik_atof(&yymsp[0].minor.yy0);}
2989 #line 3014 "pikchr.c"
2990 yymsp[0].minor.yy21 = yylhsminor.yy21;
2991 break;
2992 case 107: /* expr ::= ID */
2993 #line 771 "pikchr.y"
2994 {yylhsminor.yy21=pik_get_var(p,&yymsp[0].minor.yy0);}
2995 #line 3020 "pikchr.c"
2996 yymsp[0].minor.yy21 = yylhsminor.yy21;
2997 break;
2998 case 108: /* expr ::= FUNC1 LP expr RP */
2999 #line 772 "pikchr.y"
3000 {yylhsminor.yy21 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy21,0.0);}
3001 #line 3026 "pikchr.c"
3002 yymsp[-3].minor.yy21 = yylhsminor.yy21;
3003 break;
3004 case 109: /* expr ::= FUNC2 LP expr COMMA expr RP */
3005 #line 773 "pikchr.y"
3006 {yylhsminor.yy21 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy21,yymsp[-1].minor.yy21);}
3007 #line 3032 "pikchr.c"
3008 yymsp[-5].minor.yy21 = yylhsminor.yy21;
3009 break;
3010 case 110: /* expr ::= DIST LP position COMMA position RP */
3011 #line 774 "pikchr.y"
3012 {yymsp[-5].minor.yy21 = pik_dist(&yymsp[-3].minor.yy63,&yymsp[-1].minor.yy63);}
3013 #line 3038 "pikchr.c"
3014 break;
3015 case 111: /* expr ::= place2 DOT_XY X */
3016 #line 775 "pikchr.y"
3017 {yylhsminor.yy21 = yymsp[-2].minor.yy63.x;}
3018 #line 3043 "pikchr.c"
3019 yymsp[-2].minor.yy21 = yylhsminor.yy21;
3020 break;
3021 case 112: /* expr ::= place2 DOT_XY Y */
3022 #line 776 "pikchr.y"
3023 {yylhsminor.yy21 = yymsp[-2].minor.yy63.y;}
3024 #line 3049 "pikchr.c"
3025 yymsp[-2].minor.yy21 = yylhsminor.yy21;
3026 break;
3027 case 113: /* expr ::= object DOT_L numproperty */
3028 case 114: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==114);
3029 case 115: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==115);
3030 #line 777 "pikchr.y"
3031 {yylhsminor.yy21=pik_property_of(yymsp[-2].minor.yy162,&yymsp[0].minor.yy0);}
3032 #line 3057 "pikchr.c"
3033 yymsp[-2].minor.yy21 = yylhsminor.yy21;
3034 break;
3035 default:
3036 /* (116) lvalue ::= ID */ yytestcase(yyruleno==116);
3037 /* (117) lvalue ::= FILL */ yytestcase(yyruleno==117);
@@ -3098,19 +3130,19 @@
3130 ){
3131 pik_parserARG_FETCH
3132 pik_parserCTX_FETCH
3133 #define TOKEN yyminor
3134 /************ Begin %syntax_error code ****************************************/
3135 #line 537 "pikchr.y"
3136
3137 if( TOKEN.z && TOKEN.z[0] ){
3138 pik_error(p, &TOKEN, "syntax error");
3139 }else{
3140 pik_error(p, 0, "syntax error");
3141 }
3142 UNUSED_PARAMETER(yymajor);
3143 #line 3168 "pikchr.c"
3144 /************ End %syntax_error code ******************************************/
3145 pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
3146 pik_parserCTX_STORE
3147 }
3148
@@ -3227,23 +3259,16 @@
3259 yypParser->yyhwm++;
3260 assert( yypParser->yyhwm ==
3261 (int)(yypParser->yytos - yypParser->yystack));
3262 }
3263 #endif
 
3264 if( yypParser->yytos>=yypParser->yystackEnd ){
 
 
 
 
 
3265 if( yyGrowStack(yypParser) ){
3266 yyStackOverflow(yypParser);
3267 break;
3268 }
3269 }
 
3270 }
3271 yyact = yy_reduce(yypParser,yyruleno,yymajor,yyminor pik_parserCTX_PARAM);
3272 }else if( yyact <= YY_MAX_SHIFTREDUCE ){
3273 yy_shift(yypParser,yyact,(YYCODETYPE)yymajor,yyminor);
3274 #ifndef YYNOERRORRECOVERY
@@ -3382,11 +3407,11 @@
3407 #else
3408 (void)iToken;
3409 return 0;
3410 #endif
3411 }
3412 #line 782 "pikchr.y"
3413
3414
3415
3416 /* Chart of the 148 official CSS color names with their
3417 ** corresponding RGB values thru Color Module Level 4:
@@ -3963,10 +3988,11 @@
3988
3989 /* Methods for the "diamond" class */
3990 static void diamondInit(Pik *p, PObj *pObj){
3991 pObj->w = pik_value(p, "diamondwid",10,0);
3992 pObj->h = pik_value(p, "diamondht",9,0);
3993 pObj->bAltAutoFit = 1;
3994 }
3995 /* Return offset from the center of the box to the compass point
3996 ** given by parameter cp */
3997 static PPoint diamondOffset(Pik *p, PObj *pObj, int cp){
3998 PPoint pt = cZeroPoint;
@@ -3988,10 +4014,12 @@
4014 }
4015 UNUSED_PARAMETER(p);
4016 return pt;
4017 }
4018 static void diamondFit(Pik *p, PObj *pObj, PNum w, PNum h){
4019 if( pObj->w<=0 ) pObj->w = w*1.5;
4020 if( pObj->h<=0 ) pObj->h = h*1.5;
4021 if( pObj->w>0 && pObj->h>0 ){
4022 PNum x = pObj->w*h/pObj->h + w;
4023 PNum y = pObj->h*x/pObj->w;
4024 pObj->w = x;
4025 pObj->h = y;
@@ -6334,12 +6362,16 @@
6362 }
6363 if( pObj->type->xFit==0 ) return;
6364 pik_bbox_init(&bbox);
6365 pik_compute_layout_settings(p);
6366 pik_append_txt(p, pObj, &bbox);
6367 if( (eWhich & 1)!=0 || pObj->bAltAutoFit ){
6368 w = (bbox.ne.x - bbox.sw.x) + p->charWidth;
6369 }else{
6370 w = 0;
6371 }
6372 if( (eWhich & 2)!=0 || pObj->bAltAutoFit ){
6373 PNum h1, h2;
6374 h1 = (bbox.ne.y - pObj->ptAt.y);
6375 h2 = (pObj->ptAt.y - bbox.sw.y);
6376 h = 2.0*( h1<h2 ? h2 : h1 ) + 0.5*p->charHeight;
6377 }else{
@@ -8208,6 +8240,6 @@
8240
8241
8242 #endif /* PIKCHR_TCL */
8243
8244
8245 #line 8270 "pikchr.c"
8246
--- extsrc/pikchr.wasm
+++ extsrc/pikchr.wasm
cannot compute difference between binary files
11
--- extsrc/pikchr.wasm
+++ extsrc/pikchr.wasm
0 annot compute difference between binary files
1
--- extsrc/pikchr.wasm
+++ extsrc/pikchr.wasm
0 annot compute difference between binary files
1

Keyboard Shortcuts

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