From a3ce8f9de5498f5ab6d28c0a5daae01b655a509b Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Mon, 7 Apr 2025 01:32:15 +0100 Subject: [PATCH] More. --- sqlite3/libc/build.sh | 5 +- sqlite3/libc/libc.wasm | Bin 905 -> 1301 bytes sqlite3/libc/libc.wat | 286 +++++++++++++++++++++++++++++++++++++- sqlite3/libc/libc_test.go | 38 +++++ sqlite3/strings.c | 51 +++++++ 5 files changed, 377 insertions(+), 3 deletions(-) diff --git a/sqlite3/libc/build.sh b/sqlite3/libc/build.sh index 7d8443a..d2a6883 100755 --- a/sqlite3/libc/build.sh +++ b/sqlite3/libc/build.sh @@ -21,10 +21,13 @@ trap 'rm -f libc.tmp' EXIT -Wl,--initial-memory=16777216 \ -Wl,--export=memset \ -Wl,--export=memcpy \ + -Wl,--export=memchr \ -Wl,--export=memcmp \ -Wl,--export=strlen \ + -Wl,--export=strchr \ -Wl,--export=strcmp \ - -Wl,--export=strncmp + -Wl,--export=strncmp \ + -Wl,--export=strchrnul "$BINARYEN/wasm-ctor-eval" -g -c _initialize libc.wasm -o libc.tmp "$BINARYEN/wasm-opt" -g --strip --strip-producers -c -O3 \ diff --git a/sqlite3/libc/libc.wasm b/sqlite3/libc/libc.wasm index 1ed0412ff11723022580d149382a48375ab5b312..e0a8d4e9dee7efec81c0512be06a2c6210f39de4 100755 GIT binary patch delta 542 zcmcJMOG*Pl5QeL&Cz(fQaKMFNHa#Qa#uvGO(+eXmq6-gT;t+^QX4E9cg^S5jaTS8# z0la}1@CaUL(CQ?j;944*q8|UZ_#W+NuLiAQiU5GCqABt`$Gl1NAGs8s%OfBJ#FB+D zA^Y5$?rp|tJ54$R5ar=$&~Im8nIcKAp=5KBnX2rXR%eji_Q9Ty`M{|ldQY}H9lvZ{ zA>LDLo+2HbTCu`nB@`l7P%u=9Vxu_oX?8+u`-eVCh58e3LNp6IJjc3E3N&^@-~jAJ zN+8M$_|uuYskWAl8*MT`pE9E=Q(4IJEzj0~= sizeof(v128_t); n -= sizeof(v128_t)) { + if (wasm_v128_any_true(wasm_i8x16_eq(wasm_v128_load(w), wc))) { + break; // *w has a c + } + w++; + } + + const uint8_t *u = (void *)w; + while (n--) { + if (*u == c) return (void *)u; + u++; + } + return 0; +} + size_t strlen(const char *s) { const v128_t *const limit = (v128_t *)(__builtin_wasm_memory_size(0) * PAGESIZE) - 1; @@ -116,4 +136,35 @@ int strncmp(const char *s1, const char *s2, size_t n) { return 0; } +char *strchrnul(const char *s, int c) { + c = (char)c; + + const v128_t *const limit = + (v128_t *)(__builtin_wasm_memory_size(0) * PAGESIZE) - 1; + + const v128_t wc = wasm_i8x16_splat(c); + const v128_t *w = (void *)s; + while (w <= limit) { + if (!wasm_i8x16_all_true(wasm_v128_load(w))) { + break; // *w has a NUL + } + if (wasm_v128_any_true(wasm_i8x16_eq(wasm_v128_load(w), wc))) { + break; // *w has a c + } + w++; + } + + s = (void *)w; + while (true) { + if (*s == 0 || *s == c) break; + s++; + } + return (void *)s; +} + +char *strchr(const char *s, int c) { + char *r = strchrnul(s, c); + return *(char *)r == (char)c ? r : 0; +} + #endif