Files
ww/test/wcc/968_utf8_run.c
Hojun-Cho 793734c1e0 lib/encoding/utf8+test: Hare port (decoder / next / encoderune / runesz / utf8sz / validate)
Hoehrmann DFA from ref/hare/encoding/utf8/decodetable.ha flattened
to 1D [2048]i8 (task #20: 2D-array jagged cgen still pending);
encoderune takes a caller buffer matching lib/encoding/hex.encode;
done/more/invalid all spelled as plain void aliases per lib/io's
eof precedent. Surface ports decoder + decode + next + encoderune
+ runesz + utf8sz + validate from ref/hare/encoding/utf8/{types,
decode,encode,rune}.ha. next() polarity rewritten from Hare's
`(state-1):uint >> 31` to an explicit `if state == 0` branch
because ww's uint is 64-bit (cmd/wcc/type.c:58); same effect, no
hidden 32-bit assumption.

Deferred (no in-tree callers): prev, slice, position, remaining,
appendrune, strencode, strdecode. String iteration (chars/
newchars/nextchar in the session-4 draft) dropped per Hare
discipline — belongs in lib/strings::iterator, not encoding/utf8.

Tests:
  - 968_utf8_run drives lib/encoding/utf8/utf8test.ww via ww run.
    21 @test fns: boundaries (ASCII, 2-byte, 3-byte, 4-byte
    encode/decode), surrogate/overlong/out-of-range/bad-continuation
    reject, max-in-range (U+10FFFF) accept, truncated→more, done@EOI,
    validate empty/mixed/malformed, encode/decode roundtrip. Two
    rows ported from ref/hare/encoding/utf8/decode.ha @test that
    were missing in the session-4 draft: bad-continuation
    [0xC2,0xFF]→invalid and max-in-range [0xF4,0x8F,0xBF,0xBF]→
    U+10FFFF.
  - 9xx stdlib runtime slot range extended from 970-989 to 960-989
    to accommodate utf8 at 968 (970-989 block was full).

90/90 ok. 995_self_rebuild stays green (ww2==ww3==ww4 byte-id).
2026-05-17 23:46:34 +09:00

52 lines
1.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 968_utf8_run — execute the lib/encoding/utf8 @test fixture under the
* C-side `ww run` driver and assert exit 0.
*
* Thin wrapper mirroring 979_hex_run / 977_time_run: utf8test.ww carries
* its own `export fn main()` that drives the @test fns and signals which
* case failed via the exit code (signalled + 10).
*
* Slot 968: stdlib block 970989 was full at landing time.
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
static int
runwait(const char *cmd)
{
int rc = system(cmd);
if (rc == -1) return -1;
if (WIFEXITED(rc)) return WEXITSTATUS(rc);
return 1;
}
int
main(void)
{
const char *bin = getenv("BIN");
if (!bin) bin = "out/bin";
char absbin[1024];
if (bin[0] != '/') {
char cwd[1024];
if (getcwd(cwd, sizeof cwd) == NULL) return 1;
snprintf(absbin, sizeof absbin, "%s/%s", cwd, bin);
bin = absbin;
}
char cwd[1024];
if (getcwd(cwd, sizeof cwd) == NULL) return 1;
const char *src = "lib/encoding/utf8/utf8test.ww";
char path[1024], cmd[2048];
snprintf(path, sizeof path, "%s/%s", cwd, src);
snprintf(cmd, sizeof cmd, "%s/ww run %s", bin, path);
int rc = runwait(cmd);
if (rc != 0) {
fprintf(stderr, "utf8_run FAIL: %s exited %d\n", src, rc);
return 1;
}
printf("utf8_run: %s ok\n", src);
return 0;
}