Fossil SCM

Update the built-in pikchr.c and SQLite to the latest from both trees.

drh 2020-09-18 16:58 trunk
Commit c3de0a9930e5e4f1057e838f67a3b99181e157cc498141a1a2bb397972b8c2e2
3 files changed +308 -291 +3 -1 +33 -28
+308 -291
--- src/pikchr.c
+++ src/pikchr.c
@@ -359,20 +359,10 @@
359359
int mTPath; /* For last entry, 1: x set, 2: y set */
360360
PPoint aTPath[1000]; /* Path under construction */
361361
};
362362
363363
364
-/*
365
-** Flag values for Pik.mFlags (to be picked up by makeheaders on systems
366
-** that use makeheaders.
367
-*/
368
-#undef INTERFACE
369
-#define INTERFACE 1
370
-#if INTERFACE
371
-#define PIKCHR_INCLUDE_SOURCE 0x0001 /* Include Pikchr src in SVG output */
372
-#endif /* INTERFACE */
373
-
374364
/*
375365
** The behavior of an object class is defined by an instance of
376366
** this structure. This is the "virtual method" table.
377367
*/
378368
struct PClass {
@@ -456,11 +446,11 @@
456446
static void pik_behind(Pik*,PElem*);
457447
static PElem *pik_assert(Pik*,PNum,PToken*,PNum);
458448
static PElem *pik_place_assert(Pik*,PPoint*,PToken*,PPoint*);
459449
460450
461
-#line 487 "pikchr.c"
451
+#line 477 "pikchr.c"
462452
/**************** End of %include directives **********************************/
463453
/* These constants specify the various numeric values for terminal symbols.
464454
***************** Begin token definitions *************************************/
465455
#ifndef T_ID
466456
#define T_ID 1
@@ -1632,22 +1622,22 @@
16321622
** inside the C code.
16331623
*/
16341624
/********* Begin destructor definitions ***************************************/
16351625
case 94: /* element_list */
16361626
{
1637
-#line 476 "pikchr.y"
1627
+#line 466 "pikchr.y"
16381628
pik_elist_free(p,(yypminor->yy72));
1639
-#line 1664 "pikchr.c"
1629
+#line 1654 "pikchr.c"
16401630
}
16411631
break;
16421632
case 95: /* element */
16431633
case 96: /* unnamed_element */
16441634
case 97: /* basetype */
16451635
{
1646
-#line 478 "pikchr.y"
1636
+#line 468 "pikchr.y"
16471637
pik_elem_free(p,(yypminor->yy254));
1648
-#line 1673 "pikchr.c"
1638
+#line 1663 "pikchr.c"
16491639
}
16501640
break;
16511641
/********* End destructor definitions *****************************************/
16521642
default: break; /* If no destructor action specified: do nothing */
16531643
}
@@ -1861,14 +1851,14 @@
18611851
#endif
18621852
while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
18631853
/* Here code is inserted which will execute if the parser
18641854
** stack every overflows */
18651855
/******** Begin %stack_overflow code ******************************************/
1866
-#line 510 "pikchr.y"
1856
+#line 500 "pikchr.y"
18671857
18681858
pik_error(p, 0, "parser stack overflow");
1869
-#line 1894 "pikchr.c"
1859
+#line 1884 "pikchr.c"
18701860
/******** End %stack_overflow code ********************************************/
18711861
pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
18721862
pik_parserCTX_STORE
18731863
}
18741864
@@ -2333,593 +2323,593 @@
23332323
** break;
23342324
*/
23352325
/********** Begin reduce actions **********************************************/
23362326
YYMINORTYPE yylhsminor;
23372327
case 0: /* document ::= element_list */
2338
-#line 514 "pikchr.y"
2328
+#line 504 "pikchr.y"
23392329
{pik_render(p,yymsp[0].minor.yy72);}
2340
-#line 2365 "pikchr.c"
2330
+#line 2355 "pikchr.c"
23412331
break;
23422332
case 1: /* element_list ::= element */
2343
-#line 517 "pikchr.y"
2333
+#line 507 "pikchr.y"
23442334
{ yylhsminor.yy72 = pik_elist_append(p,0,yymsp[0].minor.yy254); }
2345
-#line 2370 "pikchr.c"
2335
+#line 2360 "pikchr.c"
23462336
yymsp[0].minor.yy72 = yylhsminor.yy72;
23472337
break;
23482338
case 2: /* element_list ::= element_list EOL element */
2349
-#line 519 "pikchr.y"
2339
+#line 509 "pikchr.y"
23502340
{ yylhsminor.yy72 = pik_elist_append(p,yymsp[-2].minor.yy72,yymsp[0].minor.yy254); }
2351
-#line 2376 "pikchr.c"
2341
+#line 2366 "pikchr.c"
23522342
yymsp[-2].minor.yy72 = yylhsminor.yy72;
23532343
break;
23542344
case 3: /* element ::= */
2355
-#line 522 "pikchr.y"
2345
+#line 512 "pikchr.y"
23562346
{ yymsp[1].minor.yy254 = 0; }
2357
-#line 2382 "pikchr.c"
2347
+#line 2372 "pikchr.c"
23582348
break;
23592349
case 4: /* element ::= direction */
2360
-#line 523 "pikchr.y"
2350
+#line 513 "pikchr.y"
23612351
{ pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy254=0; }
2362
-#line 2387 "pikchr.c"
2352
+#line 2377 "pikchr.c"
23632353
yymsp[0].minor.yy254 = yylhsminor.yy254;
23642354
break;
23652355
case 5: /* element ::= lvalue ASSIGN rvalue */
2366
-#line 524 "pikchr.y"
2356
+#line 514 "pikchr.y"
23672357
{pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy73,&yymsp[-1].minor.yy0); yylhsminor.yy254=0;}
2368
-#line 2393 "pikchr.c"
2358
+#line 2383 "pikchr.c"
23692359
yymsp[-2].minor.yy254 = yylhsminor.yy254;
23702360
break;
23712361
case 6: /* element ::= PLACENAME COLON unnamed_element */
2372
-#line 526 "pikchr.y"
2362
+#line 516 "pikchr.y"
23732363
{ yylhsminor.yy254 = yymsp[0].minor.yy254; pik_elem_setname(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0); }
2374
-#line 2399 "pikchr.c"
2364
+#line 2389 "pikchr.c"
23752365
yymsp[-2].minor.yy254 = yylhsminor.yy254;
23762366
break;
23772367
case 7: /* element ::= PLACENAME COLON position */
2378
-#line 528 "pikchr.y"
2368
+#line 518 "pikchr.y"
23792369
{ yylhsminor.yy254 = pik_elem_new(p,0,0,0);
23802370
if(yylhsminor.yy254){ yylhsminor.yy254->ptAt = yymsp[0].minor.yy139; pik_elem_setname(p,yylhsminor.yy254,&yymsp[-2].minor.yy0); }}
2381
-#line 2406 "pikchr.c"
2371
+#line 2396 "pikchr.c"
23822372
yymsp[-2].minor.yy254 = yylhsminor.yy254;
23832373
break;
23842374
case 8: /* element ::= unnamed_element */
2385
-#line 530 "pikchr.y"
2375
+#line 520 "pikchr.y"
23862376
{yylhsminor.yy254 = yymsp[0].minor.yy254;}
2387
-#line 2412 "pikchr.c"
2377
+#line 2402 "pikchr.c"
23882378
yymsp[0].minor.yy254 = yylhsminor.yy254;
23892379
break;
23902380
case 9: /* element ::= print prlist */
2391
-#line 531 "pikchr.y"
2381
+#line 521 "pikchr.y"
23922382
{pik_append(p,"<br>\n",5); yymsp[-1].minor.yy254=0;}
2393
-#line 2418 "pikchr.c"
2383
+#line 2408 "pikchr.c"
23942384
break;
23952385
case 10: /* element ::= ASSERT LP expr EQ expr RP */
2396
-#line 536 "pikchr.y"
2386
+#line 526 "pikchr.y"
23972387
{yymsp[-5].minor.yy254=pik_assert(p,yymsp[-3].minor.yy73,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy73);}
2398
-#line 2423 "pikchr.c"
2388
+#line 2413 "pikchr.c"
23992389
break;
24002390
case 11: /* element ::= ASSERT LP place EQ place RP */
2401
-#line 538 "pikchr.y"
2391
+#line 528 "pikchr.y"
24022392
{yymsp[-5].minor.yy254=pik_place_assert(p,&yymsp[-3].minor.yy139,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy139);}
2403
-#line 2428 "pikchr.c"
2393
+#line 2418 "pikchr.c"
24042394
break;
24052395
case 12: /* rvalue ::= PLACENAME */
2406
-#line 549 "pikchr.y"
2396
+#line 539 "pikchr.y"
24072397
{yylhsminor.yy73 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2408
-#line 2433 "pikchr.c"
2398
+#line 2423 "pikchr.c"
24092399
yymsp[0].minor.yy73 = yylhsminor.yy73;
24102400
break;
24112401
case 13: /* pritem ::= FILL */
24122402
case 14: /* pritem ::= COLOR */ yytestcase(yyruleno==14);
24132403
case 15: /* pritem ::= THICKNESS */ yytestcase(yyruleno==15);
2414
-#line 554 "pikchr.y"
2404
+#line 544 "pikchr.y"
24152405
{pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2416
-#line 2441 "pikchr.c"
2406
+#line 2431 "pikchr.c"
24172407
break;
24182408
case 16: /* pritem ::= rvalue */
2419
-#line 557 "pikchr.y"
2409
+#line 547 "pikchr.y"
24202410
{pik_append_num(p,"",yymsp[0].minor.yy73);}
2421
-#line 2446 "pikchr.c"
2411
+#line 2436 "pikchr.c"
24222412
break;
24232413
case 17: /* pritem ::= STRING */
2424
-#line 558 "pikchr.y"
2414
+#line 548 "pikchr.y"
24252415
{pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2426
-#line 2451 "pikchr.c"
2416
+#line 2441 "pikchr.c"
24272417
break;
24282418
case 18: /* prsep ::= COMMA */
2429
-#line 559 "pikchr.y"
2419
+#line 549 "pikchr.y"
24302420
{pik_append(p, " ", 1);}
2431
-#line 2456 "pikchr.c"
2421
+#line 2446 "pikchr.c"
24322422
break;
24332423
case 19: /* unnamed_element ::= basetype attribute_list */
2434
-#line 562 "pikchr.y"
2424
+#line 552 "pikchr.y"
24352425
{yylhsminor.yy254 = yymsp[-1].minor.yy254; pik_after_adding_attributes(p,yylhsminor.yy254);}
2436
-#line 2461 "pikchr.c"
2426
+#line 2451 "pikchr.c"
24372427
yymsp[-1].minor.yy254 = yylhsminor.yy254;
24382428
break;
24392429
case 20: /* basetype ::= CLASSNAME */
2440
-#line 564 "pikchr.y"
2430
+#line 554 "pikchr.y"
24412431
{yylhsminor.yy254 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2442
-#line 2467 "pikchr.c"
2432
+#line 2457 "pikchr.c"
24432433
yymsp[0].minor.yy254 = yylhsminor.yy254;
24442434
break;
24452435
case 21: /* basetype ::= STRING textposition */
2446
-#line 566 "pikchr.y"
2436
+#line 556 "pikchr.y"
24472437
{yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy74; yylhsminor.yy254 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2448
-#line 2473 "pikchr.c"
2438
+#line 2463 "pikchr.c"
24492439
yymsp[-1].minor.yy254 = yylhsminor.yy254;
24502440
break;
24512441
case 22: /* basetype ::= LB savelist element_list RB */
2452
-#line 568 "pikchr.y"
2442
+#line 558 "pikchr.y"
24532443
{ p->list = yymsp[-2].minor.yy72; yymsp[-3].minor.yy254 = pik_elem_new(p,0,0,yymsp[-1].minor.yy72); if(yymsp[-3].minor.yy254) yymsp[-3].minor.yy254->errTok = yymsp[0].minor.yy0; }
2454
-#line 2479 "pikchr.c"
2444
+#line 2469 "pikchr.c"
24552445
break;
24562446
case 23: /* savelist ::= */
2457
-#line 573 "pikchr.y"
2447
+#line 563 "pikchr.y"
24582448
{yymsp[1].minor.yy72 = p->list; p->list = 0;}
2459
-#line 2484 "pikchr.c"
2449
+#line 2474 "pikchr.c"
24602450
break;
24612451
case 24: /* relexpr ::= expr */
2462
-#line 580 "pikchr.y"
2452
+#line 570 "pikchr.y"
24632453
{yylhsminor.yy60.rAbs = yymsp[0].minor.yy73; yylhsminor.yy60.rRel = 0;}
2464
-#line 2489 "pikchr.c"
2454
+#line 2479 "pikchr.c"
24652455
yymsp[0].minor.yy60 = yylhsminor.yy60;
24662456
break;
24672457
case 25: /* relexpr ::= expr PERCENT */
2468
-#line 581 "pikchr.y"
2458
+#line 571 "pikchr.y"
24692459
{yylhsminor.yy60.rAbs = 0; yylhsminor.yy60.rRel = yymsp[-1].minor.yy73/100;}
2470
-#line 2495 "pikchr.c"
2460
+#line 2485 "pikchr.c"
24712461
yymsp[-1].minor.yy60 = yylhsminor.yy60;
24722462
break;
24732463
case 26: /* optrelexpr ::= */
2474
-#line 583 "pikchr.y"
2464
+#line 573 "pikchr.y"
24752465
{yymsp[1].minor.yy60.rAbs = 0; yymsp[1].minor.yy60.rRel = 1.0;}
2476
-#line 2501 "pikchr.c"
2466
+#line 2491 "pikchr.c"
24772467
break;
24782468
case 27: /* attribute_list ::= relexpr alist */
2479
-#line 585 "pikchr.y"
2469
+#line 575 "pikchr.y"
24802470
{pik_add_direction(p,0,&yymsp[-1].minor.yy60);}
2481
-#line 2506 "pikchr.c"
2471
+#line 2496 "pikchr.c"
24822472
break;
24832473
case 28: /* attribute ::= numproperty relexpr */
2484
-#line 589 "pikchr.y"
2474
+#line 579 "pikchr.y"
24852475
{ pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy60); }
2486
-#line 2511 "pikchr.c"
2476
+#line 2501 "pikchr.c"
24872477
break;
24882478
case 29: /* attribute ::= dashproperty expr */
2489
-#line 590 "pikchr.y"
2479
+#line 580 "pikchr.y"
24902480
{ pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy73); }
2491
-#line 2516 "pikchr.c"
2481
+#line 2506 "pikchr.c"
24922482
break;
24932483
case 30: /* attribute ::= dashproperty */
2494
-#line 591 "pikchr.y"
2484
+#line 581 "pikchr.y"
24952485
{ pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2496
-#line 2521 "pikchr.c"
2486
+#line 2511 "pikchr.c"
24972487
break;
24982488
case 31: /* attribute ::= colorproperty rvalue */
2499
-#line 592 "pikchr.y"
2489
+#line 582 "pikchr.y"
25002490
{ pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy73); }
2501
-#line 2526 "pikchr.c"
2491
+#line 2516 "pikchr.c"
25022492
break;
25032493
case 32: /* attribute ::= go direction optrelexpr */
2504
-#line 593 "pikchr.y"
2494
+#line 583 "pikchr.y"
25052495
{ pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy60);}
2506
-#line 2531 "pikchr.c"
2496
+#line 2521 "pikchr.c"
25072497
break;
25082498
case 33: /* attribute ::= go direction even position */
2509
-#line 594 "pikchr.y"
2499
+#line 584 "pikchr.y"
25102500
{pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy139);}
2511
-#line 2536 "pikchr.c"
2501
+#line 2526 "pikchr.c"
25122502
break;
25132503
case 34: /* attribute ::= CLOSE */
2514
-#line 595 "pikchr.y"
2504
+#line 585 "pikchr.y"
25152505
{ pik_close_path(p,&yymsp[0].minor.yy0); }
2516
-#line 2541 "pikchr.c"
2506
+#line 2531 "pikchr.c"
25172507
break;
25182508
case 35: /* attribute ::= CHOP */
2519
-#line 596 "pikchr.y"
2509
+#line 586 "pikchr.y"
25202510
{ p->cur->bChop = 1; }
2521
-#line 2546 "pikchr.c"
2511
+#line 2536 "pikchr.c"
25222512
break;
25232513
case 36: /* attribute ::= FROM position */
2524
-#line 597 "pikchr.y"
2514
+#line 587 "pikchr.y"
25252515
{ pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy139); }
2526
-#line 2551 "pikchr.c"
2516
+#line 2541 "pikchr.c"
25272517
break;
25282518
case 37: /* attribute ::= TO position */
2529
-#line 598 "pikchr.y"
2519
+#line 588 "pikchr.y"
25302520
{ pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy139); }
2531
-#line 2556 "pikchr.c"
2521
+#line 2546 "pikchr.c"
25322522
break;
25332523
case 38: /* attribute ::= THEN */
2534
-#line 599 "pikchr.y"
2524
+#line 589 "pikchr.y"
25352525
{ pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2536
-#line 2561 "pikchr.c"
2526
+#line 2551 "pikchr.c"
25372527
break;
25382528
case 39: /* attribute ::= THEN optrelexpr HEADING expr */
25392529
case 41: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==41);
2540
-#line 601 "pikchr.y"
2530
+#line 591 "pikchr.y"
25412531
{pik_move_hdg(p,&yymsp[-2].minor.yy60,&yymsp[-1].minor.yy0,yymsp[0].minor.yy73,0,&yymsp[-3].minor.yy0);}
2542
-#line 2567 "pikchr.c"
2532
+#line 2557 "pikchr.c"
25432533
break;
25442534
case 40: /* attribute ::= THEN optrelexpr EDGEPT */
25452535
case 42: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==42);
2546
-#line 602 "pikchr.y"
2536
+#line 592 "pikchr.y"
25472537
{pik_move_hdg(p,&yymsp[-1].minor.yy60,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2548
-#line 2573 "pikchr.c"
2538
+#line 2563 "pikchr.c"
25492539
break;
25502540
case 43: /* attribute ::= AT position */
2551
-#line 607 "pikchr.y"
2541
+#line 597 "pikchr.y"
25522542
{ pik_set_at(p,0,&yymsp[0].minor.yy139,&yymsp[-1].minor.yy0); }
2553
-#line 2578 "pikchr.c"
2543
+#line 2568 "pikchr.c"
25542544
break;
25552545
case 44: /* attribute ::= SAME */
2556
-#line 609 "pikchr.y"
2546
+#line 599 "pikchr.y"
25572547
{pik_same(p,0,&yymsp[0].minor.yy0);}
2558
-#line 2583 "pikchr.c"
2548
+#line 2573 "pikchr.c"
25592549
break;
25602550
case 45: /* attribute ::= SAME AS object */
2561
-#line 610 "pikchr.y"
2551
+#line 600 "pikchr.y"
25622552
{pik_same(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0);}
2563
-#line 2588 "pikchr.c"
2553
+#line 2578 "pikchr.c"
25642554
break;
25652555
case 46: /* attribute ::= STRING textposition */
2566
-#line 611 "pikchr.y"
2556
+#line 601 "pikchr.y"
25672557
{pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy74);}
2568
-#line 2593 "pikchr.c"
2558
+#line 2583 "pikchr.c"
25692559
break;
25702560
case 47: /* attribute ::= FIT */
2571
-#line 612 "pikchr.y"
2561
+#line 602 "pikchr.y"
25722562
{pik_size_to_fit(p,&yymsp[0].minor.yy0); }
2573
-#line 2598 "pikchr.c"
2563
+#line 2588 "pikchr.c"
25742564
break;
25752565
case 48: /* attribute ::= BEHIND object */
2576
-#line 613 "pikchr.y"
2566
+#line 603 "pikchr.y"
25772567
{pik_behind(p,yymsp[0].minor.yy254);}
2578
-#line 2603 "pikchr.c"
2568
+#line 2593 "pikchr.c"
25792569
break;
25802570
case 49: /* withclause ::= DOT_E edge AT position */
25812571
case 50: /* withclause ::= edge AT position */ yytestcase(yyruleno==50);
2582
-#line 621 "pikchr.y"
2572
+#line 611 "pikchr.y"
25832573
{ pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy139,&yymsp[-1].minor.yy0); }
2584
-#line 2609 "pikchr.c"
2574
+#line 2599 "pikchr.c"
25852575
break;
25862576
case 51: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2587
-#line 625 "pikchr.y"
2577
+#line 615 "pikchr.y"
25882578
{yylhsminor.yy0 = yymsp[0].minor.yy0;}
2589
-#line 2614 "pikchr.c"
2579
+#line 2604 "pikchr.c"
25902580
yymsp[0].minor.yy0 = yylhsminor.yy0;
25912581
break;
25922582
case 52: /* boolproperty ::= CW */
2593
-#line 636 "pikchr.y"
2583
+#line 626 "pikchr.y"
25942584
{p->cur->cw = 1;}
2595
-#line 2620 "pikchr.c"
2585
+#line 2610 "pikchr.c"
25962586
break;
25972587
case 53: /* boolproperty ::= CCW */
2598
-#line 637 "pikchr.y"
2588
+#line 627 "pikchr.y"
25992589
{p->cur->cw = 0;}
2600
-#line 2625 "pikchr.c"
2590
+#line 2615 "pikchr.c"
26012591
break;
26022592
case 54: /* boolproperty ::= LARROW */
2603
-#line 638 "pikchr.y"
2593
+#line 628 "pikchr.y"
26042594
{p->cur->larrow=1; p->cur->rarrow=0; }
2605
-#line 2630 "pikchr.c"
2595
+#line 2620 "pikchr.c"
26062596
break;
26072597
case 55: /* boolproperty ::= RARROW */
2608
-#line 639 "pikchr.y"
2598
+#line 629 "pikchr.y"
26092599
{p->cur->larrow=0; p->cur->rarrow=1; }
2610
-#line 2635 "pikchr.c"
2600
+#line 2625 "pikchr.c"
26112601
break;
26122602
case 56: /* boolproperty ::= LRARROW */
2613
-#line 640 "pikchr.y"
2603
+#line 630 "pikchr.y"
26142604
{p->cur->larrow=1; p->cur->rarrow=1; }
2615
-#line 2640 "pikchr.c"
2605
+#line 2630 "pikchr.c"
26162606
break;
26172607
case 57: /* boolproperty ::= INVIS */
2618
-#line 641 "pikchr.y"
2608
+#line 631 "pikchr.y"
26192609
{p->cur->sw = 0.0;}
2620
-#line 2645 "pikchr.c"
2610
+#line 2635 "pikchr.c"
26212611
break;
26222612
case 58: /* boolproperty ::= THICK */
2623
-#line 642 "pikchr.y"
2613
+#line 632 "pikchr.y"
26242614
{p->cur->sw *= 1.5;}
2625
-#line 2650 "pikchr.c"
2615
+#line 2640 "pikchr.c"
26262616
break;
26272617
case 59: /* boolproperty ::= THIN */
2628
-#line 643 "pikchr.y"
2618
+#line 633 "pikchr.y"
26292619
{p->cur->sw *= 0.67;}
2630
-#line 2655 "pikchr.c"
2620
+#line 2645 "pikchr.c"
26312621
break;
26322622
case 60: /* textposition ::= */
2633
-#line 645 "pikchr.y"
2623
+#line 635 "pikchr.y"
26342624
{yymsp[1].minor.yy74 = 0;}
2635
-#line 2660 "pikchr.c"
2625
+#line 2650 "pikchr.c"
26362626
break;
26372627
case 61: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2638
-#line 648 "pikchr.y"
2628
+#line 638 "pikchr.y"
26392629
{yylhsminor.yy74 = pik_text_position(yymsp[-1].minor.yy74,&yymsp[0].minor.yy0);}
2640
-#line 2665 "pikchr.c"
2630
+#line 2655 "pikchr.c"
26412631
yymsp[-1].minor.yy74 = yylhsminor.yy74;
26422632
break;
26432633
case 62: /* position ::= expr COMMA expr */
2644
-#line 651 "pikchr.y"
2634
+#line 641 "pikchr.y"
26452635
{yylhsminor.yy139.x=yymsp[-2].minor.yy73; yylhsminor.yy139.y=yymsp[0].minor.yy73;}
2646
-#line 2671 "pikchr.c"
2636
+#line 2661 "pikchr.c"
26472637
yymsp[-2].minor.yy139 = yylhsminor.yy139;
26482638
break;
26492639
case 63: /* position ::= place PLUS expr COMMA expr */
2650
-#line 653 "pikchr.y"
2640
+#line 643 "pikchr.y"
26512641
{yylhsminor.yy139.x=yymsp[-4].minor.yy139.x+yymsp[-2].minor.yy73; yylhsminor.yy139.y=yymsp[-4].minor.yy139.y+yymsp[0].minor.yy73;}
2652
-#line 2677 "pikchr.c"
2642
+#line 2667 "pikchr.c"
26532643
yymsp[-4].minor.yy139 = yylhsminor.yy139;
26542644
break;
26552645
case 64: /* position ::= place MINUS expr COMMA expr */
2656
-#line 654 "pikchr.y"
2646
+#line 644 "pikchr.y"
26572647
{yylhsminor.yy139.x=yymsp[-4].minor.yy139.x-yymsp[-2].minor.yy73; yylhsminor.yy139.y=yymsp[-4].minor.yy139.y-yymsp[0].minor.yy73;}
2658
-#line 2683 "pikchr.c"
2648
+#line 2673 "pikchr.c"
26592649
yymsp[-4].minor.yy139 = yylhsminor.yy139;
26602650
break;
26612651
case 65: /* position ::= place PLUS LP expr COMMA expr RP */
2662
-#line 656 "pikchr.y"
2652
+#line 646 "pikchr.y"
26632653
{yylhsminor.yy139.x=yymsp[-6].minor.yy139.x+yymsp[-3].minor.yy73; yylhsminor.yy139.y=yymsp[-6].minor.yy139.y+yymsp[-1].minor.yy73;}
2664
-#line 2689 "pikchr.c"
2654
+#line 2679 "pikchr.c"
26652655
yymsp[-6].minor.yy139 = yylhsminor.yy139;
26662656
break;
26672657
case 66: /* position ::= place MINUS LP expr COMMA expr RP */
2668
-#line 658 "pikchr.y"
2658
+#line 648 "pikchr.y"
26692659
{yylhsminor.yy139.x=yymsp[-6].minor.yy139.x-yymsp[-3].minor.yy73; yylhsminor.yy139.y=yymsp[-6].minor.yy139.y-yymsp[-1].minor.yy73;}
2670
-#line 2695 "pikchr.c"
2660
+#line 2685 "pikchr.c"
26712661
yymsp[-6].minor.yy139 = yylhsminor.yy139;
26722662
break;
26732663
case 67: /* position ::= LP position COMMA position RP */
2674
-#line 659 "pikchr.y"
2664
+#line 649 "pikchr.y"
26752665
{yymsp[-4].minor.yy139.x=yymsp[-3].minor.yy139.x; yymsp[-4].minor.yy139.y=yymsp[-1].minor.yy139.y;}
2676
-#line 2701 "pikchr.c"
2666
+#line 2691 "pikchr.c"
26772667
break;
26782668
case 68: /* position ::= LP position RP */
2679
-#line 660 "pikchr.y"
2669
+#line 650 "pikchr.y"
26802670
{yymsp[-2].minor.yy139=yymsp[-1].minor.yy139;}
2681
-#line 2706 "pikchr.c"
2671
+#line 2696 "pikchr.c"
26822672
break;
26832673
case 69: /* position ::= expr between position AND position */
2684
-#line 662 "pikchr.y"
2674
+#line 652 "pikchr.y"
26852675
{yylhsminor.yy139 = pik_position_between(yymsp[-4].minor.yy73,yymsp[-2].minor.yy139,yymsp[0].minor.yy139);}
2686
-#line 2711 "pikchr.c"
2676
+#line 2701 "pikchr.c"
26872677
yymsp[-4].minor.yy139 = yylhsminor.yy139;
26882678
break;
26892679
case 70: /* position ::= expr LT position COMMA position GT */
2690
-#line 664 "pikchr.y"
2680
+#line 654 "pikchr.y"
26912681
{yylhsminor.yy139 = pik_position_between(yymsp[-5].minor.yy73,yymsp[-3].minor.yy139,yymsp[-1].minor.yy139);}
2692
-#line 2717 "pikchr.c"
2682
+#line 2707 "pikchr.c"
26932683
yymsp[-5].minor.yy139 = yylhsminor.yy139;
26942684
break;
26952685
case 71: /* position ::= expr ABOVE position */
2696
-#line 665 "pikchr.y"
2686
+#line 655 "pikchr.y"
26972687
{yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.y += yymsp[-2].minor.yy73;}
2698
-#line 2723 "pikchr.c"
2688
+#line 2713 "pikchr.c"
26992689
yymsp[-2].minor.yy139 = yylhsminor.yy139;
27002690
break;
27012691
case 72: /* position ::= expr BELOW position */
2702
-#line 666 "pikchr.y"
2692
+#line 656 "pikchr.y"
27032693
{yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.y -= yymsp[-2].minor.yy73;}
2704
-#line 2729 "pikchr.c"
2694
+#line 2719 "pikchr.c"
27052695
yymsp[-2].minor.yy139 = yylhsminor.yy139;
27062696
break;
27072697
case 73: /* position ::= expr LEFT OF position */
2708
-#line 667 "pikchr.y"
2698
+#line 657 "pikchr.y"
27092699
{yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.x -= yymsp[-3].minor.yy73;}
2710
-#line 2735 "pikchr.c"
2700
+#line 2725 "pikchr.c"
27112701
yymsp[-3].minor.yy139 = yylhsminor.yy139;
27122702
break;
27132703
case 74: /* position ::= expr RIGHT OF position */
2714
-#line 668 "pikchr.y"
2704
+#line 658 "pikchr.y"
27152705
{yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.x += yymsp[-3].minor.yy73;}
2716
-#line 2741 "pikchr.c"
2706
+#line 2731 "pikchr.c"
27172707
yymsp[-3].minor.yy139 = yylhsminor.yy139;
27182708
break;
27192709
case 75: /* position ::= expr ON HEADING EDGEPT OF position */
2720
-#line 670 "pikchr.y"
2710
+#line 660 "pikchr.y"
27212711
{yylhsminor.yy139 = pik_position_at_hdg(yymsp[-5].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);}
2722
-#line 2747 "pikchr.c"
2712
+#line 2737 "pikchr.c"
27232713
yymsp[-5].minor.yy139 = yylhsminor.yy139;
27242714
break;
27252715
case 76: /* position ::= expr HEADING EDGEPT OF position */
2726
-#line 672 "pikchr.y"
2716
+#line 662 "pikchr.y"
27272717
{yylhsminor.yy139 = pik_position_at_hdg(yymsp[-4].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);}
2728
-#line 2753 "pikchr.c"
2718
+#line 2743 "pikchr.c"
27292719
yymsp[-4].minor.yy139 = yylhsminor.yy139;
27302720
break;
27312721
case 77: /* position ::= expr EDGEPT OF position */
2732
-#line 674 "pikchr.y"
2722
+#line 664 "pikchr.y"
27332723
{yylhsminor.yy139 = pik_position_at_hdg(yymsp[-3].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);}
2734
-#line 2759 "pikchr.c"
2724
+#line 2749 "pikchr.c"
27352725
yymsp[-3].minor.yy139 = yylhsminor.yy139;
27362726
break;
27372727
case 78: /* position ::= expr ON HEADING expr FROM position */
2738
-#line 676 "pikchr.y"
2728
+#line 666 "pikchr.y"
27392729
{yylhsminor.yy139 = pik_position_at_angle(yymsp[-5].minor.yy73,yymsp[-2].minor.yy73,yymsp[0].minor.yy139);}
2740
-#line 2765 "pikchr.c"
2730
+#line 2755 "pikchr.c"
27412731
yymsp[-5].minor.yy139 = yylhsminor.yy139;
27422732
break;
27432733
case 79: /* position ::= expr HEADING expr FROM position */
2744
-#line 678 "pikchr.y"
2734
+#line 668 "pikchr.y"
27452735
{yylhsminor.yy139 = pik_position_at_angle(yymsp[-4].minor.yy73,yymsp[-2].minor.yy73,yymsp[0].minor.yy139);}
2746
-#line 2771 "pikchr.c"
2736
+#line 2761 "pikchr.c"
27472737
yymsp[-4].minor.yy139 = yylhsminor.yy139;
27482738
break;
27492739
case 80: /* place ::= edge OF object */
2750
-#line 690 "pikchr.y"
2740
+#line 680 "pikchr.y"
27512741
{yylhsminor.yy139 = pik_place_of_elem(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0);}
2752
-#line 2777 "pikchr.c"
2742
+#line 2767 "pikchr.c"
27532743
yymsp[-2].minor.yy139 = yylhsminor.yy139;
27542744
break;
27552745
case 81: /* place2 ::= object */
2756
-#line 691 "pikchr.y"
2746
+#line 681 "pikchr.y"
27572747
{yylhsminor.yy139 = pik_place_of_elem(p,yymsp[0].minor.yy254,0);}
2758
-#line 2783 "pikchr.c"
2748
+#line 2773 "pikchr.c"
27592749
yymsp[0].minor.yy139 = yylhsminor.yy139;
27602750
break;
27612751
case 82: /* place2 ::= object DOT_E edge */
2762
-#line 692 "pikchr.y"
2752
+#line 682 "pikchr.y"
27632753
{yylhsminor.yy139 = pik_place_of_elem(p,yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);}
2764
-#line 2789 "pikchr.c"
2754
+#line 2779 "pikchr.c"
27652755
yymsp[-2].minor.yy139 = yylhsminor.yy139;
27662756
break;
27672757
case 83: /* place2 ::= NTH VERTEX OF object */
2768
-#line 693 "pikchr.y"
2758
+#line 683 "pikchr.y"
27692759
{yylhsminor.yy139 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy254);}
2770
-#line 2795 "pikchr.c"
2760
+#line 2785 "pikchr.c"
27712761
yymsp[-3].minor.yy139 = yylhsminor.yy139;
27722762
break;
27732763
case 84: /* object ::= nth */
2774
-#line 705 "pikchr.y"
2764
+#line 695 "pikchr.y"
27752765
{yylhsminor.yy254 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2776
-#line 2801 "pikchr.c"
2766
+#line 2791 "pikchr.c"
27772767
yymsp[0].minor.yy254 = yylhsminor.yy254;
27782768
break;
27792769
case 85: /* object ::= nth OF|IN object */
2780
-#line 706 "pikchr.y"
2770
+#line 696 "pikchr.y"
27812771
{yylhsminor.yy254 = pik_find_nth(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0);}
2782
-#line 2807 "pikchr.c"
2772
+#line 2797 "pikchr.c"
27832773
yymsp[-2].minor.yy254 = yylhsminor.yy254;
27842774
break;
27852775
case 86: /* objectname ::= PLACENAME */
2786
-#line 708 "pikchr.y"
2776
+#line 698 "pikchr.y"
27872777
{yylhsminor.yy254 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2788
-#line 2813 "pikchr.c"
2778
+#line 2803 "pikchr.c"
27892779
yymsp[0].minor.yy254 = yylhsminor.yy254;
27902780
break;
27912781
case 87: /* objectname ::= objectname DOT_U PLACENAME */
2792
-#line 710 "pikchr.y"
2782
+#line 700 "pikchr.y"
27932783
{yylhsminor.yy254 = pik_find_byname(p,yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);}
2794
-#line 2819 "pikchr.c"
2784
+#line 2809 "pikchr.c"
27952785
yymsp[-2].minor.yy254 = yylhsminor.yy254;
27962786
break;
27972787
case 88: /* nth ::= NTH CLASSNAME */
2798
-#line 712 "pikchr.y"
2788
+#line 702 "pikchr.y"
27992789
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2800
-#line 2825 "pikchr.c"
2790
+#line 2815 "pikchr.c"
28012791
yymsp[-1].minor.yy0 = yylhsminor.yy0;
28022792
break;
28032793
case 89: /* nth ::= NTH LAST CLASSNAME */
2804
-#line 713 "pikchr.y"
2794
+#line 703 "pikchr.y"
28052795
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2806
-#line 2831 "pikchr.c"
2796
+#line 2821 "pikchr.c"
28072797
yymsp[-2].minor.yy0 = yylhsminor.yy0;
28082798
break;
28092799
case 90: /* nth ::= LAST CLASSNAME */
2810
-#line 714 "pikchr.y"
2800
+#line 704 "pikchr.y"
28112801
{yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2812
-#line 2837 "pikchr.c"
2802
+#line 2827 "pikchr.c"
28132803
break;
28142804
case 91: /* nth ::= LAST */
2815
-#line 715 "pikchr.y"
2805
+#line 705 "pikchr.y"
28162806
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2817
-#line 2842 "pikchr.c"
2807
+#line 2832 "pikchr.c"
28182808
yymsp[0].minor.yy0 = yylhsminor.yy0;
28192809
break;
28202810
case 92: /* nth ::= NTH LB RB */
2821
-#line 716 "pikchr.y"
2811
+#line 706 "pikchr.y"
28222812
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2823
-#line 2848 "pikchr.c"
2813
+#line 2838 "pikchr.c"
28242814
yymsp[-2].minor.yy0 = yylhsminor.yy0;
28252815
break;
28262816
case 93: /* nth ::= NTH LAST LB RB */
2827
-#line 717 "pikchr.y"
2817
+#line 707 "pikchr.y"
28282818
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2829
-#line 2854 "pikchr.c"
2819
+#line 2844 "pikchr.c"
28302820
yymsp[-3].minor.yy0 = yylhsminor.yy0;
28312821
break;
28322822
case 94: /* nth ::= LAST LB RB */
2833
-#line 718 "pikchr.y"
2823
+#line 708 "pikchr.y"
28342824
{yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2835
-#line 2860 "pikchr.c"
2825
+#line 2850 "pikchr.c"
28362826
break;
28372827
case 95: /* expr ::= expr PLUS expr */
2838
-#line 720 "pikchr.y"
2828
+#line 710 "pikchr.y"
28392829
{yylhsminor.yy73=yymsp[-2].minor.yy73+yymsp[0].minor.yy73;}
2840
-#line 2865 "pikchr.c"
2830
+#line 2855 "pikchr.c"
28412831
yymsp[-2].minor.yy73 = yylhsminor.yy73;
28422832
break;
28432833
case 96: /* expr ::= expr MINUS expr */
2844
-#line 721 "pikchr.y"
2834
+#line 711 "pikchr.y"
28452835
{yylhsminor.yy73=yymsp[-2].minor.yy73-yymsp[0].minor.yy73;}
2846
-#line 2871 "pikchr.c"
2836
+#line 2861 "pikchr.c"
28472837
yymsp[-2].minor.yy73 = yylhsminor.yy73;
28482838
break;
28492839
case 97: /* expr ::= expr STAR expr */
2850
-#line 722 "pikchr.y"
2840
+#line 712 "pikchr.y"
28512841
{yylhsminor.yy73=yymsp[-2].minor.yy73*yymsp[0].minor.yy73;}
2852
-#line 2877 "pikchr.c"
2842
+#line 2867 "pikchr.c"
28532843
yymsp[-2].minor.yy73 = yylhsminor.yy73;
28542844
break;
28552845
case 98: /* expr ::= expr SLASH expr */
2856
-#line 723 "pikchr.y"
2846
+#line 713 "pikchr.y"
28572847
{
28582848
if( yymsp[0].minor.yy73==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy73 = 0.0; }
28592849
else{ yylhsminor.yy73 = yymsp[-2].minor.yy73/yymsp[0].minor.yy73; }
28602850
}
2861
-#line 2886 "pikchr.c"
2851
+#line 2876 "pikchr.c"
28622852
yymsp[-2].minor.yy73 = yylhsminor.yy73;
28632853
break;
28642854
case 99: /* expr ::= MINUS expr */
2865
-#line 727 "pikchr.y"
2855
+#line 717 "pikchr.y"
28662856
{yymsp[-1].minor.yy73=-yymsp[0].minor.yy73;}
2867
-#line 2892 "pikchr.c"
2857
+#line 2882 "pikchr.c"
28682858
break;
28692859
case 100: /* expr ::= PLUS expr */
2870
-#line 728 "pikchr.y"
2860
+#line 718 "pikchr.y"
28712861
{yymsp[-1].minor.yy73=yymsp[0].minor.yy73;}
2872
-#line 2897 "pikchr.c"
2862
+#line 2887 "pikchr.c"
28732863
break;
28742864
case 101: /* expr ::= LP expr RP */
2875
-#line 729 "pikchr.y"
2865
+#line 719 "pikchr.y"
28762866
{yymsp[-2].minor.yy73=yymsp[-1].minor.yy73;}
2877
-#line 2902 "pikchr.c"
2867
+#line 2892 "pikchr.c"
28782868
break;
28792869
case 102: /* expr ::= NUMBER */
2880
-#line 730 "pikchr.y"
2870
+#line 720 "pikchr.y"
28812871
{yylhsminor.yy73=pik_atof(&yymsp[0].minor.yy0);}
2882
-#line 2907 "pikchr.c"
2872
+#line 2897 "pikchr.c"
28832873
yymsp[0].minor.yy73 = yylhsminor.yy73;
28842874
break;
28852875
case 103: /* expr ::= ID */
2886
-#line 731 "pikchr.y"
2876
+#line 721 "pikchr.y"
28872877
{yylhsminor.yy73=pik_get_var(p,&yymsp[0].minor.yy0);}
2888
-#line 2913 "pikchr.c"
2878
+#line 2903 "pikchr.c"
28892879
yymsp[0].minor.yy73 = yylhsminor.yy73;
28902880
break;
28912881
case 104: /* expr ::= FUNC1 LP expr RP */
2892
-#line 732 "pikchr.y"
2882
+#line 722 "pikchr.y"
28932883
{yylhsminor.yy73 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy73,0.0);}
2894
-#line 2919 "pikchr.c"
2884
+#line 2909 "pikchr.c"
28952885
yymsp[-3].minor.yy73 = yylhsminor.yy73;
28962886
break;
28972887
case 105: /* expr ::= FUNC2 LP expr COMMA expr RP */
2898
-#line 733 "pikchr.y"
2888
+#line 723 "pikchr.y"
28992889
{yylhsminor.yy73 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy73,yymsp[-1].minor.yy73);}
2900
-#line 2925 "pikchr.c"
2890
+#line 2915 "pikchr.c"
29012891
yymsp[-5].minor.yy73 = yylhsminor.yy73;
29022892
break;
29032893
case 106: /* expr ::= place2 DOT_XY X */
2904
-#line 734 "pikchr.y"
2894
+#line 724 "pikchr.y"
29052895
{yylhsminor.yy73 = yymsp[-2].minor.yy139.x;}
2906
-#line 2931 "pikchr.c"
2896
+#line 2921 "pikchr.c"
29072897
yymsp[-2].minor.yy73 = yylhsminor.yy73;
29082898
break;
29092899
case 107: /* expr ::= place2 DOT_XY Y */
2910
-#line 735 "pikchr.y"
2900
+#line 725 "pikchr.y"
29112901
{yylhsminor.yy73 = yymsp[-2].minor.yy139.y;}
2912
-#line 2937 "pikchr.c"
2902
+#line 2927 "pikchr.c"
29132903
yymsp[-2].minor.yy73 = yylhsminor.yy73;
29142904
break;
29152905
case 108: /* expr ::= object DOT_L numproperty */
29162906
case 109: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==109);
29172907
case 110: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==110);
2918
-#line 736 "pikchr.y"
2908
+#line 726 "pikchr.y"
29192909
{yylhsminor.yy73=pik_property_of(yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);}
2920
-#line 2945 "pikchr.c"
2910
+#line 2935 "pikchr.c"
29212911
yymsp[-2].minor.yy73 = yylhsminor.yy73;
29222912
break;
29232913
default:
29242914
/* (111) lvalue ::= ID */ yytestcase(yyruleno==111);
29252915
/* (112) lvalue ::= FILL */ yytestcase(yyruleno==112);
@@ -3018,19 +3008,19 @@
30183008
){
30193009
pik_parserARG_FETCH
30203010
pik_parserCTX_FETCH
30213011
#define TOKEN yyminor
30223012
/************ Begin %syntax_error code ****************************************/
3023
-#line 502 "pikchr.y"
3013
+#line 492 "pikchr.y"
30243014
30253015
if( TOKEN.z && TOKEN.z[0] ){
30263016
pik_error(p, &TOKEN, "syntax error");
30273017
}else{
30283018
pik_error(p, 0, "syntax error");
30293019
}
30303020
UNUSED_PARAMETER(yymajor);
3031
-#line 3056 "pikchr.c"
3021
+#line 3046 "pikchr.c"
30323022
/************ End %syntax_error code ******************************************/
30333023
pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
30343024
pik_parserCTX_STORE
30353025
}
30363026
@@ -3259,11 +3249,11 @@
32593249
#else
32603250
(void)iToken;
32613251
return 0;
32623252
#endif
32633253
}
3264
-#line 741 "pikchr.y"
3254
+#line 731 "pikchr.y"
32653255
32663256
32673257
32683258
/* Chart of the 140 official HTML color names with their
32693259
** corresponding RGB value.
@@ -6409,23 +6399,10 @@
64096399
h = p->bbox.ne.y - p->bbox.sw.y;
64106400
p->wSVG = (int)(p->rScale*w);
64116401
p->hSVG = (int)(p->rScale*h);
64126402
pik_append_dis(p, " viewBox=\"0 0 ",w,"");
64136403
pik_append_dis(p, " ",h,"\">\n");
6414
- if( (p->mFlags & PIKCHR_INCLUDE_SOURCE)!=0 ){
6415
- /* emit original pikchr source code as metadata */
6416
- /* FIXME: emit this only if a certain p->mFlags is set. */
6417
- pik_append(p, "<metadata>\n", 11);
6418
- pik_append(p, "<pikchr:pikchr xmlns:pikchr="
6419
- "\"https://pikchr.org/home/doc/trunk/doc/grammar.md\">\n",
6420
- -1);
6421
- pik_append(p, "<pikchr:src><![CDATA[", 21);
6422
- pik_append(p, p->zIn, (int)p->nIn);
6423
- pik_append(p, "]]></pikchr:src>\n", 17);
6424
- pik_append(p, "</pikchr:pikchr>\n", 17);
6425
- pik_append(p, "</metadata>\n", 12);
6426
- }
64276404
pik_elist_render(p, pEList);
64286405
pik_append(p,"</svg>\n", -1);
64296406
}else{
64306407
p->wSVG = -1;
64316408
p->hSVG = -1;
@@ -6964,54 +6941,99 @@
69646941
return 0;
69656942
}
69666943
#endif /* PIKCHR_FUZZ */
69676944
69686945
#if defined(PIKCHR_SHELL)
6969
-/* Texting interface
6946
+/* Print a usage comment for the shell and exit. */
6947
+static void usage(const char *argv0){
6948
+ fprintf(stderr, "usage: %s [OPTIONS] FILE ...\n", argv0);
6949
+ fprintf(stderr,
6950
+ "Convert Pikchr input files into SVG.\n"
6951
+ "Options:\n"
6952
+ " --svg-only Omit raw SVG without the HTML wrapper\n"
6953
+ );
6954
+ exit(1);
6955
+}
6956
+
6957
+/* Send text to standard output, but escape HTML markup */
6958
+static void print_escape_html(const char *z){
6959
+ int j;
6960
+ char c;
6961
+ while( z[0]!=0 ){
6962
+ for(j=0; (c = z[j])!=0 && c!='<' && c!='>' && c!='&'; j++){}
6963
+ if( j ) printf("%.*s", j, z);
6964
+ z += j+1;
6965
+ j = -1;
6966
+ if( c=='<' ){
6967
+ printf("&lt;");
6968
+ }else if( c=='>' ){
6969
+ printf("&gt;");
6970
+ }else if( c=='&' ){
6971
+ printf("&amp;");
6972
+ }else if( c==0 ){
6973
+ break;
6974
+ }
6975
+ }
6976
+}
6977
+
6978
+/* Testing interface
69706979
**
69716980
** Generate HTML on standard output that displays both the original
69726981
** input text and the rendered SVG for all files named on the command
69736982
** line.
69746983
*/
69756984
int main(int argc, char **argv){
69766985
int i;
6977
- int bNoEcho = 0; /* Do not show the text of the script */
6978
- int mPikchrFlags = 0; /* Flags passed into pikchr() */
6979
- printf(
6986
+ int bSvgOnly = 0; /* Output SVG only. No HTML wrapper */
6987
+ const char *zHtmlHdr =
69806988
"<!DOCTYPE html>\n"
69816989
"<html lang=\"en-US\">\n"
69826990
"<head>\n<title>PIKCHR Test</title>\n"
6991
+ "<style>\n"
6992
+ " .hidden {\n"
6993
+ " position: absolute !important;\n"
6994
+ " opacity: 0 !important;\n"
6995
+ " pointer-events: none !important;\n"
6996
+ " display: none !important;\n"
6997
+ " }\n"
6998
+ "</style>\n"
6999
+ "<script>\n"
7000
+ " function toggleHidden(id){\n"
7001
+ " for(var c of document.getElementById(id).children){\n"
7002
+ " c.classList.toggle('hidden');\n"
7003
+ " }\n"
7004
+ " }\n"
7005
+ "</script>\n"
69837006
"<meta charset=\"utf-8\">\n"
69847007
"</head>\n"
69857008
"<body>\n"
6986
- );
7009
+ ;
7010
+ if( argc<2 ) usage(argv[0]);
69877011
for(i=1; i<argc; i++){
69887012
FILE *in;
69897013
size_t sz;
69907014
char *zIn;
69917015
char *zOut;
6992
- char *z, c;
6993
- int j;
69947016
int w, h;
69957017
69967018
if( argv[i][0]=='-' ){
69977019
char *z = argv[i];
69987020
z++;
69997021
if( z[0]=='-' ) z++;
7000
- if( strcmp(z,"no-echo")==0 ){
7001
- bNoEcho = 1;
7002
- }else
7003
- if( strcmp(z,"include-source")==0 ){
7004
- mPikchrFlags |= PIKCHR_INCLUDE_SOURCE;
7022
+ if( strcmp(z,"svg-only")==0 ){
7023
+ if( zHtmlHdr==0 ){
7024
+ fprintf(stderr, "the \"%s\" option must come first\n",argv[i]);
7025
+ exit(1);
7026
+ }
7027
+ bSvgOnly = 1;
70057028
}else
70067029
{
70077030
fprintf(stderr,"unknown option: \"%s\"\n", argv[i]);
7008
- exit(1);
7031
+ usage(argv[0]);
70097032
}
70107033
continue;
70117034
}
7012
- printf("<h1>File %s</h1>\n", argv[i]);
70137035
in = fopen(argv[i], "rb");
70147036
if( in==0 ){
70157037
fprintf(stderr, "cannot open \"%s\" for reading\n", argv[i]);
70167038
continue;
70177039
}
@@ -7025,45 +7047,40 @@
70257047
continue;
70267048
}
70277049
sz = fread(zIn, 1, sz, in);
70287050
fclose(in);
70297051
zIn[sz] = 0;
7030
- if( !bNoEcho ){
7031
- printf("<p>Source text:</p>\n<blockquote><pre>\n");
7032
- z = zIn;
7033
- while( z[0]!=0 ){
7034
- for(j=0; (c = z[j])!=0 && c!='<' && c!='>' && c!='&'; j++){}
7035
- if( j ) printf("%.*s", j, z);
7036
- z += j+1;
7037
- j = -1;
7038
- if( c=='<' ){
7039
- printf("&lt;");
7040
- }else if( c=='>' ){
7041
- printf("&gt;");
7042
- }else if( c=='&' ){
7043
- printf("&amp;");
7044
- }else if( c==0 ){
7045
- break;
7046
- }
7047
- }
7048
- printf("</pre></blockquote>\n");
7049
- }
7050
- zOut = pikchr(zIn, "pikchr", mPikchrFlags, &w, &h);
7051
- free(zIn);
7052
- if( zOut ){
7053
- if( w<0 ){
7054
- printf("<p>ERROR:</p>\n");
7055
- }else if( bNoEcho==0 ){
7056
- printf("<p>Output size: %d by %d</p>\n", w, h);
7057
- }
7058
- printf("<div style='border:3px solid lightgray;max-width:%dpx'>\n"
7059
- "%s</div>\n",
7060
- w, zOut);
7061
- free(zOut);
7062
- }
7063
- }
7064
- printf("</body></html>\n");
7052
+ zOut = pikchr(zIn, "pikchr", 0, &w, &h);
7053
+ if( zOut==0 ){
7054
+ fprintf(stderr, "pikchr() returns NULL. Out of memory?\n");
7055
+ exit(1);
7056
+ }
7057
+ if( bSvgOnly ){
7058
+ printf("%s\n", zOut);
7059
+ }else{
7060
+ if( zHtmlHdr ){
7061
+ printf("%s", zHtmlHdr);
7062
+ zHtmlHdr = 0;
7063
+ }
7064
+ printf("<h1>File %s</h1>\n", argv[i]);
7065
+ if( w<0 ){
7066
+ printf("<p>ERROR</p>\n%s\n", zOut);
7067
+ }else{
7068
+ printf("<div id=\"svg-%d\" onclick=\"toggleHidden('svg-%d')\">\n",i,i);
7069
+ printf("<div style='border:3px solid lightgray;max-width:%dpx;'>\n",w);
7070
+ printf("%s</div>\n", zOut);
7071
+ printf("<pre class='hidden'>");
7072
+ print_escape_html(zIn);
7073
+ printf("</pre>\n</div>\n");
7074
+ }
7075
+ }
7076
+ free(zOut);
7077
+ free(zIn);
7078
+ }
7079
+ if( !bSvgOnly ){
7080
+ printf("</body></html>\n");
7081
+ }
70657082
return 0;
70667083
}
70677084
#endif /* PIKCHR_SHELL */
70687085
7069
-#line 7094 "pikchr.c"
7086
+#line 7111 "pikchr.c"
70707087
--- src/pikchr.c
+++ src/pikchr.c
@@ -359,20 +359,10 @@
359 int mTPath; /* For last entry, 1: x set, 2: y set */
360 PPoint aTPath[1000]; /* Path under construction */
361 };
362
363
364 /*
365 ** Flag values for Pik.mFlags (to be picked up by makeheaders on systems
366 ** that use makeheaders.
367 */
368 #undef INTERFACE
369 #define INTERFACE 1
370 #if INTERFACE
371 #define PIKCHR_INCLUDE_SOURCE 0x0001 /* Include Pikchr src in SVG output */
372 #endif /* INTERFACE */
373
374 /*
375 ** The behavior of an object class is defined by an instance of
376 ** this structure. This is the "virtual method" table.
377 */
378 struct PClass {
@@ -456,11 +446,11 @@
456 static void pik_behind(Pik*,PElem*);
457 static PElem *pik_assert(Pik*,PNum,PToken*,PNum);
458 static PElem *pik_place_assert(Pik*,PPoint*,PToken*,PPoint*);
459
460
461 #line 487 "pikchr.c"
462 /**************** End of %include directives **********************************/
463 /* These constants specify the various numeric values for terminal symbols.
464 ***************** Begin token definitions *************************************/
465 #ifndef T_ID
466 #define T_ID 1
@@ -1632,22 +1622,22 @@
1632 ** inside the C code.
1633 */
1634 /********* Begin destructor definitions ***************************************/
1635 case 94: /* element_list */
1636 {
1637 #line 476 "pikchr.y"
1638 pik_elist_free(p,(yypminor->yy72));
1639 #line 1664 "pikchr.c"
1640 }
1641 break;
1642 case 95: /* element */
1643 case 96: /* unnamed_element */
1644 case 97: /* basetype */
1645 {
1646 #line 478 "pikchr.y"
1647 pik_elem_free(p,(yypminor->yy254));
1648 #line 1673 "pikchr.c"
1649 }
1650 break;
1651 /********* End destructor definitions *****************************************/
1652 default: break; /* If no destructor action specified: do nothing */
1653 }
@@ -1861,14 +1851,14 @@
1861 #endif
1862 while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
1863 /* Here code is inserted which will execute if the parser
1864 ** stack every overflows */
1865 /******** Begin %stack_overflow code ******************************************/
1866 #line 510 "pikchr.y"
1867
1868 pik_error(p, 0, "parser stack overflow");
1869 #line 1894 "pikchr.c"
1870 /******** End %stack_overflow code ********************************************/
1871 pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
1872 pik_parserCTX_STORE
1873 }
1874
@@ -2333,593 +2323,593 @@
2333 ** break;
2334 */
2335 /********** Begin reduce actions **********************************************/
2336 YYMINORTYPE yylhsminor;
2337 case 0: /* document ::= element_list */
2338 #line 514 "pikchr.y"
2339 {pik_render(p,yymsp[0].minor.yy72);}
2340 #line 2365 "pikchr.c"
2341 break;
2342 case 1: /* element_list ::= element */
2343 #line 517 "pikchr.y"
2344 { yylhsminor.yy72 = pik_elist_append(p,0,yymsp[0].minor.yy254); }
2345 #line 2370 "pikchr.c"
2346 yymsp[0].minor.yy72 = yylhsminor.yy72;
2347 break;
2348 case 2: /* element_list ::= element_list EOL element */
2349 #line 519 "pikchr.y"
2350 { yylhsminor.yy72 = pik_elist_append(p,yymsp[-2].minor.yy72,yymsp[0].minor.yy254); }
2351 #line 2376 "pikchr.c"
2352 yymsp[-2].minor.yy72 = yylhsminor.yy72;
2353 break;
2354 case 3: /* element ::= */
2355 #line 522 "pikchr.y"
2356 { yymsp[1].minor.yy254 = 0; }
2357 #line 2382 "pikchr.c"
2358 break;
2359 case 4: /* element ::= direction */
2360 #line 523 "pikchr.y"
2361 { pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy254=0; }
2362 #line 2387 "pikchr.c"
2363 yymsp[0].minor.yy254 = yylhsminor.yy254;
2364 break;
2365 case 5: /* element ::= lvalue ASSIGN rvalue */
2366 #line 524 "pikchr.y"
2367 {pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy73,&yymsp[-1].minor.yy0); yylhsminor.yy254=0;}
2368 #line 2393 "pikchr.c"
2369 yymsp[-2].minor.yy254 = yylhsminor.yy254;
2370 break;
2371 case 6: /* element ::= PLACENAME COLON unnamed_element */
2372 #line 526 "pikchr.y"
2373 { yylhsminor.yy254 = yymsp[0].minor.yy254; pik_elem_setname(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0); }
2374 #line 2399 "pikchr.c"
2375 yymsp[-2].minor.yy254 = yylhsminor.yy254;
2376 break;
2377 case 7: /* element ::= PLACENAME COLON position */
2378 #line 528 "pikchr.y"
2379 { yylhsminor.yy254 = pik_elem_new(p,0,0,0);
2380 if(yylhsminor.yy254){ yylhsminor.yy254->ptAt = yymsp[0].minor.yy139; pik_elem_setname(p,yylhsminor.yy254,&yymsp[-2].minor.yy0); }}
2381 #line 2406 "pikchr.c"
2382 yymsp[-2].minor.yy254 = yylhsminor.yy254;
2383 break;
2384 case 8: /* element ::= unnamed_element */
2385 #line 530 "pikchr.y"
2386 {yylhsminor.yy254 = yymsp[0].minor.yy254;}
2387 #line 2412 "pikchr.c"
2388 yymsp[0].minor.yy254 = yylhsminor.yy254;
2389 break;
2390 case 9: /* element ::= print prlist */
2391 #line 531 "pikchr.y"
2392 {pik_append(p,"<br>\n",5); yymsp[-1].minor.yy254=0;}
2393 #line 2418 "pikchr.c"
2394 break;
2395 case 10: /* element ::= ASSERT LP expr EQ expr RP */
2396 #line 536 "pikchr.y"
2397 {yymsp[-5].minor.yy254=pik_assert(p,yymsp[-3].minor.yy73,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy73);}
2398 #line 2423 "pikchr.c"
2399 break;
2400 case 11: /* element ::= ASSERT LP place EQ place RP */
2401 #line 538 "pikchr.y"
2402 {yymsp[-5].minor.yy254=pik_place_assert(p,&yymsp[-3].minor.yy139,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy139);}
2403 #line 2428 "pikchr.c"
2404 break;
2405 case 12: /* rvalue ::= PLACENAME */
2406 #line 549 "pikchr.y"
2407 {yylhsminor.yy73 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2408 #line 2433 "pikchr.c"
2409 yymsp[0].minor.yy73 = yylhsminor.yy73;
2410 break;
2411 case 13: /* pritem ::= FILL */
2412 case 14: /* pritem ::= COLOR */ yytestcase(yyruleno==14);
2413 case 15: /* pritem ::= THICKNESS */ yytestcase(yyruleno==15);
2414 #line 554 "pikchr.y"
2415 {pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2416 #line 2441 "pikchr.c"
2417 break;
2418 case 16: /* pritem ::= rvalue */
2419 #line 557 "pikchr.y"
2420 {pik_append_num(p,"",yymsp[0].minor.yy73);}
2421 #line 2446 "pikchr.c"
2422 break;
2423 case 17: /* pritem ::= STRING */
2424 #line 558 "pikchr.y"
2425 {pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2426 #line 2451 "pikchr.c"
2427 break;
2428 case 18: /* prsep ::= COMMA */
2429 #line 559 "pikchr.y"
2430 {pik_append(p, " ", 1);}
2431 #line 2456 "pikchr.c"
2432 break;
2433 case 19: /* unnamed_element ::= basetype attribute_list */
2434 #line 562 "pikchr.y"
2435 {yylhsminor.yy254 = yymsp[-1].minor.yy254; pik_after_adding_attributes(p,yylhsminor.yy254);}
2436 #line 2461 "pikchr.c"
2437 yymsp[-1].minor.yy254 = yylhsminor.yy254;
2438 break;
2439 case 20: /* basetype ::= CLASSNAME */
2440 #line 564 "pikchr.y"
2441 {yylhsminor.yy254 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2442 #line 2467 "pikchr.c"
2443 yymsp[0].minor.yy254 = yylhsminor.yy254;
2444 break;
2445 case 21: /* basetype ::= STRING textposition */
2446 #line 566 "pikchr.y"
2447 {yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy74; yylhsminor.yy254 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2448 #line 2473 "pikchr.c"
2449 yymsp[-1].minor.yy254 = yylhsminor.yy254;
2450 break;
2451 case 22: /* basetype ::= LB savelist element_list RB */
2452 #line 568 "pikchr.y"
2453 { p->list = yymsp[-2].minor.yy72; yymsp[-3].minor.yy254 = pik_elem_new(p,0,0,yymsp[-1].minor.yy72); if(yymsp[-3].minor.yy254) yymsp[-3].minor.yy254->errTok = yymsp[0].minor.yy0; }
2454 #line 2479 "pikchr.c"
2455 break;
2456 case 23: /* savelist ::= */
2457 #line 573 "pikchr.y"
2458 {yymsp[1].minor.yy72 = p->list; p->list = 0;}
2459 #line 2484 "pikchr.c"
2460 break;
2461 case 24: /* relexpr ::= expr */
2462 #line 580 "pikchr.y"
2463 {yylhsminor.yy60.rAbs = yymsp[0].minor.yy73; yylhsminor.yy60.rRel = 0;}
2464 #line 2489 "pikchr.c"
2465 yymsp[0].minor.yy60 = yylhsminor.yy60;
2466 break;
2467 case 25: /* relexpr ::= expr PERCENT */
2468 #line 581 "pikchr.y"
2469 {yylhsminor.yy60.rAbs = 0; yylhsminor.yy60.rRel = yymsp[-1].minor.yy73/100;}
2470 #line 2495 "pikchr.c"
2471 yymsp[-1].minor.yy60 = yylhsminor.yy60;
2472 break;
2473 case 26: /* optrelexpr ::= */
2474 #line 583 "pikchr.y"
2475 {yymsp[1].minor.yy60.rAbs = 0; yymsp[1].minor.yy60.rRel = 1.0;}
2476 #line 2501 "pikchr.c"
2477 break;
2478 case 27: /* attribute_list ::= relexpr alist */
2479 #line 585 "pikchr.y"
2480 {pik_add_direction(p,0,&yymsp[-1].minor.yy60);}
2481 #line 2506 "pikchr.c"
2482 break;
2483 case 28: /* attribute ::= numproperty relexpr */
2484 #line 589 "pikchr.y"
2485 { pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy60); }
2486 #line 2511 "pikchr.c"
2487 break;
2488 case 29: /* attribute ::= dashproperty expr */
2489 #line 590 "pikchr.y"
2490 { pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy73); }
2491 #line 2516 "pikchr.c"
2492 break;
2493 case 30: /* attribute ::= dashproperty */
2494 #line 591 "pikchr.y"
2495 { pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2496 #line 2521 "pikchr.c"
2497 break;
2498 case 31: /* attribute ::= colorproperty rvalue */
2499 #line 592 "pikchr.y"
2500 { pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy73); }
2501 #line 2526 "pikchr.c"
2502 break;
2503 case 32: /* attribute ::= go direction optrelexpr */
2504 #line 593 "pikchr.y"
2505 { pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy60);}
2506 #line 2531 "pikchr.c"
2507 break;
2508 case 33: /* attribute ::= go direction even position */
2509 #line 594 "pikchr.y"
2510 {pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy139);}
2511 #line 2536 "pikchr.c"
2512 break;
2513 case 34: /* attribute ::= CLOSE */
2514 #line 595 "pikchr.y"
2515 { pik_close_path(p,&yymsp[0].minor.yy0); }
2516 #line 2541 "pikchr.c"
2517 break;
2518 case 35: /* attribute ::= CHOP */
2519 #line 596 "pikchr.y"
2520 { p->cur->bChop = 1; }
2521 #line 2546 "pikchr.c"
2522 break;
2523 case 36: /* attribute ::= FROM position */
2524 #line 597 "pikchr.y"
2525 { pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy139); }
2526 #line 2551 "pikchr.c"
2527 break;
2528 case 37: /* attribute ::= TO position */
2529 #line 598 "pikchr.y"
2530 { pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy139); }
2531 #line 2556 "pikchr.c"
2532 break;
2533 case 38: /* attribute ::= THEN */
2534 #line 599 "pikchr.y"
2535 { pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2536 #line 2561 "pikchr.c"
2537 break;
2538 case 39: /* attribute ::= THEN optrelexpr HEADING expr */
2539 case 41: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==41);
2540 #line 601 "pikchr.y"
2541 {pik_move_hdg(p,&yymsp[-2].minor.yy60,&yymsp[-1].minor.yy0,yymsp[0].minor.yy73,0,&yymsp[-3].minor.yy0);}
2542 #line 2567 "pikchr.c"
2543 break;
2544 case 40: /* attribute ::= THEN optrelexpr EDGEPT */
2545 case 42: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==42);
2546 #line 602 "pikchr.y"
2547 {pik_move_hdg(p,&yymsp[-1].minor.yy60,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2548 #line 2573 "pikchr.c"
2549 break;
2550 case 43: /* attribute ::= AT position */
2551 #line 607 "pikchr.y"
2552 { pik_set_at(p,0,&yymsp[0].minor.yy139,&yymsp[-1].minor.yy0); }
2553 #line 2578 "pikchr.c"
2554 break;
2555 case 44: /* attribute ::= SAME */
2556 #line 609 "pikchr.y"
2557 {pik_same(p,0,&yymsp[0].minor.yy0);}
2558 #line 2583 "pikchr.c"
2559 break;
2560 case 45: /* attribute ::= SAME AS object */
2561 #line 610 "pikchr.y"
2562 {pik_same(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0);}
2563 #line 2588 "pikchr.c"
2564 break;
2565 case 46: /* attribute ::= STRING textposition */
2566 #line 611 "pikchr.y"
2567 {pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy74);}
2568 #line 2593 "pikchr.c"
2569 break;
2570 case 47: /* attribute ::= FIT */
2571 #line 612 "pikchr.y"
2572 {pik_size_to_fit(p,&yymsp[0].minor.yy0); }
2573 #line 2598 "pikchr.c"
2574 break;
2575 case 48: /* attribute ::= BEHIND object */
2576 #line 613 "pikchr.y"
2577 {pik_behind(p,yymsp[0].minor.yy254);}
2578 #line 2603 "pikchr.c"
2579 break;
2580 case 49: /* withclause ::= DOT_E edge AT position */
2581 case 50: /* withclause ::= edge AT position */ yytestcase(yyruleno==50);
2582 #line 621 "pikchr.y"
2583 { pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy139,&yymsp[-1].minor.yy0); }
2584 #line 2609 "pikchr.c"
2585 break;
2586 case 51: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2587 #line 625 "pikchr.y"
2588 {yylhsminor.yy0 = yymsp[0].minor.yy0;}
2589 #line 2614 "pikchr.c"
2590 yymsp[0].minor.yy0 = yylhsminor.yy0;
2591 break;
2592 case 52: /* boolproperty ::= CW */
2593 #line 636 "pikchr.y"
2594 {p->cur->cw = 1;}
2595 #line 2620 "pikchr.c"
2596 break;
2597 case 53: /* boolproperty ::= CCW */
2598 #line 637 "pikchr.y"
2599 {p->cur->cw = 0;}
2600 #line 2625 "pikchr.c"
2601 break;
2602 case 54: /* boolproperty ::= LARROW */
2603 #line 638 "pikchr.y"
2604 {p->cur->larrow=1; p->cur->rarrow=0; }
2605 #line 2630 "pikchr.c"
2606 break;
2607 case 55: /* boolproperty ::= RARROW */
2608 #line 639 "pikchr.y"
2609 {p->cur->larrow=0; p->cur->rarrow=1; }
2610 #line 2635 "pikchr.c"
2611 break;
2612 case 56: /* boolproperty ::= LRARROW */
2613 #line 640 "pikchr.y"
2614 {p->cur->larrow=1; p->cur->rarrow=1; }
2615 #line 2640 "pikchr.c"
2616 break;
2617 case 57: /* boolproperty ::= INVIS */
2618 #line 641 "pikchr.y"
2619 {p->cur->sw = 0.0;}
2620 #line 2645 "pikchr.c"
2621 break;
2622 case 58: /* boolproperty ::= THICK */
2623 #line 642 "pikchr.y"
2624 {p->cur->sw *= 1.5;}
2625 #line 2650 "pikchr.c"
2626 break;
2627 case 59: /* boolproperty ::= THIN */
2628 #line 643 "pikchr.y"
2629 {p->cur->sw *= 0.67;}
2630 #line 2655 "pikchr.c"
2631 break;
2632 case 60: /* textposition ::= */
2633 #line 645 "pikchr.y"
2634 {yymsp[1].minor.yy74 = 0;}
2635 #line 2660 "pikchr.c"
2636 break;
2637 case 61: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2638 #line 648 "pikchr.y"
2639 {yylhsminor.yy74 = pik_text_position(yymsp[-1].minor.yy74,&yymsp[0].minor.yy0);}
2640 #line 2665 "pikchr.c"
2641 yymsp[-1].minor.yy74 = yylhsminor.yy74;
2642 break;
2643 case 62: /* position ::= expr COMMA expr */
2644 #line 651 "pikchr.y"
2645 {yylhsminor.yy139.x=yymsp[-2].minor.yy73; yylhsminor.yy139.y=yymsp[0].minor.yy73;}
2646 #line 2671 "pikchr.c"
2647 yymsp[-2].minor.yy139 = yylhsminor.yy139;
2648 break;
2649 case 63: /* position ::= place PLUS expr COMMA expr */
2650 #line 653 "pikchr.y"
2651 {yylhsminor.yy139.x=yymsp[-4].minor.yy139.x+yymsp[-2].minor.yy73; yylhsminor.yy139.y=yymsp[-4].minor.yy139.y+yymsp[0].minor.yy73;}
2652 #line 2677 "pikchr.c"
2653 yymsp[-4].minor.yy139 = yylhsminor.yy139;
2654 break;
2655 case 64: /* position ::= place MINUS expr COMMA expr */
2656 #line 654 "pikchr.y"
2657 {yylhsminor.yy139.x=yymsp[-4].minor.yy139.x-yymsp[-2].minor.yy73; yylhsminor.yy139.y=yymsp[-4].minor.yy139.y-yymsp[0].minor.yy73;}
2658 #line 2683 "pikchr.c"
2659 yymsp[-4].minor.yy139 = yylhsminor.yy139;
2660 break;
2661 case 65: /* position ::= place PLUS LP expr COMMA expr RP */
2662 #line 656 "pikchr.y"
2663 {yylhsminor.yy139.x=yymsp[-6].minor.yy139.x+yymsp[-3].minor.yy73; yylhsminor.yy139.y=yymsp[-6].minor.yy139.y+yymsp[-1].minor.yy73;}
2664 #line 2689 "pikchr.c"
2665 yymsp[-6].minor.yy139 = yylhsminor.yy139;
2666 break;
2667 case 66: /* position ::= place MINUS LP expr COMMA expr RP */
2668 #line 658 "pikchr.y"
2669 {yylhsminor.yy139.x=yymsp[-6].minor.yy139.x-yymsp[-3].minor.yy73; yylhsminor.yy139.y=yymsp[-6].minor.yy139.y-yymsp[-1].minor.yy73;}
2670 #line 2695 "pikchr.c"
2671 yymsp[-6].minor.yy139 = yylhsminor.yy139;
2672 break;
2673 case 67: /* position ::= LP position COMMA position RP */
2674 #line 659 "pikchr.y"
2675 {yymsp[-4].minor.yy139.x=yymsp[-3].minor.yy139.x; yymsp[-4].minor.yy139.y=yymsp[-1].minor.yy139.y;}
2676 #line 2701 "pikchr.c"
2677 break;
2678 case 68: /* position ::= LP position RP */
2679 #line 660 "pikchr.y"
2680 {yymsp[-2].minor.yy139=yymsp[-1].minor.yy139;}
2681 #line 2706 "pikchr.c"
2682 break;
2683 case 69: /* position ::= expr between position AND position */
2684 #line 662 "pikchr.y"
2685 {yylhsminor.yy139 = pik_position_between(yymsp[-4].minor.yy73,yymsp[-2].minor.yy139,yymsp[0].minor.yy139);}
2686 #line 2711 "pikchr.c"
2687 yymsp[-4].minor.yy139 = yylhsminor.yy139;
2688 break;
2689 case 70: /* position ::= expr LT position COMMA position GT */
2690 #line 664 "pikchr.y"
2691 {yylhsminor.yy139 = pik_position_between(yymsp[-5].minor.yy73,yymsp[-3].minor.yy139,yymsp[-1].minor.yy139);}
2692 #line 2717 "pikchr.c"
2693 yymsp[-5].minor.yy139 = yylhsminor.yy139;
2694 break;
2695 case 71: /* position ::= expr ABOVE position */
2696 #line 665 "pikchr.y"
2697 {yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.y += yymsp[-2].minor.yy73;}
2698 #line 2723 "pikchr.c"
2699 yymsp[-2].minor.yy139 = yylhsminor.yy139;
2700 break;
2701 case 72: /* position ::= expr BELOW position */
2702 #line 666 "pikchr.y"
2703 {yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.y -= yymsp[-2].minor.yy73;}
2704 #line 2729 "pikchr.c"
2705 yymsp[-2].minor.yy139 = yylhsminor.yy139;
2706 break;
2707 case 73: /* position ::= expr LEFT OF position */
2708 #line 667 "pikchr.y"
2709 {yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.x -= yymsp[-3].minor.yy73;}
2710 #line 2735 "pikchr.c"
2711 yymsp[-3].minor.yy139 = yylhsminor.yy139;
2712 break;
2713 case 74: /* position ::= expr RIGHT OF position */
2714 #line 668 "pikchr.y"
2715 {yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.x += yymsp[-3].minor.yy73;}
2716 #line 2741 "pikchr.c"
2717 yymsp[-3].minor.yy139 = yylhsminor.yy139;
2718 break;
2719 case 75: /* position ::= expr ON HEADING EDGEPT OF position */
2720 #line 670 "pikchr.y"
2721 {yylhsminor.yy139 = pik_position_at_hdg(yymsp[-5].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);}
2722 #line 2747 "pikchr.c"
2723 yymsp[-5].minor.yy139 = yylhsminor.yy139;
2724 break;
2725 case 76: /* position ::= expr HEADING EDGEPT OF position */
2726 #line 672 "pikchr.y"
2727 {yylhsminor.yy139 = pik_position_at_hdg(yymsp[-4].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);}
2728 #line 2753 "pikchr.c"
2729 yymsp[-4].minor.yy139 = yylhsminor.yy139;
2730 break;
2731 case 77: /* position ::= expr EDGEPT OF position */
2732 #line 674 "pikchr.y"
2733 {yylhsminor.yy139 = pik_position_at_hdg(yymsp[-3].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);}
2734 #line 2759 "pikchr.c"
2735 yymsp[-3].minor.yy139 = yylhsminor.yy139;
2736 break;
2737 case 78: /* position ::= expr ON HEADING expr FROM position */
2738 #line 676 "pikchr.y"
2739 {yylhsminor.yy139 = pik_position_at_angle(yymsp[-5].minor.yy73,yymsp[-2].minor.yy73,yymsp[0].minor.yy139);}
2740 #line 2765 "pikchr.c"
2741 yymsp[-5].minor.yy139 = yylhsminor.yy139;
2742 break;
2743 case 79: /* position ::= expr HEADING expr FROM position */
2744 #line 678 "pikchr.y"
2745 {yylhsminor.yy139 = pik_position_at_angle(yymsp[-4].minor.yy73,yymsp[-2].minor.yy73,yymsp[0].minor.yy139);}
2746 #line 2771 "pikchr.c"
2747 yymsp[-4].minor.yy139 = yylhsminor.yy139;
2748 break;
2749 case 80: /* place ::= edge OF object */
2750 #line 690 "pikchr.y"
2751 {yylhsminor.yy139 = pik_place_of_elem(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0);}
2752 #line 2777 "pikchr.c"
2753 yymsp[-2].minor.yy139 = yylhsminor.yy139;
2754 break;
2755 case 81: /* place2 ::= object */
2756 #line 691 "pikchr.y"
2757 {yylhsminor.yy139 = pik_place_of_elem(p,yymsp[0].minor.yy254,0);}
2758 #line 2783 "pikchr.c"
2759 yymsp[0].minor.yy139 = yylhsminor.yy139;
2760 break;
2761 case 82: /* place2 ::= object DOT_E edge */
2762 #line 692 "pikchr.y"
2763 {yylhsminor.yy139 = pik_place_of_elem(p,yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);}
2764 #line 2789 "pikchr.c"
2765 yymsp[-2].minor.yy139 = yylhsminor.yy139;
2766 break;
2767 case 83: /* place2 ::= NTH VERTEX OF object */
2768 #line 693 "pikchr.y"
2769 {yylhsminor.yy139 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy254);}
2770 #line 2795 "pikchr.c"
2771 yymsp[-3].minor.yy139 = yylhsminor.yy139;
2772 break;
2773 case 84: /* object ::= nth */
2774 #line 705 "pikchr.y"
2775 {yylhsminor.yy254 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2776 #line 2801 "pikchr.c"
2777 yymsp[0].minor.yy254 = yylhsminor.yy254;
2778 break;
2779 case 85: /* object ::= nth OF|IN object */
2780 #line 706 "pikchr.y"
2781 {yylhsminor.yy254 = pik_find_nth(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0);}
2782 #line 2807 "pikchr.c"
2783 yymsp[-2].minor.yy254 = yylhsminor.yy254;
2784 break;
2785 case 86: /* objectname ::= PLACENAME */
2786 #line 708 "pikchr.y"
2787 {yylhsminor.yy254 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2788 #line 2813 "pikchr.c"
2789 yymsp[0].minor.yy254 = yylhsminor.yy254;
2790 break;
2791 case 87: /* objectname ::= objectname DOT_U PLACENAME */
2792 #line 710 "pikchr.y"
2793 {yylhsminor.yy254 = pik_find_byname(p,yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);}
2794 #line 2819 "pikchr.c"
2795 yymsp[-2].minor.yy254 = yylhsminor.yy254;
2796 break;
2797 case 88: /* nth ::= NTH CLASSNAME */
2798 #line 712 "pikchr.y"
2799 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2800 #line 2825 "pikchr.c"
2801 yymsp[-1].minor.yy0 = yylhsminor.yy0;
2802 break;
2803 case 89: /* nth ::= NTH LAST CLASSNAME */
2804 #line 713 "pikchr.y"
2805 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2806 #line 2831 "pikchr.c"
2807 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2808 break;
2809 case 90: /* nth ::= LAST CLASSNAME */
2810 #line 714 "pikchr.y"
2811 {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2812 #line 2837 "pikchr.c"
2813 break;
2814 case 91: /* nth ::= LAST */
2815 #line 715 "pikchr.y"
2816 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2817 #line 2842 "pikchr.c"
2818 yymsp[0].minor.yy0 = yylhsminor.yy0;
2819 break;
2820 case 92: /* nth ::= NTH LB RB */
2821 #line 716 "pikchr.y"
2822 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2823 #line 2848 "pikchr.c"
2824 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2825 break;
2826 case 93: /* nth ::= NTH LAST LB RB */
2827 #line 717 "pikchr.y"
2828 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2829 #line 2854 "pikchr.c"
2830 yymsp[-3].minor.yy0 = yylhsminor.yy0;
2831 break;
2832 case 94: /* nth ::= LAST LB RB */
2833 #line 718 "pikchr.y"
2834 {yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2835 #line 2860 "pikchr.c"
2836 break;
2837 case 95: /* expr ::= expr PLUS expr */
2838 #line 720 "pikchr.y"
2839 {yylhsminor.yy73=yymsp[-2].minor.yy73+yymsp[0].minor.yy73;}
2840 #line 2865 "pikchr.c"
2841 yymsp[-2].minor.yy73 = yylhsminor.yy73;
2842 break;
2843 case 96: /* expr ::= expr MINUS expr */
2844 #line 721 "pikchr.y"
2845 {yylhsminor.yy73=yymsp[-2].minor.yy73-yymsp[0].minor.yy73;}
2846 #line 2871 "pikchr.c"
2847 yymsp[-2].minor.yy73 = yylhsminor.yy73;
2848 break;
2849 case 97: /* expr ::= expr STAR expr */
2850 #line 722 "pikchr.y"
2851 {yylhsminor.yy73=yymsp[-2].minor.yy73*yymsp[0].minor.yy73;}
2852 #line 2877 "pikchr.c"
2853 yymsp[-2].minor.yy73 = yylhsminor.yy73;
2854 break;
2855 case 98: /* expr ::= expr SLASH expr */
2856 #line 723 "pikchr.y"
2857 {
2858 if( yymsp[0].minor.yy73==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy73 = 0.0; }
2859 else{ yylhsminor.yy73 = yymsp[-2].minor.yy73/yymsp[0].minor.yy73; }
2860 }
2861 #line 2886 "pikchr.c"
2862 yymsp[-2].minor.yy73 = yylhsminor.yy73;
2863 break;
2864 case 99: /* expr ::= MINUS expr */
2865 #line 727 "pikchr.y"
2866 {yymsp[-1].minor.yy73=-yymsp[0].minor.yy73;}
2867 #line 2892 "pikchr.c"
2868 break;
2869 case 100: /* expr ::= PLUS expr */
2870 #line 728 "pikchr.y"
2871 {yymsp[-1].minor.yy73=yymsp[0].minor.yy73;}
2872 #line 2897 "pikchr.c"
2873 break;
2874 case 101: /* expr ::= LP expr RP */
2875 #line 729 "pikchr.y"
2876 {yymsp[-2].minor.yy73=yymsp[-1].minor.yy73;}
2877 #line 2902 "pikchr.c"
2878 break;
2879 case 102: /* expr ::= NUMBER */
2880 #line 730 "pikchr.y"
2881 {yylhsminor.yy73=pik_atof(&yymsp[0].minor.yy0);}
2882 #line 2907 "pikchr.c"
2883 yymsp[0].minor.yy73 = yylhsminor.yy73;
2884 break;
2885 case 103: /* expr ::= ID */
2886 #line 731 "pikchr.y"
2887 {yylhsminor.yy73=pik_get_var(p,&yymsp[0].minor.yy0);}
2888 #line 2913 "pikchr.c"
2889 yymsp[0].minor.yy73 = yylhsminor.yy73;
2890 break;
2891 case 104: /* expr ::= FUNC1 LP expr RP */
2892 #line 732 "pikchr.y"
2893 {yylhsminor.yy73 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy73,0.0);}
2894 #line 2919 "pikchr.c"
2895 yymsp[-3].minor.yy73 = yylhsminor.yy73;
2896 break;
2897 case 105: /* expr ::= FUNC2 LP expr COMMA expr RP */
2898 #line 733 "pikchr.y"
2899 {yylhsminor.yy73 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy73,yymsp[-1].minor.yy73);}
2900 #line 2925 "pikchr.c"
2901 yymsp[-5].minor.yy73 = yylhsminor.yy73;
2902 break;
2903 case 106: /* expr ::= place2 DOT_XY X */
2904 #line 734 "pikchr.y"
2905 {yylhsminor.yy73 = yymsp[-2].minor.yy139.x;}
2906 #line 2931 "pikchr.c"
2907 yymsp[-2].minor.yy73 = yylhsminor.yy73;
2908 break;
2909 case 107: /* expr ::= place2 DOT_XY Y */
2910 #line 735 "pikchr.y"
2911 {yylhsminor.yy73 = yymsp[-2].minor.yy139.y;}
2912 #line 2937 "pikchr.c"
2913 yymsp[-2].minor.yy73 = yylhsminor.yy73;
2914 break;
2915 case 108: /* expr ::= object DOT_L numproperty */
2916 case 109: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==109);
2917 case 110: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==110);
2918 #line 736 "pikchr.y"
2919 {yylhsminor.yy73=pik_property_of(yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);}
2920 #line 2945 "pikchr.c"
2921 yymsp[-2].minor.yy73 = yylhsminor.yy73;
2922 break;
2923 default:
2924 /* (111) lvalue ::= ID */ yytestcase(yyruleno==111);
2925 /* (112) lvalue ::= FILL */ yytestcase(yyruleno==112);
@@ -3018,19 +3008,19 @@
3018 ){
3019 pik_parserARG_FETCH
3020 pik_parserCTX_FETCH
3021 #define TOKEN yyminor
3022 /************ Begin %syntax_error code ****************************************/
3023 #line 502 "pikchr.y"
3024
3025 if( TOKEN.z && TOKEN.z[0] ){
3026 pik_error(p, &TOKEN, "syntax error");
3027 }else{
3028 pik_error(p, 0, "syntax error");
3029 }
3030 UNUSED_PARAMETER(yymajor);
3031 #line 3056 "pikchr.c"
3032 /************ End %syntax_error code ******************************************/
3033 pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
3034 pik_parserCTX_STORE
3035 }
3036
@@ -3259,11 +3249,11 @@
3259 #else
3260 (void)iToken;
3261 return 0;
3262 #endif
3263 }
3264 #line 741 "pikchr.y"
3265
3266
3267
3268 /* Chart of the 140 official HTML color names with their
3269 ** corresponding RGB value.
@@ -6409,23 +6399,10 @@
6409 h = p->bbox.ne.y - p->bbox.sw.y;
6410 p->wSVG = (int)(p->rScale*w);
6411 p->hSVG = (int)(p->rScale*h);
6412 pik_append_dis(p, " viewBox=\"0 0 ",w,"");
6413 pik_append_dis(p, " ",h,"\">\n");
6414 if( (p->mFlags & PIKCHR_INCLUDE_SOURCE)!=0 ){
6415 /* emit original pikchr source code as metadata */
6416 /* FIXME: emit this only if a certain p->mFlags is set. */
6417 pik_append(p, "<metadata>\n", 11);
6418 pik_append(p, "<pikchr:pikchr xmlns:pikchr="
6419 "\"https://pikchr.org/home/doc/trunk/doc/grammar.md\">\n",
6420 -1);
6421 pik_append(p, "<pikchr:src><![CDATA[", 21);
6422 pik_append(p, p->zIn, (int)p->nIn);
6423 pik_append(p, "]]></pikchr:src>\n", 17);
6424 pik_append(p, "</pikchr:pikchr>\n", 17);
6425 pik_append(p, "</metadata>\n", 12);
6426 }
6427 pik_elist_render(p, pEList);
6428 pik_append(p,"</svg>\n", -1);
6429 }else{
6430 p->wSVG = -1;
6431 p->hSVG = -1;
@@ -6964,54 +6941,99 @@
6964 return 0;
6965 }
6966 #endif /* PIKCHR_FUZZ */
6967
6968 #if defined(PIKCHR_SHELL)
6969 /* Texting interface
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6970 **
6971 ** Generate HTML on standard output that displays both the original
6972 ** input text and the rendered SVG for all files named on the command
6973 ** line.
6974 */
6975 int main(int argc, char **argv){
6976 int i;
6977 int bNoEcho = 0; /* Do not show the text of the script */
6978 int mPikchrFlags = 0; /* Flags passed into pikchr() */
6979 printf(
6980 "<!DOCTYPE html>\n"
6981 "<html lang=\"en-US\">\n"
6982 "<head>\n<title>PIKCHR Test</title>\n"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6983 "<meta charset=\"utf-8\">\n"
6984 "</head>\n"
6985 "<body>\n"
6986 );
 
6987 for(i=1; i<argc; i++){
6988 FILE *in;
6989 size_t sz;
6990 char *zIn;
6991 char *zOut;
6992 char *z, c;
6993 int j;
6994 int w, h;
6995
6996 if( argv[i][0]=='-' ){
6997 char *z = argv[i];
6998 z++;
6999 if( z[0]=='-' ) z++;
7000 if( strcmp(z,"no-echo")==0 ){
7001 bNoEcho = 1;
7002 }else
7003 if( strcmp(z,"include-source")==0 ){
7004 mPikchrFlags |= PIKCHR_INCLUDE_SOURCE;
 
7005 }else
7006 {
7007 fprintf(stderr,"unknown option: \"%s\"\n", argv[i]);
7008 exit(1);
7009 }
7010 continue;
7011 }
7012 printf("<h1>File %s</h1>\n", argv[i]);
7013 in = fopen(argv[i], "rb");
7014 if( in==0 ){
7015 fprintf(stderr, "cannot open \"%s\" for reading\n", argv[i]);
7016 continue;
7017 }
@@ -7025,45 +7047,40 @@
7025 continue;
7026 }
7027 sz = fread(zIn, 1, sz, in);
7028 fclose(in);
7029 zIn[sz] = 0;
7030 if( !bNoEcho ){
7031 printf("<p>Source text:</p>\n<blockquote><pre>\n");
7032 z = zIn;
7033 while( z[0]!=0 ){
7034 for(j=0; (c = z[j])!=0 && c!='<' && c!='>' && c!='&'; j++){}
7035 if( j ) printf("%.*s", j, z);
7036 z += j+1;
7037 j = -1;
7038 if( c=='<' ){
7039 printf("&lt;");
7040 }else if( c=='>' ){
7041 printf("&gt;");
7042 }else if( c=='&' ){
7043 printf("&amp;");
7044 }else if( c==0 ){
7045 break;
7046 }
7047 }
7048 printf("</pre></blockquote>\n");
7049 }
7050 zOut = pikchr(zIn, "pikchr", mPikchrFlags, &w, &h);
7051 free(zIn);
7052 if( zOut ){
7053 if( w<0 ){
7054 printf("<p>ERROR:</p>\n");
7055 }else if( bNoEcho==0 ){
7056 printf("<p>Output size: %d by %d</p>\n", w, h);
7057 }
7058 printf("<div style='border:3px solid lightgray;max-width:%dpx'>\n"
7059 "%s</div>\n",
7060 w, zOut);
7061 free(zOut);
7062 }
7063 }
7064 printf("</body></html>\n");
7065 return 0;
7066 }
7067 #endif /* PIKCHR_SHELL */
7068
7069 #line 7094 "pikchr.c"
7070
--- src/pikchr.c
+++ src/pikchr.c
@@ -359,20 +359,10 @@
359 int mTPath; /* For last entry, 1: x set, 2: y set */
360 PPoint aTPath[1000]; /* Path under construction */
361 };
362
363
 
 
 
 
 
 
 
 
 
 
364 /*
365 ** The behavior of an object class is defined by an instance of
366 ** this structure. This is the "virtual method" table.
367 */
368 struct PClass {
@@ -456,11 +446,11 @@
446 static void pik_behind(Pik*,PElem*);
447 static PElem *pik_assert(Pik*,PNum,PToken*,PNum);
448 static PElem *pik_place_assert(Pik*,PPoint*,PToken*,PPoint*);
449
450
451 #line 477 "pikchr.c"
452 /**************** End of %include directives **********************************/
453 /* These constants specify the various numeric values for terminal symbols.
454 ***************** Begin token definitions *************************************/
455 #ifndef T_ID
456 #define T_ID 1
@@ -1632,22 +1622,22 @@
1622 ** inside the C code.
1623 */
1624 /********* Begin destructor definitions ***************************************/
1625 case 94: /* element_list */
1626 {
1627 #line 466 "pikchr.y"
1628 pik_elist_free(p,(yypminor->yy72));
1629 #line 1654 "pikchr.c"
1630 }
1631 break;
1632 case 95: /* element */
1633 case 96: /* unnamed_element */
1634 case 97: /* basetype */
1635 {
1636 #line 468 "pikchr.y"
1637 pik_elem_free(p,(yypminor->yy254));
1638 #line 1663 "pikchr.c"
1639 }
1640 break;
1641 /********* End destructor definitions *****************************************/
1642 default: break; /* If no destructor action specified: do nothing */
1643 }
@@ -1861,14 +1851,14 @@
1851 #endif
1852 while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
1853 /* Here code is inserted which will execute if the parser
1854 ** stack every overflows */
1855 /******** Begin %stack_overflow code ******************************************/
1856 #line 500 "pikchr.y"
1857
1858 pik_error(p, 0, "parser stack overflow");
1859 #line 1884 "pikchr.c"
1860 /******** End %stack_overflow code ********************************************/
1861 pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
1862 pik_parserCTX_STORE
1863 }
1864
@@ -2333,593 +2323,593 @@
2323 ** break;
2324 */
2325 /********** Begin reduce actions **********************************************/
2326 YYMINORTYPE yylhsminor;
2327 case 0: /* document ::= element_list */
2328 #line 504 "pikchr.y"
2329 {pik_render(p,yymsp[0].minor.yy72);}
2330 #line 2355 "pikchr.c"
2331 break;
2332 case 1: /* element_list ::= element */
2333 #line 507 "pikchr.y"
2334 { yylhsminor.yy72 = pik_elist_append(p,0,yymsp[0].minor.yy254); }
2335 #line 2360 "pikchr.c"
2336 yymsp[0].minor.yy72 = yylhsminor.yy72;
2337 break;
2338 case 2: /* element_list ::= element_list EOL element */
2339 #line 509 "pikchr.y"
2340 { yylhsminor.yy72 = pik_elist_append(p,yymsp[-2].minor.yy72,yymsp[0].minor.yy254); }
2341 #line 2366 "pikchr.c"
2342 yymsp[-2].minor.yy72 = yylhsminor.yy72;
2343 break;
2344 case 3: /* element ::= */
2345 #line 512 "pikchr.y"
2346 { yymsp[1].minor.yy254 = 0; }
2347 #line 2372 "pikchr.c"
2348 break;
2349 case 4: /* element ::= direction */
2350 #line 513 "pikchr.y"
2351 { pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy254=0; }
2352 #line 2377 "pikchr.c"
2353 yymsp[0].minor.yy254 = yylhsminor.yy254;
2354 break;
2355 case 5: /* element ::= lvalue ASSIGN rvalue */
2356 #line 514 "pikchr.y"
2357 {pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy73,&yymsp[-1].minor.yy0); yylhsminor.yy254=0;}
2358 #line 2383 "pikchr.c"
2359 yymsp[-2].minor.yy254 = yylhsminor.yy254;
2360 break;
2361 case 6: /* element ::= PLACENAME COLON unnamed_element */
2362 #line 516 "pikchr.y"
2363 { yylhsminor.yy254 = yymsp[0].minor.yy254; pik_elem_setname(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0); }
2364 #line 2389 "pikchr.c"
2365 yymsp[-2].minor.yy254 = yylhsminor.yy254;
2366 break;
2367 case 7: /* element ::= PLACENAME COLON position */
2368 #line 518 "pikchr.y"
2369 { yylhsminor.yy254 = pik_elem_new(p,0,0,0);
2370 if(yylhsminor.yy254){ yylhsminor.yy254->ptAt = yymsp[0].minor.yy139; pik_elem_setname(p,yylhsminor.yy254,&yymsp[-2].minor.yy0); }}
2371 #line 2396 "pikchr.c"
2372 yymsp[-2].minor.yy254 = yylhsminor.yy254;
2373 break;
2374 case 8: /* element ::= unnamed_element */
2375 #line 520 "pikchr.y"
2376 {yylhsminor.yy254 = yymsp[0].minor.yy254;}
2377 #line 2402 "pikchr.c"
2378 yymsp[0].minor.yy254 = yylhsminor.yy254;
2379 break;
2380 case 9: /* element ::= print prlist */
2381 #line 521 "pikchr.y"
2382 {pik_append(p,"<br>\n",5); yymsp[-1].minor.yy254=0;}
2383 #line 2408 "pikchr.c"
2384 break;
2385 case 10: /* element ::= ASSERT LP expr EQ expr RP */
2386 #line 526 "pikchr.y"
2387 {yymsp[-5].minor.yy254=pik_assert(p,yymsp[-3].minor.yy73,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy73);}
2388 #line 2413 "pikchr.c"
2389 break;
2390 case 11: /* element ::= ASSERT LP place EQ place RP */
2391 #line 528 "pikchr.y"
2392 {yymsp[-5].minor.yy254=pik_place_assert(p,&yymsp[-3].minor.yy139,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy139);}
2393 #line 2418 "pikchr.c"
2394 break;
2395 case 12: /* rvalue ::= PLACENAME */
2396 #line 539 "pikchr.y"
2397 {yylhsminor.yy73 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
2398 #line 2423 "pikchr.c"
2399 yymsp[0].minor.yy73 = yylhsminor.yy73;
2400 break;
2401 case 13: /* pritem ::= FILL */
2402 case 14: /* pritem ::= COLOR */ yytestcase(yyruleno==14);
2403 case 15: /* pritem ::= THICKNESS */ yytestcase(yyruleno==15);
2404 #line 544 "pikchr.y"
2405 {pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
2406 #line 2431 "pikchr.c"
2407 break;
2408 case 16: /* pritem ::= rvalue */
2409 #line 547 "pikchr.y"
2410 {pik_append_num(p,"",yymsp[0].minor.yy73);}
2411 #line 2436 "pikchr.c"
2412 break;
2413 case 17: /* pritem ::= STRING */
2414 #line 548 "pikchr.y"
2415 {pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
2416 #line 2441 "pikchr.c"
2417 break;
2418 case 18: /* prsep ::= COMMA */
2419 #line 549 "pikchr.y"
2420 {pik_append(p, " ", 1);}
2421 #line 2446 "pikchr.c"
2422 break;
2423 case 19: /* unnamed_element ::= basetype attribute_list */
2424 #line 552 "pikchr.y"
2425 {yylhsminor.yy254 = yymsp[-1].minor.yy254; pik_after_adding_attributes(p,yylhsminor.yy254);}
2426 #line 2451 "pikchr.c"
2427 yymsp[-1].minor.yy254 = yylhsminor.yy254;
2428 break;
2429 case 20: /* basetype ::= CLASSNAME */
2430 #line 554 "pikchr.y"
2431 {yylhsminor.yy254 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
2432 #line 2457 "pikchr.c"
2433 yymsp[0].minor.yy254 = yylhsminor.yy254;
2434 break;
2435 case 21: /* basetype ::= STRING textposition */
2436 #line 556 "pikchr.y"
2437 {yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy74; yylhsminor.yy254 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
2438 #line 2463 "pikchr.c"
2439 yymsp[-1].minor.yy254 = yylhsminor.yy254;
2440 break;
2441 case 22: /* basetype ::= LB savelist element_list RB */
2442 #line 558 "pikchr.y"
2443 { p->list = yymsp[-2].minor.yy72; yymsp[-3].minor.yy254 = pik_elem_new(p,0,0,yymsp[-1].minor.yy72); if(yymsp[-3].minor.yy254) yymsp[-3].minor.yy254->errTok = yymsp[0].minor.yy0; }
2444 #line 2469 "pikchr.c"
2445 break;
2446 case 23: /* savelist ::= */
2447 #line 563 "pikchr.y"
2448 {yymsp[1].minor.yy72 = p->list; p->list = 0;}
2449 #line 2474 "pikchr.c"
2450 break;
2451 case 24: /* relexpr ::= expr */
2452 #line 570 "pikchr.y"
2453 {yylhsminor.yy60.rAbs = yymsp[0].minor.yy73; yylhsminor.yy60.rRel = 0;}
2454 #line 2479 "pikchr.c"
2455 yymsp[0].minor.yy60 = yylhsminor.yy60;
2456 break;
2457 case 25: /* relexpr ::= expr PERCENT */
2458 #line 571 "pikchr.y"
2459 {yylhsminor.yy60.rAbs = 0; yylhsminor.yy60.rRel = yymsp[-1].minor.yy73/100;}
2460 #line 2485 "pikchr.c"
2461 yymsp[-1].minor.yy60 = yylhsminor.yy60;
2462 break;
2463 case 26: /* optrelexpr ::= */
2464 #line 573 "pikchr.y"
2465 {yymsp[1].minor.yy60.rAbs = 0; yymsp[1].minor.yy60.rRel = 1.0;}
2466 #line 2491 "pikchr.c"
2467 break;
2468 case 27: /* attribute_list ::= relexpr alist */
2469 #line 575 "pikchr.y"
2470 {pik_add_direction(p,0,&yymsp[-1].minor.yy60);}
2471 #line 2496 "pikchr.c"
2472 break;
2473 case 28: /* attribute ::= numproperty relexpr */
2474 #line 579 "pikchr.y"
2475 { pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy60); }
2476 #line 2501 "pikchr.c"
2477 break;
2478 case 29: /* attribute ::= dashproperty expr */
2479 #line 580 "pikchr.y"
2480 { pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy73); }
2481 #line 2506 "pikchr.c"
2482 break;
2483 case 30: /* attribute ::= dashproperty */
2484 #line 581 "pikchr.y"
2485 { pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
2486 #line 2511 "pikchr.c"
2487 break;
2488 case 31: /* attribute ::= colorproperty rvalue */
2489 #line 582 "pikchr.y"
2490 { pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy73); }
2491 #line 2516 "pikchr.c"
2492 break;
2493 case 32: /* attribute ::= go direction optrelexpr */
2494 #line 583 "pikchr.y"
2495 { pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy60);}
2496 #line 2521 "pikchr.c"
2497 break;
2498 case 33: /* attribute ::= go direction even position */
2499 #line 584 "pikchr.y"
2500 {pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy139);}
2501 #line 2526 "pikchr.c"
2502 break;
2503 case 34: /* attribute ::= CLOSE */
2504 #line 585 "pikchr.y"
2505 { pik_close_path(p,&yymsp[0].minor.yy0); }
2506 #line 2531 "pikchr.c"
2507 break;
2508 case 35: /* attribute ::= CHOP */
2509 #line 586 "pikchr.y"
2510 { p->cur->bChop = 1; }
2511 #line 2536 "pikchr.c"
2512 break;
2513 case 36: /* attribute ::= FROM position */
2514 #line 587 "pikchr.y"
2515 { pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy139); }
2516 #line 2541 "pikchr.c"
2517 break;
2518 case 37: /* attribute ::= TO position */
2519 #line 588 "pikchr.y"
2520 { pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy139); }
2521 #line 2546 "pikchr.c"
2522 break;
2523 case 38: /* attribute ::= THEN */
2524 #line 589 "pikchr.y"
2525 { pik_then(p, &yymsp[0].minor.yy0, p->cur); }
2526 #line 2551 "pikchr.c"
2527 break;
2528 case 39: /* attribute ::= THEN optrelexpr HEADING expr */
2529 case 41: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==41);
2530 #line 591 "pikchr.y"
2531 {pik_move_hdg(p,&yymsp[-2].minor.yy60,&yymsp[-1].minor.yy0,yymsp[0].minor.yy73,0,&yymsp[-3].minor.yy0);}
2532 #line 2557 "pikchr.c"
2533 break;
2534 case 40: /* attribute ::= THEN optrelexpr EDGEPT */
2535 case 42: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==42);
2536 #line 592 "pikchr.y"
2537 {pik_move_hdg(p,&yymsp[-1].minor.yy60,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
2538 #line 2563 "pikchr.c"
2539 break;
2540 case 43: /* attribute ::= AT position */
2541 #line 597 "pikchr.y"
2542 { pik_set_at(p,0,&yymsp[0].minor.yy139,&yymsp[-1].minor.yy0); }
2543 #line 2568 "pikchr.c"
2544 break;
2545 case 44: /* attribute ::= SAME */
2546 #line 599 "pikchr.y"
2547 {pik_same(p,0,&yymsp[0].minor.yy0);}
2548 #line 2573 "pikchr.c"
2549 break;
2550 case 45: /* attribute ::= SAME AS object */
2551 #line 600 "pikchr.y"
2552 {pik_same(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0);}
2553 #line 2578 "pikchr.c"
2554 break;
2555 case 46: /* attribute ::= STRING textposition */
2556 #line 601 "pikchr.y"
2557 {pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy74);}
2558 #line 2583 "pikchr.c"
2559 break;
2560 case 47: /* attribute ::= FIT */
2561 #line 602 "pikchr.y"
2562 {pik_size_to_fit(p,&yymsp[0].minor.yy0); }
2563 #line 2588 "pikchr.c"
2564 break;
2565 case 48: /* attribute ::= BEHIND object */
2566 #line 603 "pikchr.y"
2567 {pik_behind(p,yymsp[0].minor.yy254);}
2568 #line 2593 "pikchr.c"
2569 break;
2570 case 49: /* withclause ::= DOT_E edge AT position */
2571 case 50: /* withclause ::= edge AT position */ yytestcase(yyruleno==50);
2572 #line 611 "pikchr.y"
2573 { pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy139,&yymsp[-1].minor.yy0); }
2574 #line 2599 "pikchr.c"
2575 break;
2576 case 51: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
2577 #line 615 "pikchr.y"
2578 {yylhsminor.yy0 = yymsp[0].minor.yy0;}
2579 #line 2604 "pikchr.c"
2580 yymsp[0].minor.yy0 = yylhsminor.yy0;
2581 break;
2582 case 52: /* boolproperty ::= CW */
2583 #line 626 "pikchr.y"
2584 {p->cur->cw = 1;}
2585 #line 2610 "pikchr.c"
2586 break;
2587 case 53: /* boolproperty ::= CCW */
2588 #line 627 "pikchr.y"
2589 {p->cur->cw = 0;}
2590 #line 2615 "pikchr.c"
2591 break;
2592 case 54: /* boolproperty ::= LARROW */
2593 #line 628 "pikchr.y"
2594 {p->cur->larrow=1; p->cur->rarrow=0; }
2595 #line 2620 "pikchr.c"
2596 break;
2597 case 55: /* boolproperty ::= RARROW */
2598 #line 629 "pikchr.y"
2599 {p->cur->larrow=0; p->cur->rarrow=1; }
2600 #line 2625 "pikchr.c"
2601 break;
2602 case 56: /* boolproperty ::= LRARROW */
2603 #line 630 "pikchr.y"
2604 {p->cur->larrow=1; p->cur->rarrow=1; }
2605 #line 2630 "pikchr.c"
2606 break;
2607 case 57: /* boolproperty ::= INVIS */
2608 #line 631 "pikchr.y"
2609 {p->cur->sw = 0.0;}
2610 #line 2635 "pikchr.c"
2611 break;
2612 case 58: /* boolproperty ::= THICK */
2613 #line 632 "pikchr.y"
2614 {p->cur->sw *= 1.5;}
2615 #line 2640 "pikchr.c"
2616 break;
2617 case 59: /* boolproperty ::= THIN */
2618 #line 633 "pikchr.y"
2619 {p->cur->sw *= 0.67;}
2620 #line 2645 "pikchr.c"
2621 break;
2622 case 60: /* textposition ::= */
2623 #line 635 "pikchr.y"
2624 {yymsp[1].minor.yy74 = 0;}
2625 #line 2650 "pikchr.c"
2626 break;
2627 case 61: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
2628 #line 638 "pikchr.y"
2629 {yylhsminor.yy74 = pik_text_position(yymsp[-1].minor.yy74,&yymsp[0].minor.yy0);}
2630 #line 2655 "pikchr.c"
2631 yymsp[-1].minor.yy74 = yylhsminor.yy74;
2632 break;
2633 case 62: /* position ::= expr COMMA expr */
2634 #line 641 "pikchr.y"
2635 {yylhsminor.yy139.x=yymsp[-2].minor.yy73; yylhsminor.yy139.y=yymsp[0].minor.yy73;}
2636 #line 2661 "pikchr.c"
2637 yymsp[-2].minor.yy139 = yylhsminor.yy139;
2638 break;
2639 case 63: /* position ::= place PLUS expr COMMA expr */
2640 #line 643 "pikchr.y"
2641 {yylhsminor.yy139.x=yymsp[-4].minor.yy139.x+yymsp[-2].minor.yy73; yylhsminor.yy139.y=yymsp[-4].minor.yy139.y+yymsp[0].minor.yy73;}
2642 #line 2667 "pikchr.c"
2643 yymsp[-4].minor.yy139 = yylhsminor.yy139;
2644 break;
2645 case 64: /* position ::= place MINUS expr COMMA expr */
2646 #line 644 "pikchr.y"
2647 {yylhsminor.yy139.x=yymsp[-4].minor.yy139.x-yymsp[-2].minor.yy73; yylhsminor.yy139.y=yymsp[-4].minor.yy139.y-yymsp[0].minor.yy73;}
2648 #line 2673 "pikchr.c"
2649 yymsp[-4].minor.yy139 = yylhsminor.yy139;
2650 break;
2651 case 65: /* position ::= place PLUS LP expr COMMA expr RP */
2652 #line 646 "pikchr.y"
2653 {yylhsminor.yy139.x=yymsp[-6].minor.yy139.x+yymsp[-3].minor.yy73; yylhsminor.yy139.y=yymsp[-6].minor.yy139.y+yymsp[-1].minor.yy73;}
2654 #line 2679 "pikchr.c"
2655 yymsp[-6].minor.yy139 = yylhsminor.yy139;
2656 break;
2657 case 66: /* position ::= place MINUS LP expr COMMA expr RP */
2658 #line 648 "pikchr.y"
2659 {yylhsminor.yy139.x=yymsp[-6].minor.yy139.x-yymsp[-3].minor.yy73; yylhsminor.yy139.y=yymsp[-6].minor.yy139.y-yymsp[-1].minor.yy73;}
2660 #line 2685 "pikchr.c"
2661 yymsp[-6].minor.yy139 = yylhsminor.yy139;
2662 break;
2663 case 67: /* position ::= LP position COMMA position RP */
2664 #line 649 "pikchr.y"
2665 {yymsp[-4].minor.yy139.x=yymsp[-3].minor.yy139.x; yymsp[-4].minor.yy139.y=yymsp[-1].minor.yy139.y;}
2666 #line 2691 "pikchr.c"
2667 break;
2668 case 68: /* position ::= LP position RP */
2669 #line 650 "pikchr.y"
2670 {yymsp[-2].minor.yy139=yymsp[-1].minor.yy139;}
2671 #line 2696 "pikchr.c"
2672 break;
2673 case 69: /* position ::= expr between position AND position */
2674 #line 652 "pikchr.y"
2675 {yylhsminor.yy139 = pik_position_between(yymsp[-4].minor.yy73,yymsp[-2].minor.yy139,yymsp[0].minor.yy139);}
2676 #line 2701 "pikchr.c"
2677 yymsp[-4].minor.yy139 = yylhsminor.yy139;
2678 break;
2679 case 70: /* position ::= expr LT position COMMA position GT */
2680 #line 654 "pikchr.y"
2681 {yylhsminor.yy139 = pik_position_between(yymsp[-5].minor.yy73,yymsp[-3].minor.yy139,yymsp[-1].minor.yy139);}
2682 #line 2707 "pikchr.c"
2683 yymsp[-5].minor.yy139 = yylhsminor.yy139;
2684 break;
2685 case 71: /* position ::= expr ABOVE position */
2686 #line 655 "pikchr.y"
2687 {yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.y += yymsp[-2].minor.yy73;}
2688 #line 2713 "pikchr.c"
2689 yymsp[-2].minor.yy139 = yylhsminor.yy139;
2690 break;
2691 case 72: /* position ::= expr BELOW position */
2692 #line 656 "pikchr.y"
2693 {yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.y -= yymsp[-2].minor.yy73;}
2694 #line 2719 "pikchr.c"
2695 yymsp[-2].minor.yy139 = yylhsminor.yy139;
2696 break;
2697 case 73: /* position ::= expr LEFT OF position */
2698 #line 657 "pikchr.y"
2699 {yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.x -= yymsp[-3].minor.yy73;}
2700 #line 2725 "pikchr.c"
2701 yymsp[-3].minor.yy139 = yylhsminor.yy139;
2702 break;
2703 case 74: /* position ::= expr RIGHT OF position */
2704 #line 658 "pikchr.y"
2705 {yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.x += yymsp[-3].minor.yy73;}
2706 #line 2731 "pikchr.c"
2707 yymsp[-3].minor.yy139 = yylhsminor.yy139;
2708 break;
2709 case 75: /* position ::= expr ON HEADING EDGEPT OF position */
2710 #line 660 "pikchr.y"
2711 {yylhsminor.yy139 = pik_position_at_hdg(yymsp[-5].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);}
2712 #line 2737 "pikchr.c"
2713 yymsp[-5].minor.yy139 = yylhsminor.yy139;
2714 break;
2715 case 76: /* position ::= expr HEADING EDGEPT OF position */
2716 #line 662 "pikchr.y"
2717 {yylhsminor.yy139 = pik_position_at_hdg(yymsp[-4].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);}
2718 #line 2743 "pikchr.c"
2719 yymsp[-4].minor.yy139 = yylhsminor.yy139;
2720 break;
2721 case 77: /* position ::= expr EDGEPT OF position */
2722 #line 664 "pikchr.y"
2723 {yylhsminor.yy139 = pik_position_at_hdg(yymsp[-3].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);}
2724 #line 2749 "pikchr.c"
2725 yymsp[-3].minor.yy139 = yylhsminor.yy139;
2726 break;
2727 case 78: /* position ::= expr ON HEADING expr FROM position */
2728 #line 666 "pikchr.y"
2729 {yylhsminor.yy139 = pik_position_at_angle(yymsp[-5].minor.yy73,yymsp[-2].minor.yy73,yymsp[0].minor.yy139);}
2730 #line 2755 "pikchr.c"
2731 yymsp[-5].minor.yy139 = yylhsminor.yy139;
2732 break;
2733 case 79: /* position ::= expr HEADING expr FROM position */
2734 #line 668 "pikchr.y"
2735 {yylhsminor.yy139 = pik_position_at_angle(yymsp[-4].minor.yy73,yymsp[-2].minor.yy73,yymsp[0].minor.yy139);}
2736 #line 2761 "pikchr.c"
2737 yymsp[-4].minor.yy139 = yylhsminor.yy139;
2738 break;
2739 case 80: /* place ::= edge OF object */
2740 #line 680 "pikchr.y"
2741 {yylhsminor.yy139 = pik_place_of_elem(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0);}
2742 #line 2767 "pikchr.c"
2743 yymsp[-2].minor.yy139 = yylhsminor.yy139;
2744 break;
2745 case 81: /* place2 ::= object */
2746 #line 681 "pikchr.y"
2747 {yylhsminor.yy139 = pik_place_of_elem(p,yymsp[0].minor.yy254,0);}
2748 #line 2773 "pikchr.c"
2749 yymsp[0].minor.yy139 = yylhsminor.yy139;
2750 break;
2751 case 82: /* place2 ::= object DOT_E edge */
2752 #line 682 "pikchr.y"
2753 {yylhsminor.yy139 = pik_place_of_elem(p,yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);}
2754 #line 2779 "pikchr.c"
2755 yymsp[-2].minor.yy139 = yylhsminor.yy139;
2756 break;
2757 case 83: /* place2 ::= NTH VERTEX OF object */
2758 #line 683 "pikchr.y"
2759 {yylhsminor.yy139 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy254);}
2760 #line 2785 "pikchr.c"
2761 yymsp[-3].minor.yy139 = yylhsminor.yy139;
2762 break;
2763 case 84: /* object ::= nth */
2764 #line 695 "pikchr.y"
2765 {yylhsminor.yy254 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
2766 #line 2791 "pikchr.c"
2767 yymsp[0].minor.yy254 = yylhsminor.yy254;
2768 break;
2769 case 85: /* object ::= nth OF|IN object */
2770 #line 696 "pikchr.y"
2771 {yylhsminor.yy254 = pik_find_nth(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0);}
2772 #line 2797 "pikchr.c"
2773 yymsp[-2].minor.yy254 = yylhsminor.yy254;
2774 break;
2775 case 86: /* objectname ::= PLACENAME */
2776 #line 698 "pikchr.y"
2777 {yylhsminor.yy254 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
2778 #line 2803 "pikchr.c"
2779 yymsp[0].minor.yy254 = yylhsminor.yy254;
2780 break;
2781 case 87: /* objectname ::= objectname DOT_U PLACENAME */
2782 #line 700 "pikchr.y"
2783 {yylhsminor.yy254 = pik_find_byname(p,yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);}
2784 #line 2809 "pikchr.c"
2785 yymsp[-2].minor.yy254 = yylhsminor.yy254;
2786 break;
2787 case 88: /* nth ::= NTH CLASSNAME */
2788 #line 702 "pikchr.y"
2789 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
2790 #line 2815 "pikchr.c"
2791 yymsp[-1].minor.yy0 = yylhsminor.yy0;
2792 break;
2793 case 89: /* nth ::= NTH LAST CLASSNAME */
2794 #line 703 "pikchr.y"
2795 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
2796 #line 2821 "pikchr.c"
2797 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2798 break;
2799 case 90: /* nth ::= LAST CLASSNAME */
2800 #line 704 "pikchr.y"
2801 {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
2802 #line 2827 "pikchr.c"
2803 break;
2804 case 91: /* nth ::= LAST */
2805 #line 705 "pikchr.y"
2806 {yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
2807 #line 2832 "pikchr.c"
2808 yymsp[0].minor.yy0 = yylhsminor.yy0;
2809 break;
2810 case 92: /* nth ::= NTH LB RB */
2811 #line 706 "pikchr.y"
2812 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
2813 #line 2838 "pikchr.c"
2814 yymsp[-2].minor.yy0 = yylhsminor.yy0;
2815 break;
2816 case 93: /* nth ::= NTH LAST LB RB */
2817 #line 707 "pikchr.y"
2818 {yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
2819 #line 2844 "pikchr.c"
2820 yymsp[-3].minor.yy0 = yylhsminor.yy0;
2821 break;
2822 case 94: /* nth ::= LAST LB RB */
2823 #line 708 "pikchr.y"
2824 {yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
2825 #line 2850 "pikchr.c"
2826 break;
2827 case 95: /* expr ::= expr PLUS expr */
2828 #line 710 "pikchr.y"
2829 {yylhsminor.yy73=yymsp[-2].minor.yy73+yymsp[0].minor.yy73;}
2830 #line 2855 "pikchr.c"
2831 yymsp[-2].minor.yy73 = yylhsminor.yy73;
2832 break;
2833 case 96: /* expr ::= expr MINUS expr */
2834 #line 711 "pikchr.y"
2835 {yylhsminor.yy73=yymsp[-2].minor.yy73-yymsp[0].minor.yy73;}
2836 #line 2861 "pikchr.c"
2837 yymsp[-2].minor.yy73 = yylhsminor.yy73;
2838 break;
2839 case 97: /* expr ::= expr STAR expr */
2840 #line 712 "pikchr.y"
2841 {yylhsminor.yy73=yymsp[-2].minor.yy73*yymsp[0].minor.yy73;}
2842 #line 2867 "pikchr.c"
2843 yymsp[-2].minor.yy73 = yylhsminor.yy73;
2844 break;
2845 case 98: /* expr ::= expr SLASH expr */
2846 #line 713 "pikchr.y"
2847 {
2848 if( yymsp[0].minor.yy73==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy73 = 0.0; }
2849 else{ yylhsminor.yy73 = yymsp[-2].minor.yy73/yymsp[0].minor.yy73; }
2850 }
2851 #line 2876 "pikchr.c"
2852 yymsp[-2].minor.yy73 = yylhsminor.yy73;
2853 break;
2854 case 99: /* expr ::= MINUS expr */
2855 #line 717 "pikchr.y"
2856 {yymsp[-1].minor.yy73=-yymsp[0].minor.yy73;}
2857 #line 2882 "pikchr.c"
2858 break;
2859 case 100: /* expr ::= PLUS expr */
2860 #line 718 "pikchr.y"
2861 {yymsp[-1].minor.yy73=yymsp[0].minor.yy73;}
2862 #line 2887 "pikchr.c"
2863 break;
2864 case 101: /* expr ::= LP expr RP */
2865 #line 719 "pikchr.y"
2866 {yymsp[-2].minor.yy73=yymsp[-1].minor.yy73;}
2867 #line 2892 "pikchr.c"
2868 break;
2869 case 102: /* expr ::= NUMBER */
2870 #line 720 "pikchr.y"
2871 {yylhsminor.yy73=pik_atof(&yymsp[0].minor.yy0);}
2872 #line 2897 "pikchr.c"
2873 yymsp[0].minor.yy73 = yylhsminor.yy73;
2874 break;
2875 case 103: /* expr ::= ID */
2876 #line 721 "pikchr.y"
2877 {yylhsminor.yy73=pik_get_var(p,&yymsp[0].minor.yy0);}
2878 #line 2903 "pikchr.c"
2879 yymsp[0].minor.yy73 = yylhsminor.yy73;
2880 break;
2881 case 104: /* expr ::= FUNC1 LP expr RP */
2882 #line 722 "pikchr.y"
2883 {yylhsminor.yy73 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy73,0.0);}
2884 #line 2909 "pikchr.c"
2885 yymsp[-3].minor.yy73 = yylhsminor.yy73;
2886 break;
2887 case 105: /* expr ::= FUNC2 LP expr COMMA expr RP */
2888 #line 723 "pikchr.y"
2889 {yylhsminor.yy73 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy73,yymsp[-1].minor.yy73);}
2890 #line 2915 "pikchr.c"
2891 yymsp[-5].minor.yy73 = yylhsminor.yy73;
2892 break;
2893 case 106: /* expr ::= place2 DOT_XY X */
2894 #line 724 "pikchr.y"
2895 {yylhsminor.yy73 = yymsp[-2].minor.yy139.x;}
2896 #line 2921 "pikchr.c"
2897 yymsp[-2].minor.yy73 = yylhsminor.yy73;
2898 break;
2899 case 107: /* expr ::= place2 DOT_XY Y */
2900 #line 725 "pikchr.y"
2901 {yylhsminor.yy73 = yymsp[-2].minor.yy139.y;}
2902 #line 2927 "pikchr.c"
2903 yymsp[-2].minor.yy73 = yylhsminor.yy73;
2904 break;
2905 case 108: /* expr ::= object DOT_L numproperty */
2906 case 109: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==109);
2907 case 110: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==110);
2908 #line 726 "pikchr.y"
2909 {yylhsminor.yy73=pik_property_of(yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);}
2910 #line 2935 "pikchr.c"
2911 yymsp[-2].minor.yy73 = yylhsminor.yy73;
2912 break;
2913 default:
2914 /* (111) lvalue ::= ID */ yytestcase(yyruleno==111);
2915 /* (112) lvalue ::= FILL */ yytestcase(yyruleno==112);
@@ -3018,19 +3008,19 @@
3008 ){
3009 pik_parserARG_FETCH
3010 pik_parserCTX_FETCH
3011 #define TOKEN yyminor
3012 /************ Begin %syntax_error code ****************************************/
3013 #line 492 "pikchr.y"
3014
3015 if( TOKEN.z && TOKEN.z[0] ){
3016 pik_error(p, &TOKEN, "syntax error");
3017 }else{
3018 pik_error(p, 0, "syntax error");
3019 }
3020 UNUSED_PARAMETER(yymajor);
3021 #line 3046 "pikchr.c"
3022 /************ End %syntax_error code ******************************************/
3023 pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
3024 pik_parserCTX_STORE
3025 }
3026
@@ -3259,11 +3249,11 @@
3249 #else
3250 (void)iToken;
3251 return 0;
3252 #endif
3253 }
3254 #line 731 "pikchr.y"
3255
3256
3257
3258 /* Chart of the 140 official HTML color names with their
3259 ** corresponding RGB value.
@@ -6409,23 +6399,10 @@
6399 h = p->bbox.ne.y - p->bbox.sw.y;
6400 p->wSVG = (int)(p->rScale*w);
6401 p->hSVG = (int)(p->rScale*h);
6402 pik_append_dis(p, " viewBox=\"0 0 ",w,"");
6403 pik_append_dis(p, " ",h,"\">\n");
 
 
 
 
 
 
 
 
 
 
 
 
 
6404 pik_elist_render(p, pEList);
6405 pik_append(p,"</svg>\n", -1);
6406 }else{
6407 p->wSVG = -1;
6408 p->hSVG = -1;
@@ -6964,54 +6941,99 @@
6941 return 0;
6942 }
6943 #endif /* PIKCHR_FUZZ */
6944
6945 #if defined(PIKCHR_SHELL)
6946 /* Print a usage comment for the shell and exit. */
6947 static void usage(const char *argv0){
6948 fprintf(stderr, "usage: %s [OPTIONS] FILE ...\n", argv0);
6949 fprintf(stderr,
6950 "Convert Pikchr input files into SVG.\n"
6951 "Options:\n"
6952 " --svg-only Omit raw SVG without the HTML wrapper\n"
6953 );
6954 exit(1);
6955 }
6956
6957 /* Send text to standard output, but escape HTML markup */
6958 static void print_escape_html(const char *z){
6959 int j;
6960 char c;
6961 while( z[0]!=0 ){
6962 for(j=0; (c = z[j])!=0 && c!='<' && c!='>' && c!='&'; j++){}
6963 if( j ) printf("%.*s", j, z);
6964 z += j+1;
6965 j = -1;
6966 if( c=='<' ){
6967 printf("&lt;");
6968 }else if( c=='>' ){
6969 printf("&gt;");
6970 }else if( c=='&' ){
6971 printf("&amp;");
6972 }else if( c==0 ){
6973 break;
6974 }
6975 }
6976 }
6977
6978 /* Testing interface
6979 **
6980 ** Generate HTML on standard output that displays both the original
6981 ** input text and the rendered SVG for all files named on the command
6982 ** line.
6983 */
6984 int main(int argc, char **argv){
6985 int i;
6986 int bSvgOnly = 0; /* Output SVG only. No HTML wrapper */
6987 const char *zHtmlHdr =
 
6988 "<!DOCTYPE html>\n"
6989 "<html lang=\"en-US\">\n"
6990 "<head>\n<title>PIKCHR Test</title>\n"
6991 "<style>\n"
6992 " .hidden {\n"
6993 " position: absolute !important;\n"
6994 " opacity: 0 !important;\n"
6995 " pointer-events: none !important;\n"
6996 " display: none !important;\n"
6997 " }\n"
6998 "</style>\n"
6999 "<script>\n"
7000 " function toggleHidden(id){\n"
7001 " for(var c of document.getElementById(id).children){\n"
7002 " c.classList.toggle('hidden');\n"
7003 " }\n"
7004 " }\n"
7005 "</script>\n"
7006 "<meta charset=\"utf-8\">\n"
7007 "</head>\n"
7008 "<body>\n"
7009 ;
7010 if( argc<2 ) usage(argv[0]);
7011 for(i=1; i<argc; i++){
7012 FILE *in;
7013 size_t sz;
7014 char *zIn;
7015 char *zOut;
 
 
7016 int w, h;
7017
7018 if( argv[i][0]=='-' ){
7019 char *z = argv[i];
7020 z++;
7021 if( z[0]=='-' ) z++;
7022 if( strcmp(z,"svg-only")==0 ){
7023 if( zHtmlHdr==0 ){
7024 fprintf(stderr, "the \"%s\" option must come first\n",argv[i]);
7025 exit(1);
7026 }
7027 bSvgOnly = 1;
7028 }else
7029 {
7030 fprintf(stderr,"unknown option: \"%s\"\n", argv[i]);
7031 usage(argv[0]);
7032 }
7033 continue;
7034 }
 
7035 in = fopen(argv[i], "rb");
7036 if( in==0 ){
7037 fprintf(stderr, "cannot open \"%s\" for reading\n", argv[i]);
7038 continue;
7039 }
@@ -7025,45 +7047,40 @@
7047 continue;
7048 }
7049 sz = fread(zIn, 1, sz, in);
7050 fclose(in);
7051 zIn[sz] = 0;
7052 zOut = pikchr(zIn, "pikchr", 0, &w, &h);
7053 if( zOut==0 ){
7054 fprintf(stderr, "pikchr() returns NULL. Out of memory?\n");
7055 exit(1);
7056 }
7057 if( bSvgOnly ){
7058 printf("%s\n", zOut);
7059 }else{
7060 if( zHtmlHdr ){
7061 printf("%s", zHtmlHdr);
7062 zHtmlHdr = 0;
7063 }
7064 printf("<h1>File %s</h1>\n", argv[i]);
7065 if( w<0 ){
7066 printf("<p>ERROR</p>\n%s\n", zOut);
7067 }else{
7068 printf("<div id=\"svg-%d\" onclick=\"toggleHidden('svg-%d')\">\n",i,i);
7069 printf("<div style='border:3px solid lightgray;max-width:%dpx;'>\n",w);
7070 printf("%s</div>\n", zOut);
7071 printf("<pre class='hidden'>");
7072 print_escape_html(zIn);
7073 printf("</pre>\n</div>\n");
7074 }
7075 }
7076 free(zOut);
7077 free(zIn);
7078 }
7079 if( !bSvgOnly ){
7080 printf("</body></html>\n");
7081 }
 
 
 
 
 
