diff options
Diffstat (limited to 'vere/pkg/c3')
-rw-r--r-- | vere/pkg/c3/build.zig | 56 | ||||
-rw-r--r-- | vere/pkg/c3/build.zig.zon | 15 | ||||
-rw-r--r-- | vere/pkg/c3/c3.h | 11 | ||||
-rw-r--r-- | vere/pkg/c3/defs.c | 19 | ||||
-rw-r--r-- | vere/pkg/c3/defs.h | 283 | ||||
-rw-r--r-- | vere/pkg/c3/motes.h | 1397 | ||||
-rw-r--r-- | vere/pkg/c3/platform/windows/compat.c | 611 | ||||
-rw-r--r-- | vere/pkg/c3/platform/windows/compat.h | 28 | ||||
-rw-r--r-- | vere/pkg/c3/platform/windows/mman.h | 26 | ||||
-rw-r--r-- | vere/pkg/c3/platform/windows/wsetjmp.h | 7 | ||||
-rw-r--r-- | vere/pkg/c3/portable.h | 268 | ||||
-rw-r--r-- | vere/pkg/c3/types.h | 75 |
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 */ |