summaryrefslogtreecommitdiff
path: root/vere/pkg/c3
diff options
context:
space:
mode:
Diffstat (limited to 'vere/pkg/c3')
-rw-r--r--vere/pkg/c3/build.zig56
-rw-r--r--vere/pkg/c3/build.zig.zon15
-rw-r--r--vere/pkg/c3/c3.h11
-rw-r--r--vere/pkg/c3/defs.c19
-rw-r--r--vere/pkg/c3/defs.h283
-rw-r--r--vere/pkg/c3/motes.h1397
-rw-r--r--vere/pkg/c3/platform/windows/compat.c611
-rw-r--r--vere/pkg/c3/platform/windows/compat.h28
-rw-r--r--vere/pkg/c3/platform/windows/mman.h26
-rw-r--r--vere/pkg/c3/platform/windows/wsetjmp.h7
-rw-r--r--vere/pkg/c3/portable.h268
-rw-r--r--vere/pkg/c3/types.h75
12 files changed, 2796 insertions, 0 deletions
diff --git a/vere/pkg/c3/build.zig b/vere/pkg/c3/build.zig
new file mode 100644
index 0000000..3c5a89c
--- /dev/null
+++ b/vere/pkg/c3/build.zig
@@ -0,0 +1,56 @@
+const std = @import("std");
+
+pub fn build(b: *std.Build) void {
+ const target = b.standardTargetOptions(.{});
+ const optimize = b.standardOptimizeOption(.{});
+ const t = target.result;
+
+ const copts: []const []const u8 =
+ b.option([]const []const u8, "copt", "") orelse &.{};
+
+ const pkg_c3 = b.addStaticLibrary(.{
+ .name = "c3",
+ .target = target,
+ .optimize = optimize,
+ });
+
+ if (target.result.os.tag.isDarwin() and !target.query.isNative()) {
+ const macos_sdk = b.lazyDependency("macos_sdk", .{
+ .target = target,
+ .optimize = optimize,
+ });
+ if (macos_sdk != null) {
+ pkg_c3.addSystemIncludePath(macos_sdk.?.path("usr/include"));
+ pkg_c3.addLibraryPath(macos_sdk.?.path("usr/lib"));
+ pkg_c3.addFrameworkPath(macos_sdk.?.path("System/Library/Frameworks"));
+ }
+ }
+
+ pkg_c3.linkLibC();
+
+ pkg_c3.addIncludePath(b.path(""));
+
+ pkg_c3.addCSourceFiles(.{
+ .root = b.path(""),
+ .files = &.{"defs.c"},
+ .flags = copts,
+ });
+
+ if (t.os.tag == .windows) {
+ pkg_c3.addIncludePath(b.path("platform/windows"));
+ pkg_c3.installHeadersDirectory(b.path("platform/windows"), "", .{});
+ pkg_c3.addCSourceFiles(.{
+ .root = b.path(""),
+ .files = &.{"platform/windows/compat.c"},
+ .flags = copts,
+ });
+ }
+
+ pkg_c3.installHeader(b.path("c3.h"), "c3/c3.h");
+ pkg_c3.installHeader(b.path("defs.h"), "c3/defs.h");
+ pkg_c3.installHeader(b.path("motes.h"), "c3/motes.h");
+ pkg_c3.installHeader(b.path("portable.h"), "c3/portable.h");
+ pkg_c3.installHeader(b.path("types.h"), "c3/types.h");
+
+ b.installArtifact(pkg_c3);
+}
diff --git a/vere/pkg/c3/build.zig.zon b/vere/pkg/c3/build.zig.zon
new file mode 100644
index 0000000..98a26f1
--- /dev/null
+++ b/vere/pkg/c3/build.zig.zon
@@ -0,0 +1,15 @@
+.{
+ .name = .c3,
+ .fingerprint = 0xb0d94b8d21880022,
+ .version = "0.0.1",
+ .dependencies = .{
+ .macos_sdk = .{
+ .url = "https://github.com/joseluisq/macosx-sdks/releases/download/14.5/MacOSX14.5.sdk.tar.xz",
+ .hash = "N-V-__8AAKtK4FMzqcFsY_ZrpMg9bGH0h7BqZDXtVyAerMtM",
+ .lazy = true,
+ },
+ },
+ .paths = .{
+ "",
+ },
+}
diff --git a/vere/pkg/c3/c3.h b/vere/pkg/c3/c3.h
new file mode 100644
index 0000000..c5a60af
--- /dev/null
+++ b/vere/pkg/c3/c3.h
@@ -0,0 +1,11 @@
+/// @file
+
+#ifndef C3_H
+#define C3_H
+
+#include "defs.h"
+#include "motes.h"
+#include "portable.h"
+#include "types.h"
+
+#endif /* ifndef C3_H */
diff --git a/vere/pkg/c3/defs.c b/vere/pkg/c3/defs.c
new file mode 100644
index 0000000..24c1d13
--- /dev/null
+++ b/vere/pkg/c3/defs.c
@@ -0,0 +1,19 @@
+#include "defs.h"
+
+c3_s
+c3_sift_short(c3_y buf_y[2]);
+c3_w
+c3_sift_word(c3_y buf_y[4]);
+c3_d
+c3_sift_chub(c3_y byt_y[8]);
+
+void
+c3_etch_short(c3_y buf_y[2], c3_s sot_s);
+void
+c3_etch_word(c3_y buf_y[4], c3_w wod_w);
+void
+c3_etch_chub(c3_y byt_y[8], c3_d num_d);
+
+c3_w c3_align_w(c3_w x, c3_w al, align_dir hilo);
+c3_d c3_align_d(c3_d x, c3_d al, align_dir hilo);
+void *c3_align_p(void const * p, size_t al, align_dir hilo);
diff --git a/vere/pkg/c3/defs.h b/vere/pkg/c3/defs.h
new file mode 100644
index 0000000..5adc05d
--- /dev/null
+++ b/vere/pkg/c3/defs.h
@@ -0,0 +1,283 @@
+/// @file
+
+#ifndef C3_DEFS_H
+#define C3_DEFS_H
+
+#include "portable.h"
+#include "types.h"
+#include <limits.h>
+
+#include <errno.h>
+
+ /** Loobeans - inverse booleans to match nock.
+ **/
+# define c3y 0
+# define c3n 1
+
+# define _(x) (c3y == (x))
+# define __(x) ((x) ? c3y : c3n)
+# define c3a(x, y) __(_(x) && _(y))
+# define c3o(x, y) __(_(x) || _(y))
+
+
+ /** Random useful C macros.
+ **/
+ /* Dessert. Debug assert. If a debugger is attached, it will break in and
+ execution can be allowed to proceed without aborting the process.
+ Otherwise, the unhandled SIGTRAP will dump core.
+ */
+#ifdef C3DBG
+ #if defined(__i386__) || defined(__x86_64__)
+ #define c3_dessert(x) do { if(!(x)) __asm__ volatile("int $3"); } while (0)
+ #elif defined(__thumb__)
+ #define c3_dessert(x) do { if(!(x)) __asm__ volatile(".inst 0xde01"); } while (0)
+ #elif defined(__aarch64__)
+ #define c3_dessert(x) do { if(!(x)) __asm__ volatile(".inst 0xd4200000"); } while (0)
+ #elif defined(__arm__)
+ #define c3_dessert(x) do { if(!(x)) __asm__ volatile(".inst 0xe7f001f0"); } while (0)
+ #else
+ STATIC_ASSERT(0, "debugger break instruction unimplemented");
+ #endif
+#else
+ #define c3_dessert(x) ((void)(0))
+#endif
+
+ /* Stub.
+ */
+# define c3_stub u3_assert(!"stub")
+
+ /* Size in words.
+ */
+# define c3_wiseof(x) (((sizeof (x)) + 3) >> 2)
+
+ /* Bit counting.
+ */
+#if (32 == (CHAR_BIT * __SIZEOF_INT__))
+# define c3_lz_w __builtin_clz
+# define c3_tz_w __builtin_ctz
+# define c3_pc_w __builtin_popcount
+#elif (32 == (CHAR_BIT * __SIZEOF_LONG__))
+# define c3_lz_w __builtin_clzl
+# define c3_tz_w __builtin_ctzl
+# define c3_pc_w __builtin_popcountl
+#else
+# error "port me"
+#endif
+
+#if (64 == (CHAR_BIT * __SIZEOF_LONG__))
+# define c3_lz_d __builtin_clzl
+# define c3_tz_d __builtin_ctzl
+# define c3_pc_d __builtin_popcountl
+#elif (64 == (CHAR_BIT * __SIZEOF_LONG_LONG__))
+# define c3_lz_d __builtin_clzll
+# define c3_tz_d __builtin_ctzll
+# define c3_pc_d __builtin_popcountll
+#else
+# error "port me"
+#endif
+
+# define c3_bits_word(w) ((w) ? (32 - c3_lz_w(w)) : 0)
+# define c3_bits_dabl(d) ((d) ? (64 - c3_lz_d(d)) : 0)
+
+ /* Min and max.
+ */
+# define c3_max(x, y) ( ((x) > (y)) ? (x) : (y) )
+# define c3_min(x, y) ( ((x) < (y)) ? (x) : (y) )
+
+
+//! Round up/down (respectively).
+//!
+//! @param[in] x Integer to round.
+//! @param[in] n Multiple to round to. Must be power of 2.
+//!
+//! @return `x` rounded to the nearest multiple of `n`.
+# define c3_rop(x, n) (((x) + ((n) - 1)) & (~((n) - 1)))
+# define c3_rod(x, n) ((x) & ~((n) - 1))
+
+ /* Rotate.
+ */
+# define c3_rotw(r, x) ( ((x) << (r)) | ((x) >> (32 - (r))) )
+
+ /* Fill 16 words (64 bytes) with high-quality entropy.
+ */
+ void
+ c3_rand(c3_w* rad_w);
+
+ /* Short integers.
+ */
+# define c3_s1(a) ( (a) )
+# define c3_s2(a, b) ( ((b) << 8) | c3_s1(a) )
+# define c3_s3(a, b, c) ( ((c) << 16) | c3_s2(a, b) )
+# define c3_s4(a, b, c, d) ( ((d) << 24) | c3_s3(a, b, c) )
+
+# define c3_s5(a, b, c, d, e) \
+ ( ((uint64_t)c3_s1(e) << 32ULL) | c3_s4(a, b, c, d) )
+# define c3_s6(a, b, c, d, e, f) \
+ ( ((uint64_t)c3_s2(e, f) << 32ULL) | c3_s4(a, b, c, d) )
+# define c3_s7(a, b, c, d, e, f, g) \
+ ( ((uint64_t)c3_s3(e, f, g) << 32ULL) | c3_s4(a, b, c, d) )
+# define c3_s8(a, b, c, d, e, f, g, h) \
+ ( ((uint64_t)c3_s4(e, f, g, h) << 32ULL) | c3_s4(a, b, c, d) )
+
+ /* Byte-order twiddling.
+ */
+# define c3_flip32(w) \
+ ( (((w) >> 24) & 0xff) \
+ | (((w) >> 16) & 0xff) << 8 \
+ | (((w) >> 8) & 0xff) << 16 \
+ | ( (w) & 0xff) << 24 )
+
+ inline c3_s
+ c3_sift_short(c3_y buf_y[2])
+ {
+ return ((c3_s)buf_y[1] << 8 | (c3_s)buf_y[0]);
+ }
+
+ inline c3_w
+ c3_sift_word(c3_y buf_y[4])
+ {
+ return ((c3_w)buf_y[3] << 24 | (c3_w)buf_y[2] << 16 | (c3_w)buf_y[1] << 8 | (c3_w)buf_y[0]);
+ }
+
+ inline c3_d
+ c3_sift_chub(c3_y byt_y[8])
+ {
+ return (c3_d)byt_y[0]
+ | (c3_d)byt_y[1] << 8
+ | (c3_d)byt_y[2] << 16
+ | (c3_d)byt_y[3] << 24
+ | (c3_d)byt_y[4] << 32
+ | (c3_d)byt_y[5] << 40
+ | (c3_d)byt_y[6] << 48
+ | (c3_d)byt_y[7] << 56;
+ }
+
+ inline void
+ c3_etch_short(c3_y buf_y[2], c3_s sot_s)
+ {
+ buf_y[0] = sot_s & 0xff;
+ buf_y[1] = (sot_s >> 8) & 0xff;
+ }
+
+ inline void
+ c3_etch_word(c3_y buf_y[4], c3_w wod_w)
+ {
+ buf_y[0] = wod_w & 0xff;
+ buf_y[1] = (wod_w >> 8) & 0xff;
+ buf_y[2] = (wod_w >> 16) & 0xff;
+ buf_y[3] = (wod_w >> 24) & 0xff;
+ }
+
+ inline void
+ c3_etch_chub(c3_y byt_y[8], c3_d num_d)
+ {
+ byt_y[0] = num_d & 0xff;
+ byt_y[1] = (num_d >> 8) & 0xff;
+ byt_y[2] = (num_d >> 16) & 0xff;
+ byt_y[3] = (num_d >> 24) & 0xff;
+ byt_y[4] = (num_d >> 32) & 0xff;
+ byt_y[5] = (num_d >> 40) & 0xff;
+ byt_y[6] = (num_d >> 48) & 0xff;
+ byt_y[7] = (num_d >> 56) & 0xff;
+ }
+
+ /* Asserting allocators.
+ */
+# define c3_free(s) free(s)
+# define c3_malloc(s) ({ \
+ void* rut = malloc(s); \
+ if ( 0 == rut ) { \
+ fprintf(stderr, "c3_malloc(%" PRIu64 ") failed\r\n", \
+ (c3_d)s); \
+ u3_assert(!"memory lost"); \
+ } \
+ rut;})
+# define c3_calloc(s) ({ \
+ void* rut = calloc(1,s); \
+ if ( 0 == rut ) { \
+ fprintf(stderr, "c3_calloc(%" PRIu64 ") failed\r\n", \
+ (c3_d)s); \
+ u3_assert(!"memory lost"); \
+ } \
+ rut;})
+# define c3_realloc(a, b) ({ \
+ void* rut = realloc(a, b); \
+ if ( 0 == rut ) { \
+ fprintf(stderr, "c3_realloc(%" PRIu64 ") failed\r\n", \
+ (c3_d)b); \
+ u3_assert(!"memory lost"); \
+ } \
+ rut;})
+
+ /* Asserting unix fs wrappers.
+ **
+ ** these all crash the process if passed a non-canonical
+ ** path (i.e., one containing '.', '..', or the empty path
+ ** component), so make sure you don't pass them one. if you
+ ** find yourself fighting with them, then please delete them
+ ** and do a sed search-and-replace to remove the `c3_` from
+ ** their call sites; their goal is to decrease maintenance
+ ** burden, not increase it.
+ */
+ // defined in vere/io/unix.c.
+ c3_t u3_unix_cane(const c3_c* pax_c);
+# define c3_open(a, ...) ({ \
+ open(a, __VA_ARGS__);})
+# define c3_opendir(a) ({ \
+ opendir(a);})
+# define c3_mkdir(a, b) ({ \
+ mkdir(a, b);})
+# define c3_rmdir(a) ({ \
+ rmdir(a);})
+# define c3_link(a, b) ({ \
+ link(a, b);})
+# define c3_unlink(a) ({ \
+ unlink(a);})
+# define c3_fopen(a, b) ({ \
+ fopen(a, b);})
+# define c3_remove(a) ({ \
+ remove(a);})
+# define c3_rename(a, b) ({ \
+ rename(a, b);})
+
+/* c3_align(
+ x - the address/quantity to align,
+ al - the alignment,
+ hilo - [C3_ALGHI, C3_ALGLO] high or low align
+ )
+
+ hi or lo align x to al
+
+ unless effective type of x is c3_w or c3_d, assumes x is a pointer.
+*/
+#define c3_align(x, al, hilo) \
+ _Generic((x), \
+ c3_w : c3_align_w, \
+ c3_d : c3_align_d, \
+ default : c3_align_p) \
+ (x, al, hilo)
+typedef enum { C3_ALGHI=1, C3_ALGLO=0 } align_dir;
+inline c3_w
+c3_align_w(c3_w x, c3_w al, align_dir hilo) {
+ c3_dessert(hilo <= C3_ALGHI && hilo >= C3_ALGLO);
+ x += hilo * (al - 1);
+ x &= ~(al - 1);
+ return x;
+}
+inline c3_d
+c3_align_d(c3_d x, c3_d al, align_dir hilo) {
+ c3_dessert(hilo <= C3_ALGHI && hilo >= C3_ALGLO);
+ x += hilo * (al - 1);
+ x &= ~(al - 1);
+ return x;
+}
+inline void*
+c3_align_p(void const * p, size_t al, align_dir hilo) {
+ uintptr_t x = (uintptr_t)p;
+ c3_dessert(hilo <= C3_ALGHI && hilo >= C3_ALGLO);
+ x += hilo * (al - 1);
+ x &= ~(al - 1);
+ return (void*)x;
+}
+
+#endif /* ifndef C3_DEFS_H */
diff --git a/vere/pkg/c3/motes.h b/vere/pkg/c3/motes.h
new file mode 100644
index 0000000..3ba8a70
--- /dev/null
+++ b/vere/pkg/c3/motes.h
@@ -0,0 +1,1397 @@
+/// @file
+
+#ifndef C3_MOTES_H
+#define C3_MOTES_H
+
+#include "defs.h"
+
+ /** Definitions.
+ **/
+
+# define c3__a c3_s1('a')
+# define c3__a50 c3_s3('a','5','0')
+# define c3__abel c3_s4('a','b','e','l')
+# define c3__abo c3_s3('a','b','o')
+# define c3__actd c3_s4('a','c','t','d')
+# define c3__add c3_s3('a','d','d')
+# define c3__aka c3_s3('a','k','a')
+# define c3__all c3_s3('a','l','l')
+# define c3__alrm c3_s4('a','l','r','m')
+# define c3__amat c3_s4('a','m','a','t')
+# define c3__ames c3_s4('a','m','e','s')
+# define c3__and c3_s3('a','n','d')
+# define c3__ankh c3_s4('a','n','k','h')
+# define c3__any c3_s3('a','n','y')
+# define c3__ap c3_s2('a','p')
+# define c3__apen c3_s4('a','p','e','n')
+# define c3__aro c3_s3('a','r','o')
+# define c3__arvo c3_s4('a','r','v','o')
+# define c3__ash c3_s3('a','s','h')
+# define c3__at c3_s2('a','t')
+# define c3__atom c3_s4('a','t','o','m')
+# define c3__auth c3_s4('a','u','t','h')
+# define c3__auto c3_s4('a','u','t','o')
+# define c3__avow c3_s4('a','v','o','w')
+# define c3__awry c3_s4('a','w','r','y')
+# define c3__ax c3_s2('a','x')
+# define c3__axe c3_s3('a','x','e')
+# define c3__axil c3_s4('a','x','i','l')
+# define c3__axis c3_s4('a','x','i','s')
+# define c3__b c3_s1('b')
+# define c3__bac c3_s3('b','a','c')
+# define c3__bach c3_s4('b','a','c','h')
+# define c3__bag c3_s3('b','a','g')
+# define c3__bail c3_s4('b','a','i','l')
+# define c3__ball c3_s4('b','a','l','l')
+# define c3__band c3_s4('b','a','n','d')
+# define c3__bank c3_s4('b','a','n','k')
+# define c3__bar c3_s3('b','a','r')
+# define c3__bark c3_s4('b','a','r','k')
+# define c3__barn c3_s4('b','a','r','n')
+# define c3__base c3_s4('b','a','s','e')
+# define c3__bask c3_s4('b','a','s','k')
+# define c3__basp c3_s4('b','a','s','p')
+# define c3__bbye c3_s4('b','b','y','e')
+# define c3__bcbn c3_s4('b','c','b','n')
+# define c3__bcbr c3_s4('b','c','b','r')
+# define c3__bccb c3_s4('b','c','c','b')
+# define c3__bccn c3_s4('b','c','c','n')
+# define c3__bcdg c3_s4('b','c','d','g')
+# define c3__bcdt c3_s4('b','c','d','t')
+# define c3__bckt c3_s4('b','c','k','t')
+# define c3__bclc c3_s4('b','c','l','c')
+# define c3__bcmt c3_s4('b','c','m','t')
+# define c3__bcpm c3_s4('b','c','p','m')
+# define c3__bcpt c3_s4('b','c','p','t')
+# define c3__bcsg c3_s4('b','c','s','g')
+# define c3__bctr c3_s4('b','c','t','r')
+# define c3__bcts c3_s4('b','c','t','s')
+# define c3__bczp c3_s4('b','c','z','p')
+# define c3__bead c3_s4('b','e','a','d')
+# define c3__beam c3_s4('b','e','a','m')
+# define c3__bean c3_s4('b','e','a','n')
+# define c3__bear c3_s4('b','e','a','r')
+# define c3__bede c3_s4('b','e','d','e')
+# define c3__bee c3_s3('b','e','e')
+# define c3__behn c3_s4('b','e','h','n')
+# define c3__bel c3_s3('b','e','l')
+# define c3__belt c3_s4('b','e','l','t')
+# define c3__bend c3_s4('b','e','n','d')
+# define c3__ber c3_s3('b','e','r')
+# define c3__bias c3_s4('b','i','a','s')
+# define c3__bic c3_s3('b','i','c')
+# define c3__bind c3_s4('b','i','n','d')
+# define c3__bink c3_s4('b','i','n','k')
+# define c3__bird c3_s4('b','i','r','d')
+# define c3__bit c3_s3('b','i','t')
+# define c3__bl c3_s2('b','l')
+# define c3__blan c3_s4('b','l','a','n')
+# define c3__blap c3_s4('b','l','a','p')
+# define c3__bleb c3_s4('b','l','e','b')
+# define c3__blem c3_s4('b','l','e','m')
+# define c3__blew c3_s4('b','l','e','w')
+# define c3__blin c3_s4('b','l','i','n')
+# define c3__blit c3_s4('b','l','i','t')
+# define c3__blob c3_s4('b','l','o','b')
+# define c3__blob c3_s4('b','l','o','b')
+# define c3__blog c3_s4('b','l','o','g')
+# define c3__bloq c3_s4('b','l','o','q')
+# define c3__blot c3_s4('b','l','o','t')
+# define c3__blow c3_s4('b','l','o','w')
+# define c3__blue c3_s4('b','l','u','e')
+# define c3__blur c3_s4('b','l','u','r')
+# define c3__bndl c3_s4('b','n','d','l')
+# define c3__bndp c3_s4('b','n','d','p')
+# define c3__bnld c3_s4('b','n','l','d')
+# define c3__bnnp c3_s4('b','n','n','p')
+# define c3__bnpd c3_s4('b','n','p','d')
+# define c3__bnps c3_s4('b','n','p','s')
+# define c3__bnsp c3_s4('b','n','s','p')
+# define c3__boat c3_s4('b','o','a','t')
+# define c3__boce c3_s4('b','o','c','e')
+# define c3__boil c3_s4('b','o','i','l')
+# define c3__boin c3_s4('b','o','i','n')
+# define c3__bolt c3_s4('b','o','l','t')
+# define c3__bond c3_s4('b','o','n','d')
+# define c3__bone c3_s4('b','o','n','e')
+# define c3__bong c3_s4('b','o','n','g')
+# define c3__book c3_s4('b','o','o','k')
+# define c3__bool c3_s4('b','o','o','l')
+# define c3__boot c3_s4('b','o','o','t')
+# define c3__born c3_s4('b','o','r','n')
+# define c3__both c3_s4('b','o','t','h')
+# define c3__bout c3_s4('b','o','u','t')
+# define c3__box c3_s3('b','o','x')
+# define c3__br c3_s2('b','r')
+# define c3__bran c3_s4('b','r','a','n')
+# define c3__brax c3_s4('b','r','a','x')
+# define c3__brbn c3_s4('b','r','b','n')
+# define c3__brcb c3_s4('b','r','c','b')
+# define c3__brcl c3_s4('b','r','c','l')
+# define c3__brcn c3_s4('b','r','c','n')
+# define c3__brcs c3_s4('b','r','c','s')
+# define c3__brdg c3_s4('b','r','d','g')
+# define c3__brdl c3_s4('b','r','d','l')
+# define c3__brdp c3_s4('b','r','d','p')
+# define c3__brdt c3_s4('b','r','d','t')
+# define c3__brhp c3_s4('b','r','h','p')
+# define c3__brip c3_s4('b','r','i','p')
+# define c3__brkt c3_s4('b','r','k','t')
+# define c3__brlc c3_s4('b','r','l','c')
+# define c3__brld c3_s4('b','r','l','d')
+# define c3__brls c3_s4('b','r','l','s')
+# define c3__brms c3_s4('b','r','m','s')
+# define c3__brmt c3_s4('b','r','m','t')
+# define c3__brnp c3_s4('b','r','n','p')
+# define c3__broc c3_s4('b','r','o','c')
+# define c3__bron c3_s4('b','r','o','n')
+# define c3__brop c3_s4('b','r','o','p')
+# define c3__brov c3_s4('b','r','o','v')
+# define c3__brpd c3_s4('b','r','p','d')
+# define c3__brps c3_s4('b','r','p','s')
+# define c3__brrt c3_s4('b','r','r','t')
+# define c3__brsg c3_s4('b','r','s','g')
+# define c3__brsp c3_s4('b','r','s','p')
+# define c3__brtg c3_s4('b','r','t','g')
+# define c3__brtr c3_s4('b','r','t','r')
+# define c3__brts c3_s4('b','r','t','s')
+# define c3__brvt c3_s4('b','r','v','t')
+# define c3__brwt c3_s4('b','r','w','t')
+# define c3__brzp c3_s4('b','r','z','p')
+# define c3__bud c3_s3('b','u','d')
+# define c3__bull c3_s4('b','u','l','l')
+# define c3__bump c3_s4('b','u','m','p')
+# define c3__bund c3_s4('b','u','n','d')
+# define c3__bung c3_s4('b','u','n','g')
+# define c3__bunk c3_s4('b','u','n','k')
+# define c3__bunt c3_s4('b','u','n','t')
+# define c3__bunx c3_s4('b','u','n','x')
+# define c3__burn c3_s4('b','u','r','n')
+# define c3__busk c3_s4('b','u','s','k')
+# define c3__bust c3_s4('b','u','s','t')
+# define c3__butt c3_s4('b','u','t','t')
+# define c3__by c3_s2('b','y')
+# define c3__byte c3_s4('b','y','t','e')
+# define c3__c c3_s1('c')
+# define c3__cage c3_s4('c','a','g','e')
+# define c3__cain c3_s4('c','a','i','n')
+# define c3__call c3_s4('c','a','l','l')
+# define c3__can c3_s3('c','a','n')
+# define c3__cap c3_s3('c','a','p')
+# define c3__card c3_s4('c','a','r','d')
+# define c3__carp c3_s4('c','a','r','p')
+# define c3__cary c3_s4('c','a','r','y')
+# define c3__case c3_s4('c','a','s','e')
+# define c3__cash c3_s4('c','a','s','h')
+# define c3__cast c3_s4('c','a','s','t')
+# define c3__cat c3_s3('c','a','t')
+# define c3__cato c3_s4('c','a','t','o')
+# define c3__cay c3_s3('c','a','y')
+# define c3__cbbn c3_s4('c','b','b','n')
+# define c3__cbbr c3_s4('c','b','b','r')
+# define c3__cbdg c3_s4('c','b','d','g')
+# define c3__cbkt c3_s4('c','b','k','t')
+# define c3__cblc c3_s4('c','b','l','c')
+# define c3__cbmt c3_s4('c','b','m','t')
+# define c3__cbpm c3_s4('c','b','p','m')
+# define c3__cbtr c3_s4('c','b','t','r')
+# define c3__cdr c3_s3('c','d','r')
+# define c3__ce c3_s2('c','e')
+# define c3__cell c3_s4('c','e','l','l')
+# define c3__chaf c3_s4('c','h','a','f')
+# define c3__chan c3_s4('c','h','a','n')
+# define c3__chew c3_s4('c','h','e','w')
+# define c3__chis c3_s4('c','h','i','s')
+# define c3__chob c3_s4('c','h','o','b')
+# define c3__chop c3_s4('c','h','o','p')
+# define c3__chug c3_s4('c','h','u','g')
+# define c3__claf c3_s4('c','l','a','f')
+# define c3__clam c3_s4('c','l','a','m')
+# define c3__clap c3_s4('c','l','a','p')
+# define c3__clat c3_s4('c','l','a','t')
+# define c3__clay c3_s4('c','l','a','y')
+# define c3__clcb c3_s4('c','l','c','b')
+# define c3__clcn c3_s4('c','l','c','n')
+# define c3__clep c3_s4('c','l','e','p')
+# define c3__clet c3_s4('c','l','e','t')
+# define c3__clhp c3_s4('c','l','h','p')
+# define c3__clip c3_s4('c','l','i','p')
+# define c3__clkt c3_s4('c','l','k','t')
+# define c3__clls c3_s4('c','l','l','s')
+# define c3__clms c3_s4('c','l','m','s')
+# define c3__clr c3_s3('c','l','r')
+# define c3__clsg c3_s4('c','l','s','g')
+# define c3__clsp c3_s4('c','l','s','p')
+# define c3__cltr c3_s4('c','l','t','r')
+# define c3__cnbc c3_s4('c','n','b','c')
+# define c3__cnbr c3_s4('c','n','b','r')
+# define c3__cncb c3_s4('c','n','c','b')
+# define c3__cncl c3_s4('c','n','c','l')
+# define c3__cndt c3_s4('c','n','d','t')
+# define c3__cnhp c3_s4('c','n','h','p')
+# define c3__cnhs c3_s4('c','n','h','s')
+# define c3__cnhx c3_s4('c','n','h','x')
+# define c3__cnkt c3_s4('c','n','k','t')
+# define c3__cnls c3_s4('c','n','l','s')
+# define c3__cnms c3_s4('c','n','m','s')
+# define c3__cnpm c3_s4('c','n','p','m')
+# define c3__cnsg c3_s4('c','n','s','g')
+# define c3__cntr c3_s4('c','n','t','r')
+# define c3__cnts c3_s4('c','n','t','s')
+# define c3__cnzy c3_s4('c','n','z','y')
+# define c3__cnzz c3_s4('c','n','z','z')
+# define c3__coat c3_s4('c','o','a','t')
+# define c3__code c3_s4('c','o','d','e')
+# define c3__coin c3_s4('c','o','i','n')
+# define c3__colb c3_s4('c','o','l','b')
+# define c3__cold c3_s4('c','o','l','d')
+# define c3__comb c3_s4('c','o','m','b')
+# define c3__come c3_s4('c','o','m','e')
+# define c3__con c3_s3('c','o','n')
+# define c3__cone c3_s4('c','o','n','e')
+# define c3__cong c3_s4('c','o','n','g')
+# define c3__conn c3_s4('c','o','n','n')
+# define c3__cons c3_s4('c','o','n','s')
+# define c3__cook c3_s4('c','o','o','k')
+# define c3__cool c3_s4('c','o','o','l')
+# define c3__core c3_s4('c','o','r','e')
+# define c3__corm c3_s4('c','o','r','m')
+# define c3__corp c3_s4('c','o','r','p')
+# define c3__corp c3_s4('c','o','r','p')
+# define c3__cow c3_s3('c','o','w')
+# define c3__cplx c3_s3('c','p','l','x')
+# define c3__cpu c3_s3('c','p','u')
+# define c3__crad c3_s4('c','r','a','d')
+# define c3__cram c3_s4('c','r','a','m')
+# define c3__crap c3_s4('c','r','a','p')
+# define c3__cret c3_s4('c','r','e','t')
+# define c3__crib c3_s4('c','r','i','b')
+# define c3__crof c3_s4('c','r','o','f')
+# define c3__crop c3_s4('c','r','o','p')
+# define c3__crot c3_s4('c','r','o','t')
+# define c3__crud c3_s4('c','r','u','d')
+# define c3__csbn c3_s4('c','s','b','n')
+# define c3__csbr c3_s4('c','s','b','r')
+# define c3__csdg c3_s4('c','s','d','g')
+# define c3__csdl c3_s4('c','s','d','l')
+# define c3__csdp c3_s4('c','s','d','p')
+# define c3__csdt c3_s4('c','s','d','t')
+# define c3__csin c3_s4('c','s','i','n')
+# define c3__csip c3_s4('c','s','i','p')
+# define c3__cslc c3_s4('c','s','l','c')
+# define c3__csld c3_s4('c','s','l','d')
+# define c3__csnp c3_s4('c','s','n','p')
+# define c3__cspm c3_s4('c','s','p','m')
+# define c3__csps c3_s4('c','s','p','s')
+# define c3__csrt c3_s4('c','s','r','t')
+# define c3__cssg c3_s4('c','s','s','g')
+# define c3__cssp c3_s4('c','s','s','p')
+# define c3__cstg c3_s4('c','s','t','g')
+# define c3__cstr c3_s4('c','s','t','r')
+# define c3__cszp c3_s4('c','s','z','p')
+# define c3__ctl c3_s3('c','t','l')
+# define c3__cttp c3_s4('c','t','t','p')
+# define c3__cube c3_s4('c','u','b','e')
+# define c3__cull c3_s4('c','u','l','l')
+# define c3__curd c3_s4('c','u','r','d')
+# define c3__cut c3_s3('c','u','t')
+# define c3__cyl c3_s3('c','y','l')
+# define c3__czar c3_s4('c','z','a','r')
+# define c3__d c3_s1('d')
+# define c3__da c3_s2('d','a')
+# define c3__dago c3_s4('d','a','g','o')
+# define c3__dant c3_s4('d','a','n','t')
+# define c3__dast c3_s4('d','a','s','t')
+# define c3__data c3_s4('d','a','t','a')
+# define c3__dawn c3_s4('d','a','w','n')
+# define c3__dbug c3_s4('d','b','u','g')
+# define c3__dec c3_s3('d','e','c')
+# define c3__deem c3_s4('d','e','e','m')
+# define c3__deep c3_s4('d','e','e','p')
+# define c3__defn c3_s4('d','e','f','n')
+# define c3__del c3_s3('d','e','l')
+# define c3__dear c3_s4('d','e','a','r')
+# define c3__delc c3_s4('d','e','l','c')
+# define c3__delt c3_s4('d','e','l','t')
+# define c3__dept c3_s4('d','e','p','t')
+# define c3__dext c3_s4('d','e','x','t')
+# define c3__dgdp c3_s4('d','g','d','p')
+# define c3__dgkt c3_s4('d','g','k','t')
+# define c3__dgnp c3_s4('d','g','n','p')
+# define c3__dgpd c3_s4('d','g','p','d')
+# define c3__dgps c3_s4('d','g','p','s')
+# define c3__dgrt c3_s4('d','g','r','t')
+# define c3__dgsg c3_s4('d','g','s','g')
+# define c3__dgsp c3_s4('d','g','s','p')
+# define c3__dgtg c3_s4('d','g','t','g')
+# define c3__dgtr c3_s4('d','g','t','r')
+# define c3__dice c3_s4('d','i','c','e')
+# define c3__die c3_s3('d','i','e')
+# define c3__dill c3_s4('d','i','l','l')
+# define c3__dire c3_s4('d','i','r','e')
+# define c3__dirk c3_s4('d','i','r','k')
+# define c3__dis c3_s3('d','i','s')
+# define c3__dish c3_s4('d','i','s','h')
+# define c3__disk c3_s4('d','i','s','k')
+# define c3__div c3_s3('d','i','v')
+# define c3__dmal c3_s4('d','m','a','l')
+# define c3__do c3_s2('d','o')
+# define c3__doc c3_s3('d','o','c')
+# define c3__dock c3_s4('d','o','c','k')
+# define c3__docs c3_s4('d','o','c','s')
+# define c3__dogo c3_s4('d','o','g','o')
+# define c3__dojo c3_s4('d','o','j','o')
+# define c3__dome c3_s4('d','o','m','e')
+# define c3__done c3_s4('d','o','n','e')
+# define c3__doom c3_s4('d','o','o','m')
+# define c3__door c3_s4('d','o','o','r')
+# define c3__dorn c3_s4('d','o','r','n')
+# define c3__dost c3_s4('d','o','s','t')
+# define c3__dot c3_s3('d','o','t')
+# define c3__doze c3_s4('d','o','z','e')
+# define c3__drag c3_s4('d','r','a','g')
+# define c3__draz c3_s4('d','r','a','z')
+# define c3__drib c3_s4('d','r','i','b')
+# define c3__drol c3_s4('d','r','o','l')
+# define c3__dron c3_s4('d','r','o','n')
+# define c3__drop c3_s4('d','r','o','p')
+# define c3__drun c3_s4('d','r','u','n')
+# define c3__dry c3_s3('d','r','y')
+# define c3__dtbn c3_s4('d','t','b','n')
+# define c3__dtcs c3_s4('d','t','c','s')
+# define c3__dtdt c3_s4('d','t','d','t')
+# define c3__dthx c3_s4('d','t','h','x')
+# define c3__dtkt c3_s4('d','t','k','t')
+# define c3__dtlc c3_s4('d','t','l','c')
+# define c3__dtls c3_s4('d','t','l','s')
+# define c3__dtpd c3_s4('d','t','p','d')
+# define c3__dtps c3_s4('d','t','p','s')
+# define c3__dtpt c3_s4('d','t','p','t')
+# define c3__dtrt c3_s4('d','t','r','t')
+# define c3__dtsg c3_s4('d','t','s','g')
+# define c3__dttg c3_s4('d','t','t','g')
+# define c3__dttr c3_s4('d','t','t','r')
+# define c3__dtts c3_s4('d','t','t','s')
+# define c3__dtwt c3_s4('d','t','w','t')
+# define c3__dtzy c3_s4('d','t','z','y')
+# define c3__dtzz c3_s4('d','t','z','z')
+# define c3__dub c3_s3('d','u','b')
+# define c3__duct c3_s4('d','u','c','t')
+# define c3__duke c3_s4('d','u','k','e')
+# define c3__dumb c3_s4('d','u','m','b')
+# define c3__dump c3_s4('d','u','m','p')
+# define c3__dust c3_s4('d','u','s','t')
+# define c3__dxkt c3_s4('d','x','k','t')
+# define c3__e c3_s1('e')
+# define c3__earl c3_s4('e','a','r','l')
+# define c3__east c3_s4('e','a','s','t')
+# define c3__echo c3_s4('e','c','h','o')
+# define c3__edge c3_s4('e','d','g','e')
+# define c3__edit c3_s4('e','d','i','t')
+# define c3__elm c3_s3('e','l','m')
+# define c3__else c3_s4('e','l','s','e')
+# define c3__emph c3_s4('e','m','p','h')
+# define c3__end c3_s3('e','n','d')
+# define c3__eq c3_s2('e','q')
+# define c3__ergo c3_s4('e','r','g','o')
+# define c3__esh c3_s3('e','s','h')
+# define c3__etch c3_s4('e','t','c','h')
+# define c3__eval c3_s4('e','v','a','l')
+# define c3__evil c3_s4('e','v','i','l')
+# define c3__ex c3_s2('e','x')
+# define c3__exit c3_s4('e','x','i','t')
+# define c3__eyre c3_s4('e','y','r','e')
+# define c3__f c3_s1('f')
+# define c3__f32 c3_s3('f','3','2')
+# define c3__f64 c3_s3('f','6','4')
+# define c3__fx c3_s2('f','x')
+# define c3__fab c3_s3('f','a','b')
+# define c3__face c3_s4('f','a','c','e')
+# define c3__fail c3_s4('f','a','i','l')
+# define c3__fair c3_s4('f','a','i','r')
+# define c3__fake c3_s4('f','a','k','e')
+# define c3__fan c3_s3('f','a','n')
+# define c3__farg c3_s4('f','a','r','g')
+# define c3__fast c3_s4('f','a','s','t')
+# define c3__fdec c3_s4('f','d','e','c')
+# define c3__felk c3_s4('f','e','l','k')
+# define c3__feng c3_s4('f','e','n','g')
+# define c3__fent c3_s4('f','e','n','t')
+# define c3__ferd c3_s4('f','e','r','d')
+# define c3__fhex c3_s4('f','h','e','x')
+# define c3__file c3_s4('f','i','l','e')
+# define c3__film c3_s4('f','i','l','m')
+# define c3__find c3_s4('f','i','n','d')
+# define c3__fine c3_s4('f','i','n','e')
+# define c3__fing c3_s4('f','i','n','g')
+# define c3__fink c3_s4('f','i','n','k')
+# define c3__fino c3_s4('f','i','n','o')
+# define c3__fir c3_s3('f','i','r')
+# define c3__fire c3_s4('f','i','r','e')
+# define c3__firm c3_s4('f','i','r','m')
+# define c3__fish c3_s4('f','i','s','h')
+# define c3__fist c3_s4('f','i','s','t')
+# define c3__fit c3_s3('f','i','t')
+# define c3__fits c3_s4('f','i','t','s')
+# define c3__fix c3_s3('f','i','x')
+# define c3__fixp c3_s3('f','i','x','p')
+# define c3__fl c3_s2('f','l')
+# define c3__flac c3_s4('f','l','a','c')
+# define c3__flag c3_s4('f','l','a','g')
+# define c3__flat c3_s4('f','l','a','t')
+# define c3__flec c3_s4('f','l','e','c')
+# define c3__flet c3_s4('f','l','e','t')
+# define c3__flic c3_s4('f','l','i','c')
+# define c3__flip c3_s4('f','l','i','p')
+# define c3__flit c3_s4('f','l','i','t')
+# define c3__flog c3_s4('f','l','o','g')
+# define c3__flot c3_s4('f','l','o','t')
+# define c3__flow c3_s4('f','l','o','w')
+# define c3__fon c3_s3('f','o','n')
+# define c3__fond c3_s4('f','o','n','d')
+# define c3__for c3_s3('f','o','r')
+# define c3__forb c3_s4('f','o','r','b')
+# define c3__fore c3_s4('f','o','r','e')
+# define c3__fork c3_s4('f','o','r','k')
+# define c3__form c3_s4('f','o','r','m')
+# define c3__forq c3_s4('f','o','r','q')
+# define c3__foul c3_s4('f','o','u','l')
+# define c3__frag c3_s4('f','r','a','g')
+# define c3__free c3_s4('f','r','e','e')
+# define c3__frez c3_s4('f','r','e','z')
+# define c3__frit c3_s4('f','r','i','t')
+# define c3__frog c3_s4('f','r','o','g')
+# define c3__from c3_s4('f','r','o','m')
+# define c3__fron c3_s4('f','r','o','n')
+# define c3__fry c3_s3('f','r','y')
+# define c3__fuge c3_s4('f','u','g','e')
+# define c3__full c3_s4('f','u','l','l')
+# define c3__fume c3_s4('f','u','m','e')
+# define c3__fun c3_s3('f','u','n')
+# define c3__fund c3_s4('f','u','n','d')
+# define c3__fung c3_s4('f','u','n','g')
+# define c3__funk c3_s4('f','u','n','k')
+# define c3__fuse c3_s4('f','u','s','e')
+# define c3__fuss c3_s4('f','u','s','s')
+# define c3__fyrd c3_s4('f','y','r','d')
+# define c3__gab c3_s3('g','a','b')
+# define c3__galb c3_s4('g','a','l','b')
+# define c3__gald c3_s4('g','a','l','d')
+# define c3__galk c3_s4('g','a','l','k')
+# define c3__game c3_s4('g','a','m','e')
+# define c3__gamp c3_s4('g','a','m','p')
+# define c3__gant c3_s4('g','a','n','t')
+# define c3__garc c3_s4('g','a','r','c')
+# define c3__gate c3_s4('g','a','t','e')
+# define c3__gath c3_s4('g','a','t','h')
+# define c3__ge c3_s2('g','e')
+# define c3__gear c3_s4('g','e','a','r')
+# define c3__gen c3_s3('g','e','n')
+# define c3__gene c3_s4('g','e','n','e')
+# define c3__germ c3_s4('g','e','r','m')
+# define c3__gent c3_s4('g','e','n','t')
+# define c3__get c3_s3('g','e','t')
+# define c3__give c3_s4('g','i','v','e')
+# define c3__glax c3_s4('g','l','a','x')
+# define c3__glaz c3_s4('g','l','a','z')
+# define c3__gleb c3_s4('g','l','e','b')
+# define c3__glem c3_s4('g','l','e','m')
+# define c3__glid c3_s4('g','l','i','d')
+# define c3__glon c3_s4('g','l','o','n')
+# define c3__glop c3_s4('g','l','o','p')
+# define c3__gluc c3_s4('g','l','u','c')
+# define c3__glue c3_s4('g','l','u','e')
+# define c3__gnom c3_s4('g','n','o','m')
+# define c3__gnum c3_s4('g','n','u','m')
+# define c3__go c3_s2('g','o')
+# define c3__goat c3_s4('g','o','a','t')
+# define c3__gold c3_s4('g','o','l','d')
+# define c3__good c3_s4('g','o','o','d')
+# define c3__gorm c3_s4('g','o','r','m')
+# define c3__goto c3_s4('g','o','t','o')
+# define c3__grab c3_s4('g','r','a','b')
+# define c3__grad c3_s4('g','r','a','d')
+# define c3__gram c3_s4('g','r','a','m')
+# define c3__gran c3_s4('g','r','a','n')
+# define c3__grat c3_s4('g','r','a','t')
+# define c3__gray c3_s4('g','r','a','y')
+# define c3__grel c3_s4('g','r','e','l')
+# define c3__gret c3_s4('g','r','e','t')
+# define c3__grik c3_s4('g','r','i','k')
+# define c3__gril c3_s4('g','r','i','l')
+# define c3__grip c3_s4('g','r','i','p')
+# define c3__grit c3_s4('g','r','i','t')
+# define c3__griv c3_s4('g','r','i','v')
+# define c3__grix c3_s4('g','r','i','x')
+# define c3__grop c3_s4('g','r','o','p')
+# define c3__grun c3_s4('g','r','u','n')
+# define c3__gt c3_s2('g','t')
+# define c3__gulf c3_s4('g','u','l','f')
+# define c3__gull c3_s4('g','u','l','l')
+# define c3__gult c3_s4('g','u','l','t')
+# define c3__gund c3_s4('g','u','n','d')
+# define c3__gunn c3_s4('g','u','n','n')
+# define c3__hack c3_s4('h','a','c','k')
+# define c3__hail c3_s4('h','a','i','l')
+# define c3__hair c3_s4('h','a','i','r')
+# define c3__hake c3_s4('h','a','k','e')
+# define c3__halc c3_s4('h','a','l','c')
+# define c3__hand c3_s4('h','a','n','d')
+# define c3__hang c3_s4('h','a','n','g')
+# define c3__hard c3_s4('h','a','r','d')
+# define c3__harm c3_s4('h','a','r','m')
+# define c3__harp c3_s4('h','a','r','p')
+# define c3__have c3_s4('h','a','v','e')
+# define c3__head c3_s4('h','e','a','d')
+# define c3__heal c3_s4('h','e','a','l')
+# define c3__hear c3_s4('h','e','a','r')
+# define c3__heer c3_s4('h','e','e','r')
+# define c3__hela c3_s4('h','e','l','a')
+# define c3__helm c3_s4('h','e','l','m')
+# define c3__helo c3_s4('h','e','l','o')
+# define c3__help c3_s4('h','e','l','p')
+# define c3__hep c3_s3('h','e','p')
+# define c3__hept c3_s4('h','e','p','t')
+# define c3__herb c3_s4('h','e','r','b')
+# define c3__hevy c3_s4('h','e','v','y')
+# define c3__hez c3_s3('h','e','z')
+# define c3__hide c3_s4('h','i','d','e')
+# define c3__high c3_s4('h','i','g','h')
+# define c3__hike c3_s4('h','i','k','e')
+# define c3__hill c3_s4('h','i','l','l')
+# define c3__hind c3_s4('h','i','n','d')
+# define c3__hint c3_s4('h','i','n','t')
+# define c3__hit c3_s3('h','i','t')
+# define c3__hmac c3_s4('h','m','a','c')
+# define c3__hmal c3_s4('h','m','a','l')
+# define c3__hold c3_s4('h','o','l','d')
+# define c3__hole c3_s4('h','o','l','e')
+# define c3__holt c3_s4('h','o','l','t')
+# define c3__home c3_s4('h','o','m','e')
+# define c3__homp c3_s4('h','o','m','p')
+# define c3__hook c3_s4('h','o','o','k')
+# define c3__hoon c3_s4('h','o','o','n')
+# define c3__hoot c3_s4('h','o','o','t')
+# define c3__hop c3_s3('h','o','p')
+# define c3__hosc c3_s4('h','o','s','c')
+# define c3__hose c3_s4('h','o','s','e')
+# define c3__hrul c3_s4('h','r','u','l')
+# define c3__hsbn c3_s4('h','s','b','n')
+# define c3__hsbr c3_s4('h','s','b','r')
+# define c3__hscn c3_s4('h','s','c','n')
+# define c3__hsdg c3_s4('h','s','d','g')
+# define c3__hskt c3_s4('h','s','k','t')
+# define c3__hslc c3_s4('h','s','l','c')
+# define c3__hsmt c3_s4('h','s','m','t')
+# define c3__hspm c3_s4('h','s','p','m')
+# define c3__hssg c3_s4('h','s','s','g')
+# define c3__hstr c3_s4('h','s','t','r')
+# define c3__hsts c3_s4('h','s','t','s')
+# define c3__htcn c3_s4('h','t','c','n')
+# define c3__htls c3_s4('h','t','l','s')
+# define c3__html c3_s4('h','t','m','l')
+# define c3__htmt c3_s4('h','t','m','t')
+# define c3__http c3_s4('h','t','t','p')
+# define c3__hume c3_s4('h','u','m','e')
+# define c3__hunk c3_s4('h','u','n','k')
+# define c3__hxgl c3_s4('h','x','g','l')
+# define c3__hxgr c3_s4('h','x','g','r')
+# define c3__hxtr c3_s4('h','x','t','r')
+# define c3__hxts c3_s4('h','x','t','s')
+# define c3__i c3_s1('i')
+# define c3__i32 c3_s3('i','3','2')
+# define c3__i64 c3_s3('i','6','4')
+# define c3__ic c3_s2('i','c')
+# define c3__ice c3_s3('i','c','e')
+# define c3__iced c3_s4('i','c','e','d')
+# define c3__id c3_s2('i','d')
+# define c3__idle c3_s4('i','d','l','e')
+# define c3__if c3_s2('i','f')
+# define c3__ifix c3_s4('i','f','i','x')
+# define c3__in c3_s2('i','n')
+# define c3__inc c3_s3('i','n','c')
+# define c3__info c3_s4('i','n','f','o')
+# define c3__init c3_s4('i','n','i','t')
+# define c3__ins c3_s3('i','n','s')
+# define c3__int2 c3_s4('i','n','t','2')
+# define c3__into c3_s4('i','n','t','o')
+# define c3__intr c3_s4('i','n','t','r')
+# define c3__inuk c3_s4('i','n','u','k')
+# define c3__ipv4 c3_s4('i','p','v','4')
+# define c3__iron c3_s4('i','r','o','n')
+# define c3__is c3_s2('i','s')
+# define c3__item c3_s4('i','t','e','m')
+# define c3__ix c3_s2('i','x')
+# define c3__i754 c3_s4('i','7','5','4')
+# define c3__j c3_s1('j')
+# define c3__jack c3_s4('j','a','c','k')
+# define c3__jam c3_s3('j','a','m')
+# define c3__jamx c3_s4('j','a','m','x')
+# define c3__jamz c3_s4('j','a','m','z')
+# define c3__jato c3_s4('j','a','t','o')
+# define c3__jet c3_s3('j','e','t')
+# define c3__jetd c3_s4('j','e','t','d')
+# define c3__just c3_s4('j','u','s','t')
+# define c3__k c3_s1('k')
+# define c3__khan c3_s4('k','h','a','n')
+# define c3__keep c3_s4('k','e','e','p')
+# define c3__kern c3_s4('k','e','r','n')
+# define c3__key c3_s3('k','e','y')
+# define c3__kgo c3_s3('k','g','o')
+# define c3__kick c3_s4('k','i','c','k')
+# define c3__king c3_s4('k','i','n','g')
+# define c3__kit c3_s3('k','i','t')
+# define c3__klr c3_s3('k','l','r')
+# define c3__knit c3_s4('k','n','i','t')
+# define c3__kno c3_s3('k','n','o')
+# define c3__ktbc c3_s4('k','t','b','c')
+# define c3__ktbn c3_s4('k','t','b','n')
+# define c3__ktbr c3_s4('k','t','b','r')
+# define c3__ktcb c3_s4('k','t','c','b')
+# define c3__ktcl c3_s4('k','t','c','l')
+# define c3__ktcn c3_s4('k','t','c','n')
+# define c3__ktcs c3_s4('k','t','c','s')
+# define c3__ktdg c3_s4('k','t','d','g')
+# define c3__ktdl c3_s4('k','t','d','l')
+# define c3__ktdp c3_s4('k','t','d','p')
+# define c3__ktdt c3_s4('k','t','d','t')
+# define c3__ktgl c3_s4('k','t','g','l')
+# define c3__ktgr c3_s4('k','t','g','r')
+# define c3__kthp c3_s4('k','t','h','p')
+# define c3__kthx c3_s4('k','t','h','x')
+# define c3__ktlc c3_s4('k','t','l','c')
+# define c3__ktld c3_s4('k','t','l','d')
+# define c3__ktls c3_s4('k','t','l','s')
+# define c3__ktms c3_s4('k','t','m','s')
+# define c3__ktmt c3_s4('k','t','m','t')
+# define c3__ktnp c3_s4('k','t','n','p')
+# define c3__ktpd c3_s4('k','t','p','d')
+# define c3__ktpm c3_s4('k','t','p','m')
+# define c3__ktps c3_s4('k','t','p','s')
+# define c3__ktpt c3_s4('k','t','p','t')
+# define c3__ktrt c3_s4('k','t','r','t')
+# define c3__ktsg c3_s4('k','t','s','g')
+# define c3__ktsp c3_s4('k','t','s','p')
+# define c3__kttg c3_s4('k','t','t','g')
+# define c3__kttr c3_s4('k','t','t','r')
+# define c3__ktts c3_s4('k','t','t','s')
+# define c3__ktwt c3_s4('k','t','w','t')
+# define c3__ktzp c3_s4('k','t','z','p')
+# define c3__l c3_s1('l')
+# define c3__lamb c3_s4('l','a','m','b')
+# define c3__lame c3_s4('l','a','m','e')
+# define c3__lang c3_s4('l','a','n','g')
+# define c3__lask c3_s4('l','a','s','k')
+# define c3__last c3_s4('l','a','s','t')
+# define c3__lcdl c3_s4('l','c','d','l')
+# define c3__lcdp c3_s4('l','c','d','p')
+# define c3__lcld c3_s4('l','c','l','d')
+# define c3__lcnp c3_s4('l','c','n','p')
+# define c3__lcpd c3_s4('l','c','p','d')
+# define c3__lcps c3_s4('l','c','p','s')
+# define c3__lcsp c3_s4('l','c','s','p')
+# define c3__le c3_s2('l','e')
+# define c3__lead c3_s4('l','e','a','d')
+# define c3__leaf c3_s4('l','e','a','f')
+# define c3__leap c3_s4('l','e','a','p')
+# define c3__lect c3_s4('l','e','c','t')
+# define c3__lee c3_s3('l','e','e')
+# define c3__leg c3_s3('l','e','g')
+# define c3__lest c3_s4('l','e','s','t')
+# define c3__lg c3_s2('l','g')
+# define c3__lib c3_s3('l','i','b')
+# define c3__libd c3_s4('l','i','b','d')
+# define c3__lick c3_s4('l','i','c','k')
+# define c3__life c3_s4('l','i','f','e')
+# define c3__lift c3_s4('l','i','f','t')
+# define c3__like c3_s4('l','i','k','e')
+# define c3__limb c3_s4('l','i','m','b')
+# define c3__lin c3_s3('l','i','n')
+# define c3__line c3_s4('l','i','n','e')
+# define c3__link c3_s4('l','i','n','k')
+# define c3__lint c3_s4('l','i','n','t')
+# define c3__liqd c3_s4('l','i','q','d')
+# define c3__lisc c3_s4('l','i','s','c')
+# define c3__list c3_s4('l','i','s','t')
+# define c3__lite c3_s4('l','i','t','e')
+# define c3__live c3_s4('l','i','v','e')
+# define c3__load c3_s4('l','o','a','d')
+# define c3__loaf c3_s4('l','o','a','f')
+# define c3__log c3_s3('l','o','g')
+# define c3__logo c3_s4('l','o','g','o')
+# define c3__lome c3_s4('l','o','m','e')
+# define c3__lond c3_s4('l','o','n','d')
+# define c3__lonk c3_s4('l','o','n','k')
+# define c3__look c3_s4('l','o','o','k')
+# define c3__loom c3_s4('l','o','o','m')
+# define c3__loop c3_s4('l','o','o','p')
+# define c3__lorb c3_s4('l','o','r','b')
+# define c3__lord c3_s4('l','o','r','d')
+# define c3__lort c3_s4('l','o','r','t')
+# define c3__lose c3_s4('l','o','s','e')
+# define c3__loss c3_s4('l','o','s','s')
+# define c3__lost c3_s4('l','o','s','t')
+# define c3__low c3_s3('l','o','w')
+# define c3__lsh c3_s3('l','s','h')
+# define c3__lt c3_s2('l','t')
+# define c3__lull c3_s4('l','u','l','l')
+# define c3__lunt c3_s4('l','u','n','t')
+# define c3__m c3_s1('m')
+# define c3__mx c3_s2('m','x')
+# define c3__mach c3_s4('m','a','c','h')
+# define c3__mack c3_s4('m','a','c','k')
+# define c3__made c3_s4('m','a','d','e')
+# define c3__main c3_s4('m','a','i','n')
+# define c3__make c3_s4('m','a','k','e')
+# define c3__malg c3_s4('m','a','l','g')
+# define c3__malk c3_s4('m','a','l','k')
+# define c3__mang c3_s4('m','a','n','g')
+# define c3__many c3_s4('m','a','n','y')
+# define c3__map c3_s3('m','a','p')
+# define c3__marg c3_s4('m','a','r','g')
+# define c3__mark c3_s4('m','a','r','k')
+# define c3__marn c3_s4('m','a','r','n')
+# define c3__mash c3_s4('m','a','s','h')
+# define c3__mass c3_s4('m','a','s','s')
+# define c3__mast c3_s4('m','a','s','t')
+# define c3__mate c3_s4('m','a','t','e')
+# define c3__mave c3_s4('m','a','v','e')
+# define c3__mean c3_s4('m','e','a','n')
+# define c3__mega c3_s4('m','e','g','a')
+# define c3__meh c3_s3('m','e','h')
+# define c3__meld c3_s4('m','e','l','d')
+# define c3__melt c3_s4('m','e','l','t')
+# define c3__meme c3_s4('m','e','m','e')
+# define c3__memo c3_s4('m','e','m','o')
+# define c3__menu c3_s4('m','e','n','u')
+# define c3__mesa c3_s4('m','e','s','a')
+# define c3__mesh c3_s4('m','e','s','h')
+# define c3__mess c3_s4('m','e','s','s')
+# define c3__mess_ser c3_s8('m','e','s','s','-', 's', 'e','r')
+# define c3__met c3_s3('m','e','t')
+# define c3__meta c3_s4('m','e','t','a')
+# define c3__mill c3_s4('m','i','l','l')
+# define c3__mime c3_s4('m','i','m','e')
+# define c3__mine c3_s4('m','i','n','e')
+# define c3__mint c3_s4('m','i','n','t')
+# define c3__mirt c3_s4('m','i','r','t')
+# define c3__miss c3_s4('m','i','s','s')
+# define c3__mix c3_s3('m','i','x')
+# define c3__moat c3_s4('m','o','a','t')
+# define c3__mod c3_s3('m','o','d')
+# define c3__mold c3_s4('m','o','l','d')
+# define c3__mong c3_s4('m','o','n','g')
+# define c3__mono c3_s4('m','o','n','o')
+# define c3__mook c3_s4('m','o','o','k')
+# define c3__moot c3_s4('m','o','o','t')
+# define c3__mor c3_s3('m','o','r')
+# define c3__move c3_s4('m','o','v','e')
+# define c3__moze c3_s4('m','o','z','e')
+# define c3__mtbn c3_s4('m','t','b','n')
+# define c3__mtbr c3_s4('m','t','b','r')
+# define c3__mtdg c3_s4('m','t','d','g')
+# define c3__mtdp c3_s4('m','t','d','p')
+# define c3__mtdt c3_s4('m','t','d','t')
+# define c3__mtkt c3_s4('m','t','k','t')
+# define c3__mtlc c3_s4('m','t','l','c')
+# define c3__mtnp c3_s4('m','t','n','p')
+# define c3__mtpd c3_s4('m','t','p','d')
+# define c3__mtps c3_s4('m','t','p','s')
+# define c3__mtrt c3_s4('m','t','r','t')
+# define c3__mtsg c3_s4('m','t','s','g')
+# define c3__mtsp c3_s4('m','t','s','p')
+# define c3__mttg c3_s4('m','t','t','g')
+# define c3__mttr c3_s4('m','t','t','r')
+# define c3__mul c3_s3('m','u','l')
+# define c3__mull c3_s4('m','u','l','l')
+# define c3__mung c3_s4('m','u','n','g')
+# define c3__mut c3_s3('m','u','t')
+# define c3__n c3_s1('n')
+# define c3__na c3_s2('n','a')
+# define c3__nail c3_s4('n','a','i','l')
+# define c3__name c3_s4('n','a','m','e')
+# define c3__nap c3_s3('n','a','p')
+# define c3__nara c3_s4('n','a','r','a')
+# define c3__narv c3_s4('n','a','r','v')
+# define c3__ne c3_s2('n','e')
+# define c3__need c3_s4('n','e','e','d')
+# define c3__neft c3_s4('n','e','f','t')
+# define c3__nel c3_s3('n','e','l')
+# define c3__nest c3_s4('n','e','s','t')
+# define c3__netd c3_s4('n','e','t','d')
+# define c3__new c3_s3('n','e','w')
+# define c3__news c3_s4('n','e','w','s')
+# define c3__newt c3_s4('n','e','w','t')
+# define c3__next c3_s4('n','e','x','t')
+# define c3__nich c3_s4('n','i','c','h')
+# define c3__nick c3_s4('n','i','c','k')
+# define c3__nil c3_s3('n','i','l')
+# define c3__nilk c3_s4('n','i','l','k')
+# define c3__no c3_s2('n','o')
+# define c3__noah c3_s4('n','o','a','h')
+# define c3__nock c3_s4('n','o','c','k')
+# define c3__noco c3_s4('n','o','c','o')
+# define c3__nodo c3_s4('n','o','d','o')
+# define c3__none c3_s4('n','o','n','e')
+# define c3__noop c3_s4('n','o','o','p')
+# define c3__nop c3_s3('n','o','p')
+# define c3__norm c3_s4('n','o','r','m')
+# define c3__nost c3_s4('n','o','s','t')
+# define c3__not c3_s3('n','o','t')
+# define c3__note c3_s4('n','o','t','e')
+# define c3__noun c3_s4('n','o','u','n')
+# define c3__nt c3_s2('n','t')
+# define c3__nub c3_s3('n','u','b')
+# define c3__null c3_s4('n','u','l','l')
+# define c3__nz c3_s2('n','z')
+# define c3__o c3_s1('o')
+# define c3__oak c3_s3('o','a','k')
+# define c3__of c3_s2('o','f')
+# define c3__off c3_s3('o','f','f')
+# define c3__ogre c3_s4('o','g','r','e')
+# define c3__old c3_s3('o','l','d')
+# define c3__omen c3_s4('o','m','e','n')
+# define c3__omit c3_s4('o','m','i','t')
+# define c3__on c3_s2('o','n')
+# define c3__onan c3_s4('o','n','a','n')
+# define c3__once c3_s4('o','n','c','e')
+# define c3__one c3_s3('o','n','e')
+# define c3__only c3_s4('o','n','l','y')
+# define c3__oops c3_s4('o','o','p','s')
+# define c3__op c3_s2('o','p')
+# define c3__open c3_s4('o','p','e','n')
+# define c3__opts c3_s4('o','p','t','s')
+# define c3__or c3_s2('o','r')
+# define c3__ord c3_s3('o','r','d')
+# define c3__orth c3_s4('o','r','t','h')
+# define c3__oust c3_s4('o','u','s','t')
+# define c3__outd c3_s4('o','u','t','d')
+# define c3__ov c3_s2('o','v')
+# define c3__over c3_s4('o','v','e','r')
+# define c3__ovum c3_s4('o','v','u','m')
+# define c3__p c3_s1('p')
+# define c3__pack c3_s4('p','a','c','k')
+# define c3__pact c3_s4('p','a','c','t')
+# define c3__page c3_s4('p','a','g','e')
+# define c3__pair c3_s4('p','a','i','r')
+# define c3__palm c3_s4('p','a','l','m')
+# define c3__palq c3_s4('p','a','l','q')
+# define c3__palt c3_s4('p','a','l','t')
+# define c3__pan c3_s3('p','a','n')
+# define c3__pane c3_s4('p','a','n','e')
+# define c3__pang c3_s4('p','a','n','g')
+# define c3__pank c3_s4('p','a','n','k')
+# define c3__para c3_s4('p','a','r','a')
+# define c3__park c3_s4('p','a','r','k')
+# define c3__parq c3_s4('p','a','r','q')
+# define c3__part c3_s4('p','a','r','t')
+# define c3__pass c3_s4('p','a','s','s')
+# define c3__past c3_s4('p','a','s','t')
+# define c3__pawn c3_s4('p','a','w','n')
+# define c3__peek c3_s4('p','e','e','k')
+# define c3__peel c3_s4('p','e','e','l')
+# define c3__peep c3_s4('p','e','e','p')
+# define c3__peft c3_s4('p','e','f','t')
+# define c3__peg c3_s3('p','e','g')
+# define c3__peld c3_s4('p','e','l','d')
+# define c3__pen c3_s3('p','e','n')
+# define c3__per c3_s3('p','e','r')
+# define c3__perd c3_s4('p','e','r','d')
+# define c3__pesk c3_s4('p','e','s','k')
+# define c3__pfix c3_s4('p','f','i','x')
+# define c3__pick c3_s4('p','i','c','k')
+# define c3__pier c3_s4('p','i','e','r')
+# define c3__pike c3_s4('p','i','k','e')
+# define c3__pile c3_s4('p','i','l','e')
+# define c3__pill c3_s4('p','i','l','l')
+# define c3__ping c3_s4('p','i','n','g')
+# define c3__pink c3_s4('p','i','n','k')
+# define c3__pip c3_s3('p','i','p')
+# define c3__pipe c3_s4('p','i','p','e')
+# define c3__pith c3_s4('p','i','t','h')
+# define c3__pitt c3_s4('p','i','t','t')
+# define c3__plac c3_s4('p','l','a','c')
+# define c3__plam c3_s4('p','l','a','m')
+# define c3__plat c3_s4('p','l','a','t')
+# define c3__play c3_s4('p','l','a','y')
+# define c3__plaz c3_s4('p','l','a','z')
+# define c3__plem c3_s4('p','l','e','m')
+# define c3__plet c3_s4('p','l','e','t')
+# define c3__plic c3_s4('p','l','i','c')
+# define c3__plin c3_s4('p','l','i','n')
+# define c3__plom c3_s4('p','l','o','m')
+# define c3__plov c3_s4('p','l','o','v')
+# define c3__plug c3_s4('p','l','u','g')
+# define c3__plus c3_s4('p','l','u','s')
+# define c3__pmbn c3_s4('p','m','b','n')
+# define c3__pmcl c3_s4('p','m','c','l')
+# define c3__pmcn c3_s4('p','m','c','n')
+# define c3__pmdg c3_s4('p','m','d','g')
+# define c3__pmdp c3_s4('p','m','d','p')
+# define c3__pmdt c3_s4('p','m','d','t')
+# define c3__pmlc c3_s4('p','m','l','c')
+# define c3__pmls c3_s4('p','m','l','s')
+# define c3__pmms c3_s4('p','m','m','s')
+# define c3__pmmt c3_s4('p','m','m','t')
+# define c3__pmpd c3_s4('p','m','p','d')
+# define c3__pmps c3_s4('p','m','p','s')
+# define c3__pmsp c3_s4('p','m','s','p')
+# define c3__pmtr c3_s4('p','m','t','r')
+# define c3__pmts c3_s4('p','m','t','s')
+# define c3__pmzp c3_s4('p','m','z','p')
+# define c3__pnut c3_s4('p','n','u','t')
+# define c3__pock c3_s4('p','o','c','k')
+# define c3__poke c3_s4('p','o','k','e')
+# define c3__poll c3_s4('p','o','l','l')
+# define c3__poly c3_s4('p','o','l','y')
+# define c3__pont c3_s4('p','o','n','t')
+# define c3__poos c3_s4('p','o','o','s')
+# define c3__pop c3_s3('p','o','p')
+# define c3__port c3_s4('p','o','r','t')
+# define c3__pos c3_s3('p','o','s')
+# define c3__pose c3_s4('p','o','s','e')
+# define c3__post c3_s4('p','o','s','t')
+# define c3__pray c3_s4('p','r','a','y')
+# define c3__prec c3_s4('p','r','e','c')
+# define c3__prep c3_s4('p','r','e','p')
+# define c3__pret c3_s4('p','r','e','t')
+# define c3__prex c3_s4('p','r','e','x')
+# define c3__pril c3_s4('p','r','i','l')
+# define c3__pro c3_s3('p','r','o')
+# define c3__prod c3_s4('p','r','o','d')
+# define c3__prop c3_s4('p','r','o','p')
+# define c3__prof c3_s4('p','r','o','f')
+# define c3__prox c3_s4('p','r','o','x')
+# define c3__psdg c3_s4('p','s','d','g')
+# define c3__puck c3_s4('p','u','c','k')
+# define c3__pull c3_s4('p','u','l','l')
+# define c3__pult c3_s4('p','u','l','t')
+# define c3__pung c3_s4('p','u','n','g')
+# define c3__punk c3_s4('p','u','n','k')
+# define c3__punt c3_s4('p','u','n','t')
+# define c3__pure c3_s4('p','u','r','e')
+# define c3__purr c3_s4('p','u','r','r')
+# define c3__push c3_s4('p','u','s','h')
+# define c3__put c3_s3('p','u','t')
+# define c3__quac c3_s4('q','u','a','c')
+# define c3__quic c3_s4('q','u','i','c')
+# define c3__qual c3_s4('q','u','a','l')
+# define c3__quat c3_s4('q','u','a','t')
+# define c3__quax c3_s4('q','u','a','x')
+# define c3__quem c3_s4('q','u','e','m')
+# define c3__ques c3_s4('q','u','e','s')
+# define c3__quet c3_s4('q','u','e','t')
+# define c3__queu c3_s4('q','u','e','u')
+# define c3__quid c3_s4('q','u','i','d')
+# define c3__quil c3_s4('q','u','i','l')
+# define c3__quix c3_s4('q','u','i','x')
+# define c3__quiz c3_s4('q','u','i','z')
+# define c3__quol c3_s4('q','u','o','l')
+# define c3__quop c3_s4('q','u','o','p')
+# define c3__rack c3_s4('r','a','c','k')
+# define c3__rald c3_s4('r','a','l','d')
+# define c3__ramp c3_s4('r','a','m','p')
+# define c3__rand c3_s4('r','a','n','d')
+# define c3__rasp c3_s4('r','a','s','p')
+# define c3__raw c3_s3('r','a','w')
+# define c3__read c3_s4('r','e','a','d')
+# define c3__real c3_s4('r','e','a','l')
+# define c3__reck c3_s4('r','e','c','k')
+# define c3__redo c3_s4('r','e','d','o')
+# define c3__reef c3_s4('r','e','e','f')
+# define c3__resd c3_s4('r','e','s','d')
+# define c3__rest c3_s4('r','e','s','t')
+# define c3__ret c3_s3('r','e','t')
+# define c3__revo c3_s4('r','e','v','o')
+# define c3__rez c3_s3('r','e','z')
+# define c3__rin c3_s3('r','i','n')
+# define c3__ring c3_s4('r','i','n','g')
+# define c3__ripe c3_s4('r','i','p','e')
+# define c3__rite c3_s4('r','i','t','e')
+# define c3__rock c3_s4('r','o','c','k')
+# define c3__roll c3_s4('r','o','l','l')
+# define c3__rolp c3_s4('r','o','l','p')
+# define c3__rond c3_s4('r','o','n','d')
+# define c3__root c3_s4('r','o','o','t')
+# define c3__rose c3_s4('r','o','s','e')
+# define c3__rsh c3_s3('r','s','h')
+# define c3__rulf c3_s4('r','u','l','f')
+# define c3__run c3_s3('r','u','n')
+# define c3__s c3_s1('s')
+# define c3__safe c3_s4('s','a','f','e')
+# define c3__sag c3_s3('s','a','g')
+# define c3__sail c3_s4('s','a','i','l')
+# define c3__same c3_s4('s','a','m','e')
+# define c3__sand c3_s4('s','a','n','d')
+# define c3__sard c3_s4('s','a','r','d')
+# define c3__sav c3_s3('s','a','v')
+# define c3__save c3_s4('s','a','v','e')
+# define c3__saxo c3_s4('s','a','x','o')
+# define c3__scam c3_s4('s','c','a','m')
+# define c3__scan c3_s4('s','c','a','n')
+# define c3__scry c3_s4('s','c','r','y')
+# define c3__scsg c3_s4('s','c','s','g')
+# define c3__seal c3_s4('s','e','a','l')
+# define c3__seat c3_s4('s','e','a','t')
+# define c3__see c3_s3('s','e','e')
+# define c3__seed c3_s4('s','e','e','d')
+# define c3__seek c3_s4('s','e','e','k')
+# define c3__seft c3_s4('s','e','f','t')
+# define c3__sell c3_s4('s','e','l','l')
+# define c3__semp c3_s4('s','e','m','p')
+# define c3__send c3_s4('s','e','n','d')
+# define c3__sent c3_s4('s','e','n','t')
+# define c3__seq c3_s3('s','e','q')
+# define c3__serd c3_s4('s','e','r','d')
+# define c3__serf c3_s4('s','e','r','f')
+# define c3__set c3_s3('s','e','t')
+# define c3__sfix c3_s4('s','f','i','x')
+# define c3__sgbc c3_s4('s','g','b','c')
+# define c3__sgbn c3_s4('s','g','b','n')
+# define c3__sgbr c3_s4('s','g','b','r')
+# define c3__sgcb c3_s4('s','g','c','b')
+# define c3__sgcl c3_s4('s','g','c','l')
+# define c3__sgcn c3_s4('s','g','c','n')
+# define c3__sgdg c3_s4('s','g','d','g')
+# define c3__sgdl c3_s4('s','g','d','l')
+# define c3__sgdp c3_s4('s','g','d','p')
+# define c3__sgdt c3_s4('s','g','d','t')
+# define c3__sgdx c3_s4('s','g','d','x')
+# define c3__sgfs c3_s4('s','g','f','s')
+# define c3__sggl c3_s4('s','g','g','l')
+# define c3__sggr c3_s4('s','g','g','r')
+# define c3__sghp c3_s4('s','g','h','p')
+# define c3__sghs c3_s4('s','g','h','s')
+# define c3__sghx c3_s4('s','g','h','x')
+# define c3__sgkt c3_s4('s','g','k','t')
+# define c3__sglc c3_s4('s','g','l','c')
+# define c3__sgld c3_s4('s','g','l','d')
+# define c3__sgls c3_s4('s','g','l','s')
+# define c3__sgms c3_s4('s','g','m','s')
+# define c3__sgmt c3_s4('s','g','m','t')
+# define c3__sgpd c3_s4('s','g','p','d')
+# define c3__sgpm c3_s4('s','g','p','m')
+# define c3__sgps c3_s4('s','g','p','s')
+# define c3__sgsg c3_s4('s','g','s','g')
+# define c3__sgsp c3_s4('s','g','s','p')
+# define c3__sgts c3_s4('s','g','t','s')
+# define c3__sgwt c3_s4('s','g','w','t')
+# define c3__sgzp c3_s4('s','g','z','p')
+# define c3__shiv c3_s4('s','h','i','v')
+# define c3__show c3_s4('s','h','o','w')
+# define c3__shud c3_s4('s','h','u','d')
+# define c3__shut c3_s4('s','h','u','t')
+# define c3__sibl c3_s4('s','i','b','l')
+# define c3__sift c3_s4('s','i','f','t')
+# define c3__sign c3_s4('s','i','g','n')
+# define c3__sing c3_s4('s','i','n','g')
+# define c3__sist c3_s4('s','i','s','t')
+# define c3__site c3_s4('s','i','t','e')
+# define c3__sith c3_s4('s','i','t','h')
+# define c3__size c3_s4('s','i','z','e')
+# define c3__slam c3_s4('s','l','a','m')
+# define c3__slap c3_s4('s','l','a','p')
+# define c3__slat c3_s4('s','l','a','t')
+# define c3__slax c3_s4('s','l','a','x')
+# define c3__slem c3_s4('s','l','e','m')
+# define c3__slet c3_s4('s','l','e','t')
+# define c3__slex c3_s4('s','l','e','x')
+# define c3__slid c3_s4('s','l','i','d')
+# define c3__slip c3_s4('s','l','i','p')
+# define c3__sliv c3_s4('s','l','i','v')
+# define c3__sloc c3_s4('s','l','o','c')
+# define c3__slog c3_s4('s','l','o','g')
+# define c3__slon c3_s4('s','l','o','n')
+# define c3__slop c3_s4('s','l','o','p')
+# define c3__slos c3_s4('s','l','o','s')
+# define c3__slow c3_s4('s','l','o','w')
+# define c3__slur c3_s4('s','l','u','r')
+# define c3__slux c3_s4('s','l','u','x')
+# define c3__sm c3_s2('s','m')
+# define c3__smcl c3_s4('s','m','c','l')
+# define c3__smdq c3_s4('s','m','d','q')
+# define c3__smsg c3_s4('s','m','s','g')
+# define c3__smsm c3_s4('s','m','s','m')
+# define c3__smts c3_s4('s','m','t','s')
+# define c3__snap c3_s4('s','n','a','p')
+# define c3__so c3_s2('s','o')
+# define c3__soak c3_s4('s','o','a','k')
+# define c3__sock c3_s4('s','o','c','k')
+# define c3__soft c3_s4('s','o','f','t')
+# define c3__sole c3_s4('s','o','l','e')
+# define c3__some c3_s4('s','o','m','e')
+# define c3__sort c3_s4('s','o','r','t')
+# define c3__spal c3_s4('s','p','a','l')
+# define c3__spar c3_s4('s','p','a','r')
+# define c3__spig c3_s4('s','p','i','g')
+# define c3__spil c3_s4('s','p','i','l')
+# define c3__spin c3_s4('s','p','i','n')
+# define c3__spit c3_s4('s','p','i','t')
+# define c3__spot c3_s4('s','p','o','t')
+# define c3__stam c3_s4('s','t','a','m')
+# define c3__star c3_s4('s','t','a','r')
+# define c3__stdr c3_s4('s','t','d','r')
+# define c3__stem c3_s4('s','t','e','m')
+# define c3__step c3_s4('s','t','e','p')
+# define c3__stid c3_s4('s','t','i','d')
+# define c3__stig c3_s4('s','t','i','g')
+# define c3__stil c3_s4('s','t','i','l')
+# define c3__stiv c3_s4('s','t','i','v')
+# define c3__stix c3_s4('s','t','i','x')
+# define c3__stol c3_s4('s','t','o','l')
+# define c3__ston c3_s4('s','t','o','n')
+# define c3__stop c3_s4('s','t','o','p')
+# define c3__stub c3_s4('s','t','u','b')
+# define c3__stun c3_s4('s','t','u','n')
+# define c3__stur c3_s4('s','t','u','r')
+# define c3__sub c3_s3('s','u','b')
+# define c3__sunt c3_s4('s','u','n','t')
+# define c3__sure c3_s4('s','u','r','e')
+# define c3__susp c3_s4('s','u','s','p')
+# define c3__swap c3_s4('s','w','a','p')
+# define c3__sym c3_s3('s','y','m')
+# define c3__sync c3_s4('s','y','n','c')
+# define c3__sys c3_s3('s','y','s')
+# define c3__ta c3_s2('t','a')
+# define c3__tab c3_s3('t','a','b')
+# define c3__tack c3_s4('t','a','c','k')
+# define c3__tag c3_s3('t','a','g')
+# define c3__tail c3_s4('t','a','i','l')
+# define c3__take c3_s4('t','a','k','e')
+# define c3__talk c3_s4('t','a','l','k')
+# define c3__tame c3_s4('t','a','m','e')
+# define c3__tang c3_s4('t','a','n','g')
+# define c3__tank c3_s4('t','a','n','k')
+# define c3__tap c3_s3('t','a','p')
+# define c3__tarn c3_s4('t','a','r','n')
+# define c3__tas c3_s3('t','a','s')
+# define c3__tash c3_s4('t','a','s','h')
+# define c3__teal c3_s4('t','e','a','l')
+# define c3__teck c3_s4('t','e','c','k')
+# define c3__tell c3_s4('t','e','l','l')
+# define c3__terg c3_s4('t','e','r','g')
+# define c3__term c3_s4('t','e','r','m')
+# define c3__test c3_s4('t','e','s','t')
+# define c3__text c3_s4('t','e','x','t')
+# define c3__tgbn c3_s4('t','g','b','n')
+# define c3__tgbr c3_s4('t','g','b','r')
+# define c3__tgdg c3_s4('t','g','d','g')
+# define c3__tgdl c3_s4('t','g','d','l')
+# define c3__tgdp c3_s4('t','g','d','p')
+# define c3__tgdx c3_s4('t','g','d','x')
+# define c3__tgkt c3_s4('t','g','k','t')
+# define c3__tglc c3_s4('t','g','l','c')
+# define c3__tgld c3_s4('t','g','l','d')
+# define c3__tgmt c3_s4('t','g','m','t')
+# define c3__tgpd c3_s4('t','g','p','d')
+# define c3__tgpm c3_s4('t','g','p','m')
+# define c3__tgps c3_s4('t','g','p','s')
+# define c3__tgsp c3_s4('t','g','s','p')
+# define c3__that c3_s4('t','h','a','t')
+# define c3__thee c3_s4('t','h','e','e')
+# define c3__then c3_s4('t','h','e','n')
+# define c3__they c3_s4('t','h','e','y')
+# define c3__thin c3_s4('t','h','i','n')
+# define c3__this c3_s4('t','h','i','s')
+# define c3__thou c3_s4('t','h','o','u')
+# define c3__thud c3_s4('t','h','u','d')
+# define c3__thuo c3_s4('t','h','u','o')
+# define c3__thus c3_s4('t','h','u','s')
+# define c3__tick c3_s4('t','i','c','k')
+# define c3__time c3_s4('t','i','m','e')
+# define c3__tip c3_s3('t','i','p')
+# define c3__tmbn c3_s4('t','m','b','n')
+# define c3__tmdg c3_s4('t','m','d','g')
+# define c3__tmdp c3_s4('t','m','d','p')
+# define c3__tmlc c3_s4('t','m','l','c')
+# define c3__tmnp c3_s4('t','m','n','p')
+# define c3__tmpd c3_s4('t','m','p','d')
+# define c3__tmps c3_s4('t','m','p','s')
+# define c3__tmsg c3_s4('t','m','s','g')
+# define c3__tmsp c3_s4('t','m','s','p')
+# define c3__tmtr c3_s4('t','m','t','r')
+# define c3__to c3_s2('t','o')
+# define c3__toe c3_s3('t','o','e')
+# define c3__tome c3_s4('t','o','m','e')
+# define c3__tong c3_s4('t','o','n','g')
+# define c3__tool c3_s4('t','o','o','l')
+# define c3__top c3_s3('t','o','p')
+# define c3__toy c3_s3('t','o','y')
+# define c3__trac c3_s4('t','r','a','c')
+# define c3__tram c3_s4('t','r','a','m')
+# define c3__trap c3_s4('t','r','a','p')
+# define c3__trel c3_s4('t','r','e','l')
+# define c3__trex c3_s4('t','r','e','x')
+# define c3__trib c3_s4('t','r','i','b')
+# define c3__trim c3_s4('t','r','i','m')
+# define c3__trip c3_s4('t','r','i','p')
+# define c3__trol c3_s4('t','r','o','l')
+# define c3__trop c3_s4('t','r','o','p')
+# define c3__trup c3_s4('t','r','u','p')
+# define c3__try c3_s3('t','r','y')
+# define c3__tsbn c3_s4('t','s','b','n')
+# define c3__tsbr c3_s4('t','s','b','r')
+# define c3__tscl c3_s4('t','s','c','l')
+# define c3__tscm c3_s4('t','s','c','m')
+# define c3__tsdt c3_s4('t','s','d','t')
+# define c3__tsgl c3_s4('t','s','g','l')
+# define c3__tsgr c3_s4('t','s','g','r')
+# define c3__tshp c3_s4('t','s','h','p')
+# define c3__tshx c3_s4('t','s','h','x')
+# define c3__tsls c3_s4('t','s','l','s')
+# define c3__tsms c3_s4('t','s','m','s')
+# define c3__tssg c3_s4('t','s','s','g')
+# define c3__tstr c3_s4('t','s','t','r')
+# define c3__tub c3_s3('t','u','b')
+# define c3__tul c3_s3('t','u','l')
+# define c3__tule c3_s4('t','u','l','e')
+# define c3__tulp c3_s4('t','u','l','p')
+# define c3__tune c3_s4('t','u','n','e')
+# define c3__tung c3_s4('t','u','n','g')
+# define c3__tupl c3_s4('t','u','p','l')
+# define c3__turd c3_s4('t','u','r','d')
+# define c3__turf c3_s4('t','u','r','f')
+# define c3__turn c3_s4('t','u','r','n')
+# define c3__twig c3_s4('t','w','i','g')
+# define c3__twix c3_s4('t','w','i','x')
+# define c3__txt c3_s3('t','x','t')
+# define c3__type c3_s4('t','y','p','e')
+# define c3__u c3_s1('u')
+# define c3__ubin c3_s4('u','b','i','n')
+# define c3__ubit c3_s4('u','b','i','t')
+# define c3__ud c3_s2('u','d')
+# define c3__uint c3_s4('u','i','n','t')
+# define c3__ulib c3_s4('u','l','i','b')
+# define c3__un c3_s2('u','n')
+# define c3__uniq c3_s4('u','n','i','q')
+# define c3__unix c3_s4('u','n','i','x')
+# define c3__unt c3_s3('u','n','t')
+# define c3__unum c3_s3('u','n','u','m')
+# define c3__up c3_s2('u','p')
+# define c3__url c3_s3('u','r','l')
+# define c3__urth c3_s4('u','r','t','h')
+# define c3__use c3_s3('u','s','e')
+# define c3__ut c3_s2('u','t')
+# define c3__uv c3_s2('u','v')
+# define c3__uw c3_s2('u','w')
+# define c3__ux c3_s2('u','x')
+# define c3__v c3_s1('v')
+# define c3__vamp c3_s4('v','a','m','p')
+# define c3__vane c3_s4('v','a','n','e')
+# define c3__var c3_s3('v','a','r')
+# define c3__veal c3_s4('v','e','a','l')
+# define c3__veb c3_s3('v','e','b')
+# define c3__veck c3_s4('v','e','c','k')
+# define c3__veer c3_s4('v','e','e','r')
+# define c3__vega c3_s4('v','e','g','a')
+# define c3__velt c3_s4('v','e','l','t')
+# define c3__vent c3_s4('v','e','n','t')
+# define c3__verb c3_s4('v','e','r','b')
+# define c3__vere c3_s4('v','e','r','e')
+# define c3__veri c3_s4('v','e','r','i')
+# define c3__vern c3_s4('v','e','r','n')
+# define c3__very c3_s4('v','e','r','y')
+# define c3__view c3_s4('v','i','e','w')
+# define c3__vile c3_s4('v','i','l', 'e')
+# define c3__vint c3_s4('v','i','n','t')
+# define c3__void c3_s4('v','o','i','d')
+# define c3__vorp c3_s4('v','o','r','p')
+# define c3__wack c3_s4('w','a','c','k')
+# define c3__wail c3_s4('w','a','i','l')
+# define c3__wake c3_s4('w','a','k','e')
+# define c3__walk c3_s4('w','a','l','k')
+# define c3__wamp c3_s4('w','a','m','p')
+# define c3__want c3_s4('w','a','n','t')
+# define c3__warm c3_s4('w','a','r','m')
+# define c3__warn c3_s4('w','a','r','n')
+# define c3__warx c3_s4('w','a','r','x')
+# define c3__wash c3_s4('w','a','s','h')
+# define c3__watt c3_s4('w','a','t','t')
+# define c3__way c3_s3('w','a','y')
+# define c3__weak c3_s4('w','e','a','k')
+# define c3__web c3_s3('w','e','b')
+# define c3__wend c3_s4('w','e','n','d')
+# define c3__werp c3_s4('w','e','r','p')
+# define c3__west c3_s4('w','e','s','t')
+# define c3__wet c3_s3('w','e','t')
+# define c3__what c3_s4('w','h','a','t')
+# define c3__whey c3_s4('w','h','e','y')
+# define c3__who c3_s3('w','h','o')
+# define c3__whom c3_s4('w','h','o','m')
+# define c3__wild c3_s4('w','i','l','d')
+# define c3__win c3_s3('w','i','n')
+# define c3__wing c3_s4('w','i','n','g')
+# define c3__wipe c3_s4('w','i','p','e')
+# define c3__wise c3_s4('w','i','s','e')
+# define c3__wish c3_s4('w','i','s','h')
+# define c3__with c3_s4('w','i','t','h')
+# define c3__wnut c3_s4('w','n','u','t')
+# define c3__wood c3_s4('w','o','o','d')
+# define c3__woot c3_s4('w','o','o','t')
+# define c3__work c3_s4('w','o','r','k')
+# define c3__wost c3_s4('w','o','s','t')
+# define c3__wrap c3_s4('w','r','a','p')
+# define c3__wtbr c3_s4('w','t','b','r')
+# define c3__wtcb c3_s4('w','t','c','b')
+# define c3__wtcl c3_s4('w','t','c','l')
+# define c3__wtcn c3_s4('w','t','c','n')
+# define c3__wtdt c3_s4('w','t','d','t')
+# define c3__wtfs c3_s4('w','t','f','s')
+# define c3__wtgl c3_s4('w','t','g','l')
+# define c3__wtgr c3_s4('w','t','g','r')
+# define c3__wthp c3_s4('w','t','h','p')
+# define c3__wthx c3_s4('w','t','h','x')
+# define c3__wtkt c3_s4('w','t','k','t')
+# define c3__wtls c3_s4('w','t','l','s')
+# define c3__wtms c3_s4('w','t','m','s')
+# define c3__wtpm c3_s4('w','t','p','m')
+# define c3__wtpt c3_s4('w','t','p','t')
+# define c3__wtsg c3_s4('w','t','s','g')
+# define c3__wtts c3_s4('w','t','t','s')
+# define c3__wtzp c3_s4('w','t','z','p')
+# define c3__wyp c3_s3('w','y','p')
+# define c3__wyrd c3_s4('w','y','r','d')
+# define c3__xray c3_s4('x','r','a','y')
+# define c3__xmas c3_s4('x','m','a','s')
+# define c3__x c3_s1('x')
+# define c3__xx c3_s2('x','x')
+# define c3__yell c3_s4('y','e','l','l')
+# define c3__yelp c3_s4('y','e','l','p')
+# define c3__z c3_s1('z')
+# define c3__zact c3_s4('z','a','c','t')
+# define c3__zalt c3_s4('z','a','l','t')
+# define c3__zarb c3_s4('z','a','r','b')
+# define c3__zect c3_s4('z','e','c','t')
+# define c3__zemp c3_s4('z','e','m','p')
+# define c3__zero c3_s4('z','e','r','o')
+# define c3__zike c3_s4('z','i','k','e')
+# define c3__zinc c3_s4('z','i','n','c')
+# define c3__zole c3_s4('z','o','l','e')
+# define c3__zond c3_s4('z','o','n','d')
+# define c3__zoot c3_s4('z','o','o','t')
+# define c3__zork c3_s4('z','o','r','k')
+# define c3__zpbn c3_s4('z','p','b','n')
+# define c3__zpcb c3_s4('z','p','c','b')
+# define c3__zpcm c3_s4('z','p','c','m')
+# define c3__zpcn c3_s4('z','p','c','n')
+# define c3__zpdg c3_s4('z','p','d','g')
+# define c3__zpdx c3_s4('z','p','d','x')
+# define c3__zpfs c3_s4('z','p','f','s')
+# define c3__zpgr c3_s4('z','p','g','r')
+# define c3__zphx c3_s4('z','p','h','x')
+# define c3__zplc c3_s4('z','p','l','c')
+# define c3__zpmc c3_s4('z','p','m','c')
+# define c3__zpmt c3_s4('z','p','m','t')
+# define c3__zpsg c3_s4('z','p','s','g')
+# define c3__zpsk c3_s4('z','p','s','k')
+# define c3__zpsm c3_s4('z','p','s','m')
+# define c3__zptc c3_s4('z','p','t','c')
+# define c3__zptm c3_s4('z','p','t','m')
+# define c3__zpts c3_s4('z','p','t','s')
+# define c3__zpvn c3_s4('z','p','v','n')
+# define c3__zpvt c3_s4('z','p','v','t')
+# define c3__zpzp c3_s4('z','p','z','p')
+# define c3__zuse c3_s4('z','u','s','e')
+# define c3__zush c3_s4('z','u','s','h')
+
+#endif /* ifndef C3_MOTES_H */
diff --git a/vere/pkg/c3/platform/windows/compat.c b/vere/pkg/c3/platform/windows/compat.c
new file mode 100644
index 0000000..d47f3f8
--- /dev/null
+++ b/vere/pkg/c3/platform/windows/compat.c
@@ -0,0 +1,611 @@
+#include "portable.h"
+#include <fcntl.h>
+#include <sys/utime.h>
+#include <windows.h>
+#include <tlhelp32.h>
+#include "errno.h"
+
+// set default CRT file mode to binary
+// note that mingw binmode.o does nothing
+#undef _fmode
+int _fmode = _O_BINARY;
+
+// set standard I/O fds to binary too, because
+// MSVCRT creates them before MingW sets _fmode
+static void __attribute__ ((constructor)) _set_stdio_to_binary()
+{
+ _setmode(0, _O_BINARY);
+ _setmode(1, _O_BINARY);
+ _setmode(2, _O_BINARY);
+}
+
+// from https://github.com/git/git/blob/master/compat/mingw.c
+// -----------------------------------------------------------------------
+
+int err_win_to_posix(DWORD winerr)
+{
+ int error = ENOSYS;
+ switch(winerr) {
+ case ERROR_ACCESS_DENIED: error = EACCES; break;
+ case ERROR_ACCOUNT_DISABLED: error = EACCES; break;
+ case ERROR_ACCOUNT_RESTRICTION: error = EACCES; break;
+ case ERROR_ALREADY_ASSIGNED: error = EBUSY; break;
+ case ERROR_ALREADY_EXISTS: error = EEXIST; break;
+ case ERROR_ARITHMETIC_OVERFLOW: error = ERANGE; break;
+ case ERROR_BAD_COMMAND: error = EIO; break;
+ case ERROR_BAD_DEVICE: error = ENODEV; break;
+ case ERROR_BAD_DRIVER_LEVEL: error = ENXIO; break;
+ case ERROR_BAD_EXE_FORMAT: error = ENOEXEC; break;
+ case ERROR_BAD_FORMAT: error = ENOEXEC; break;
+ case ERROR_BAD_LENGTH: error = EINVAL; break;
+ case ERROR_BAD_PATHNAME: error = ENOENT; break;
+ case ERROR_BAD_PIPE: error = EPIPE; break;
+ case ERROR_BAD_UNIT: error = ENODEV; break;
+ case ERROR_BAD_USERNAME: error = EINVAL; break;
+ case ERROR_BROKEN_PIPE: error = EPIPE; break;
+ case ERROR_BUFFER_OVERFLOW: error = ENAMETOOLONG; break;
+ case ERROR_BUSY: error = EBUSY; break;
+ case ERROR_BUSY_DRIVE: error = EBUSY; break;
+ case ERROR_CALL_NOT_IMPLEMENTED: error = ENOSYS; break;
+ case ERROR_CANNOT_MAKE: error = EACCES; break;
+ case ERROR_CANTOPEN: error = EIO; break;
+ case ERROR_CANTREAD: error = EIO; break;
+ case ERROR_CANTWRITE: error = EIO; break;
+ case ERROR_CRC: error = EIO; break;
+ case ERROR_CURRENT_DIRECTORY: error = EACCES; break;
+ case ERROR_DEVICE_IN_USE: error = EBUSY; break;
+ case ERROR_DEV_NOT_EXIST: error = ENODEV; break;
+ case ERROR_DIRECTORY: error = EINVAL; break;
+ case ERROR_DIR_NOT_EMPTY: error = ENOTEMPTY; break;
+ case ERROR_DISK_CHANGE: error = EIO; break;
+ case ERROR_DISK_FULL: error = ENOSPC; break;
+ case ERROR_DRIVE_LOCKED: error = EBUSY; break;
+ case ERROR_ENVVAR_NOT_FOUND: error = EINVAL; break;
+ case ERROR_EXE_MARKED_INVALID: error = ENOEXEC; break;
+ case ERROR_FILENAME_EXCED_RANGE: error = ENAMETOOLONG; break;
+ case ERROR_FILE_EXISTS: error = EEXIST; break;
+ case ERROR_FILE_INVALID: error = ENODEV; break;
+ case ERROR_FILE_NOT_FOUND: error = ENOENT; break;
+ case ERROR_GEN_FAILURE: error = EIO; break;
+ case ERROR_HANDLE_DISK_FULL: error = ENOSPC; break;
+ case ERROR_INSUFFICIENT_BUFFER: error = ENOMEM; break;
+ case ERROR_INVALID_ACCESS: error = EACCES; break;
+ case ERROR_INVALID_ADDRESS: error = EFAULT; break;
+ case ERROR_INVALID_BLOCK: error = EFAULT; break;
+ case ERROR_INVALID_DATA: error = EINVAL; break;
+ case ERROR_INVALID_DRIVE: error = ENODEV; break;
+ case ERROR_INVALID_EXE_SIGNATURE: error = ENOEXEC; break;
+ case ERROR_INVALID_FLAGS: error = EINVAL; break;
+ case ERROR_INVALID_FUNCTION: error = ENOSYS; break;
+ case ERROR_INVALID_HANDLE: error = EBADF; break;
+ case ERROR_INVALID_LOGON_HOURS: error = EACCES; break;
+ case ERROR_INVALID_NAME: error = EINVAL; break;
+ case ERROR_INVALID_OWNER: error = EINVAL; break;
+ case ERROR_INVALID_PARAMETER: error = EINVAL; break;
+ case ERROR_INVALID_PASSWORD: error = EPERM; break;
+ case ERROR_INVALID_PRIMARY_GROUP: error = EINVAL; break;
+ case ERROR_INVALID_SIGNAL_NUMBER: error = EINVAL; break;
+ case ERROR_INVALID_TARGET_HANDLE: error = EIO; break;
+ case ERROR_INVALID_WORKSTATION: error = EACCES; break;
+ case ERROR_IO_DEVICE: error = EIO; break;
+ case ERROR_IO_INCOMPLETE: error = EINTR; break;
+ case ERROR_LOCKED: error = EBUSY; break;
+ case ERROR_LOCK_VIOLATION: error = EACCES; break;
+ case ERROR_LOGON_FAILURE: error = EACCES; break;
+ case ERROR_MAPPED_ALIGNMENT: error = EINVAL; break;
+ case ERROR_META_EXPANSION_TOO_LONG: error = E2BIG; break;
+ case ERROR_MORE_DATA: error = EPIPE; break;
+ case ERROR_NEGATIVE_SEEK: error = ESPIPE; break;
+ case ERROR_NOACCESS: error = EFAULT; break;
+ case ERROR_NONE_MAPPED: error = EINVAL; break;
+ case ERROR_NOT_ENOUGH_MEMORY: error = ENOMEM; break;
+ case ERROR_NOT_READY: error = EAGAIN; break;
+ case ERROR_NOT_SAME_DEVICE: error = EXDEV; break;
+ case ERROR_NO_DATA: error = EPIPE; break;
+ case ERROR_NO_MORE_SEARCH_HANDLES: error = EIO; break;
+ case ERROR_NO_PROC_SLOTS: error = EAGAIN; break;
+ case ERROR_NO_SUCH_PRIVILEGE: error = EACCES; break;
+ case ERROR_OPEN_FAILED: error = EIO; break;
+ case ERROR_OPEN_FILES: error = EBUSY; break;
+ case ERROR_OPERATION_ABORTED: error = EINTR; break;
+ case ERROR_OUTOFMEMORY: error = ENOMEM; break;
+ case ERROR_PASSWORD_EXPIRED: error = EACCES; break;
+ case ERROR_PATH_BUSY: error = EBUSY; break;
+ case ERROR_PATH_NOT_FOUND: error = ENOENT; break;
+ case ERROR_PIPE_BUSY: error = EBUSY; break;
+ case ERROR_PIPE_CONNECTED: error = EPIPE; break;
+ case ERROR_PIPE_LISTENING: error = EPIPE; break;
+ case ERROR_PIPE_NOT_CONNECTED: error = EPIPE; break;
+ case ERROR_PRIVILEGE_NOT_HELD: error = EACCES; break;
+ case ERROR_READ_FAULT: error = EIO; break;
+ case ERROR_SEEK: error = EIO; break;
+ case ERROR_SEEK_ON_DEVICE: error = ESPIPE; break;
+ case ERROR_SHARING_BUFFER_EXCEEDED: error = ENFILE; break;
+ case ERROR_SHARING_VIOLATION: error = EACCES; break;
+ case ERROR_STACK_OVERFLOW: error = ENOMEM; break;
+ case ERROR_SUCCESS: error = 0; break;
+ case ERROR_SWAPERROR: error = ENOENT; break;
+ case ERROR_TOO_MANY_MODULES: error = EMFILE; break;
+ case ERROR_TOO_MANY_OPEN_FILES: error = EMFILE; break;
+ case ERROR_UNRECOGNIZED_MEDIA: error = ENXIO; break;
+ case ERROR_UNRECOGNIZED_VOLUME: error = ENODEV; break;
+ case ERROR_WAIT_NO_CHILDREN: error = ECHILD; break;
+ case ERROR_WRITE_FAULT: error = EIO; break;
+ case ERROR_WRITE_PROTECT: error = EROFS; break;
+ }
+ return error;
+}
+
+int link(const char *path1, const char *path2)
+{
+ if ( CreateHardLinkA(path2, path1, NULL) ) {
+ return 0;
+ }
+
+ errno = err_win_to_posix(GetLastError());
+ return -1;
+}
+
+// from msys2 mingw-packages-dev patches
+// -----------------------------------------------------------------------
+
+static DWORD __map_mmap_prot_page(const int prot)
+{
+ DWORD protect = 0;
+
+ if (prot == PROT_NONE)
+ return protect;
+
+ if ((prot & PROT_EXEC) != 0)
+ {
+ protect = ((prot & PROT_WRITE) != 0) ?
+ PAGE_EXECUTE_READWRITE : PAGE_EXECUTE_READ;
+ }
+ else
+ {
+ protect = ((prot & PROT_WRITE) != 0) ?
+ PAGE_READWRITE : PAGE_READONLY;
+ }
+
+ return protect;
+}
+
+static DWORD __map_mmap_prot_file(const int prot)
+{
+ DWORD desiredAccess = 0;
+
+ if (prot == PROT_NONE)
+ return desiredAccess;
+
+ if ((prot & PROT_READ) != 0)
+ desiredAccess |= FILE_MAP_READ;
+ if ((prot & PROT_WRITE) != 0)
+ desiredAccess |= FILE_MAP_WRITE;
+ if ((prot & PROT_EXEC) != 0)
+ desiredAccess |= FILE_MAP_EXECUTE;
+
+ return desiredAccess;
+}
+
+void* mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off)
+{
+ HANDLE fm, h;
+
+ void * map = MAP_FAILED;
+
+ const DWORD dwFileOffsetLow = (sizeof(off_t) <= sizeof(DWORD)) ?
+ (DWORD)off : (DWORD)(off & 0xFFFFFFFFL);
+ const DWORD dwFileOffsetHigh = (sizeof(off_t) <= sizeof(DWORD)) ?
+ (DWORD)0 : (DWORD)((off >> 32) & 0xFFFFFFFFL);
+ const DWORD protect = __map_mmap_prot_page(prot);
+ const DWORD desiredAccess = __map_mmap_prot_file(prot);
+
+ errno = 0;
+
+ if (len == 0
+ /* Usupported protection combinations */
+ || prot == PROT_EXEC)
+ {
+ errno = EINVAL;
+ return MAP_FAILED;
+ }
+
+ if ((flags & MAP_ANON) == 0)
+ {
+ h = (HANDLE)_get_osfhandle(fildes);
+
+ if (h == INVALID_HANDLE_VALUE)
+ {
+ errno = EBADF;
+ return MAP_FAILED;
+ }
+ }
+ else h = INVALID_HANDLE_VALUE;
+
+ fm = CreateFileMapping(h, NULL, protect, 0, len, NULL);
+
+ if (fm == NULL)
+ {
+ errno = err_win_to_posix(GetLastError());
+ return MAP_FAILED;
+ }
+
+ map = MapViewOfFileEx(fm, desiredAccess, dwFileOffsetHigh, dwFileOffsetLow, len, addr);
+ errno = err_win_to_posix(GetLastError());
+
+ CloseHandle(fm);
+
+ if (map == NULL)
+ return MAP_FAILED;
+
+ if ((flags & MAP_FIXED) != 0 && map != addr)
+ {
+ UnmapViewOfFile(map);
+ errno = EEXIST;
+ return MAP_FAILED;
+ }
+
+ return map;
+}
+
+int munmap(void *addr, size_t len)
+{
+ if (UnmapViewOfFile(addr))
+ return 0;
+
+ errno = err_win_to_posix(GetLastError());
+ return -1;
+}
+
+int msync(void *addr, size_t len, int flags)
+{
+ if (FlushViewOfFile(addr, len))
+ return 0;
+
+ errno = err_win_to_posix(GetLastError());
+ return -1;
+}
+
+// -----------------------------------------------------------------------
+
+// vere uses kill() only to kill lockfile owner with SIGTERM or SIGKILL
+// Windows does not have signals, so I handle SIGKILL as TerminateProcess()
+// and return an error in all other cases
+int kill(pid_t pid, int sig)
+{
+ if (pid > 0 && sig == SIGKILL) {
+ HANDLE h = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
+
+ if (TerminateProcess(h, -1)) {
+ CloseHandle(h);
+ return 0;
+ }
+
+ errno = err_win_to_posix(GetLastError());
+ CloseHandle(h);
+ return -1;
+ }
+
+ errno = EINVAL;
+ return -1;
+}
+
+// libgcc built for mingw has included an implementation of mprotect
+// via VirtualProtect since olden days, but it takes int rather than size_t
+// and therefore fails or does unexpected things for >2GB blocks on 64-bit
+// https://github.com/gcc-mirror/gcc/blob/master/libgcc/libgcc2.c
+int mprotect (void *addr, size_t len, int prot)
+{
+ DWORD np, op;
+
+ if (prot == (PROT_READ | PROT_WRITE | PROT_EXEC))
+ np = PAGE_EXECUTE_READWRITE;
+ else if (prot == (PROT_READ | PROT_EXEC))
+ np = PAGE_EXECUTE_READ;
+ else if (prot == (PROT_EXEC))
+ np = PAGE_EXECUTE;
+ else if (prot == (PROT_READ | PROT_WRITE))
+ np = PAGE_READWRITE;
+ else if (prot == (PROT_READ))
+ np = PAGE_READONLY;
+ else if (prot == 0)
+ np = PAGE_NOACCESS;
+ else
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (VirtualProtect (addr, len, np, &op))
+ return 0;
+
+ // NB: return code of ntdll!RtlGetLastNtStatus() is useful
+ // for diagnosing obscure VirtualProtect failures
+ errno = err_win_to_posix(GetLastError());
+ return -1;
+}
+
+int utimes(const char *path, const struct timeval times[2])
+{
+ struct _utimbuf utb = {.actime = times[0].tv_sec, .modtime = times[1].tv_sec};
+ return _utime(path, &utb);
+}
+
+int fdatasync(int fildes)
+{
+ HANDLE h = (HANDLE)_get_osfhandle(fildes);
+
+ if (h == INVALID_HANDLE_VALUE)
+ {
+ errno = EBADF;
+ return -1;
+ }
+
+ if (FlushFileBuffers(h))
+ {
+ errno = 0;
+ return 0;
+ }
+ else
+ {
+ errno = err_win_to_posix(GetLastError());
+ return -1;
+ }
+}
+
+intmax_t mdb_get_filesize(HANDLE han_u)
+{
+ LARGE_INTEGER li;
+ GetFileSizeEx(han_u, &li);
+ return li.QuadPart;
+}
+
+char *realpath(const char *path, char *resolved_path)
+{
+ // XX MAX_PATH
+ //
+ return _fullpath(resolved_path, path, MAX_PATH);
+}
+
+long sysconf(int name)
+{
+ SYSTEM_INFO si;
+
+ if ( _SC_PAGESIZE != name ) {
+ return -1;
+ }
+ GetNativeSystemInfo(&si);
+ return si.dwPageSize;
+}
+
+
+// musl memmem for windows
+
+static char *twobyte_memmem(const unsigned char *h, size_t k, const unsigned char *n)
+{
+ uint16_t nw = n[0]<<8 | n[1], hw = h[0]<<8 | h[1];
+ for (h++, k--; k; k--, hw = hw<<8 | *++h)
+ if (hw == nw) return (char *)h-1;
+ return 0;
+}
+
+static char *threebyte_memmem(const unsigned char *h, size_t k, const unsigned char *n)
+{
+ uint32_t nw = n[0]<<24 | n[1]<<16 | n[2]<<8;
+ uint32_t hw = h[0]<<24 | h[1]<<16 | h[2]<<8;
+ for (h+=2, k-=2; k; k--, hw = (hw|*++h)<<8)
+ if (hw == nw) return (char *)h-2;
+ return 0;
+}
+
+static char *fourbyte_memmem(const unsigned char *h, size_t k, const unsigned char *n)
+{
+ uint32_t nw = n[0]<<24 | n[1]<<16 | n[2]<<8 | n[3];
+ uint32_t hw = h[0]<<24 | h[1]<<16 | h[2]<<8 | h[3];
+ for (h+=3, k-=3; k; k--, hw = hw<<8 | *++h)
+ if (hw == nw) return (char *)h-3;
+ return 0;
+}
+
+#define MAX(a,b) ((a)>(b)?(a):(b))
+#define MIN(a,b) ((a)<(b)?(a):(b))
+
+#define BITOP(a,b,op) \
+ ((a)[(size_t)(b)/(8*sizeof *(a))] op (size_t)1<<((size_t)(b)%(8*sizeof *(a))))
+
+static char *twoway_memmem(const unsigned char *h, const unsigned char *z, const unsigned char *n, size_t l)
+{
+ size_t i, ip, jp, k, p, ms, p0, mem, mem0;
+ size_t byteset[32 / sizeof(size_t)] = { 0 };
+ size_t shift[256];
+
+ /* Computing length of needle and fill shift table */
+ for (i=0; i<l; i++)
+ BITOP(byteset, n[i], |=), shift[n[i]] = i+1;
+
+ /* Compute maximal suffix */
+ ip = -1; jp = 0; k = p = 1;
+ while (jp+k<l) {
+ if (n[ip+k] == n[jp+k]) {
+ if (k == p) {
+ jp += p;
+ k = 1;
+ } else k++;
+ } else if (n[ip+k] > n[jp+k]) {
+ jp += k;
+ k = 1;
+ p = jp - ip;
+ } else {
+ ip = jp++;
+ k = p = 1;
+ }
+ }
+ ms = ip;
+ p0 = p;
+
+ /* And with the opposite comparison */
+ ip = -1; jp = 0; k = p = 1;
+ while (jp+k<l) {
+ if (n[ip+k] == n[jp+k]) {
+ if (k == p) {
+ jp += p;
+ k = 1;
+ } else k++;
+ } else if (n[ip+k] < n[jp+k]) {
+ jp += k;
+ k = 1;
+ p = jp - ip;
+ } else {
+ ip = jp++;
+ k = p = 1;
+ }
+ }
+ if (ip+1 > ms+1) ms = ip;
+ else p = p0;
+
+ /* Periodic needle? */
+ if (memcmp(n, n+p, ms+1)) {
+ mem0 = 0;
+ p = MAX(ms, l-ms-1) + 1;
+ } else mem0 = l-p;
+ mem = 0;
+
+ /* Search loop */
+ for (;;) {
+ /* If remainder of haystack is shorter than needle, done */
+ if (z-h < l) return 0;
+
+ /* Check last byte first; advance by shift on mismatch */
+ if (BITOP(byteset, h[l-1], &)) {
+ k = l-shift[h[l-1]];
+ if (k) {
+ if (mem0 && mem && k < p) k = l-p;
+ h += k;
+ mem = 0;
+ continue;
+ }
+ } else {
+ h += l;
+ mem = 0;
+ continue;
+ }
+
+ /* Compare right half */
+ for (k=MAX(ms+1,mem); k<l && n[k] == h[k]; k++);
+ if (k < l) {
+ h += k-ms;
+ mem = 0;
+ continue;
+ }
+ /* Compare left half */
+ for (k=ms+1; k>mem && n[k-1] == h[k-1]; k--);
+ if (k <= mem) return (char *)h;
+ h += p;
+ mem = mem0;
+ }
+}
+
+void *memmem(const void *h0, size_t k, const void *n0, size_t l)
+{
+ const unsigned char *h = h0, *n = n0;
+
+ /* Return immediately on empty needle */
+ if (!l) return (void *)h;
+
+ /* Return immediately when needle is longer than haystack */
+ if (k<l) return 0;
+
+ /* Use faster algorithms for short needles */
+ h = memchr(h0, *n, k);
+ if (!h || l==1) return (void *)h;
+ k -= h - (const unsigned char *)h0;
+ if (l==2) return twobyte_memmem(h, k, n);
+ if (l==3) return threebyte_memmem(h, k, n);
+ if (l==4) return fourbyte_memmem(h, k, n);
+
+ return twoway_memmem(h, h+k, n, l);
+}
+
+uint32_t getppid()
+{
+ HANDLE hSnapshot;
+ PROCESSENTRY32 pe32;
+ DWORD ppid = 0, pid = GetCurrentProcessId();
+
+ hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
+ __try{
+ if( hSnapshot == INVALID_HANDLE_VALUE ) __leave;
+
+ ZeroMemory( &pe32, sizeof( pe32 ) );
+ pe32.dwSize = sizeof( pe32 );
+ if( !Process32First( hSnapshot, &pe32 ) ) __leave;
+
+ do{
+ if( pe32.th32ProcessID == pid ){
+ ppid = pe32.th32ParentProcessID;
+ break;
+ }
+ }while( Process32Next( hSnapshot, &pe32 ) );
+
+ }
+ __finally{
+ if( hSnapshot != INVALID_HANDLE_VALUE ) CloseHandle( hSnapshot );
+ }
+ return ppid;
+}
+
+ssize_t pread(int fd, void *buf, size_t count, off_t offset)
+{
+ DWORD len = 0;
+
+ OVERLAPPED overlapped = {0};
+
+ overlapped.OffsetHigh = (sizeof(off_t) <= sizeof(DWORD)) ?
+ (DWORD)0 : (DWORD)((offset >> 32) & 0xFFFFFFFFL);
+ overlapped.Offset = (sizeof(off_t) <= sizeof(DWORD)) ?
+ (DWORD)offset : (DWORD)(offset & 0xFFFFFFFFL);
+
+ HANDLE h = (HANDLE)_get_osfhandle(fd);
+
+ if ( INVALID_HANDLE_VALUE == h ) {
+ errno = EBADF;
+ return -1;
+ }
+
+ if ( !ReadFile(h, buf, count, &len, &overlapped) ) {
+ DWORD err = GetLastError();
+
+ if ( ERROR_HANDLE_EOF != err ) {
+ errno = err_win_to_posix(err);
+ return -1;
+ }
+ }
+
+ return (ssize_t)len;
+}
+
+ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset)
+{
+ DWORD len = 0;
+
+ OVERLAPPED overlapped = {0};
+
+ overlapped.OffsetHigh = (sizeof(off_t) <= sizeof(DWORD)) ?
+ (DWORD)0 : (DWORD)((offset >> 32) & 0xFFFFFFFFL);
+ overlapped.Offset = (sizeof(off_t) <= sizeof(DWORD)) ?
+ (DWORD)offset : (DWORD)(offset & 0xFFFFFFFFL);
+
+ HANDLE h = (HANDLE)_get_osfhandle(fd);
+
+ if ( INVALID_HANDLE_VALUE == h ) {
+ errno = EBADF;
+ return -1;
+ }
+
+ if ( !WriteFile(h, buf, count, &len, &overlapped) ) {
+ errno = err_win_to_posix(GetLastError());
+ return -1;
+ }
+
+ return (ssize_t)len;
+}
diff --git a/vere/pkg/c3/platform/windows/compat.h b/vere/pkg/c3/platform/windows/compat.h
new file mode 100644
index 0000000..17338b8
--- /dev/null
+++ b/vere/pkg/c3/platform/windows/compat.h
@@ -0,0 +1,28 @@
+#ifndef _MINGW_IO_H
+#define _MINGW_IO_H
+
+#define mkdir(A, B) mkdir(A)
+
+int link(const char *path1, const char *path2);
+char *realpath(const char *path, char *resolved_path);
+int fdatasync(int fd);
+int utimes(const char *path, const struct timeval times[2]);
+long sysconf(int name);
+
+int kill(pid_t pid, int signum);
+
+void *memmem(const void *h0, size_t k, const void *n0, size_t l);
+
+uint32_t getppid();
+
+ssize_t pread(int fd, void *buf, size_t count, off_t offset);
+ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);
+
+#define SIGUSR1 10
+#define SIGALRM 14
+#define SIGVTALRM 26
+#define SIGSTK 31
+#define SIG_COUNT 32
+#define _SC_PAGESIZE 29
+
+#endif//_MINGW_IO_H
diff --git a/vere/pkg/c3/platform/windows/mman.h b/vere/pkg/c3/platform/windows/mman.h
new file mode 100644
index 0000000..965fecf
--- /dev/null
+++ b/vere/pkg/c3/platform/windows/mman.h
@@ -0,0 +1,26 @@
+#ifndef _SYS_MMAN_H
+#define _SYS_MMAN_H
+
+void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
+int munmap(void *addr, size_t length);
+int msync(void *addr, size_t length, int flags);
+int mprotect(void *addr, size_t len, int prot);
+
+#define PROT_NONE 0x00 /* No access. */
+#define PROT_READ 0x01 /* Pages can be read. */
+#define PROT_WRITE 0x02 /* Pages can be written. */
+#define PROT_EXEC 0x04 /* Pages can be executed. */
+
+#define MAP_FILE 0x0001 /* Mapped from a file or device. */
+#define MAP_ANON 0x0002 /* Allocated from anonymous virtual memory. */
+#define MAP_TYPE 0x000f /* Mask for type field. */
+#define MAP_SHARED 0x0010 /* Share changes. */
+#define MAP_PRIVATE 0x0000 /* Changes private; copy pages on write. */
+#define MAP_FIXED 0x0100 /* Map address must be exactly as requested. */
+#define MAP_FAILED ((void *) -1)
+
+#define MS_ASYNC 1 /* Sync memory asynchronously. */
+#define MS_SYNC 0 /* Synchronous memory sync. */
+#define MS_INVALIDATE 2 /* Invalidate the caches. */
+
+#endif//_SYS_MMAN_H
diff --git a/vere/pkg/c3/platform/windows/wsetjmp.h b/vere/pkg/c3/platform/windows/wsetjmp.h
new file mode 100644
index 0000000..08e1957
--- /dev/null
+++ b/vere/pkg/c3/platform/windows/wsetjmp.h
@@ -0,0 +1,7 @@
+#ifndef _MINGW_SETJMP_H
+#define _MINGW_SETJMP_H
+#include "setjmp.h"
+
+#define _longjmp longjmp
+
+#endif//_MINGW_SETJMP_H
diff --git a/vere/pkg/c3/portable.h b/vere/pkg/c3/portable.h
new file mode 100644
index 0000000..29172f2
--- /dev/null
+++ b/vere/pkg/c3/portable.h
@@ -0,0 +1,268 @@
+/// @file
+
+#ifndef C3_PORTABLE_H
+#define C3_PORTABLE_H
+
+# ifndef __GNUC__
+# error "port me"
+# endif
+# ifndef _GNU_SOURCE
+# define _GNU_SOURCE
+# endif
+
+ /** System include files.
+ ***
+ *** Do not put include files that are only used in the
+ *** porting layer here. Include them directly in the
+ *** C file.
+ **/
+# if defined(U3_OS_linux)
+# ifndef _XOPEN_SOURCE
+# define _XOPEN_SOURCE 700
+# endif
+# include <ctype.h>
+# include <inttypes.h>
+# include <stdlib.h>
+# include <string.h>
+# include <stdarg.h>
+# include <unistd.h>
+# include <stdint.h>
+# include <assert.h>
+# include <byteswap.h>
+# include <setjmp.h>
+# include <stdio.h>
+# include <signal.h>
+# include <sys/time.h>
+# include <sys/resource.h>
+# include <sys/mman.h>
+# include <sys/sendfile.h>
+
+# elif defined(U3_OS_osx)
+# include <ctype.h>
+# include <inttypes.h>
+# include <stdlib.h>
+# include <string.h>
+# include <stdarg.h>
+# include <unistd.h>
+# include <stdint.h>
+# include <assert.h>
+# include <setjmp.h>
+# include <signal.h>
+# include <machine/endian.h>
+# include <machine/byte_order.h>
+# include <stdio.h>
+# include <sys/time.h>
+# include <sys/resource.h>
+# include <sys/syslimits.h>
+# include <sys/mman.h>
+# include <sys/clonefile.h>
+# include <copyfile.h>
+
+# elif defined(U3_OS_bsd)
+# include <ctype.h>
+# include <inttypes.h>
+# include <stdlib.h>
+# include <string.h>
+# include <stdarg.h>
+# include <unistd.h>
+# include <stdint.h>
+# include <assert.h>
+# include <machine/endian.h>
+# include <setjmp.h>
+# include <stdio.h>
+# include <signal.h>
+# include <sys/time.h>
+# include <sys/resource.h>
+# include <sys/mman.h>
+
+# elif defined(U3_OS_windows)
+# define signal mingw_has_no_usable_signal
+# define raise mingw_has_no_usable_raise
+# define _POSIX
+# include <ctype.h>
+# include <inttypes.h>
+# include <stdlib.h>
+# include <string.h>
+# include <stdarg.h>
+# include <unistd.h>
+# include <stdint.h>
+# include <assert.h>
+# include <wsetjmp.h>
+# include <stdio.h>
+# include <dirent.h>
+# include <signal.h>
+# include <sys/time.h>
+# include "mman.h"
+# include "compat.h"
+
+
+# else
+#error "port: headers"
+# endif
+
+# ifndef __has_feature
+# define __has_feature(x) 0
+# endif
+
+# if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
+# define ASAN_ENABLED
+# endif
+
+ /** Platform string.
+ **/
+# if defined(U3_OS_linux)
+# ifdef __LP64__
+# ifdef U3_CPU_aarch64
+# define U3_OS_ARCH "linux-aarch64"
+# else
+# define U3_OS_ARCH "linux-x86_64"
+# endif
+# endif
+# elif defined(U3_OS_osx)
+# ifdef __LP64__
+# ifdef U3_CPU_aarch64
+# define U3_OS_ARCH "macos-aarch64"
+# else
+# define U3_OS_ARCH "macos-x86_64"
+# endif
+# endif
+# elif defined(U3_OS_windows)
+#define U3_OS_ARCH "windows-x86_64"
+# endif
+
+
+
+# define U3_BIN_ALIAS ".run"
+
+/** Address space layout.
+***
+*** NB: 2^30 words == 4G
+**/
+# if defined(U3_OS_linux)
+# ifdef __LP64__
+# ifdef ASAN_ENABLED
+# define U3_OS_LoomBase 0x10007ffff000
+# else
+# define U3_OS_LoomBase 0x200000000
+# endif
+# else
+# define U3_OS_LoomBase 0x36000000
+# endif
+# define U3_OS_LoomBits 30
+# elif defined(U3_OS_osx)
+# ifdef __LP64__
+# ifdef ASAN_ENABLED
+# define U3_OS_LoomBase 0x728000000000
+# else
+# define U3_OS_LoomBase 0x28000000000
+# endif
+# else
+# define U3_OS_LoomBase 0x4000000
+# endif
+# define U3_OS_LoomBits 30
+# elif defined(U3_OS_bsd)
+# ifdef __LP64__
+# define U3_OS_LoomBase 0x200000000
+# else
+# define U3_OS_LoomBase 0x4000000
+# endif
+# define U3_OS_LoomBits 30
+# elif defined(U3_OS_windows)
+# define U3_OS_LoomBase 0x28000000000
+# define U3_OS_LoomBits 30
+# else
+# error "port: LoomBase"
+# endif
+
+
+ /** Private C "extensions."
+ ***
+ *** Except for these and main(), any function, macro, or structure
+ *** names must be prefixed either by u3_/U3_ (for public names),
+ *** or _ (for static and other file-local names).
+ **/
+ /* Endianness.
+ */
+# define c3_endian_little 0
+# define c3_endian_big 1
+
+# ifdef U3_OS_ENDIAN_little
+# define c3_endian c3_endian_little
+# elif defined(U3_OS_ENDIAN_big)
+# define c3_endian c3_endian_big
+# else
+# error "port: U3_OS_ENDIAN"
+# endif
+
+ /* Byte swapping.
+ */
+# if defined(U3_OS_linux) || defined(U3_OS_bsd) || defined(U3_OS_windows)
+# define c3_bswap_16(x) bswap_16(x)
+# define c3_bswap_32(x) bswap_32(x)
+# define c3_bswap_64(x) bswap_64(x)
+# elif defined(U3_OS_osx)
+# define c3_bswap_16(x) NXSwapShort(x)
+# define c3_bswap_32(x) NXSwapInt(x)
+# define c3_bswap_64(x) NXSwapLongLong(x)
+# else
+# error "port: byte swap"
+# endif
+
+ /* Sync.
+ */
+# if defined(U3_OS_linux) || defined(U3_OS_windows)
+# define c3_sync(fd) (fdatasync(fd))
+# elif defined(U3_OS_osx)
+# define c3_sync(fd) (fcntl(fd, F_FULLFSYNC, 0))
+# elif defined(U3_OS_bsd)
+# define c3_sync(fd) (fsync(fd))
+# else
+# error "port: sync"
+# endif
+
+ /* Purge.
+ */
+# if defined(U3_OS_linux)
+# include <stdio_ext.h>
+# define c3_fpurge __fpurge
+# elif defined(U3_OS_bsd) || defined(U3_OS_osx) || defined(U3_OS_windows)
+# define c3_fpurge fpurge
+# else
+# error "port: fpurge"
+# endif
+
+ /* Stat.
+ */
+# if defined(U3_OS_linux) || defined(U3_OS_windows)
+# define c3_stat_mtime(dp) (u3_time_t_in_ts((dp)->st_mtime))
+# elif defined(U3_OS_osx)
+# define c3_stat_mtime(dp) (u3_time_in_ts(&((dp)->st_mtimespec)))
+# define lseek64 lseek
+# elif defined(U3_OS_bsd)
+# define c3_stat_mtime(dp) (u3_time_in_ts(&((dp)->st_mtim)))
+# define lseek64 lseek
+# else
+# error "port: timeconvert"
+# endif
+
+ /* Null.
+ */
+# if defined(U3_OS_linux) || defined(U3_OS_bsd) || defined(U3_OS_osx)
+# define c3_dev_null "/dev/null"
+# elif defined(U3_OS_windows)
+# define c3_dev_null "nul"
+# else
+# error "port: /dev/null"
+# endif
+
+ /* Static assertion.
+
+ TODO: we could just use static_assert (c23)/_Static_assert (c11) in
+ <assert.h>
+ */
+# define ASSERT_CONCAT_(a, b) a##b
+# define ASSERT_CONCAT(a, b) ASSERT_CONCAT_(a, b)
+# define STATIC_ASSERT(e,m) \
+ enum { ASSERT_CONCAT(assert_line_, __LINE__) = 1/(int)(!!(e)) }
+
+#endif /* ifndef C3_PORTABLE_H */
diff --git a/vere/pkg/c3/types.h b/vere/pkg/c3/types.h
new file mode 100644
index 0000000..8214fbc
--- /dev/null
+++ b/vere/pkg/c3/types.h
@@ -0,0 +1,75 @@
+/// @file
+
+#ifndef C3_TYPES_H
+#define C3_TYPES_H
+
+#include "portable.h"
+
+ /** Integer typedefs.
+ **/
+ /* Canonical integers.
+ */
+ typedef size_t c3_z;
+ typedef ssize_t c3_zs;
+ typedef uint64_t c3_d;
+ typedef int64_t c3_ds;
+ typedef uint32_t c3_w;
+ typedef int32_t c3_ws;
+ typedef uint16_t c3_s;
+ typedef int16_t c3_ss;
+ typedef uint8_t c3_y; // byte
+ typedef int8_t c3_ys; // signed byte
+ typedef uint8_t c3_b; // bit
+
+ typedef uint8_t c3_t; // boolean
+ typedef uint8_t c3_o; // loobean
+ typedef uint8_t c3_g; // 32-bit log - 0-31 bits
+ typedef uint32_t c3_l; // little; 31-bit unsigned integer
+ typedef uint32_t c3_m; // mote; also c3_l; LSB first a-z 4-char string.
+
+ /* Deprecated integers.
+ */
+ typedef char c3_c; // does not match int8_t or uint8_t
+ typedef int c3_i; // int - really bad
+ typedef uintptr_t c3_p; // pointer-length uint - really really bad
+ typedef intptr_t c3_ps; // pointer-length int - really really bad
+
+ /* Print specifiers
+ */
+
+ /* c3_z */
+ #define PRIc3_z "zu" /* unsigned dec */
+ #define PRIc3_zs "zd" /* signed dec */
+ #define PRIxc3_z "zx" /* unsigned hex */
+ #define PRIXc3_z "zX" /* unsigned HEX */
+
+ /* c3_d */
+ #define PRIc3_d PRIu64
+ #define PRIc3_ds PRIi64
+ #define PRIxc3_d PRIx64
+ #define PRIXc3_d PRIX64
+
+ /* c3_w */
+ #define PRIc3_w PRIu32
+ #define PRIc3_ws PRIi32
+ #define PRIxc3_w PRIx32
+ #define PRIXc3_w PRIX32
+
+ /* c3_s */
+ #define PRIc3_s PRIu16
+ #define PRIc3_ss PRIi16
+ #define PRIxc3_s PRIx16
+ #define PRIXc3_s PRIX16
+
+ /* c3_y */
+ #define PRIc3_y PRIu8
+ #define PRIc3_ys PRIi8
+ #define PRIxc3_y PRIx8
+ #define PRIXc3_y PRIX8
+
+ /* c3_b */
+ #define PRIc3_b PRIu8
+ #define PRIxc3_b PRIx8
+ #define PRIXc3_b PRIX8
+
+#endif /* ifndef C3_TYPES_H */