7082 return 0;
7083 }
7084 #endif /* PIKCHR_SHELL */
7085
7086 #line 7111 "pikchr.c"
7087
+3 -1
--- src/shell.c
+++ src/shell.c
@@ -8919,10 +8919,11 @@
89198919
int nTab = STRLEN(zTab);
89208920
int nByte = sizeof(IdxTable) + nTab + 1;
89218921
IdxTable *pNew = 0;
89228922
int rc, rc2;
89238923
char *pCsr = 0;
8924
+ int nPk = 0;
89248925
89258926
rc = idxPrintfPrepareStmt(db, &p1, pzErrmsg, "PRAGMA table_info=%Q", zTab);
89268927
while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
89278928
const char *zCol = (const char*)sqlite3_column_text(p1, 1);
89288929
nByte += 1 + STRLEN(zCol);
@@ -8929,10 +8930,11 @@
89298930
rc = sqlite3_table_column_metadata(
89308931
db, "main", zTab, zCol, 0, &zCol, 0, 0, 0
89318932
);
89328933
nByte += 1 + STRLEN(zCol);
89338934
nCol++;
8935
+ nPk += (sqlite3_column_int(p1, 5)>0);
89348936
}
89358937
rc2 = sqlite3_reset(p1);
89368938
if( rc==SQLITE_OK ) rc = rc2;
89378939
89388940
nByte += sizeof(IdxColumn) * nCol;
@@ -8948,11 +8950,11 @@
89488950
nCol = 0;
89498951
while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
89508952
const char *zCol = (const char*)sqlite3_column_text(p1, 1);
89518953
int nCopy = STRLEN(zCol) + 1;
89528954
pNew->aCol[nCol].zName = pCsr;
8953
- pNew->aCol[nCol].iPk = sqlite3_column_int(p1, 5);
8955
+ pNew->aCol[nCol].iPk = (sqlite3_column_int(p1, 5)==1 && nPk==1);
89548956
memcpy(pCsr, zCol, nCopy);
89558957
pCsr += nCopy;
89568958
89578959
rc = sqlite3_table_column_metadata(
89588960
db, "main", zTab, zCol, 0, &zCol, 0, 0, 0
89598961
--- src/shell.c
+++ src/shell.c
@@ -8919,10 +8919,11 @@
8919 int nTab = STRLEN(zTab);
8920 int nByte = sizeof(IdxTable) + nTab + 1;
8921 IdxTable *pNew = 0;
8922 int rc, rc2;
8923 char *pCsr = 0;
 
8924
8925 rc = idxPrintfPrepareStmt(db, &p1, pzErrmsg, "PRAGMA table_info=%Q", zTab);
8926 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
8927 const char *zCol = (const char*)sqlite3_column_text(p1, 1);
8928 nByte += 1 + STRLEN(zCol);
@@ -8929,10 +8930,11 @@
8929 rc = sqlite3_table_column_metadata(
8930 db, "main", zTab, zCol, 0, &zCol, 0, 0, 0
8931 );
8932 nByte += 1 + STRLEN(zCol);
8933 nCol++;
 
8934 }
8935 rc2 = sqlite3_reset(p1);
8936 if( rc==SQLITE_OK ) rc = rc2;
8937
8938 nByte += sizeof(IdxColumn) * nCol;
@@ -8948,11 +8950,11 @@
8948 nCol = 0;
8949 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
8950 const char *zCol = (const char*)sqlite3_column_text(p1, 1);
8951 int nCopy = STRLEN(zCol) + 1;
8952 pNew->aCol[nCol].zName = pCsr;
8953 pNew->aCol[nCol].iPk = sqlite3_column_int(p1, 5);
8954 memcpy(pCsr, zCol, nCopy);
8955 pCsr += nCopy;
8956
8957 rc = sqlite3_table_column_metadata(
8958 db, "main", zTab, zCol, 0, &zCol, 0, 0, 0
8959
--- src/shell.c
+++ src/shell.c
@@ -8919,10 +8919,11 @@
8919 int nTab = STRLEN(zTab);
8920 int nByte = sizeof(IdxTable) + nTab + 1;
8921 IdxTable *pNew = 0;
8922 int rc, rc2;
8923 char *pCsr = 0;
8924 int nPk = 0;
8925
8926 rc = idxPrintfPrepareStmt(db, &p1, pzErrmsg, "PRAGMA table_info=%Q", zTab);
8927 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
8928 const char *zCol = (const char*)sqlite3_column_text(p1, 1);
8929 nByte += 1 + STRLEN(zCol);
@@ -8929,10 +8930,11 @@
8930 rc = sqlite3_table_column_metadata(
8931 db, "main", zTab, zCol, 0, &zCol, 0, 0, 0
8932 );
8933 nByte += 1 + STRLEN(zCol);
8934 nCol++;
8935 nPk += (sqlite3_column_int(p1, 5)>0);
8936 }
8937 rc2 = sqlite3_reset(p1);
8938 if( rc==SQLITE_OK ) rc = rc2;
8939
8940 nByte += sizeof(IdxColumn) * nCol;
@@ -8948,11 +8950,11 @@
8950 nCol = 0;
8951 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
8952 const char *zCol = (const char*)sqlite3_column_text(p1, 1);
8953 int nCopy = STRLEN(zCol) + 1;
8954 pNew->aCol[nCol].zName = pCsr;
8955 pNew->aCol[nCol].iPk = (sqlite3_column_int(p1, 5)==1 && nPk==1);
8956 memcpy(pCsr, zCol, nCopy);
8957 pCsr += nCopy;
8958
8959 rc = sqlite3_table_column_metadata(
8960 db, "main", zTab, zCol, 0, &zCol, 0, 0, 0
8961
+33 -28
--- src/sqlite3.c
+++ src/sqlite3.c
@@ -1171,11 +1171,11 @@
11711171
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
11721172
** [sqlite_version()] and [sqlite_source_id()].
11731173
*/
11741174
#define SQLITE_VERSION "3.34.0"
11751175
#define SQLITE_VERSION_NUMBER 3034000
1176
-#define SQLITE_SOURCE_ID "2020-09-15 20:48:30 3d35fa0be866213274fc09250225b345f6b08a9b4ec373d53d95e627e24512be"
1176
+#define SQLITE_SOURCE_ID "2020-09-17 21:11:25 4542d194e2fef5e21e1c3679914bd9e21fab31cfb111cf640524fb3514a8afa3"
11771177
11781178
/*
11791179
** CAPI3REF: Run-Time Library Version Numbers
11801180
** KEYWORDS: sqlite3_version sqlite3_sourceid
11811181
**
@@ -10517,11 +10517,11 @@
1051710517
** or any operation on a WITHOUT ROWID table, the value of the sixth
1051810518
** parameter is undefined. For an INSERT or UPDATE on a rowid table the
1051910519
** seventh parameter is the final rowid value of the row being inserted
1052010520
** or updated. The value of the seventh parameter passed to the callback
1052110521
** function is not defined for operations on WITHOUT ROWID tables, or for
10522
-** INSERT operations on rowid tables.
10522
+** DELETE operations on rowid tables.
1052310523
**
1052410524
** The [sqlite3_preupdate_old()], [sqlite3_preupdate_new()],
1052510525
** [sqlite3_preupdate_count()], and [sqlite3_preupdate_depth()] interfaces
1052610526
** provide additional information about a preupdate event. These routines
1052710527
** may only be called from within a preupdate callback. Invoking any of
@@ -18569,13 +18569,10 @@
1856918569
**
1857018570
** SRT_Discard Throw the results away. This is used by SELECT
1857118571
** statements within triggers whose only purpose is
1857218572
** the side-effects of functions.
1857318573
**
18574
-** All of the above are free to ignore their ORDER BY clause. Those that
18575
-** follow must honor the ORDER BY clause.
18576
-**
1857718574
** SRT_Output Generate a row of output (using the OP_ResultRow
1857818575
** opcode) for each row in the result set.
1857918576
**
1858018577
** SRT_Mem Only valid if the result is a single column.
1858118578
** Store the first column of the first result row
@@ -18628,17 +18625,22 @@
1862818625
*/
1862918626
#define SRT_Union 1 /* Store result as keys in an index */
1863018627
#define SRT_Except 2 /* Remove result from a UNION index */
1863118628
#define SRT_Exists 3 /* Store 1 if the result is not empty */
1863218629
#define SRT_Discard 4 /* Do not save the results anywhere */
18633
-#define SRT_Fifo 5 /* Store result as data with an automatic rowid */
18634
-#define SRT_DistFifo 6 /* Like SRT_Fifo, but unique results only */
18630
+#define SRT_DistFifo 5 /* Like SRT_Fifo, but unique results only */
18631
+#define SRT_DistQueue 6 /* Like SRT_Queue, but unique results only */
18632
+
18633
+/* The DISTINCT clause is ignored for all of the above. Not that
18634
+** IgnorableDistinct() implies IgnorableOrderby() */
18635
+#define IgnorableDistinct(X) ((X->eDest)<=SRT_DistQueue)
18636
+
1863518637
#define SRT_Queue 7 /* Store result in an queue */
18636
-#define SRT_DistQueue 8 /* Like SRT_Queue, but unique results only */
18638
+#define SRT_Fifo 8 /* Store result as data with an automatic rowid */
1863718639
1863818640
/* The ORDER BY clause is ignored for all of the above */
18639
-#define IgnorableOrderby(X) ((X->eDest)<=SRT_DistQueue)
18641
+#define IgnorableOrderby(X) ((X->eDest)<=SRT_Fifo)
1864018642
1864118643
#define SRT_Output 9 /* Output each row of result */
1864218644
#define SRT_Mem 10 /* Store result in a memory cell */
1864318645
#define SRT_Set 11 /* Store results as keys in an index */
1864418646
#define SRT_EphemTab 12 /* Create transient tab and store like SRT_Table */
@@ -127348,11 +127350,11 @@
127348127350
pParent = sqlite3FindTable(db, pFK->zTo, zDb);
127349127351
pIdx = 0;
127350127352
aiCols = 0;
127351127353
if( pParent ){
127352127354
x = sqlite3FkLocateIndex(pParse, pParent, pFK, &pIdx, &aiCols);
127353
- assert( x==0 );
127355
+ assert( x==0 || db->mallocFailed );
127354127356
}
127355127357
addrOk = sqlite3VdbeMakeLabel(pParse);
127356127358
127357127359
/* Generate code to read the child key values into registers
127358127360
** regRow..regRow+n. If any of the child key values are NULL, this
@@ -127373,11 +127375,11 @@
127373127375
VdbeCoverage(v);
127374127376
}else if( pParent ){
127375127377
int jmp = sqlite3VdbeCurrentAddr(v)+2;
127376127378
sqlite3VdbeAddOp3(v, OP_SeekRowid, i, jmp, regRow); VdbeCoverage(v);
127377127379
sqlite3VdbeGoto(v, addrOk);
127378
- assert( pFK->nCol==1 );
127380
+ assert( pFK->nCol==1 || db->mallocFailed );
127379127381
}
127380127382
127381127383
/* Generate code to report an FK violation to the caller. */
127382127384
if( HasRowid(pTab) ){
127383127385
sqlite3VdbeAddOp2(v, OP_Rowid, 0, regResult+1);
@@ -135260,17 +135262,15 @@
135260135262
135261135263
assert( p->pOrderBy==0 || pDest->eDest!=SRT_DistFifo );
135262135264
assert( p->pOrderBy==0 || pDest->eDest!=SRT_Fifo );
135263135265
assert( p->pOrderBy==0 || pDest->eDest!=SRT_DistQueue );
135264135266
assert( p->pOrderBy==0 || pDest->eDest!=SRT_Queue );
135265
- if( IgnorableOrderby(pDest) ){
135266
- assert(pDest->eDest==SRT_Exists || pDest->eDest==SRT_Union ||
135267
- pDest->eDest==SRT_Except || pDest->eDest==SRT_Discard ||
135268
- pDest->eDest==SRT_Queue || pDest->eDest==SRT_DistFifo ||
135269
- pDest->eDest==SRT_DistQueue || pDest->eDest==SRT_Fifo);
135270
- /* If ORDER BY makes no difference in the output then neither does
135271
- ** DISTINCT so it can be removed too. */
135267
+ if( IgnorableDistinct(pDest) ){
135268
+ assert(pDest->eDest==SRT_Exists || pDest->eDest==SRT_Union ||
135269
+ pDest->eDest==SRT_Except || pDest->eDest==SRT_Discard ||
135270
+ pDest->eDest==SRT_DistQueue || pDest->eDest==SRT_DistFifo );
135271
+ /* All of these destinations are also able to ignore the ORDER BY clause */
135272135272
sqlite3ExprListDelete(db, p->pOrderBy);
135273135273
p->pOrderBy = 0;
135274135274
p->selFlags &= ~SF_Distinct;
135275135275
p->selFlags |= SF_NoopOrderBy;
135276135276
}
@@ -143073,10 +143073,13 @@
143073143073
sqlite3VdbeAddOp4(v, OP_VFilter, iCur, addrNotFound, iReg,
143074143074
pLoop->u.vtab.idxStr,
143075143075
pLoop->u.vtab.needFree ? P4_DYNAMIC : P4_STATIC);
143076143076
VdbeCoverage(v);
143077143077
pLoop->u.vtab.needFree = 0;
143078
+ /* An OOM inside of AddOp4(OP_VFilter) instruction above might have freed
143079
+ ** the u.vtab.idxStr. NULL it out to prevent a use-after-free */
143080
+ if( db->mallocFailed ) pLoop->u.vtab.idxStr = 0;
143078143081
pLevel->p1 = iCur;
143079143082
pLevel->op = pWInfo->eOnePass ? OP_Noop : OP_VNext;
143080143083
pLevel->p2 = sqlite3VdbeCurrentAddr(v);
143081143084
iIn = pLevel->u.in.nIn;
143082143085
for(j=nConstraint-1; j>=0; j--){
@@ -156896,11 +156899,11 @@
156896156899
}
156897156900
}
156898156901
#endif /* YYWILDCARD */
156899156902
return yy_default[stateno];
156900156903
}else{
156901
- assert( i>=0 && i<sizeof(yy_action)/sizeof(yy_action[0]) );
156904
+ assert( i>=0 && i<(int)(sizeof(yy_action)/sizeof(yy_action[0])) );
156902156905
return yy_action[i];
156903156906
}
156904156907
}while(1);
156905156908
}
156906156909
@@ -189218,11 +189221,11 @@
189218189221
** of the r-tree structure. A height of zero means all data is stored on
189219189222
** the root node. A height of one means the children of the root node
189220189223
** are the leaves, and so on. If the depth as specified on the root node
189221189224
** is greater than RTREE_MAX_DEPTH, the r-tree structure must be corrupt.
189222189225
*/
189223
- if( pNode && iNode==1 ){
189226
+ if( pNode && rc==SQLITE_OK && iNode==1 ){
189224189227
pRtree->iDepth = readInt16(pNode->zData);
189225189228
if( pRtree->iDepth>RTREE_MAX_DEPTH ){
189226189229
rc = SQLITE_CORRUPT_VTAB;
189227189230
RTREE_IS_CORRUPT(pRtree);
189228189231
}
@@ -210518,11 +210521,11 @@
210518210521
}
210519210522
}
210520210523
#endif /* fts5YYWILDCARD */
210521210524
return fts5yy_default[stateno];
210522210525
}else{
210523
- assert( i>=0 && i<sizeof(fts5yy_action)/sizeof(fts5yy_action[0]) );
210526
+ assert( i>=0 && i<(int)(sizeof(fts5yy_action)/sizeof(fts5yy_action[0])) );
210524210527
return fts5yy_action[i];
210525210528
}
210526210529
}while(1);
210527210530
}
210528210531
@@ -216523,11 +216526,10 @@
216523216526
if( pHash->eDetail!=FTS5_DETAIL_NONE ){
216524216527
p->nData += 1;
216525216528
p->iCol = (pHash->eDetail==FTS5_DETAIL_FULL ? 0 : -1);
216526216529
}
216527216530
216528
- nIncr += p->nData;
216529216531
}else{
216530216532
216531216533
/* Appending to an existing hash-entry. Check that there is enough
216532216534
** space to append the largest possible new entry. Worst case scenario
216533216535
** is:
@@ -221775,11 +221777,13 @@
221775221777
/* See the earlier comment in this function for an explanation of why
221776221778
** corrupt input position lists might cause the output to consume
221777221779
** at most 20 bytes of unexpected space. */
221778221780
fts5MergeAppendDocid(&out, iLastRowid, i2.iRowid);
221779221781
fts5BufferZero(&tmp);
221780
- sqlite3Fts5BufferSize(&p->rc, &tmp, i1.nPoslist + i2.nPoslist + 10 + 10);
221782
+ sqlite3Fts5BufferSize(&p->rc, &tmp,
221783
+ i1.nPoslist + i2.nPoslist + 10 + 10 + FTS5_DATA_ZERO_PADDING
221784
+ );
221781221785
if( p->rc ) break;
221782221786
221783221787
sqlite3Fts5PoslistNext64(a1, i1.nPoslist, &iOff1, &iPos1);
221784221788
sqlite3Fts5PoslistNext64(a2, i2.nPoslist, &iOff2, &iPos2);
221785221789
assert_nc( iPos1>=0 && iPos2>=0 );
@@ -221849,13 +221853,14 @@
221849221853
fts5MergeAppendDocid(&out, iLastRowid, i2.iRowid);
221850221854
fts5BufferSafeAppendBlob(&out, i2.aPoslist, i2.aEof - i2.aPoslist);
221851221855
}
221852221856
assert_nc( out.n<=(p1->n+p2->n+9) );
221853221857
221854
- fts5BufferSet(&p->rc, p1, out.n, out.p);
221858
+ fts5BufferFree(p1);
221855221859
fts5BufferFree(&tmp);
221856
- fts5BufferFree(&out);
221860
+ memset(&out.p[out.n], 0, FTS5_DATA_ZERO_PADDING);
221861
+ *p1 = out;
221857221862
}
221858221863
}
221859221864
221860221865
static void fts5SetupPrefixIter(
221861221866
Fts5Index *p, /* Index to read from */
@@ -226150,11 +226155,11 @@
226150226155
int nArg, /* Number of args */
226151226156
sqlite3_value **apUnused /* Function arguments */
226152226157
){
226153226158
assert( nArg==0 );
226154226159
UNUSED_PARAM2(nArg, apUnused);
226155
- sqlite3_result_text(pCtx, "fts5: 2020-09-11 15:01:49 b79f19edfd33c2a75f936c352668e14e81f35acf4f07edc27a21f941a7304b38", -1, SQLITE_TRANSIENT);
226160
+ sqlite3_result_text(pCtx, "fts5: 2020-09-17 21:11:25 4542d194e2fef5e21e1c3679914bd9e21fab31cfb111cf640524fb3514a8afa3", -1, SQLITE_TRANSIENT);
226156226161
}
226157226162
226158226163
/*
226159226164
** Return true if zName is the extension on one of the shadow tables used
226160226165
** by this module.
@@ -230940,12 +230945,12 @@
230940230945
}
230941230946
#endif /* SQLITE_CORE */
230942230947
#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_STMTVTAB) */
230943230948
230944230949
/************** End of stmt.c ************************************************/
230945
-#if __LINE__!=230945
230950
+#if __LINE__!=230950
230946230951
#undef SQLITE_SOURCE_ID
230947
-#define SQLITE_SOURCE_ID "2020-09-15 20:48:30 3d35fa0be866213274fc09250225b345f6b08a9b4ec373d53d95e627e245alt2"
230952
+#define SQLITE_SOURCE_ID "2020-09-17 21:11:25 4542d194e2fef5e21e1c3679914bd9e21fab31cfb111cf640524fb3514a8alt2"
230948230953
#endif
230949230954
/* Return the source-id for this library */
230950230955
SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; }
230951230956
/************************** End of sqlite3.c ******************************/
230952230957
--- src/sqlite3.c
+++ src/sqlite3.c
@@ -1171,11 +1171,11 @@
1171 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
1172 ** [sqlite_version()] and [sqlite_source_id()].
1173 */
1174 #define SQLITE_VERSION "3.34.0"
1175 #define SQLITE_VERSION_NUMBER 3034000
1176 #define SQLITE_SOURCE_ID "2020-09-15 20:48:30 3d35fa0be866213274fc09250225b345f6b08a9b4ec373d53d95e627e24512be"
1177
1178 /*
1179 ** CAPI3REF: Run-Time Library Version Numbers
1180 ** KEYWORDS: sqlite3_version sqlite3_sourceid
1181 **
@@ -10517,11 +10517,11 @@
10517 ** or any operation on a WITHOUT ROWID table, the value of the sixth
10518 ** parameter is undefined. For an INSERT or UPDATE on a rowid table the
10519 ** seventh parameter is the final rowid value of the row being inserted
10520 ** or updated. The value of the seventh parameter passed to the callback
10521 ** function is not defined for operations on WITHOUT ROWID tables, or for
10522 ** INSERT operations on rowid tables.
10523 **
10524 ** The [sqlite3_preupdate_old()], [sqlite3_preupdate_new()],
10525 ** [sqlite3_preupdate_count()], and [sqlite3_preupdate_depth()] interfaces
10526 ** provide additional information about a preupdate event. These routines
10527 ** may only be called from within a preupdate callback. Invoking any of
@@ -18569,13 +18569,10 @@
18569 **
18570 ** SRT_Discard Throw the results away. This is used by SELECT
18571 ** statements within triggers whose only purpose is
18572 ** the side-effects of functions.
18573 **
18574 ** All of the above are free to ignore their ORDER BY clause. Those that
18575 ** follow must honor the ORDER BY clause.
18576 **
18577 ** SRT_Output Generate a row of output (using the OP_ResultRow
18578 ** opcode) for each row in the result set.
18579 **
18580 ** SRT_Mem Only valid if the result is a single column.
18581 ** Store the first column of the first result row
@@ -18628,17 +18625,22 @@
18628 */
18629 #define SRT_Union 1 /* Store result as keys in an index */
18630 #define SRT_Except 2 /* Remove result from a UNION index */
18631 #define SRT_Exists 3 /* Store 1 if the result is not empty */
18632 #define SRT_Discard 4 /* Do not save the results anywhere */
18633 #define SRT_Fifo 5 /* Store result as data with an automatic rowid */
18634 #define SRT_DistFifo 6 /* Like SRT_Fifo, but unique results only */
 
 
 
 
 
