Faithful realignment of lib/path to Hare's buffer-centric API
(ref/hare/path/{stack,buffer}.ha). Replaces the old str-only path.ww
wholesale (zero consumers). Scope = stack-core: init() deferred (returns
~4KB (buffer|error), rides the #40 arc / #147); abs/dirname/basename land
in c3; extension/join dropped.
appendlit uses the #145 slice-copy-assign arm (buf.buf[lo:hi]=bs), no hand
loop. dot/dotdot are faithful module-global []u8 (D2 #148). MAX =
os.PATH_MAX-1. Divergences (size->i32 indices, frombytes, module-global
consts) cited inline.
Tests: lib/path/pathtest.ww (table-driven), wired at test/wcc/989_path_run.c;
push rows mirror stack.ha:107-111 verbatim incl the restored "/d"
intermediate. Slot 989 (overflow bucket) since 970 is taken.
C-first: cstage @test green; wwstage byte-id deferred to the #125 batch.
path classified M_WWREJECT in 989_lib_byteid (w6c_ww rejects the module-
global slice consts = #120/#29; + the #148 twin #151) — self-graduates back
to M_ID the day wwstage accepts. path moved off the 900_stdlib standalone
list (import-dependent: os.PATH_MAX def-dim + match over imported error
types; coverage at 989_path_run), per the bytes/fmt/os precedent.
Gate: all 324 passed, byte-id 990-997 green, w6c/w6c_ww unchanged
(lib-only, non-embedded).
90 lines
3.2 KiB
C
90 lines
3.2 KiB
C
/*
|
|
* 900_stdlib — verify each stdlib module parses, type-checks, and
|
|
* codegens. We don't link or run them; they exist for downstream
|
|
* users to import. As real applications come online they will start
|
|
* exercising the bodies through the e2e harness.
|
|
*/
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
|
|
static const char *modules[] = {
|
|
"lib/types/types.ww",
|
|
"lib/ascii/ascii.ww",
|
|
"lib/io/io.ww",
|
|
"lib/strconv/strconv.ww",
|
|
"lib/sort/sort.ww",
|
|
"lib/encoding/utf8/utf8.ww",
|
|
"lib/encoding/base32/base32.ww",
|
|
"lib/hash/fnv/fnv.ww",
|
|
"lib/hash/adler32/adler32.ww",
|
|
"lib/hash/crc16/crc16.ww",
|
|
"lib/hash/crc32/crc32.ww",
|
|
"lib/hash/crc64/crc64.ww",
|
|
"lib/hash/siphash/siphash.ww",
|
|
"lib/math/random/random.ww",
|
|
"lib/time/time.ww",
|
|
"lib/c/libc/libc.ww",
|
|
/* lib/bufio/bufio.ww, lib/bytes/bytes.ww, lib/errors/errors.ww,
|
|
* lib/fmt/fmt.ww, lib/os/os.ww, and lib/strings/strings.ww moved
|
|
* off this list: each has cross-module type refs that only resolve
|
|
* once the driver concatenates `use`d modules. bufio / fmt
|
|
* graduated to io.stream-based sinks (io.stream = *io.vtable,
|
|
* io.eof, io.error); lib/os carries time.instant in filestat
|
|
* post-Commit B; lib/errors.errno references os.errno / os.E* /
|
|
* os.strerror (ww folds Hare's sys role into os); lib/strings.iterator
|
|
* + lib/strings.next reference utf8.decoder / utf8.done;
|
|
* lib/bytes.tokenize references the assert builtin + types.I64_MAX/MIN per
|
|
* ref/hare/bytes/tokenize.ha:23-24,42-43; lib/encoding/hex and
|
|
* lib/encoding/base64 graduated to Hare's io-streaming surface
|
|
* (hex references io.handle / fmt.fprint / memio.dynamic / strconv /
|
|
* errors.invalid; base64 references io.handle / memio.dynamic /
|
|
* bytes.zero / strings.frombytes / errors.invalid); lib/path.path
|
|
* is import-dependent post-c2-stack realignment ([MAX]u8 via
|
|
* os.PATH_MAX def-dim + match over imported path error types).
|
|
* Coverage lives at
|
|
* lib/bufio/bufiotest.ww + lib/bytes/bytestest.ww +
|
|
* lib/errors/errnotest.ww + lib/fmt/fmttest.ww + lib/os/stattest.ww
|
|
* + lib/strings/stringstest.ww + lib/encoding/hex/hextest.ww +
|
|
* lib/encoding/base64/base64_test.ww (wired at 998_bufio_run.c,
|
|
* 967_bytes_run.c, 902_errno_run.c, 970_fmt_run.c, 976_stat_run.c,
|
|
* 966_strings_run.c, 979_hex_run.c, 984_base64_run.c) + path at
|
|
* lib/path/pathtest.ww (989_path_run.c), plus the
|
|
* bufio.scanline / fmt.println e2e rows in test/wcc/700_e2e.c. */
|
|
"lib/net/net.ww",
|
|
NULL
|
|
};
|
|
|
|
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;
|
|
|
|
int n = 0, fail = 0;
|
|
for (int i = 0; modules[i]; i++, n++) {
|
|
char path[1024], cmd[2048];
|
|
snprintf(path, sizeof path, "%s/%s", cwd, modules[i]);
|
|
snprintf(cmd, sizeof cmd, "%s/w6c %s > /dev/null 2>&1",
|
|
bin, path);
|
|
int rc = system(cmd);
|
|
if (rc != 0) {
|
|
fprintf(stderr, "stdlib FAIL: %s (rc=%d)\n", modules[i], rc);
|
|
fail++;
|
|
}
|
|
}
|
|
if (fail) { fprintf(stderr, "%d/%d stdlib modules failed\n", fail, n); return 1; }
|
|
printf("stdlib: %d/%d ok\n", n, n);
|
|
return 0;
|
|
}
|