summaryrefslogtreecommitdiffstats
path: root/ext/misc/basexx.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/misc/basexx.c')
-rw-r--r--ext/misc/basexx.c89
1 files changed, 89 insertions, 0 deletions
diff --git a/ext/misc/basexx.c b/ext/misc/basexx.c
new file mode 100644
index 0000000..0dcde54
--- /dev/null
+++ b/ext/misc/basexx.c
@@ -0,0 +1,89 @@
+/*
+** 2022-11-20
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+**
+** This source allows multiple SQLite extensions to be either: combined
+** into a single runtime-loadable library; or built into the SQLite shell
+** using a preprocessing convention set by src/shell.c.in (and shell.c).
+**
+** Presently, it combines the base64.c and base85.c extensions. However,
+** it can be used as a template for other combinations.
+**
+** Example usages:
+**
+** - Build a runtime-loadable extension from SQLite checkout directory:
+** *Nix, OSX: gcc -O2 -shared -I. -fPIC -o basexx.so ext/misc/basexx.c
+** Win32: cl /Os -I. ext/misc/basexx.c -link -dll -out:basexx.dll
+**
+** - Incorporate as built-in in sqlite3 shell:
+** *Nix, OSX with gcc on a like platform:
+** export mop1=-DSQLITE_SHELL_EXTSRC=ext/misc/basexx.c
+** export mop2=-DSQLITE_SHELL_EXTFUNCS=BASEXX
+** make sqlite3 "OPTS=$mop1 $mop2"
+** Win32 with Microsoft toolset on Windows:
+** set mop1=-DSQLITE_SHELL_EXTSRC=ext/misc/basexx.c
+** set mop2=-DSQLITE_SHELL_EXTFUNCS=BASEXX
+** set mops="OPTS=%mop1% %mop2%"
+** nmake -f Makefile.msc sqlite3.exe %mops%
+*/
+
+#ifndef SQLITE_SHELL_EXTFUNCS /* Guard for #include as built-in extension. */
+# include "sqlite3ext.h"
+SQLITE_EXTENSION_INIT1;
+#endif
+
+static void init_api_ptr(const sqlite3_api_routines *pApi){
+ SQLITE_EXTENSION_INIT2(pApi);
+}
+
+#undef SQLITE_EXTENSION_INIT1
+#define SQLITE_EXTENSION_INIT1 /* */
+#undef SQLITE_EXTENSION_INIT2
+#define SQLITE_EXTENSION_INIT2(v) (void)v
+
+typedef unsigned char u8;
+#define U8_TYPEDEF
+
+/* These next 2 undef's are only needed because the entry point names
+ * collide when formulated per the rules stated for loadable extension
+ * entry point names that will be deduced from the file basenames.
+ */
+#undef sqlite3_base_init
+#define sqlite3_base_init sqlite3_base64_init
+#include "base64.c"
+
+#undef sqlite3_base_init
+#define sqlite3_base_init sqlite3_base85_init
+#include "base85.c"
+
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
+int sqlite3_basexx_init(sqlite3 *db, char **pzErr,
+ const sqlite3_api_routines *pApi){
+ int rc1;
+ int rc2;
+
+ init_api_ptr(pApi);
+ rc1 = BASE64_INIT(db);
+ rc2 = BASE85_INIT(db);
+
+ if( rc1==SQLITE_OK && rc2==SQLITE_OK ){
+ BASE64_EXPOSE(db, pzErr);
+ BASE64_EXPOSE(db, pzErr);
+ return SQLITE_OK;
+ }else{
+ return SQLITE_ERROR;
+ }
+}
+
+# define BASEXX_INIT(db) sqlite3_basexx_init(db, 0, 0)
+# define BASEXX_EXPOSE(db, pzErr) /* Not needed, ..._init() does this. */