18635 #define SRT_Queue 7 /* Store result in an queue */
18636 #define SRT_DistQueue 8 /* Like SRT_Queue, but unique results only */
18637
18638 /* The ORDER BY clause is ignored for all of the above */
18639 #define IgnorableOrderby(X) ((X->eDest)<=SRT_DistQueue)
18640
18641 #define SRT_Output 9 /* Output each row of result */
18642 #define SRT_Mem 10 /* Store result in a memory cell */
18643 #define SRT_Set 11 /* Store results as keys in an index */
18644 #define SRT_EphemTab 12 /* Create transient tab and store like SRT_Table */
@@ -127348,11 +127350,11 @@
127348 pParent = sqlite3FindTable(db, pFK->zTo, zDb);
127349 pIdx = 0;
127350 aiCols = 0;
127351 if( pParent ){
127352 x = sqlite3FkLocateIndex(pParse, pParent, pFK, &pIdx, &aiCols);
127353 assert( x==0 );
127354 }
127355 addrOk = sqlite3VdbeMakeLabel(pParse);
127356
127357 /* Generate code to read the child key values into registers
127358 ** regRow..regRow+n. If any of the child key values are NULL, this
@@ -127373,11 +127375,11 @@
127373 VdbeCoverage(v);
127374 }else if( pParent ){
127375 int jmp = sqlite3VdbeCurrentAddr(v)+2;
127376 sqlite3VdbeAddOp3(v, OP_SeekRowid, i, jmp, regRow); VdbeCoverage(v);
127377 sqlite3VdbeGoto(v, addrOk);
127378 assert( pFK->nCol==1 );
127379 }
127380
127381 /* Generate code to report an FK violation to the caller. */
127382 if( HasRowid(pTab) ){
127383 sqlite3VdbeAddOp2(v, OP_Rowid, 0, regResult+1);
@@ -135260,17 +135262,15 @@
135260
135261 assert( p->pOrderBy==0 || pDest->eDest!=SRT_DistFifo );
135262 assert( p->pOrderBy==0 || pDest->eDest!=SRT_Fifo );
135263 assert( p->pOrderBy==0 || pDest->eDest!=SRT_DistQueue );
135264 assert( p->pOrderBy==0 || pDest->eDest!=SRT_Queue );
135265 if( IgnorableOrderby(pDest) ){
135266 assert(pDest->eDest==SRT_Exists || pDest->eDest==SRT_Union ||
135267 pDest->eDest==SRT_Except || pDest->eDest==SRT_Discard ||
135268 pDest->eDest==SRT_Queue || pDest->eDest==SRT_DistFifo ||
135269 pDest->eDest==SRT_DistQueue || pDest->eDest==SRT_Fifo);
135270 /* If ORDER BY makes no difference in the output then neither does
135271 ** DISTINCT so it can be removed too. */
135272 sqlite3ExprListDelete(db, p->pOrderBy);
135273 p->pOrderBy = 0;
135274 p->selFlags &= ~SF_Distinct;
135275 p->selFlags |= SF_NoopOrderBy;
135276 }
@@ -143073,10 +143073,13 @@
143073 sqlite3VdbeAddOp4(v, OP_VFilter, iCur, addrNotFound, iReg,
143074 pLoop->u.vtab.idxStr,
143075 pLoop->u.vtab.needFree ? P4_DYNAMIC : P4_STATIC);
143076 VdbeCoverage(v);
143077 pLoop->u.vtab.needFree = 0;
 
 
 
143078 pLevel->p1 = iCur;
143079 pLevel->op = pWInfo->eOnePass ? OP_Noop : OP_VNext;
143080 pLevel->p2 = sqlite3VdbeCurrentAddr(v);
143081 iIn = pLevel->u.in.nIn;
143082 for(j=nConstraint-1; j>=0; j--){
@@ -156896,11 +156899,11 @@
156896 }
156897 }
156898 #endif /* YYWILDCARD */
156899 return yy_default[stateno];
156900 }else{
156901 assert( i>=0 && i<sizeof(yy_action)/sizeof(yy_action[0]) );
156902 return yy_action[i];
156903 }
156904 }while(1);
156905 }
156906
@@ -189218,11 +189221,11 @@
189218 ** of the r-tree structure. A height of zero means all data is stored on
189219 ** the root node. A height of one means the children of the root node
189220 ** are the leaves, and so on. If the depth as specified on the root node
189221 ** is greater than RTREE_MAX_DEPTH, the r-tree structure must be corrupt.
189222 */
189223 if( pNode && iNode==1 ){
189224 pRtree->iDepth = readInt16(pNode->zData);
189225 if( pRtree->iDepth>RTREE_MAX_DEPTH ){
189226 rc = SQLITE_CORRUPT_VTAB;
189227 RTREE_IS_CORRUPT(pRtree);
189228 }
@@ -210518,11 +210521,11 @@
210518 }
210519 }
210520 #endif /* fts5YYWILDCARD */
210521 return fts5yy_default[stateno];
210522 }else{
210523 assert( i>=0 && i<sizeof(fts5yy_action)/sizeof(fts5yy_action[0]) );
210524 return fts5yy_action[i];
210525 }
210526 }while(1);
210527 }
210528
@@ -216523,11 +216526,10 @@
216523 if( pHash->eDetail!=FTS5_DETAIL_NONE ){
216524 p->nData += 1;
216525 p->iCol = (pHash->eDetail==FTS5_DETAIL_FULL ? 0 : -1);
216526 }
216527
216528 nIncr += p->nData;
216529 }else{
216530
216531 /* Appending to an existing hash-entry. Check that there is enough
216532 ** space to append the largest possible new entry. Worst case scenario
216533 ** is:
@@ -221775,11 +221777,13 @@
221775 /* See the earlier comment in this function for an explanation of why
221776 ** corrupt input position lists might cause the output to consume
221777 ** at most 20 bytes of unexpected space. */
221778 fts5MergeAppendDocid(&out, iLastRowid, i2.iRowid);
221779 fts5BufferZero(&tmp);
221780 sqlite3Fts5BufferSize(&p->rc, &tmp, i1.nPoslist + i2.nPoslist + 10 + 10);
 
 
221781 if( p->rc ) break;
221782
221783 sqlite3Fts5PoslistNext64(a1, i1.nPoslist, &iOff1, &iPos1);
221784 sqlite3Fts5PoslistNext64(a2, i2.nPoslist, &iOff2, &iPos2);
221785 assert_nc( iPos1>=0 && iPos2>=0 );
@@ -221849,13 +221853,14 @@
221849 fts5MergeAppendDocid(&out, iLastRowid, i2.iRowid);
221850 fts5BufferSafeAppendBlob(&out, i2.aPoslist, i2.aEof - i2.aPoslist);
221851 }
221852 assert_nc( out.n<=(p1->n+p2->n+9) );
221853
221854 fts5BufferSet(&p->rc, p1, out.n, out.p);
221855 fts5BufferFree(&tmp);
221856 fts5BufferFree(&out);
 
