Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Update the built-in pikchr.c and SQLite to the latest from both trees. |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA3-256: |
c3de0a9930e5e4f1057e838f67a3b991 |
| User & Date: | drh 2020-09-18 16:58:18.091 |
Context
|
2020-09-18
| ||
| 17:43 | CSS workaround for centering pikchrs in Chrome. check-in: d825fcc11a user: stephan tags: trunk | |
| 16:58 | Update the built-in pikchr.c and SQLite to the latest from both trees. check-in: c3de0a9930 user: drh tags: trunk | |
| 13:18 | Be careful to honor the auto-hyperlinks setting when it is off, and not display any hyperlinks. See [forum:5a7530639a|forum post 5a7530639a] for the bug report. check-in: b190858e97 user: drh tags: trunk | |
Changes
Changes to src/pikchr.c.
| ︙ | ︙ | |||
357 358 359 360 361 362 363 | ** the PElem object at the end: */ int nTPath; /* Number of entries on aTPath[] */ int mTPath; /* For last entry, 1: x set, 2: y set */ PPoint aTPath[1000]; /* Path under construction */ }; | < < < < < < < < < < | 357 358 359 360 361 362 363 364 365 366 367 368 369 370 |
** the PElem object at the end: */
int nTPath; /* Number of entries on aTPath[] */
int mTPath; /* For last entry, 1: x set, 2: y set */
PPoint aTPath[1000]; /* Path under construction */
};
/*
** The behavior of an object class is defined by an instance of
** this structure. This is the "virtual method" table.
*/
struct PClass {
const char *zName; /* Name of class */
char isLine; /* True if a line class */
|
| ︙ | ︙ | |||
454 455 456 457 458 459 460 | static PToken pik_next_semantic_token(PToken *pThis); static void pik_compute_layout_settings(Pik*); static void pik_behind(Pik*,PElem*); static PElem *pik_assert(Pik*,PNum,PToken*,PNum); static PElem *pik_place_assert(Pik*,PPoint*,PToken*,PPoint*); | | | 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 | static PToken pik_next_semantic_token(PToken *pThis); static void pik_compute_layout_settings(Pik*); static void pik_behind(Pik*,PElem*); static PElem *pik_assert(Pik*,PNum,PToken*,PNum); static PElem *pik_place_assert(Pik*,PPoint*,PToken*,PPoint*); #line 477 "pikchr.c" /**************** End of %include directives **********************************/ /* These constants specify the various numeric values for terminal symbols. ***************** Begin token definitions *************************************/ #ifndef T_ID #define T_ID 1 #define T_EDGEPT 2 #define T_OF 3 |
| ︙ | ︙ | |||
1630 1631 1632 1633 1634 1635 1636 |
** Note: during a reduce, the only symbols destroyed are those
** which appear on the RHS of the rule, but which are *not* used
** inside the C code.
*/
/********* Begin destructor definitions ***************************************/
case 94: /* element_list */
{
| | | | | | 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 |
** Note: during a reduce, the only symbols destroyed are those
** which appear on the RHS of the rule, but which are *not* used
** inside the C code.
*/
/********* Begin destructor definitions ***************************************/
case 94: /* element_list */
{
#line 466 "pikchr.y"
pik_elist_free(p,(yypminor->yy72));
#line 1654 "pikchr.c"
}
break;
case 95: /* element */
case 96: /* unnamed_element */
case 97: /* basetype */
{
#line 468 "pikchr.y"
pik_elem_free(p,(yypminor->yy254));
#line 1663 "pikchr.c"
}
break;
/********* End destructor definitions *****************************************/
default: break; /* If no destructor action specified: do nothing */
}
}
|
| ︙ | ︙ | |||
1859 1860 1861 1862 1863 1864 1865 |
fprintf(yyTraceFILE,"%sStack Overflow!\n",yyTracePrompt);
}
#endif
while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
/* Here code is inserted which will execute if the parser
** stack every overflows */
/******** Begin %stack_overflow code ******************************************/
| | | | 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 |
fprintf(yyTraceFILE,"%sStack Overflow!\n",yyTracePrompt);
}
#endif
while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser);
/* Here code is inserted which will execute if the parser
** stack every overflows */
/******** Begin %stack_overflow code ******************************************/
#line 500 "pikchr.y"
pik_error(p, 0, "parser stack overflow");
#line 1884 "pikchr.c"
/******** End %stack_overflow code ********************************************/
pik_parserARG_STORE /* Suppress warning about unused %extra_argument var */
pik_parserCTX_STORE
}
/*
** Print tracing information for a SHIFT action
|
| ︙ | ︙ | |||
2331 2332 2333 2334 2335 2336 2337 |
** { ... } // User supplied code
** #line <lineno> <thisfile>
** break;
*/
/********** Begin reduce actions **********************************************/
YYMINORTYPE yylhsminor;
case 0: /* document ::= element_list */
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 |
** { ... } // User supplied code
** #line <lineno> <thisfile>
** break;
*/
/********** Begin reduce actions **********************************************/
YYMINORTYPE yylhsminor;
case 0: /* document ::= element_list */
#line 504 "pikchr.y"
{pik_render(p,yymsp[0].minor.yy72);}
#line 2355 "pikchr.c"
break;
case 1: /* element_list ::= element */
#line 507 "pikchr.y"
{ yylhsminor.yy72 = pik_elist_append(p,0,yymsp[0].minor.yy254); }
#line 2360 "pikchr.c"
yymsp[0].minor.yy72 = yylhsminor.yy72;
break;
case 2: /* element_list ::= element_list EOL element */
#line 509 "pikchr.y"
{ yylhsminor.yy72 = pik_elist_append(p,yymsp[-2].minor.yy72,yymsp[0].minor.yy254); }
#line 2366 "pikchr.c"
yymsp[-2].minor.yy72 = yylhsminor.yy72;
break;
case 3: /* element ::= */
#line 512 "pikchr.y"
{ yymsp[1].minor.yy254 = 0; }
#line 2372 "pikchr.c"
break;
case 4: /* element ::= direction */
#line 513 "pikchr.y"
{ pik_set_direction(p,yymsp[0].minor.yy0.eCode); yylhsminor.yy254=0; }
#line 2377 "pikchr.c"
yymsp[0].minor.yy254 = yylhsminor.yy254;
break;
case 5: /* element ::= lvalue ASSIGN rvalue */
#line 514 "pikchr.y"
{pik_set_var(p,&yymsp[-2].minor.yy0,yymsp[0].minor.yy73,&yymsp[-1].minor.yy0); yylhsminor.yy254=0;}
#line 2383 "pikchr.c"
yymsp[-2].minor.yy254 = yylhsminor.yy254;
break;
case 6: /* element ::= PLACENAME COLON unnamed_element */
#line 516 "pikchr.y"
{ yylhsminor.yy254 = yymsp[0].minor.yy254; pik_elem_setname(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0); }
#line 2389 "pikchr.c"
yymsp[-2].minor.yy254 = yylhsminor.yy254;
break;
case 7: /* element ::= PLACENAME COLON position */
#line 518 "pikchr.y"
{ yylhsminor.yy254 = pik_elem_new(p,0,0,0);
if(yylhsminor.yy254){ yylhsminor.yy254->ptAt = yymsp[0].minor.yy139; pik_elem_setname(p,yylhsminor.yy254,&yymsp[-2].minor.yy0); }}
#line 2396 "pikchr.c"
yymsp[-2].minor.yy254 = yylhsminor.yy254;
break;
case 8: /* element ::= unnamed_element */
#line 520 "pikchr.y"
{yylhsminor.yy254 = yymsp[0].minor.yy254;}
#line 2402 "pikchr.c"
yymsp[0].minor.yy254 = yylhsminor.yy254;
break;
case 9: /* element ::= print prlist */
#line 521 "pikchr.y"
{pik_append(p,"<br>\n",5); yymsp[-1].minor.yy254=0;}
#line 2408 "pikchr.c"
break;
case 10: /* element ::= ASSERT LP expr EQ expr RP */
#line 526 "pikchr.y"
{yymsp[-5].minor.yy254=pik_assert(p,yymsp[-3].minor.yy73,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy73);}
#line 2413 "pikchr.c"
break;
case 11: /* element ::= ASSERT LP place EQ place RP */
#line 528 "pikchr.y"
{yymsp[-5].minor.yy254=pik_place_assert(p,&yymsp[-3].minor.yy139,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy139);}
#line 2418 "pikchr.c"
break;
case 12: /* rvalue ::= PLACENAME */
#line 539 "pikchr.y"
{yylhsminor.yy73 = pik_lookup_color(p,&yymsp[0].minor.yy0);}
#line 2423 "pikchr.c"
yymsp[0].minor.yy73 = yylhsminor.yy73;
break;
case 13: /* pritem ::= FILL */
case 14: /* pritem ::= COLOR */ yytestcase(yyruleno==14);
case 15: /* pritem ::= THICKNESS */ yytestcase(yyruleno==15);
#line 544 "pikchr.y"
{pik_append_num(p,"",pik_value(p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.n,0));}
#line 2431 "pikchr.c"
break;
case 16: /* pritem ::= rvalue */
#line 547 "pikchr.y"
{pik_append_num(p,"",yymsp[0].minor.yy73);}
#line 2436 "pikchr.c"
break;
case 17: /* pritem ::= STRING */
#line 548 "pikchr.y"
{pik_append_text(p,yymsp[0].minor.yy0.z+1,yymsp[0].minor.yy0.n-2,0);}
#line 2441 "pikchr.c"
break;
case 18: /* prsep ::= COMMA */
#line 549 "pikchr.y"
{pik_append(p, " ", 1);}
#line 2446 "pikchr.c"
break;
case 19: /* unnamed_element ::= basetype attribute_list */
#line 552 "pikchr.y"
{yylhsminor.yy254 = yymsp[-1].minor.yy254; pik_after_adding_attributes(p,yylhsminor.yy254);}
#line 2451 "pikchr.c"
yymsp[-1].minor.yy254 = yylhsminor.yy254;
break;
case 20: /* basetype ::= CLASSNAME */
#line 554 "pikchr.y"
{yylhsminor.yy254 = pik_elem_new(p,&yymsp[0].minor.yy0,0,0); }
#line 2457 "pikchr.c"
yymsp[0].minor.yy254 = yylhsminor.yy254;
break;
case 21: /* basetype ::= STRING textposition */
#line 556 "pikchr.y"
{yymsp[-1].minor.yy0.eCode = yymsp[0].minor.yy74; yylhsminor.yy254 = pik_elem_new(p,0,&yymsp[-1].minor.yy0,0); }
#line 2463 "pikchr.c"
yymsp[-1].minor.yy254 = yylhsminor.yy254;
break;
case 22: /* basetype ::= LB savelist element_list RB */
#line 558 "pikchr.y"
{ 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; }
#line 2469 "pikchr.c"
break;
case 23: /* savelist ::= */
#line 563 "pikchr.y"
{yymsp[1].minor.yy72 = p->list; p->list = 0;}
#line 2474 "pikchr.c"
break;
case 24: /* relexpr ::= expr */
#line 570 "pikchr.y"
{yylhsminor.yy60.rAbs = yymsp[0].minor.yy73; yylhsminor.yy60.rRel = 0;}
#line 2479 "pikchr.c"
yymsp[0].minor.yy60 = yylhsminor.yy60;
break;
case 25: /* relexpr ::= expr PERCENT */
#line 571 "pikchr.y"
{yylhsminor.yy60.rAbs = 0; yylhsminor.yy60.rRel = yymsp[-1].minor.yy73/100;}
#line 2485 "pikchr.c"
yymsp[-1].minor.yy60 = yylhsminor.yy60;
break;
case 26: /* optrelexpr ::= */
#line 573 "pikchr.y"
{yymsp[1].minor.yy60.rAbs = 0; yymsp[1].minor.yy60.rRel = 1.0;}
#line 2491 "pikchr.c"
break;
case 27: /* attribute_list ::= relexpr alist */
#line 575 "pikchr.y"
{pik_add_direction(p,0,&yymsp[-1].minor.yy60);}
#line 2496 "pikchr.c"
break;
case 28: /* attribute ::= numproperty relexpr */
#line 579 "pikchr.y"
{ pik_set_numprop(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy60); }
#line 2501 "pikchr.c"
break;
case 29: /* attribute ::= dashproperty expr */
#line 580 "pikchr.y"
{ pik_set_dashed(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy73); }
#line 2506 "pikchr.c"
break;
case 30: /* attribute ::= dashproperty */
#line 581 "pikchr.y"
{ pik_set_dashed(p,&yymsp[0].minor.yy0,0); }
#line 2511 "pikchr.c"
break;
case 31: /* attribute ::= colorproperty rvalue */
#line 582 "pikchr.y"
{ pik_set_clrprop(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy73); }
#line 2516 "pikchr.c"
break;
case 32: /* attribute ::= go direction optrelexpr */
#line 583 "pikchr.y"
{ pik_add_direction(p,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy60);}
#line 2521 "pikchr.c"
break;
case 33: /* attribute ::= go direction even position */
#line 584 "pikchr.y"
{pik_evenwith(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy139);}
#line 2526 "pikchr.c"
break;
case 34: /* attribute ::= CLOSE */
#line 585 "pikchr.y"
{ pik_close_path(p,&yymsp[0].minor.yy0); }
#line 2531 "pikchr.c"
break;
case 35: /* attribute ::= CHOP */
#line 586 "pikchr.y"
{ p->cur->bChop = 1; }
#line 2536 "pikchr.c"
break;
case 36: /* attribute ::= FROM position */
#line 587 "pikchr.y"
{ pik_set_from(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy139); }
#line 2541 "pikchr.c"
break;
case 37: /* attribute ::= TO position */
#line 588 "pikchr.y"
{ pik_add_to(p,p->cur,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy139); }
#line 2546 "pikchr.c"
break;
case 38: /* attribute ::= THEN */
#line 589 "pikchr.y"
{ pik_then(p, &yymsp[0].minor.yy0, p->cur); }
#line 2551 "pikchr.c"
break;
case 39: /* attribute ::= THEN optrelexpr HEADING expr */
case 41: /* attribute ::= GO optrelexpr HEADING expr */ yytestcase(yyruleno==41);
#line 591 "pikchr.y"
{pik_move_hdg(p,&yymsp[-2].minor.yy60,&yymsp[-1].minor.yy0,yymsp[0].minor.yy73,0,&yymsp[-3].minor.yy0);}
#line 2557 "pikchr.c"
break;
case 40: /* attribute ::= THEN optrelexpr EDGEPT */
case 42: /* attribute ::= GO optrelexpr EDGEPT */ yytestcase(yyruleno==42);
#line 592 "pikchr.y"
{pik_move_hdg(p,&yymsp[-1].minor.yy60,0,0,&yymsp[0].minor.yy0,&yymsp[-2].minor.yy0);}
#line 2563 "pikchr.c"
break;
case 43: /* attribute ::= AT position */
#line 597 "pikchr.y"
{ pik_set_at(p,0,&yymsp[0].minor.yy139,&yymsp[-1].minor.yy0); }
#line 2568 "pikchr.c"
break;
case 44: /* attribute ::= SAME */
#line 599 "pikchr.y"
{pik_same(p,0,&yymsp[0].minor.yy0);}
#line 2573 "pikchr.c"
break;
case 45: /* attribute ::= SAME AS object */
#line 600 "pikchr.y"
{pik_same(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0);}
#line 2578 "pikchr.c"
break;
case 46: /* attribute ::= STRING textposition */
#line 601 "pikchr.y"
{pik_add_txt(p,&yymsp[-1].minor.yy0,yymsp[0].minor.yy74);}
#line 2583 "pikchr.c"
break;
case 47: /* attribute ::= FIT */
#line 602 "pikchr.y"
{pik_size_to_fit(p,&yymsp[0].minor.yy0); }
#line 2588 "pikchr.c"
break;
case 48: /* attribute ::= BEHIND object */
#line 603 "pikchr.y"
{pik_behind(p,yymsp[0].minor.yy254);}
#line 2593 "pikchr.c"
break;
case 49: /* withclause ::= DOT_E edge AT position */
case 50: /* withclause ::= edge AT position */ yytestcase(yyruleno==50);
#line 611 "pikchr.y"
{ pik_set_at(p,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy139,&yymsp[-1].minor.yy0); }
#line 2599 "pikchr.c"
break;
case 51: /* numproperty ::= HEIGHT|WIDTH|RADIUS|DIAMETER|THICKNESS */
#line 615 "pikchr.y"
{yylhsminor.yy0 = yymsp[0].minor.yy0;}
#line 2604 "pikchr.c"
yymsp[0].minor.yy0 = yylhsminor.yy0;
break;
case 52: /* boolproperty ::= CW */
#line 626 "pikchr.y"
{p->cur->cw = 1;}
#line 2610 "pikchr.c"
break;
case 53: /* boolproperty ::= CCW */
#line 627 "pikchr.y"
{p->cur->cw = 0;}
#line 2615 "pikchr.c"
break;
case 54: /* boolproperty ::= LARROW */
#line 628 "pikchr.y"
{p->cur->larrow=1; p->cur->rarrow=0; }
#line 2620 "pikchr.c"
break;
case 55: /* boolproperty ::= RARROW */
#line 629 "pikchr.y"
{p->cur->larrow=0; p->cur->rarrow=1; }
#line 2625 "pikchr.c"
break;
case 56: /* boolproperty ::= LRARROW */
#line 630 "pikchr.y"
{p->cur->larrow=1; p->cur->rarrow=1; }
#line 2630 "pikchr.c"
break;
case 57: /* boolproperty ::= INVIS */
#line 631 "pikchr.y"
{p->cur->sw = 0.0;}
#line 2635 "pikchr.c"
break;
case 58: /* boolproperty ::= THICK */
#line 632 "pikchr.y"
{p->cur->sw *= 1.5;}
#line 2640 "pikchr.c"
break;
case 59: /* boolproperty ::= THIN */
#line 633 "pikchr.y"
{p->cur->sw *= 0.67;}
#line 2645 "pikchr.c"
break;
case 60: /* textposition ::= */
#line 635 "pikchr.y"
{yymsp[1].minor.yy74 = 0;}
#line 2650 "pikchr.c"
break;
case 61: /* textposition ::= textposition CENTER|LJUST|RJUST|ABOVE|BELOW|ITALIC|BOLD|ALIGNED|BIG|SMALL */
#line 638 "pikchr.y"
{yylhsminor.yy74 = pik_text_position(yymsp[-1].minor.yy74,&yymsp[0].minor.yy0);}
#line 2655 "pikchr.c"
yymsp[-1].minor.yy74 = yylhsminor.yy74;
break;
case 62: /* position ::= expr COMMA expr */
#line 641 "pikchr.y"
{yylhsminor.yy139.x=yymsp[-2].minor.yy73; yylhsminor.yy139.y=yymsp[0].minor.yy73;}
#line 2661 "pikchr.c"
yymsp[-2].minor.yy139 = yylhsminor.yy139;
break;
case 63: /* position ::= place PLUS expr COMMA expr */
#line 643 "pikchr.y"
{yylhsminor.yy139.x=yymsp[-4].minor.yy139.x+yymsp[-2].minor.yy73; yylhsminor.yy139.y=yymsp[-4].minor.yy139.y+yymsp[0].minor.yy73;}
#line 2667 "pikchr.c"
yymsp[-4].minor.yy139 = yylhsminor.yy139;
break;
case 64: /* position ::= place MINUS expr COMMA expr */
#line 644 "pikchr.y"
{yylhsminor.yy139.x=yymsp[-4].minor.yy139.x-yymsp[-2].minor.yy73; yylhsminor.yy139.y=yymsp[-4].minor.yy139.y-yymsp[0].minor.yy73;}
#line 2673 "pikchr.c"
yymsp[-4].minor.yy139 = yylhsminor.yy139;
break;
case 65: /* position ::= place PLUS LP expr COMMA expr RP */
#line 646 "pikchr.y"
{yylhsminor.yy139.x=yymsp[-6].minor.yy139.x+yymsp[-3].minor.yy73; yylhsminor.yy139.y=yymsp[-6].minor.yy139.y+yymsp[-1].minor.yy73;}
#line 2679 "pikchr.c"
yymsp[-6].minor.yy139 = yylhsminor.yy139;
break;
case 66: /* position ::= place MINUS LP expr COMMA expr RP */
#line 648 "pikchr.y"
{yylhsminor.yy139.x=yymsp[-6].minor.yy139.x-yymsp[-3].minor.yy73; yylhsminor.yy139.y=yymsp[-6].minor.yy139.y-yymsp[-1].minor.yy73;}
#line 2685 "pikchr.c"
yymsp[-6].minor.yy139 = yylhsminor.yy139;
break;
case 67: /* position ::= LP position COMMA position RP */
#line 649 "pikchr.y"
{yymsp[-4].minor.yy139.x=yymsp[-3].minor.yy139.x; yymsp[-4].minor.yy139.y=yymsp[-1].minor.yy139.y;}
#line 2691 "pikchr.c"
break;
case 68: /* position ::= LP position RP */
#line 650 "pikchr.y"
{yymsp[-2].minor.yy139=yymsp[-1].minor.yy139;}
#line 2696 "pikchr.c"
break;
case 69: /* position ::= expr between position AND position */
#line 652 "pikchr.y"
{yylhsminor.yy139 = pik_position_between(yymsp[-4].minor.yy73,yymsp[-2].minor.yy139,yymsp[0].minor.yy139);}
#line 2701 "pikchr.c"
yymsp[-4].minor.yy139 = yylhsminor.yy139;
break;
case 70: /* position ::= expr LT position COMMA position GT */
#line 654 "pikchr.y"
{yylhsminor.yy139 = pik_position_between(yymsp[-5].minor.yy73,yymsp[-3].minor.yy139,yymsp[-1].minor.yy139);}
#line 2707 "pikchr.c"
yymsp[-5].minor.yy139 = yylhsminor.yy139;
break;
case 71: /* position ::= expr ABOVE position */
#line 655 "pikchr.y"
{yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.y += yymsp[-2].minor.yy73;}
#line 2713 "pikchr.c"
yymsp[-2].minor.yy139 = yylhsminor.yy139;
break;
case 72: /* position ::= expr BELOW position */
#line 656 "pikchr.y"
{yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.y -= yymsp[-2].minor.yy73;}
#line 2719 "pikchr.c"
yymsp[-2].minor.yy139 = yylhsminor.yy139;
break;
case 73: /* position ::= expr LEFT OF position */
#line 657 "pikchr.y"
{yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.x -= yymsp[-3].minor.yy73;}
#line 2725 "pikchr.c"
yymsp[-3].minor.yy139 = yylhsminor.yy139;
break;
case 74: /* position ::= expr RIGHT OF position */
#line 658 "pikchr.y"
{yylhsminor.yy139=yymsp[0].minor.yy139; yylhsminor.yy139.x += yymsp[-3].minor.yy73;}
#line 2731 "pikchr.c"
yymsp[-3].minor.yy139 = yylhsminor.yy139;
break;
case 75: /* position ::= expr ON HEADING EDGEPT OF position */
#line 660 "pikchr.y"
{yylhsminor.yy139 = pik_position_at_hdg(yymsp[-5].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);}
#line 2737 "pikchr.c"
yymsp[-5].minor.yy139 = yylhsminor.yy139;
break;
case 76: /* position ::= expr HEADING EDGEPT OF position */
#line 662 "pikchr.y"
{yylhsminor.yy139 = pik_position_at_hdg(yymsp[-4].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);}
#line 2743 "pikchr.c"
yymsp[-4].minor.yy139 = yylhsminor.yy139;
break;
case 77: /* position ::= expr EDGEPT OF position */
#line 664 "pikchr.y"
{yylhsminor.yy139 = pik_position_at_hdg(yymsp[-3].minor.yy73,&yymsp[-2].minor.yy0,yymsp[0].minor.yy139);}
#line 2749 "pikchr.c"
yymsp[-3].minor.yy139 = yylhsminor.yy139;
break;
case 78: /* position ::= expr ON HEADING expr FROM position */
#line 666 "pikchr.y"
{yylhsminor.yy139 = pik_position_at_angle(yymsp[-5].minor.yy73,yymsp[-2].minor.yy73,yymsp[0].minor.yy139);}
#line 2755 "pikchr.c"
yymsp[-5].minor.yy139 = yylhsminor.yy139;
break;
case 79: /* position ::= expr HEADING expr FROM position */
#line 668 "pikchr.y"
{yylhsminor.yy139 = pik_position_at_angle(yymsp[-4].minor.yy73,yymsp[-2].minor.yy73,yymsp[0].minor.yy139);}
#line 2761 "pikchr.c"
yymsp[-4].minor.yy139 = yylhsminor.yy139;
break;
case 80: /* place ::= edge OF object */
#line 680 "pikchr.y"
{yylhsminor.yy139 = pik_place_of_elem(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0);}
#line 2767 "pikchr.c"
yymsp[-2].minor.yy139 = yylhsminor.yy139;
break;
case 81: /* place2 ::= object */
#line 681 "pikchr.y"
{yylhsminor.yy139 = pik_place_of_elem(p,yymsp[0].minor.yy254,0);}
#line 2773 "pikchr.c"
yymsp[0].minor.yy139 = yylhsminor.yy139;
break;
case 82: /* place2 ::= object DOT_E edge */
#line 682 "pikchr.y"
{yylhsminor.yy139 = pik_place_of_elem(p,yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);}
#line 2779 "pikchr.c"
yymsp[-2].minor.yy139 = yylhsminor.yy139;
break;
case 83: /* place2 ::= NTH VERTEX OF object */
#line 683 "pikchr.y"
{yylhsminor.yy139 = pik_nth_vertex(p,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,yymsp[0].minor.yy254);}
#line 2785 "pikchr.c"
yymsp[-3].minor.yy139 = yylhsminor.yy139;
break;
case 84: /* object ::= nth */
#line 695 "pikchr.y"
{yylhsminor.yy254 = pik_find_nth(p,0,&yymsp[0].minor.yy0);}
#line 2791 "pikchr.c"
yymsp[0].minor.yy254 = yylhsminor.yy254;
break;
case 85: /* object ::= nth OF|IN object */
#line 696 "pikchr.y"
{yylhsminor.yy254 = pik_find_nth(p,yymsp[0].minor.yy254,&yymsp[-2].minor.yy0);}
#line 2797 "pikchr.c"
yymsp[-2].minor.yy254 = yylhsminor.yy254;
break;
case 86: /* objectname ::= PLACENAME */
#line 698 "pikchr.y"
{yylhsminor.yy254 = pik_find_byname(p,0,&yymsp[0].minor.yy0);}
#line 2803 "pikchr.c"
yymsp[0].minor.yy254 = yylhsminor.yy254;
break;
case 87: /* objectname ::= objectname DOT_U PLACENAME */
#line 700 "pikchr.y"
{yylhsminor.yy254 = pik_find_byname(p,yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);}
#line 2809 "pikchr.c"
yymsp[-2].minor.yy254 = yylhsminor.yy254;
break;
case 88: /* nth ::= NTH CLASSNAME */
#line 702 "pikchr.y"
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-1].minor.yy0); }
#line 2815 "pikchr.c"
yymsp[-1].minor.yy0 = yylhsminor.yy0;
break;
case 89: /* nth ::= NTH LAST CLASSNAME */
#line 703 "pikchr.y"
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-2].minor.yy0); }
#line 2821 "pikchr.c"
yymsp[-2].minor.yy0 = yylhsminor.yy0;
break;
case 90: /* nth ::= LAST CLASSNAME */
#line 704 "pikchr.y"
{yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.eCode = -1;}
#line 2827 "pikchr.c"
break;
case 91: /* nth ::= LAST */
#line 705 "pikchr.y"
{yylhsminor.yy0=yymsp[0].minor.yy0; yylhsminor.yy0.eCode = -1;}
#line 2832 "pikchr.c"
yymsp[0].minor.yy0 = yylhsminor.yy0;
break;
case 92: /* nth ::= NTH LB RB */
#line 706 "pikchr.y"
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = pik_nth_value(p,&yymsp[-2].minor.yy0);}
#line 2838 "pikchr.c"
yymsp[-2].minor.yy0 = yylhsminor.yy0;
break;
case 93: /* nth ::= NTH LAST LB RB */
#line 707 "pikchr.y"
{yylhsminor.yy0=yymsp[-1].minor.yy0; yylhsminor.yy0.eCode = -pik_nth_value(p,&yymsp[-3].minor.yy0);}
#line 2844 "pikchr.c"
yymsp[-3].minor.yy0 = yylhsminor.yy0;
break;
case 94: /* nth ::= LAST LB RB */
#line 708 "pikchr.y"
{yymsp[-2].minor.yy0=yymsp[-1].minor.yy0; yymsp[-2].minor.yy0.eCode = -1; }
#line 2850 "pikchr.c"
break;
case 95: /* expr ::= expr PLUS expr */
#line 710 "pikchr.y"
{yylhsminor.yy73=yymsp[-2].minor.yy73+yymsp[0].minor.yy73;}
#line 2855 "pikchr.c"
yymsp[-2].minor.yy73 = yylhsminor.yy73;
break;
case 96: /* expr ::= expr MINUS expr */
#line 711 "pikchr.y"
{yylhsminor.yy73=yymsp[-2].minor.yy73-yymsp[0].minor.yy73;}
#line 2861 "pikchr.c"
yymsp[-2].minor.yy73 = yylhsminor.yy73;
break;
case 97: /* expr ::= expr STAR expr */
#line 712 "pikchr.y"
{yylhsminor.yy73=yymsp[-2].minor.yy73*yymsp[0].minor.yy73;}
#line 2867 "pikchr.c"
yymsp[-2].minor.yy73 = yylhsminor.yy73;
break;
case 98: /* expr ::= expr SLASH expr */
#line 713 "pikchr.y"
{
if( yymsp[0].minor.yy73==0.0 ){ pik_error(p, &yymsp[-1].minor.yy0, "division by zero"); yylhsminor.yy73 = 0.0; }
else{ yylhsminor.yy73 = yymsp[-2].minor.yy73/yymsp[0].minor.yy73; }
}
#line 2876 "pikchr.c"
yymsp[-2].minor.yy73 = yylhsminor.yy73;
break;
case 99: /* expr ::= MINUS expr */
#line 717 "pikchr.y"
{yymsp[-1].minor.yy73=-yymsp[0].minor.yy73;}
#line 2882 "pikchr.c"
break;
case 100: /* expr ::= PLUS expr */
#line 718 "pikchr.y"
{yymsp[-1].minor.yy73=yymsp[0].minor.yy73;}
#line 2887 "pikchr.c"
break;
case 101: /* expr ::= LP expr RP */
#line 719 "pikchr.y"
{yymsp[-2].minor.yy73=yymsp[-1].minor.yy73;}
#line 2892 "pikchr.c"
break;
case 102: /* expr ::= NUMBER */
#line 720 "pikchr.y"
{yylhsminor.yy73=pik_atof(&yymsp[0].minor.yy0);}
#line 2897 "pikchr.c"
yymsp[0].minor.yy73 = yylhsminor.yy73;
break;
case 103: /* expr ::= ID */
#line 721 "pikchr.y"
{yylhsminor.yy73=pik_get_var(p,&yymsp[0].minor.yy0);}
#line 2903 "pikchr.c"
yymsp[0].minor.yy73 = yylhsminor.yy73;
break;
case 104: /* expr ::= FUNC1 LP expr RP */
#line 722 "pikchr.y"
{yylhsminor.yy73 = pik_func(p,&yymsp[-3].minor.yy0,yymsp[-1].minor.yy73,0.0);}
#line 2909 "pikchr.c"
yymsp[-3].minor.yy73 = yylhsminor.yy73;
break;
case 105: /* expr ::= FUNC2 LP expr COMMA expr RP */
#line 723 "pikchr.y"
{yylhsminor.yy73 = pik_func(p,&yymsp[-5].minor.yy0,yymsp[-3].minor.yy73,yymsp[-1].minor.yy73);}
#line 2915 "pikchr.c"
yymsp[-5].minor.yy73 = yylhsminor.yy73;
break;
case 106: /* expr ::= place2 DOT_XY X */
#line 724 "pikchr.y"
{yylhsminor.yy73 = yymsp[-2].minor.yy139.x;}
#line 2921 "pikchr.c"
yymsp[-2].minor.yy73 = yylhsminor.yy73;
break;
case 107: /* expr ::= place2 DOT_XY Y */
#line 725 "pikchr.y"
{yylhsminor.yy73 = yymsp[-2].minor.yy139.y;}
#line 2927 "pikchr.c"
yymsp[-2].minor.yy73 = yylhsminor.yy73;
break;
case 108: /* expr ::= object DOT_L numproperty */
case 109: /* expr ::= object DOT_L dashproperty */ yytestcase(yyruleno==109);
case 110: /* expr ::= object DOT_L colorproperty */ yytestcase(yyruleno==110);
#line 726 "pikchr.y"
{yylhsminor.yy73=pik_property_of(yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);}
#line 2935 "pikchr.c"
yymsp[-2].minor.yy73 = yylhsminor.yy73;
break;
default:
/* (111) lvalue ::= ID */ yytestcase(yyruleno==111);
/* (112) lvalue ::= FILL */ yytestcase(yyruleno==112);
/* (113) lvalue ::= COLOR */ yytestcase(yyruleno==113);
/* (114) lvalue ::= THICKNESS */ yytestcase(yyruleno==114);
|
| ︙ | ︙ | |||
3016 3017 3018 3019 3020 3021 3022 |
int yymajor, /* The major type of the error token */
pik_parserTOKENTYPE yyminor /* The minor type of the error token */
){
pik_parserARG_FETCH
pik_parserCTX_FETCH
#define TOKEN yyminor
/************ Begin %syntax_error code ****************************************/
| | | | 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 |
int yymajor, /* The major type of the error token */
pik_parserTOKENTYPE yyminor /* The minor type of the error token */
){
pik_parserARG_FETCH
pik_parserCTX_FETCH
#define TOKEN yyminor
/************ Begin %syntax_error code ****************************************/
#line 492 "pikchr.y"
if( TOKEN.z && TOKEN.z[0] ){
pik_error(p, &TOKEN, "syntax error");
}else{
pik_error(p, 0, "syntax error");
}
UNUSED_PARAMETER(yymajor);
#line 3046 "pikchr.c"
/************ End %syntax_error code ******************************************/
pik_parserARG_STORE /* Suppress warning about unused %extra_argument variable */
pik_parserCTX_STORE
}
/*
** The following is executed when the parser accepts
|
| ︙ | ︙ | |||
3257 3258 3259 3260 3261 3262 3263 | assert( iToken<(int)(sizeof(yyFallback)/sizeof(yyFallback[0])) ); return yyFallback[iToken]; #else (void)iToken; return 0; #endif } | | | 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 | assert( iToken<(int)(sizeof(yyFallback)/sizeof(yyFallback[0])) ); return yyFallback[iToken]; #else (void)iToken; return 0; #endif } #line 731 "pikchr.y" /* Chart of the 140 official HTML color names with their ** corresponding RGB value. ** ** Two new names "None" and "Off" are added with a value |
| ︙ | ︙ | |||
6407 6408 6409 6410 6411 6412 6413 |
}
w = p->bbox.ne.x - p->bbox.sw.x;
h = p->bbox.ne.y - p->bbox.sw.y;
p->wSVG = (int)(p->rScale*w);
p->hSVG = (int)(p->rScale*h);
pik_append_dis(p, " viewBox=\"0 0 ",w,"");
pik_append_dis(p, " ",h,"\">\n");
| < < < < < < < < < < < < < | 6397 6398 6399 6400 6401 6402 6403 6404 6405 6406 6407 6408 6409 6410 |
}
w = p->bbox.ne.x - p->bbox.sw.x;
h = p->bbox.ne.y - p->bbox.sw.y;
p->wSVG = (int)(p->rScale*w);
p->hSVG = (int)(p->rScale*h);
pik_append_dis(p, " viewBox=\"0 0 ",w,"");
pik_append_dis(p, " ",h,"\">\n");
pik_elist_render(p, pEList);
pik_append(p,"</svg>\n", -1);
}else{
p->wSVG = -1;
p->hSVG = -1;
}
pik_elist_free(p, pEList);
|
| ︙ | ︙ | |||
6962 6963 6964 6965 6966 6967 6968 | free(zIn); free(zOut); return 0; } #endif /* PIKCHR_FUZZ */ #if defined(PIKCHR_SHELL) | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | < > > > > > > > > > > > > > > > < > > < < | > > > > | < < < | < < < | | < | < | > | | | < | | < | | < | < < < < | | | < | | > > > > > | | | < > | > | | 6939 6940 6941 6942 6943 6944 6945 6946 6947 6948 6949 6950 6951 6952 6953 6954 6955 6956 6957 6958 6959 6960 6961 6962 6963 6964 6965 6966 6967 6968 6969 6970 6971 6972 6973 6974 6975 6976 6977 6978 6979 6980 6981 6982 6983 6984 6985 6986 6987 6988 6989 6990 6991 6992 6993 6994 6995 6996 6997 6998 6999 7000 7001 7002 7003 7004 7005 7006 7007 7008 7009 7010 7011 7012 7013 7014 7015 7016 7017 7018 7019 7020 7021 7022 7023 7024 7025 7026 7027 7028 7029 7030 7031 7032 7033 7034 7035 7036 7037 7038 7039 7040 7041 7042 7043 7044 7045 7046 7047 7048 7049 7050 7051 7052 7053 7054 7055 7056 7057 7058 7059 7060 7061 7062 7063 7064 7065 7066 7067 7068 7069 7070 7071 7072 7073 7074 7075 7076 7077 7078 7079 7080 7081 7082 7083 7084 7085 7086 |
free(zIn);
free(zOut);
return 0;
}
#endif /* PIKCHR_FUZZ */
#if defined(PIKCHR_SHELL)
/* Print a usage comment for the shell and exit. */
static void usage(const char *argv0){
fprintf(stderr, "usage: %s [OPTIONS] FILE ...\n", argv0);
fprintf(stderr,
"Convert Pikchr input files into SVG.\n"
"Options:\n"
" --svg-only Omit raw SVG without the HTML wrapper\n"
);
exit(1);
}
/* Send text to standard output, but escape HTML markup */
static void print_escape_html(const char *z){
int j;
char c;
while( z[0]!=0 ){
for(j=0; (c = z[j])!=0 && c!='<' && c!='>' && c!='&'; j++){}
if( j ) printf("%.*s", j, z);
z += j+1;
j = -1;
if( c=='<' ){
printf("<");
}else if( c=='>' ){
printf(">");
}else if( c=='&' ){
printf("&");
}else if( c==0 ){
break;
}
}
}
/* Testing interface
**
** Generate HTML on standard output that displays both the original
** input text and the rendered SVG for all files named on the command
** line.
*/
int main(int argc, char **argv){
int i;
int bSvgOnly = 0; /* Output SVG only. No HTML wrapper */
const char *zHtmlHdr =
"<!DOCTYPE html>\n"
"<html lang=\"en-US\">\n"
"<head>\n<title>PIKCHR Test</title>\n"
"<style>\n"
" .hidden {\n"
" position: absolute !important;\n"
" opacity: 0 !important;\n"
" pointer-events: none !important;\n"
" display: none !important;\n"
" }\n"
"</style>\n"
"<script>\n"
" function toggleHidden(id){\n"
" for(var c of document.getElementById(id).children){\n"
" c.classList.toggle('hidden');\n"
" }\n"
" }\n"
"</script>\n"
"<meta charset=\"utf-8\">\n"
"</head>\n"
"<body>\n"
;
if( argc<2 ) usage(argv[0]);
for(i=1; i<argc; i++){
FILE *in;
size_t sz;
char *zIn;
char *zOut;
int w, h;
if( argv[i][0]=='-' ){
char *z = argv[i];
z++;
if( z[0]=='-' ) z++;
if( strcmp(z,"svg-only")==0 ){
if( zHtmlHdr==0 ){
fprintf(stderr, "the \"%s\" option must come first\n",argv[i]);
exit(1);
}
bSvgOnly = 1;
}else
{
fprintf(stderr,"unknown option: \"%s\"\n", argv[i]);
usage(argv[0]);
}
continue;
}
in = fopen(argv[i], "rb");
if( in==0 ){
fprintf(stderr, "cannot open \"%s\" for reading\n", argv[i]);
continue;
}
fseek(in, 0, SEEK_END);
sz = ftell(in);
rewind(in);
zIn = malloc( sz+1 );
if( zIn==0 ){
fprintf(stderr, "cannot allocate space for file \"%s\"\n", argv[i]);
fclose(in);
continue;
}
sz = fread(zIn, 1, sz, in);
fclose(in);
zIn[sz] = 0;
zOut = pikchr(zIn, "pikchr", 0, &w, &h);
if( zOut==0 ){
fprintf(stderr, "pikchr() returns NULL. Out of memory?\n");
exit(1);
}
if( bSvgOnly ){
printf("%s\n", zOut);
}else{
if( zHtmlHdr ){
printf("%s", zHtmlHdr);
zHtmlHdr = 0;
}
printf("<h1>File %s</h1>\n", argv[i]);
if( w<0 ){
printf("<p>ERROR</p>\n%s\n", zOut);
}else{
printf("<div id=\"svg-%d\" onclick=\"toggleHidden('svg-%d')\">\n",i,i);
printf("<div style='border:3px solid lightgray;max-width:%dpx;'>\n",w);
printf("%s</div>\n", zOut);
printf("<pre class='hidden'>");
print_escape_html(zIn);
printf("</pre>\n</div>\n");
}
}
free(zOut);
free(zIn);
}
if( !bSvgOnly ){
printf("</body></html>\n");
}
return 0;
}
#endif /* PIKCHR_SHELL */
#line 7111 "pikchr.c"
|
Changes to src/shell.c.
| ︙ | ︙ | |||
8917 8918 8919 8920 8921 8922 8923 8924 8925 8926 8927 8928 8929 8930 8931 8932 8933 8934 8935 8936 8937 8938 8939 8940 8941 8942 8943 8944 8945 8946 8947 8948 8949 8950 8951 8952 |
sqlite3_stmt *p1 = 0;
int nCol = 0;
int nTab = STRLEN(zTab);
int nByte = sizeof(IdxTable) + nTab + 1;
IdxTable *pNew = 0;
int rc, rc2;
char *pCsr = 0;
rc = idxPrintfPrepareStmt(db, &p1, pzErrmsg, "PRAGMA table_info=%Q", zTab);
while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
const char *zCol = (const char*)sqlite3_column_text(p1, 1);
nByte += 1 + STRLEN(zCol);
rc = sqlite3_table_column_metadata(
db, "main", zTab, zCol, 0, &zCol, 0, 0, 0
);
nByte += 1 + STRLEN(zCol);
nCol++;
}
rc2 = sqlite3_reset(p1);
if( rc==SQLITE_OK ) rc = rc2;
nByte += sizeof(IdxColumn) * nCol;
if( rc==SQLITE_OK ){
pNew = idxMalloc(&rc, nByte);
}
if( rc==SQLITE_OK ){
pNew->aCol = (IdxColumn*)&pNew[1];
pNew->nCol = nCol;
pCsr = (char*)&pNew->aCol[nCol];
}
nCol = 0;
while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
const char *zCol = (const char*)sqlite3_column_text(p1, 1);
int nCopy = STRLEN(zCol) + 1;
pNew->aCol[nCol].zName = pCsr;
| > > | | 8917 8918 8919 8920 8921 8922 8923 8924 8925 8926 8927 8928 8929 8930 8931 8932 8933 8934 8935 8936 8937 8938 8939 8940 8941 8942 8943 8944 8945 8946 8947 8948 8949 8950 8951 8952 8953 8954 8955 8956 8957 8958 8959 8960 8961 8962 |
sqlite3_stmt *p1 = 0;
int nCol = 0;
int nTab = STRLEN(zTab);
int nByte = sizeof(IdxTable) + nTab + 1;
IdxTable *pNew = 0;
int rc, rc2;
char *pCsr = 0;
int nPk = 0;
rc = idxPrintfPrepareStmt(db, &p1, pzErrmsg, "PRAGMA table_info=%Q", zTab);
while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
const char *zCol = (const char*)sqlite3_column_text(p1, 1);
nByte += 1 + STRLEN(zCol);
rc = sqlite3_table_column_metadata(
db, "main", zTab, zCol, 0, &zCol, 0, 0, 0
);
nByte += 1 + STRLEN(zCol);
nCol++;
nPk += (sqlite3_column_int(p1, 5)>0);
}
rc2 = sqlite3_reset(p1);
if( rc==SQLITE_OK ) rc = rc2;
nByte += sizeof(IdxColumn) * nCol;
if( rc==SQLITE_OK ){
pNew = idxMalloc(&rc, nByte);
}
if( rc==SQLITE_OK ){
pNew->aCol = (IdxColumn*)&pNew[1];
pNew->nCol = nCol;
pCsr = (char*)&pNew->aCol[nCol];
}
nCol = 0;
while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
const char *zCol = (const char*)sqlite3_column_text(p1, 1);
int nCopy = STRLEN(zCol) + 1;
pNew->aCol[nCol].zName = pCsr;
pNew->aCol[nCol].iPk = (sqlite3_column_int(p1, 5)==1 && nPk==1);
memcpy(pCsr, zCol, nCopy);
pCsr += nCopy;
rc = sqlite3_table_column_metadata(
db, "main", zTab, zCol, 0, &zCol, 0, 0, 0
);
if( rc==SQLITE_OK ){
|
| ︙ | ︙ |
Changes to src/sqlite3.c.
| ︙ | ︙ | |||
1169 1170 1171 1172 1173 1174 1175 | ** ** See also: [sqlite3_libversion()], ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ #define SQLITE_VERSION "3.34.0" #define SQLITE_VERSION_NUMBER 3034000 | | | 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 | ** ** See also: [sqlite3_libversion()], ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ #define SQLITE_VERSION "3.34.0" #define SQLITE_VERSION_NUMBER 3034000 #define SQLITE_SOURCE_ID "2020-09-17 21:11:25 4542d194e2fef5e21e1c3679914bd9e21fab31cfb111cf640524fb3514a8afa3" /* ** CAPI3REF: Run-Time Library Version Numbers ** KEYWORDS: sqlite3_version sqlite3_sourceid ** ** These interfaces provide the same information as the [SQLITE_VERSION], ** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] C preprocessor macros |
| ︙ | ︙ | |||
10515 10516 10517 10518 10519 10520 10521 | ** parameter passed to the preupdate callback is the initial [rowid] of the ** row being modified or deleted. For an INSERT operation on a rowid table, ** or any operation on a WITHOUT ROWID table, the value of the sixth ** parameter is undefined. For an INSERT or UPDATE on a rowid table the ** seventh parameter is the final rowid value of the row being inserted ** or updated. The value of the seventh parameter passed to the callback ** function is not defined for operations on WITHOUT ROWID tables, or for | | | 10515 10516 10517 10518 10519 10520 10521 10522 10523 10524 10525 10526 10527 10528 10529 | ** parameter passed to the preupdate callback is the initial [rowid] of the ** row being modified or deleted. For an INSERT operation on a rowid table, ** or any operation on a WITHOUT ROWID table, the value of the sixth ** parameter is undefined. For an INSERT or UPDATE on a rowid table the ** seventh parameter is the final rowid value of the row being inserted ** or updated. The value of the seventh parameter passed to the callback ** function is not defined for operations on WITHOUT ROWID tables, or for ** DELETE operations on rowid tables. ** ** The [sqlite3_preupdate_old()], [sqlite3_preupdate_new()], ** [sqlite3_preupdate_count()], and [sqlite3_preupdate_depth()] interfaces ** provide additional information about a preupdate event. These routines ** may only be called from within a preupdate callback. Invoking any of ** these routines from outside of a preupdate callback or with a ** [database connection] pointer that is different from the one supplied |
| ︙ | ︙ | |||
18567 18568 18569 18570 18571 18572 18573 | ** SRT_Exists Store a 1 in memory cell pDest->iSDParm if the result ** set is not empty. ** ** SRT_Discard Throw the results away. This is used by SELECT ** statements within triggers whose only purpose is ** the side-effects of functions. ** | < < < | 18567 18568 18569 18570 18571 18572 18573 18574 18575 18576 18577 18578 18579 18580 | ** SRT_Exists Store a 1 in memory cell pDest->iSDParm if the result ** set is not empty. ** ** SRT_Discard Throw the results away. This is used by SELECT ** statements within triggers whose only purpose is ** the side-effects of functions. ** ** SRT_Output Generate a row of output (using the OP_ResultRow ** opcode) for each row in the result set. ** ** SRT_Mem Only valid if the result is a single column. ** Store the first column of the first result row ** in register pDest->iSDParm then abandon the rest ** of the query. This destination implies "LIMIT 1". |
| ︙ | ︙ | |||
18626 18627 18628 18629 18630 18631 18632 | ** table. (pDest->iSDParm) is the number of key columns in ** each index record in this case. */ #define SRT_Union 1 /* Store result as keys in an index */ #define SRT_Except 2 /* Remove result from a UNION index */ #define SRT_Exists 3 /* Store 1 if the result is not empty */ #define SRT_Discard 4 /* Do not save the results anywhere */ | > > | > > > | | | | 18623 18624 18625 18626 18627 18628 18629 18630 18631 18632 18633 18634 18635 18636 18637 18638 18639 18640 18641 18642 18643 18644 18645 18646 18647 18648 | ** table. (pDest->iSDParm) is the number of key columns in ** each index record in this case. */ #define SRT_Union 1 /* Store result as keys in an index */ #define SRT_Except 2 /* Remove result from a UNION index */ #define SRT_Exists 3 /* Store 1 if the result is not empty */ #define SRT_Discard 4 /* Do not save the results anywhere */ #define SRT_DistFifo 5 /* Like SRT_Fifo, but unique results only */ #define SRT_DistQueue 6 /* Like SRT_Queue, but unique results only */ /* The DISTINCT clause is ignored for all of the above. Not that ** IgnorableDistinct() implies IgnorableOrderby() */ #define IgnorableDistinct(X) ((X->eDest)<=SRT_DistQueue) #define SRT_Queue 7 /* Store result in an queue */ #define SRT_Fifo 8 /* Store result as data with an automatic rowid */ /* The ORDER BY clause is ignored for all of the above */ #define IgnorableOrderby(X) ((X->eDest)<=SRT_Fifo) #define SRT_Output 9 /* Output each row of result */ #define SRT_Mem 10 /* Store result in a memory cell */ #define SRT_Set 11 /* Store results as keys in an index */ #define SRT_EphemTab 12 /* Create transient tab and store like SRT_Table */ #define SRT_Coroutine 13 /* Generate a single row of result */ #define SRT_Table 14 /* Store result as data with an automatic rowid */ |
| ︙ | ︙ | |||
127346 127347 127348 127349 127350 127351 127352 |
addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, 0); VdbeCoverage(v);
for(i=1, pFK=pTab->pFKey; pFK; i++, pFK=pFK->pNextFrom){
pParent = sqlite3FindTable(db, pFK->zTo, zDb);
pIdx = 0;
aiCols = 0;
if( pParent ){
x = sqlite3FkLocateIndex(pParse, pParent, pFK, &pIdx, &aiCols);
| | | 127348 127349 127350 127351 127352 127353 127354 127355 127356 127357 127358 127359 127360 127361 127362 |
addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, 0); VdbeCoverage(v);
for(i=1, pFK=pTab->pFKey; pFK; i++, pFK=pFK->pNextFrom){
pParent = sqlite3FindTable(db, pFK->zTo, zDb);
pIdx = 0;
aiCols = 0;
if( pParent ){
x = sqlite3FkLocateIndex(pParse, pParent, pFK, &pIdx, &aiCols);
assert( x==0 || db->mallocFailed );
}
addrOk = sqlite3VdbeMakeLabel(pParse);
/* Generate code to read the child key values into registers
** regRow..regRow+n. If any of the child key values are NULL, this
** row cannot cause an FK violation. Jump directly to addrOk in
** this case. */
|
| ︙ | ︙ | |||
127371 127372 127373 127374 127375 127376 127377 |
sqlite3IndexAffinityStr(db,pIdx), pFK->nCol);
sqlite3VdbeAddOp4Int(v, OP_Found, i, addrOk, regKey, 0);
VdbeCoverage(v);
}else if( pParent ){
int jmp = sqlite3VdbeCurrentAddr(v)+2;
sqlite3VdbeAddOp3(v, OP_SeekRowid, i, jmp, regRow); VdbeCoverage(v);
sqlite3VdbeGoto(v, addrOk);
| | | 127373 127374 127375 127376 127377 127378 127379 127380 127381 127382 127383 127384 127385 127386 127387 |
sqlite3IndexAffinityStr(db,pIdx), pFK->nCol);
sqlite3VdbeAddOp4Int(v, OP_Found, i, addrOk, regKey, 0);
VdbeCoverage(v);
}else if( pParent ){
int jmp = sqlite3VdbeCurrentAddr(v)+2;
sqlite3VdbeAddOp3(v, OP_SeekRowid, i, jmp, regRow); VdbeCoverage(v);
sqlite3VdbeGoto(v, addrOk);
assert( pFK->nCol==1 || db->mallocFailed );
}
/* Generate code to report an FK violation to the caller. */
if( HasRowid(pTab) ){
sqlite3VdbeAddOp2(v, OP_Rowid, 0, regResult+1);
}else{
sqlite3VdbeAddOp2(v, OP_Null, 0, regResult+1);
|
| ︙ | ︙ | |||
135258 135259 135260 135261 135262 135263 135264 | } #endif assert( p->pOrderBy==0 || pDest->eDest!=SRT_DistFifo ); assert( p->pOrderBy==0 || pDest->eDest!=SRT_Fifo ); assert( p->pOrderBy==0 || pDest->eDest!=SRT_DistQueue ); assert( p->pOrderBy==0 || pDest->eDest!=SRT_Queue ); | | | | < | | < | 135260 135261 135262 135263 135264 135265 135266 135267 135268 135269 135270 135271 135272 135273 135274 135275 135276 135277 135278 |
}
#endif
assert( p->pOrderBy==0 || pDest->eDest!=SRT_DistFifo );
assert( p->pOrderBy==0 || pDest->eDest!=SRT_Fifo );
assert( p->pOrderBy==0 || pDest->eDest!=SRT_DistQueue );
assert( p->pOrderBy==0 || pDest->eDest!=SRT_Queue );
if( IgnorableDistinct(pDest) ){
assert(pDest->eDest==SRT_Exists || pDest->eDest==SRT_Union ||
pDest->eDest==SRT_Except || pDest->eDest==SRT_Discard ||
pDest->eDest==SRT_DistQueue || pDest->eDest==SRT_DistFifo );
/* All of these destinations are also able to ignore the ORDER BY clause */
sqlite3ExprListDelete(db, p->pOrderBy);
p->pOrderBy = 0;
p->selFlags &= ~SF_Distinct;
p->selFlags |= SF_NoopOrderBy;
}
sqlite3SelectPrep(pParse, p, 0);
if( pParse->nErr || db->mallocFailed ){
|
| ︙ | ︙ | |||
143071 143072 143073 143074 143075 143076 143077 143078 143079 143080 143081 143082 143083 143084 |
sqlite3VdbeAddOp2(v, OP_Integer, pLoop->u.vtab.idxNum, iReg);
sqlite3VdbeAddOp2(v, OP_Integer, nConstraint, iReg+1);
sqlite3VdbeAddOp4(v, OP_VFilter, iCur, addrNotFound, iReg,
pLoop->u.vtab.idxStr,
pLoop->u.vtab.needFree ? P4_DYNAMIC : P4_STATIC);
VdbeCoverage(v);
pLoop->u.vtab.needFree = 0;
pLevel->p1 = iCur;
pLevel->op = pWInfo->eOnePass ? OP_Noop : OP_VNext;
pLevel->p2 = sqlite3VdbeCurrentAddr(v);
iIn = pLevel->u.in.nIn;
for(j=nConstraint-1; j>=0; j--){
pTerm = pLoop->aLTerm[j];
if( (pTerm->eOperator & WO_IN)!=0 ) iIn--;
| > > > | 143071 143072 143073 143074 143075 143076 143077 143078 143079 143080 143081 143082 143083 143084 143085 143086 143087 |
sqlite3VdbeAddOp2(v, OP_Integer, pLoop->u.vtab.idxNum, iReg);
sqlite3VdbeAddOp2(v, OP_Integer, nConstraint, iReg+1);
sqlite3VdbeAddOp4(v, OP_VFilter, iCur, addrNotFound, iReg,
pLoop->u.vtab.idxStr,
pLoop->u.vtab.needFree ? P4_DYNAMIC : P4_STATIC);
VdbeCoverage(v);
pLoop->u.vtab.needFree = 0;
/* An OOM inside of AddOp4(OP_VFilter) instruction above might have freed
** the u.vtab.idxStr. NULL it out to prevent a use-after-free */
if( db->mallocFailed ) pLoop->u.vtab.idxStr = 0;
pLevel->p1 = iCur;
pLevel->op = pWInfo->eOnePass ? OP_Noop : OP_VNext;
pLevel->p2 = sqlite3VdbeCurrentAddr(v);
iIn = pLevel->u.in.nIn;
for(j=nConstraint-1; j>=0; j--){
pTerm = pLoop->aLTerm[j];
if( (pTerm->eOperator & WO_IN)!=0 ) iIn--;
|
| ︙ | ︙ | |||
156894 156895 156896 156897 156898 156899 156900 |
#endif /* NDEBUG */
return yy_action[j];
}
}
#endif /* YYWILDCARD */
return yy_default[stateno];
}else{
| | | 156897 156898 156899 156900 156901 156902 156903 156904 156905 156906 156907 156908 156909 156910 156911 |
#endif /* NDEBUG */
return yy_action[j];
}
}
#endif /* YYWILDCARD */
return yy_default[stateno];
}else{
assert( i>=0 && i<(int)(sizeof(yy_action)/sizeof(yy_action[0])) );
return yy_action[i];
}
}while(1);
}
/*
** Find the appropriate action for a parser given the non-terminal
|
| ︙ | ︙ | |||
189216 189217 189218 189219 189220 189221 189222 | /* If the root node was just loaded, set pRtree->iDepth to the height ** of the r-tree structure. A height of zero means all data is stored on ** the root node. A height of one means the children of the root node ** are the leaves, and so on. If the depth as specified on the root node ** is greater than RTREE_MAX_DEPTH, the r-tree structure must be corrupt. */ | | | 189219 189220 189221 189222 189223 189224 189225 189226 189227 189228 189229 189230 189231 189232 189233 |
/* If the root node was just loaded, set pRtree->iDepth to the height
** of the r-tree structure. A height of zero means all data is stored on
** the root node. A height of one means the children of the root node
** are the leaves, and so on. If the depth as specified on the root node
** is greater than RTREE_MAX_DEPTH, the r-tree structure must be corrupt.
*/
if( pNode && rc==SQLITE_OK && iNode==1 ){
pRtree->iDepth = readInt16(pNode->zData);
if( pRtree->iDepth>RTREE_MAX_DEPTH ){
rc = SQLITE_CORRUPT_VTAB;
RTREE_IS_CORRUPT(pRtree);
}
}
|
| ︙ | ︙ | |||
210516 210517 210518 210519 210520 210521 210522 |
#endif /* NDEBUG */
return fts5yy_action[j];
}
}
#endif /* fts5YYWILDCARD */
return fts5yy_default[stateno];
}else{
| | | 210519 210520 210521 210522 210523 210524 210525 210526 210527 210528 210529 210530 210531 210532 210533 |
#endif /* NDEBUG */
return fts5yy_action[j];
}
}
#endif /* fts5YYWILDCARD */
return fts5yy_default[stateno];
}else{
assert( i>=0 && i<(int)(sizeof(fts5yy_action)/sizeof(fts5yy_action[0])) );
return fts5yy_action[i];
}
}while(1);
}
/*
** Find the appropriate action for a parser given the non-terminal
|
| ︙ | ︙ | |||
216521 216522 216523 216524 216525 216526 216527 |
p->iSzPoslist = p->nData;
if( pHash->eDetail!=FTS5_DETAIL_NONE ){
p->nData += 1;
p->iCol = (pHash->eDetail==FTS5_DETAIL_FULL ? 0 : -1);
}
| < | 216524 216525 216526 216527 216528 216529 216530 216531 216532 216533 216534 216535 216536 216537 |
p->iSzPoslist = p->nData;
if( pHash->eDetail!=FTS5_DETAIL_NONE ){
p->nData += 1;
p->iCol = (pHash->eDetail==FTS5_DETAIL_FULL ? 0 : -1);
}
}else{
/* Appending to an existing hash-entry. Check that there is enough
** space to append the largest possible new entry. Worst case scenario
** is:
**
** + 9 bytes for a new rowid,
|
| ︙ | ︙ | |||
221773 221774 221775 221776 221777 221778 221779 |
memset(&writer, 0, sizeof(writer));
/* See the earlier comment in this function for an explanation of why
** corrupt input position lists might cause the output to consume
** at most 20 bytes of unexpected space. */
fts5MergeAppendDocid(&out, iLastRowid, i2.iRowid);
fts5BufferZero(&tmp);
| | > > | 221775 221776 221777 221778 221779 221780 221781 221782 221783 221784 221785 221786 221787 221788 221789 221790 221791 |
memset(&writer, 0, sizeof(writer));
/* See the earlier comment in this function for an explanation of why
** corrupt input position lists might cause the output to consume
** at most 20 bytes of unexpected space. */
fts5MergeAppendDocid(&out, iLastRowid, i2.iRowid);
fts5BufferZero(&tmp);
sqlite3Fts5BufferSize(&p->rc, &tmp,
i1.nPoslist + i2.nPoslist + 10 + 10 + FTS5_DATA_ZERO_PADDING
);
if( p->rc ) break;
sqlite3Fts5PoslistNext64(a1, i1.nPoslist, &iOff1, &iPos1);
sqlite3Fts5PoslistNext64(a2, i2.nPoslist, &iOff2, &iPos2);
assert_nc( iPos1>=0 && iPos2>=0 );
if( iPos1<iPos2 ){
|
| ︙ | ︙ | |||
221847 221848 221849 221850 221851 221852 221853 |
}
else if( i2.aPoslist ){
fts5MergeAppendDocid(&out, iLastRowid, i2.iRowid);
fts5BufferSafeAppendBlob(&out, i2.aPoslist, i2.aEof - i2.aPoslist);
}
assert_nc( out.n<=(p1->n+p2->n+9) );
| < | | > > | 221851 221852 221853 221854 221855 221856 221857 221858 221859 221860 221861 221862 221863 221864 221865 221866 221867 221868 |
}
else if( i2.aPoslist ){
fts5MergeAppendDocid(&out, iLastRowid, i2.iRowid);
fts5BufferSafeAppendBlob(&out, i2.aPoslist, i2.aEof - i2.aPoslist);
}
assert_nc( out.n<=(p1->n+p2->n+9) );
fts5BufferFree(p1);
fts5BufferFree(&tmp);
memset(&out.p[out.n], 0, FTS5_DATA_ZERO_PADDING);
*p1 = out;
}
}
static void fts5SetupPrefixIter(
Fts5Index *p, /* Index to read from */
int bDesc, /* True for "ORDER BY rowid DESC" */
const u8 *pToken, /* Buffer containing prefix to match */
|
| ︙ | ︙ | |||
226148 226149 226150 226151 226152 226153 226154 |
static void fts5SourceIdFunc(
sqlite3_context *pCtx, /* Function call context */
int nArg, /* Number of args */
sqlite3_value **apUnused /* Function arguments */
){
assert( nArg==0 );
UNUSED_PARAM2(nArg, apUnused);
| | | 226153 226154 226155 226156 226157 226158 226159 226160 226161 226162 226163 226164 226165 226166 226167 |
static void fts5SourceIdFunc(
sqlite3_context *pCtx, /* Function call context */
int nArg, /* Number of args */
sqlite3_value **apUnused /* Function arguments */
){
assert( nArg==0 );
UNUSED_PARAM2(nArg, apUnused);
sqlite3_result_text(pCtx, "fts5: 2020-09-17 21:11:25 4542d194e2fef5e21e1c3679914bd9e21fab31cfb111cf640524fb3514a8afa3", -1, SQLITE_TRANSIENT);
}
/*
** Return true if zName is the extension on one of the shadow tables used
** by this module.
*/
static int fts5ShadowName(const char *zName){
|
| ︙ | ︙ | |||
230938 230939 230940 230941 230942 230943 230944 | #endif return rc; } #endif /* SQLITE_CORE */ #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_STMTVTAB) */ /************** End of stmt.c ************************************************/ | | | | 230943 230944 230945 230946 230947 230948 230949 230950 230951 230952 230953 230954 230955 230956 |
#endif
return rc;
}
#endif /* SQLITE_CORE */
#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_STMTVTAB) */
/************** End of stmt.c ************************************************/
#if __LINE__!=230950
#undef SQLITE_SOURCE_ID
#define SQLITE_SOURCE_ID "2020-09-17 21:11:25 4542d194e2fef5e21e1c3679914bd9e21fab31cfb111cf640524fb3514a8alt2"
#endif
/* Return the source-id for this library */
SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; }
/************************** End of sqlite3.c ******************************/
|