221857 }
221858 }
221859
221860 static void fts5SetupPrefixIter(
221861 Fts5Index *p, /* Index to read from */
@@ -226150,11 +226155,11 @@
226150 int nArg, /* Number of args */
226151 sqlite3_value **apUnused /* Function arguments */
226152 ){
226153 assert( nArg==0 );
226154 UNUSED_PARAM2(nArg, apUnused);
226155 sqlite3_result_text(pCtx, "fts5: 2020-09-11 15:01:49 b79f19edfd33c2a75f936c352668e14e81f35acf4f07edc27a21f941a7304b38", -1, SQLITE_TRANSIENT);
226156 }
226157
226158 /*
226159 ** Return true if zName is the extension on one of the shadow tables used
226160 ** by this module.
@@ -230940,12 +230945,12 @@
230940 }
230941 #endif /* SQLITE_CORE */
230942 #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_STMTVTAB) */
230943
230944 /************** End of stmt.c ************************************************/
230945 #if __LINE__!=230945
230946 #undef SQLITE_SOURCE_ID
230947 #define SQLITE_SOURCE_ID "2020-09-15 20:48:30 3d35fa0be866213274fc09250225b345f6b08a9b4ec373d53d95e627e245alt2"
230948 #endif
230949 /* Return the source-id for this library */
230950 SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; }
230951 /************************** End of sqlite3.c ******************************/
230952
--- src/sqlite3.c
+++ src/sqlite3.c
@@ -1171,11 +1171,11 @@
1171 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
1172 ** [sqlite_version()] and [sqlite_source_id()].
1173 */
1174 #define SQLITE_VERSION "3.34.0"
1175 #define SQLITE_VERSION_NUMBER 3034000
1176 #define SQLITE_SOURCE_ID "2020-09-17 21:11:25 4542d194e2fef5e21e1c3679914bd9e21fab31cfb111cf640524fb3514a8afa3"
1177
1178 /*
1179 ** CAPI3REF: Run-Time Library Version Numbers
1180 ** KEYWORDS: sqlite3_version sqlite3_sourceid
1181 **
@@ -10517,11 +10517,11 @@
10517 ** or any operation on a WITHOUT ROWID table, the value of the sixth
10518 ** parameter is undefined. For an INSERT or UPDATE on a rowid table the
10519 ** seventh parameter is the final rowid value of the row being inserted
10520 ** or updated. The value of the seventh parameter passed to the callback
10521 ** function is not defined for operations on WITHOUT ROWID tables, or for
10522 ** DELETE operations on rowid tables.
10523 **
10524 ** The [sqlite3_preupdate_old()], [sqlite3_preupdate_new()],
10525 ** [sqlite3_preupdate_count()], and [sqlite3_preupdate_depth()] interfaces
10526 ** provide additional information about a preupdate event. These routines
10527 ** may only be called from within a preupdate callback. Invoking any of
@@ -18569,13 +18569,10 @@
18569 **
18570 ** SRT_Discard Throw the results away. This is used by SELECT
18571 ** statements within triggers whose only purpose is
18572 ** the side-effects of functions.
18573 **
 
 
 
18574 ** SRT_Output Generate a row of output (using the OP_ResultRow
18575 ** opcode) for each row in the result set.
18576 **
18577 ** SRT_Mem Only valid if the result is a single column.
18578 ** Store the first column of the first result row
@@ -18628,17 +18625,22 @@
18625 */
18626 #define SRT_Union 1 /* Store result as keys in an index */
18627 #define SRT_Except 2 /* Remove result from a UNION index */
18628 #define SRT_Exists 3 /* Store 1 if the result is not empty */
18629 #define SRT_Discard 4 /* Do not save the results anywhere */
18630 #define SRT_DistFifo 5 /* Like SRT_Fifo, but unique results only */
18631 #define SRT_DistQueue 6 /* Like SRT_Queue, but unique results only */
18632
18633 /* The DISTINCT clause is ignored for all of the above. Not that
18634 ** IgnorableDistinct() implies IgnorableOrderby() */
18635 #define IgnorableDistinct(X) ((X->eDest)<=SRT_DistQueue)
18636
18637 #define SRT_Queue 7 /* Store result in an queue */
18638 #define SRT_Fifo 8 /* Store result as data with an automatic rowid */
18639
18640 /* The ORDER BY clause is ignored for all of the above */
18641 #define IgnorableOrderby(X) ((X->eDest)<=SRT_Fifo)
18642
18643 #define SRT_Output 9 /* Output each row of result */
18644 #define SRT_Mem 10 /* Store result in a memory cell */
18645 #define SRT_Set 11 /* Store results as keys in an index */
18646 #define SRT_EphemTab 12 /* Create transient tab and store like SRT_Table */
@@ -127348,11 +127350,11 @@
127350 pParent = sqlite3FindTable(db, pFK->zTo, zDb);
127351 pIdx = 0;
127352 aiCols = 0;
127353 if( pParent ){
127354 x = sqlite3FkLocateIndex(pParse, pParent, pFK, &pIdx, &aiCols);
127355 assert( x==0 || db->mallocFailed );
127356 }
127357 addrOk = sqlite3VdbeMakeLabel(pParse);
127358
127359 /* Generate code to read the child key values into registers
127360 ** regRow..regRow+n. If any of the child key values are NULL, this
@@ -127373,11 +127375,11 @@
127375 VdbeCoverage(v);
127376 }else if( pParent ){
127377 int jmp = sqlite3VdbeCurrentAddr(v)+2;
127378 sqlite3VdbeAddOp3(v, OP_SeekRowid, i, jmp, regRow); VdbeCoverage(v);
127379 sqlite3VdbeGoto(v, addrOk);
127380 assert( pFK->nCol==1 || db->mallocFailed );
127381 }
127382
127383 /* Generate code to report an FK violation to the caller. */
127384 if( HasRowid(pTab) ){
127385 sqlite3VdbeAddOp2(v, OP_Rowid, 0, regResult+1);
@@ -135260,17 +135262,15 @@
135262
135263 assert( p->pOrderBy==0 || pDest->eDest!=SRT_DistFifo );
135264 assert( p->pOrderBy==0 || pDest->eDest!=SRT_Fifo );
135265 assert( p->pOrderBy==0 || pDest->eDest!=SRT_DistQueue );
135266 assert( p->pOrderBy==0 || pDest->eDest!=SRT_Queue );
135267 if( IgnorableDistinct(pDest) ){
135268 assert(pDest->eDest==SRT_Exists || pDest->eDest==SRT_Union ||
135269 pDest->eDest==SRT_Except || pDest->eDest==SRT_Discard ||
135270 pDest->eDest==SRT_DistQueue || pDest->eDest==SRT_DistFifo );
135271 /* All of these destinations are also able to ignore the ORDER BY clause */
 
 
135272 sqlite3ExprListDelete(db, p->pOrderBy);
135273 p->pOrderBy = 0;
135274 p->selFlags &= ~SF_Distinct;
135275 p->selFlags |= SF_NoopOrderBy;
135276 }
@@ -143073,10 +143073,13 @@
143073 sqlite3VdbeAddOp4(v, OP_VFilter, iCur, addrNotFound, iReg,
143074 pLoop->u.vtab.idxStr,
143075 pLoop->u.vtab.needFree ? P4_DYNAMIC : P4_STATIC);
143076 VdbeCoverage(v);
143077 pLoop->u.vtab.needFree = 0;
143078 /* An OOM inside of AddOp4(OP_VFilter) instruction above might have freed
143079 ** the u.vtab.idxStr. NULL it out to prevent a use-after-free */
143080 if( db->mallocFailed ) pLoop->u.vtab.idxStr = 0;
143081 pLevel->p1 = iCur;
143082 pLevel->op = pWInfo->eOnePass ? OP_Noop : OP_VNext;
143083 pLevel->p2 = sqlite3VdbeCurrentAddr(v);
143084 iIn = pLevel->u.in.nIn;
143085 for(j=nConstraint-1; j>=0; j--){
@@ -156896,11 +156899,11 @@
156899 }
156900 }
156901 #endif /* YYWILDCARD */
156902 return yy_default[stateno];
156903 }else{
156904 assert( i>=0 && i<(int)(sizeof(yy_action)/sizeof(yy_action[0])) );
156905 return yy_action[i];
156906 }
156907 }while(1);
156908 }
156909
@@ -189218,11 +189221,11 @@
189221 ** of the r-tree structure. A height of zero means all data is stored on
189222 ** the root node. A height of one means the children of the root node
189223 ** are the leaves, and so on. If the depth as specified on the root node
189224 ** is greater than RTREE_MAX_DEPTH, the r-tree structure must be corrupt.
189225 */
189226 if( pNode && rc==SQLITE_OK && iNode==1 ){
189227 pRtree->iDepth = readInt16(pNode->zData);
189228 if( pRtree->iDepth>RTREE_MAX_DEPTH ){
189229 rc = SQLITE_CORRUPT_VTAB;
189230 RTREE_IS_CORRUPT(pRtree);
189231 }
@@ -210518,11 +210521,11 @@
210521 }
210522 }
210523 #endif /* fts5YYWILDCARD */
210524 return fts5yy_default[stateno];
210525 }else{
210526 assert( i>=0 && i<(int)(sizeof(fts5yy_action)/sizeof(fts5yy_action[0])) );
210527 return fts5yy_action[i];
210528 }
210529 }while(1);
210530 }
210531
@@ -216523,11 +216526,10 @@
216526 if( pHash->eDetail!=FTS5_DETAIL_NONE ){
216527 p->nData += 1;
216528 p->iCol = (pHash->eDetail==FTS5_DETAIL_FULL ? 0 : -1);
216529 }
216530
 
216531 }else{
216532
216533 /* Appending to an existing hash-entry. Check that there is enough
216534 ** space to append the largest possible new entry. Worst case scenario
216535 ** is:
@@ -221775,11 +221777,13 @@
221777 /* See the earlier comment in this function for an explanation of why
221778 ** corrupt input position lists might cause the output to consume
221779 ** at most 20 bytes of unexpected space. */
221780 fts5MergeAppendDocid(&out, iLastRowid, i2.iRowid);
221781 fts5BufferZero(&tmp);
221782 sqlite3Fts5BufferSize(&p->rc, &tmp,
221783 i1.nPoslist + i2.nPoslist + 10 + 10 + FTS5_DATA_ZERO_PADDING
221784 );
221785 if( p->rc ) break;
221786
221787 sqlite3Fts5PoslistNext64(a1, i1.nPoslist, &iOff1, &iPos1);
221788 sqlite3Fts5PoslistNext64(a2, i2.nPoslist, &iOff2, &iPos2);
221789 assert_nc( iPos1>=0 && iPos2>=0 );
@@ -221849,13 +221853,14 @@
221853 fts5MergeAppendDocid(&out, iLastRowid, i2.iRowid);
221854 fts5BufferSafeAppendBlob(&out, i2.aPoslist, i2.aEof - i2.aPoslist);
221855 }
221856 assert_nc( out.n<=(p1->n+p2->n+9) );
221857
221858 fts5BufferFree(p1);
221859 fts5BufferFree(&tmp);
221860 memset(&out.p[out.n], 0, FTS5_DATA_ZERO_PADDING);
221861 *p1 = out;
221862 }
221863 }
221864
221865 static void fts5SetupPrefixIter(
221866 Fts5Index *p, /* Index to read from */
@@ -226150,11 +226155,11 @@
226155 int nArg, /* Number of args */
226156 sqlite3_value **apUnused /* Function arguments */
226157 ){
226158 assert( nArg==0 );
226159 UNUSED_PARAM2(nArg, apUnused);
226160 sqlite3_result_text(pCtx, "fts5: 2020-09-17 21:11:25 4542d194e2fef5e21e1c3679914bd9e21fab31cfb111cf640524fb3514a8afa3", -1, SQLITE_TRANSIENT);
226161 }
226162
226163 /*
226164 ** Return true if zName is the extension on one of the shadow tables used
226165 ** by this module.
@@ -230940,12 +230945,12 @@
230945 }
230946 #endif /* SQLITE_CORE */
230947 #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_STMTVTAB) */
230948
230949 /************** End of stmt.c ************************************************/
230950 #if __LINE__!=230950
230951 #undef SQLITE_SOURCE_ID
230952 #define SQLITE_SOURCE_ID "2020-09-17 21:11:25 4542d194e2fef5e21e1c3679914bd9e21fab31cfb111cf640524fb3514a8alt2"
230953 #endif
230954 /* Return the source-id for this library */
230955 SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; }
230956 /************************** End of sqlite3.c ******************************/
230957

Keyboard Shortcuts

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