selfhost/cmd/ww+w6l/main.ww: amalloc → alloc([], N)! (α-10)
Phase 0 #8 tenth α/γ-batch. 14 amalloc sites: - ww/main.ww: 11 (path bufs in importpathform/locatein/peekpackage/ expanddir/arenadupcstr/builddirmodulepath/buildsearchpath + γ names/nlens in enumeratedir) - w6l/main.ww: 3 (resolvelib cstr+NUL paths) α: *u8 → []u8 + .ptr at consumer; γ: **u8 / *u64 → []*u8 / []u64 with element-count alloc (was bytes/8). Verified 132/132 + 995_self_rebuild byte-identity. ~27 amalloc sites remain across 5 files; most blocked on #7 (astrndup), #8 (β grow loops in w6a/parse, w6a/obj, w6l/dynout), #10 (cgoutarena).
This commit is contained in:
@@ -3203,30 +3203,30 @@ fn resolvelib(a: *arena, name: *u8, libdirs: **u8, nlibdirs: i32) *u8 = {
|
|||||||
let _l1: u64 = buildpath(bufp.ptr, dir, name, ".so");
|
let _l1: u64 = buildpath(bufp.ptr, dir, name, ".so");
|
||||||
if (islinkable(bufp.ptr)) {
|
if (islinkable(bufp.ptr)) {
|
||||||
let pl: u64 = cstrlen(bufp.ptr);
|
let pl: u64 = cstrlen(bufp.ptr);
|
||||||
let p: *u8 = amalloc(a, pl + 1u64): *u8;
|
let p: []u8 = alloc([], pl + 1u64)!;
|
||||||
let k: u64 = 0u64;
|
let k: u64 = 0u64;
|
||||||
for (k <= pl) { p[k] = bufp[k]; k += 1u64; };
|
for (k <= pl) { p[k] = bufp[k]; k += 1u64; };
|
||||||
return p;
|
return p.ptr;
|
||||||
};
|
};
|
||||||
let v: u64 = 0u64;
|
let v: u64 = 0u64;
|
||||||
for (v <= 8u64) {
|
for (v <= 8u64) {
|
||||||
let _l2: u64 = buildpathv(bufp.ptr, dir, name, v);
|
let _l2: u64 = buildpathv(bufp.ptr, dir, name, v);
|
||||||
if (islinkable(bufp.ptr)) {
|
if (islinkable(bufp.ptr)) {
|
||||||
let pl2: u64 = cstrlen(bufp.ptr);
|
let pl2: u64 = cstrlen(bufp.ptr);
|
||||||
let p2: *u8 = amalloc(a, pl2 + 1u64): *u8;
|
let p2: []u8 = alloc([], pl2 + 1u64)!;
|
||||||
let k2: u64 = 0u64;
|
let k2: u64 = 0u64;
|
||||||
for (k2 <= pl2) { p2[k2] = bufp[k2]; k2 += 1u64; };
|
for (k2 <= pl2) { p2[k2] = bufp[k2]; k2 += 1u64; };
|
||||||
return p2;
|
return p2.ptr;
|
||||||
};
|
};
|
||||||
v += 1u64;
|
v += 1u64;
|
||||||
};
|
};
|
||||||
let _l3: u64 = buildpath(bufp.ptr, dir, name, ".a");
|
let _l3: u64 = buildpath(bufp.ptr, dir, name, ".a");
|
||||||
if (islinkable(bufp.ptr)) {
|
if (islinkable(bufp.ptr)) {
|
||||||
let pl3: u64 = cstrlen(bufp.ptr);
|
let pl3: u64 = cstrlen(bufp.ptr);
|
||||||
let p3: *u8 = amalloc(a, pl3 + 1u64): *u8;
|
let p3: []u8 = alloc([], pl3 + 1u64)!;
|
||||||
let k3: u64 = 0u64;
|
let k3: u64 = 0u64;
|
||||||
for (k3 <= pl3) { p3[k3] = bufp[k3]; k3 += 1u64; };
|
for (k3 <= pl3) { p3[k3] = bufp[k3]; k3 += 1u64; };
|
||||||
return p3;
|
return p3.ptr;
|
||||||
};
|
};
|
||||||
i += 1;
|
i += 1;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -139,30 +139,30 @@ fn resolvelib(a: *arena, name: *u8, libdirs: **u8, nlibdirs: i32) *u8 = {
|
|||||||
let _l1: u64 = buildpath(bufp.ptr, dir, name, ".so");
|
let _l1: u64 = buildpath(bufp.ptr, dir, name, ".so");
|
||||||
if (islinkable(bufp.ptr)) {
|
if (islinkable(bufp.ptr)) {
|
||||||
let pl: u64 = cstrlen(bufp.ptr);
|
let pl: u64 = cstrlen(bufp.ptr);
|
||||||
let p: *u8 = amalloc(a, pl + 1u64): *u8;
|
let p: []u8 = alloc([], pl + 1u64)!;
|
||||||
let k: u64 = 0u64;
|
let k: u64 = 0u64;
|
||||||
for (k <= pl) { p[k] = bufp[k]; k += 1u64; };
|
for (k <= pl) { p[k] = bufp[k]; k += 1u64; };
|
||||||
return p;
|
return p.ptr;
|
||||||
};
|
};
|
||||||
let v: u64 = 0u64;
|
let v: u64 = 0u64;
|
||||||
for (v <= 8u64) {
|
for (v <= 8u64) {
|
||||||
let _l2: u64 = buildpathv(bufp.ptr, dir, name, v);
|
let _l2: u64 = buildpathv(bufp.ptr, dir, name, v);
|
||||||
if (islinkable(bufp.ptr)) {
|
if (islinkable(bufp.ptr)) {
|
||||||
let pl2: u64 = cstrlen(bufp.ptr);
|
let pl2: u64 = cstrlen(bufp.ptr);
|
||||||
let p2: *u8 = amalloc(a, pl2 + 1u64): *u8;
|
let p2: []u8 = alloc([], pl2 + 1u64)!;
|
||||||
let k2: u64 = 0u64;
|
let k2: u64 = 0u64;
|
||||||
for (k2 <= pl2) { p2[k2] = bufp[k2]; k2 += 1u64; };
|
for (k2 <= pl2) { p2[k2] = bufp[k2]; k2 += 1u64; };
|
||||||
return p2;
|
return p2.ptr;
|
||||||
};
|
};
|
||||||
v += 1u64;
|
v += 1u64;
|
||||||
};
|
};
|
||||||
let _l3: u64 = buildpath(bufp.ptr, dir, name, ".a");
|
let _l3: u64 = buildpath(bufp.ptr, dir, name, ".a");
|
||||||
if (islinkable(bufp.ptr)) {
|
if (islinkable(bufp.ptr)) {
|
||||||
let pl3: u64 = cstrlen(bufp.ptr);
|
let pl3: u64 = cstrlen(bufp.ptr);
|
||||||
let p3: *u8 = amalloc(a, pl3 + 1u64): *u8;
|
let p3: []u8 = alloc([], pl3 + 1u64)!;
|
||||||
let k3: u64 = 0u64;
|
let k3: u64 = 0u64;
|
||||||
for (k3 <= pl3) { p3[k3] = bufp[k3]; k3 += 1u64; };
|
for (k3 <= pl3) { p3[k3] = bufp[k3]; k3 += 1u64; };
|
||||||
return p3;
|
return p3.ptr;
|
||||||
};
|
};
|
||||||
i += 1;
|
i += 1;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1098,7 +1098,7 @@ fn visitadd(c: *expctx, path: str) void = {
|
|||||||
// (ref/hare/hare/module/srcs.ha:78 builds the same shape via
|
// (ref/hare/hare/module/srcs.ha:78 builds the same shape via
|
||||||
// path::push per ident part).
|
// path::push per ident part).
|
||||||
fn importpathform(a: *arena, name: *u8, namelen: u64) *u8 = {
|
fn importpathform(a: *arena, name: *u8, namelen: u64) *u8 = {
|
||||||
let buf: *u8 = amalloc(a, namelen + 1u64): *u8;
|
let buf: []u8 = alloc([], namelen + 1u64)!;
|
||||||
let i: u64 = 0u64;
|
let i: u64 = 0u64;
|
||||||
for (i < namelen) {
|
for (i < namelen) {
|
||||||
if (name[i] == 46u8) { buf[i] = 47u8; } // '.' -> '/'
|
if (name[i] == 46u8) { buf[i] = 47u8; } // '.' -> '/'
|
||||||
@@ -1106,7 +1106,7 @@ fn importpathform(a: *arena, name: *u8, namelen: u64) *u8 = {
|
|||||||
i += 1u64;
|
i += 1u64;
|
||||||
};
|
};
|
||||||
buf[namelen] = 0u8;
|
buf[namelen] = 0u8;
|
||||||
return buf;
|
return buf.ptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Try <dir>/<path>/ as a directory, then <dir>/<path>.ww as a file.
|
// Try <dir>/<path>/ as a directory, then <dir>/<path>.ww as a file.
|
||||||
@@ -1117,7 +1117,7 @@ fn importpathform(a: *arena, name: *u8, namelen: u64) *u8 = {
|
|||||||
// `foo/foo.ha` fallback; a module IS the directory).
|
// `foo/foo.ha` fallback; a module IS the directory).
|
||||||
fn locatein(a: *arena, dir: *u8, dirlen: u64,
|
fn locatein(a: *arena, dir: *u8, dirlen: u64,
|
||||||
pathform: *u8, pflen: u64, isdir: *i32) *u8 = {
|
pathform: *u8, pflen: u64, isdir: *i32) *u8 = {
|
||||||
let buf: *u8 = amalloc(a, PATH_MAX): *u8;
|
let buf: []u8 = alloc([], PATH_MAX)!;
|
||||||
let off: u64 = 0u64;
|
let off: u64 = 0u64;
|
||||||
let i: u64 = 0u64;
|
let i: u64 = 0u64;
|
||||||
for (i < dirlen) { buf[off + i] = dir[i]; i += 1u64; };
|
for (i < dirlen) { buf[off + i] = dir[i]; i += 1u64; };
|
||||||
@@ -1128,7 +1128,7 @@ fn locatein(a: *arena, dir: *u8, dirlen: u64,
|
|||||||
off += pflen;
|
off += pflen;
|
||||||
buf[off] = 0u8;
|
buf[off] = 0u8;
|
||||||
let fi: os.filestat;
|
let fi: os.filestat;
|
||||||
let r: (void | os.oserror) = os.stat(&fi, pathstr(buf));
|
let r: (void | os.oserror) = os.stat(&fi, pathstr(buf.ptr));
|
||||||
let isdirhit: bool = false;
|
let isdirhit: bool = false;
|
||||||
match (r) {
|
match (r) {
|
||||||
case void => {
|
case void => {
|
||||||
@@ -1139,10 +1139,10 @@ fn locatein(a: *arena, dir: *u8, dirlen: u64,
|
|||||||
};
|
};
|
||||||
if (isdirhit) {
|
if (isdirhit) {
|
||||||
*isdir = 1;
|
*isdir = 1;
|
||||||
return buf;
|
return buf.ptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
let buf2: *u8 = amalloc(a, PATH_MAX): *u8;
|
let buf2: []u8 = alloc([], PATH_MAX)!;
|
||||||
off = 0u64;
|
off = 0u64;
|
||||||
i = 0u64;
|
i = 0u64;
|
||||||
for (i < dirlen) { buf2[off + i] = dir[i]; i += 1u64; };
|
for (i < dirlen) { buf2[off + i] = dir[i]; i += 1u64; };
|
||||||
@@ -1155,9 +1155,9 @@ fn locatein(a: *arena, dir: *u8, dirlen: u64,
|
|||||||
buf2[off] = 119u8; off += 1u64; // 'w'
|
buf2[off] = 119u8; off += 1u64; // 'w'
|
||||||
buf2[off] = 119u8; off += 1u64; // 'w'
|
buf2[off] = 119u8; off += 1u64; // 'w'
|
||||||
buf2[off] = 0u8;
|
buf2[off] = 0u8;
|
||||||
if (os.access(pathstr(buf2), 0i32) == 0) {
|
if (os.access(pathstr(buf2.ptr), 0i32) == 0) {
|
||||||
*isdir = 0;
|
*isdir = 0;
|
||||||
return buf2;
|
return buf2.ptr;
|
||||||
};
|
};
|
||||||
return nil;
|
return nil;
|
||||||
};
|
};
|
||||||
@@ -1261,8 +1261,8 @@ fn enumeratedir(a: *arena, dirpath: *u8) (**u8, i32) = {
|
|||||||
let fd: i32 = os.open(pathstr(dirpath), os.flag.RDONLY, 0i32);
|
let fd: i32 = os.open(pathstr(dirpath), os.flag.RDONLY, 0i32);
|
||||||
if (fd < 0) { return nil: **u8, 0; };
|
if (fd < 0) { return nil: **u8, 0; };
|
||||||
let maxnames: i32 = 256;
|
let maxnames: i32 = 256;
|
||||||
let names: **u8 = amalloc(a, (maxnames: u64) * 8u64): **u8;
|
let names: []*u8 = alloc([], maxnames: u64)!;
|
||||||
let nlens: *u64 = amalloc(a, (maxnames: u64) * 8u64): *u64;
|
let nlens: []u64 = alloc([], maxnames: u64)!;
|
||||||
let n: i32 = 0;
|
let n: i32 = 0;
|
||||||
let buf: []u8 = alloc([], 8192u64)!;
|
let buf: []u8 = alloc([], 8192u64)!;
|
||||||
buf.len = 8192;
|
buf.len = 8192;
|
||||||
@@ -1278,11 +1278,11 @@ fn enumeratedir(a: *arena, dirpath: *u8) (**u8, i32) = {
|
|||||||
let nl: u64 = cstrlen(nm);
|
let nl: u64 = cstrlen(nm);
|
||||||
if (dirfilekeep(nm, nl)) {
|
if (dirfilekeep(nm, nl)) {
|
||||||
if (n < maxnames) {
|
if (n < maxnames) {
|
||||||
let cp: *u8 = amalloc(a, nl + 1u64): *u8;
|
let cp: []u8 = alloc([], nl + 1u64)!;
|
||||||
let i: u64 = 0u64;
|
let i: u64 = 0u64;
|
||||||
for (i < nl) { cp[i] = nm[i]; i += 1u64; };
|
for (i < nl) { cp[i] = nm[i]; i += 1u64; };
|
||||||
cp[nl] = 0u8;
|
cp[nl] = 0u8;
|
||||||
names[n] = cp;
|
names[n] = cp.ptr;
|
||||||
nlens[n] = nl;
|
nlens[n] = nl;
|
||||||
n += 1;
|
n += 1;
|
||||||
};
|
};
|
||||||
@@ -1312,7 +1312,7 @@ fn enumeratedir(a: *arena, dirpath: *u8) (**u8, i32) = {
|
|||||||
};
|
};
|
||||||
i += 1;
|
i += 1;
|
||||||
};
|
};
|
||||||
return names, n;
|
return names.ptr, n;
|
||||||
};
|
};
|
||||||
|
|
||||||
// ---- file slurp -------------------------------------------------------
|
// ---- file slurp -------------------------------------------------------
|
||||||
@@ -1495,11 +1495,11 @@ fn peekpackage(a: *arena, pathcs: *u8) *u8 = {
|
|||||||
};
|
};
|
||||||
let plen: u64 = t - start;
|
let plen: u64 = t - start;
|
||||||
if (plen == 0u64) { return nil; };
|
if (plen == 0u64) { return nil; };
|
||||||
let r: *u8 = amalloc(a, plen + 1u64): *u8;
|
let r: []u8 = alloc([], plen + 1u64)!;
|
||||||
let k: u64 = 0u64;
|
let k: u64 = 0u64;
|
||||||
for (k < plen) { r[k] = buf[start + k]; k += 1u64; };
|
for (k < plen) { r[k] = buf[start + k]; k += 1u64; };
|
||||||
r[plen] = 0u8;
|
r[plen] = 0u8;
|
||||||
return r;
|
return r.ptr;
|
||||||
}; }; }; }; }; }; };
|
}; }; }; }; }; }; };
|
||||||
};
|
};
|
||||||
return nil;
|
return nil;
|
||||||
@@ -1540,21 +1540,21 @@ fn expanddir(c: *expctx, dirpath: *u8) void = {
|
|||||||
let i: i32 = 0;
|
let i: i32 = 0;
|
||||||
for (i < n) {
|
for (i < n) {
|
||||||
let nlen: u64 = cstrlen(names[i]);
|
let nlen: u64 = cstrlen(names[i]);
|
||||||
let fp: *u8 = amalloc(c.a, dlen + 1u64 + nlen + 1u64): *u8;
|
let fp: []u8 = alloc([], dlen + 1u64 + nlen + 1u64)!;
|
||||||
let k: u64 = 0u64;
|
let k: u64 = 0u64;
|
||||||
for (k < dlen) { fp[k] = dirpath[k]; k += 1u64; };
|
for (k < dlen) { fp[k] = dirpath[k]; k += 1u64; };
|
||||||
fp[dlen] = 47u8; // '/'
|
fp[dlen] = 47u8; // '/'
|
||||||
k = 0u64;
|
k = 0u64;
|
||||||
for (k < nlen) { fp[dlen + 1u64 + k] = names[i][k]; k += 1u64; };
|
for (k < nlen) { fp[dlen + 1u64 + k] = names[i][k]; k += 1u64; };
|
||||||
fp[dlen + 1u64 + nlen] = 0u8;
|
fp[dlen + 1u64 + nlen] = 0u8;
|
||||||
let pkg: *u8 = peekpackage(c.a, fp);
|
let pkg: *u8 = peekpackage(c.a, fp.ptr);
|
||||||
if (pkg != nil) {
|
if (pkg != nil) {
|
||||||
if (dirpkg == nil) { dirpkg = pkg; }
|
if (dirpkg == nil) { dirpkg = pkg; }
|
||||||
else { if (!cstreq(dirpkg, pkg)) {
|
else { if (!cstreq(dirpkg, pkg)) {
|
||||||
strictpkgmismatch(fp, pkg, dirpkg, dirpath);
|
strictpkgmismatch(fp.ptr, pkg, dirpkg, dirpath);
|
||||||
}; };
|
}; };
|
||||||
};
|
};
|
||||||
expand(c, fp);
|
expand(c, fp.ptr);
|
||||||
i += 1;
|
i += 1;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@@ -1847,18 +1847,18 @@ fn basenameoff(p: *u8, plen: u64) u64 = {
|
|||||||
// arenadupcstr — copy `plen` bytes from `src` into a fresh NUL-sealed
|
// arenadupcstr — copy `plen` bytes from `src` into a fresh NUL-sealed
|
||||||
// arena buffer.
|
// arena buffer.
|
||||||
fn arenadupcstr(a: *arena, src: *u8, plen: u64) *u8 = {
|
fn arenadupcstr(a: *arena, src: *u8, plen: u64) *u8 = {
|
||||||
let buf: *u8 = amalloc(a, plen + 1u64): *u8;
|
let buf: []u8 = alloc([], plen + 1u64)!;
|
||||||
let i: u64 = 0u64;
|
let i: u64 = 0u64;
|
||||||
for (i < plen) { buf[i] = src[i]; i += 1u64; };
|
for (i < plen) { buf[i] = src[i]; i += 1u64; };
|
||||||
buf[plen] = 0u8;
|
buf[plen] = 0u8;
|
||||||
return buf;
|
return buf.ptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
// builddirmodulepath — alloc <dir>/<base>.ww, NUL-terminated, in `a`.
|
// builddirmodulepath — alloc <dir>/<base>.ww, NUL-terminated, in `a`.
|
||||||
fn builddirmodulepath(a: *arena, dir: *u8, dlen: u64,
|
fn builddirmodulepath(a: *arena, dir: *u8, dlen: u64,
|
||||||
base: *u8, blen: u64) *u8 = {
|
base: *u8, blen: u64) *u8 = {
|
||||||
let need: u64 = dlen + 1u64 + blen + 3u64 + 1u64;
|
let need: u64 = dlen + 1u64 + blen + 3u64 + 1u64;
|
||||||
let buf: *u8 = amalloc(a, need): *u8;
|
let buf: []u8 = alloc([], need)!;
|
||||||
let off: u64 = 0u64;
|
let off: u64 = 0u64;
|
||||||
let i: u64 = 0u64;
|
let i: u64 = 0u64;
|
||||||
for (i < dlen) { buf[off] = dir[i]; off += 1u64; i += 1u64; };
|
for (i < dlen) { buf[off] = dir[i]; off += 1u64; i += 1u64; };
|
||||||
@@ -1869,26 +1869,26 @@ fn builddirmodulepath(a: *arena, dir: *u8, dlen: u64,
|
|||||||
buf[off] = 119u8; off += 1u64; // 'w'
|
buf[off] = 119u8; off += 1u64; // 'w'
|
||||||
buf[off] = 119u8; off += 1u64; // 'w'
|
buf[off] = 119u8; off += 1u64; // 'w'
|
||||||
buf[off] = 0u8;
|
buf[off] = 0u8;
|
||||||
return buf;
|
return buf.ptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
// buildsearchpath — compose the colon-separated lookup path used by
|
// buildsearchpath — compose the colon-separated lookup path used by
|
||||||
// resolvemodule's case (4). Order: "." : <incs> : <selfdir>/../../lib
|
// resolvemodule's case (4). Order: "." : <incs> : <selfdir>/../../lib
|
||||||
fn buildsearchpath(a: *arena, selfdir: *u8, incs: *u8) *u8 = {
|
fn buildsearchpath(a: *arena, selfdir: *u8, incs: *u8) *u8 = {
|
||||||
let buf: *u8 = amalloc(a, PATH_MAX * 2u64): *u8;
|
let buf: []u8 = alloc([], PATH_MAX * 2u64)!;
|
||||||
let off: u64 = 0u64;
|
let off: u64 = 0u64;
|
||||||
buf[off] = 46u8; off += 1u64; // '.'
|
buf[off] = 46u8; off += 1u64; // '.'
|
||||||
if (incs != nil) {
|
if (incs != nil) {
|
||||||
if (incs[0u64] != 0u8) {
|
if (incs[0u64] != 0u8) {
|
||||||
buf[off] = 58u8; off += 1u64; // ':'
|
buf[off] = 58u8; off += 1u64; // ':'
|
||||||
off = cstrinto(buf, off, incs);
|
off = cstrinto(buf.ptr, off, incs);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
buf[off] = 58u8; off += 1u64;
|
buf[off] = 58u8; off += 1u64;
|
||||||
off = cstrinto(buf, off, selfdir);
|
off = cstrinto(buf.ptr, off, selfdir);
|
||||||
off = strinto(buf, off, "/../../lib");
|
off = strinto(buf.ptr, off, "/../../lib");
|
||||||
cstrseal(buf, off);
|
cstrseal(buf.ptr, off);
|
||||||
return buf;
|
return buf.ptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
// resolvemodule — map a name like "foo", "lib/foo", "foo.ww", or
|
// resolvemodule — map a name like "foo", "lib/foo", "foo.ww", or
|
||||||
|
|||||||
@@ -236,7 +236,7 @@ fn visitadd(c: *expctx, path: str) void = {
|
|||||||
// (ref/hare/hare/module/srcs.ha:78 builds the same shape via
|
// (ref/hare/hare/module/srcs.ha:78 builds the same shape via
|
||||||
// path::push per ident part).
|
// path::push per ident part).
|
||||||
fn importpathform(a: *arena, name: *u8, namelen: u64) *u8 = {
|
fn importpathform(a: *arena, name: *u8, namelen: u64) *u8 = {
|
||||||
let buf: *u8 = amalloc(a, namelen + 1u64): *u8;
|
let buf: []u8 = alloc([], namelen + 1u64)!;
|
||||||
let i: u64 = 0u64;
|
let i: u64 = 0u64;
|
||||||
for (i < namelen) {
|
for (i < namelen) {
|
||||||
if (name[i] == 46u8) { buf[i] = 47u8; } // '.' -> '/'
|
if (name[i] == 46u8) { buf[i] = 47u8; } // '.' -> '/'
|
||||||
@@ -244,7 +244,7 @@ fn importpathform(a: *arena, name: *u8, namelen: u64) *u8 = {
|
|||||||
i += 1u64;
|
i += 1u64;
|
||||||
};
|
};
|
||||||
buf[namelen] = 0u8;
|
buf[namelen] = 0u8;
|
||||||
return buf;
|
return buf.ptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Try <dir>/<path>/ as a directory, then <dir>/<path>.ww as a file.
|
// Try <dir>/<path>/ as a directory, then <dir>/<path>.ww as a file.
|
||||||
@@ -255,7 +255,7 @@ fn importpathform(a: *arena, name: *u8, namelen: u64) *u8 = {
|
|||||||
// `foo/foo.ha` fallback; a module IS the directory).
|
// `foo/foo.ha` fallback; a module IS the directory).
|
||||||
fn locatein(a: *arena, dir: *u8, dirlen: u64,
|
fn locatein(a: *arena, dir: *u8, dirlen: u64,
|
||||||
pathform: *u8, pflen: u64, isdir: *i32) *u8 = {
|
pathform: *u8, pflen: u64, isdir: *i32) *u8 = {
|
||||||
let buf: *u8 = amalloc(a, PATH_MAX): *u8;
|
let buf: []u8 = alloc([], PATH_MAX)!;
|
||||||
let off: u64 = 0u64;
|
let off: u64 = 0u64;
|
||||||
let i: u64 = 0u64;
|
let i: u64 = 0u64;
|
||||||
for (i < dirlen) { buf[off + i] = dir[i]; i += 1u64; };
|
for (i < dirlen) { buf[off + i] = dir[i]; i += 1u64; };
|
||||||
@@ -266,7 +266,7 @@ fn locatein(a: *arena, dir: *u8, dirlen: u64,
|
|||||||
off += pflen;
|
off += pflen;
|
||||||
buf[off] = 0u8;
|
buf[off] = 0u8;
|
||||||
let fi: os.filestat;
|
let fi: os.filestat;
|
||||||
let r: (void | os.oserror) = os.stat(&fi, pathstr(buf));
|
let r: (void | os.oserror) = os.stat(&fi, pathstr(buf.ptr));
|
||||||
let isdirhit: bool = false;
|
let isdirhit: bool = false;
|
||||||
match (r) {
|
match (r) {
|
||||||
case void => {
|
case void => {
|
||||||
@@ -277,10 +277,10 @@ fn locatein(a: *arena, dir: *u8, dirlen: u64,
|
|||||||
};
|
};
|
||||||
if (isdirhit) {
|
if (isdirhit) {
|
||||||
*isdir = 1;
|
*isdir = 1;
|
||||||
return buf;
|
return buf.ptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
let buf2: *u8 = amalloc(a, PATH_MAX): *u8;
|
let buf2: []u8 = alloc([], PATH_MAX)!;
|
||||||
off = 0u64;
|
off = 0u64;
|
||||||
i = 0u64;
|
i = 0u64;
|
||||||
for (i < dirlen) { buf2[off + i] = dir[i]; i += 1u64; };
|
for (i < dirlen) { buf2[off + i] = dir[i]; i += 1u64; };
|
||||||
@@ -293,9 +293,9 @@ fn locatein(a: *arena, dir: *u8, dirlen: u64,
|
|||||||
buf2[off] = 119u8; off += 1u64; // 'w'
|
buf2[off] = 119u8; off += 1u64; // 'w'
|
||||||
buf2[off] = 119u8; off += 1u64; // 'w'
|
buf2[off] = 119u8; off += 1u64; // 'w'
|
||||||
buf2[off] = 0u8;
|
buf2[off] = 0u8;
|
||||||
if (os.access(pathstr(buf2), 0i32) == 0) {
|
if (os.access(pathstr(buf2.ptr), 0i32) == 0) {
|
||||||
*isdir = 0;
|
*isdir = 0;
|
||||||
return buf2;
|
return buf2.ptr;
|
||||||
};
|
};
|
||||||
return nil;
|
return nil;
|
||||||
};
|
};
|
||||||
@@ -399,8 +399,8 @@ fn enumeratedir(a: *arena, dirpath: *u8) (**u8, i32) = {
|
|||||||
let fd: i32 = os.open(pathstr(dirpath), os.flag.RDONLY, 0i32);
|
let fd: i32 = os.open(pathstr(dirpath), os.flag.RDONLY, 0i32);
|
||||||
if (fd < 0) { return nil: **u8, 0; };
|
if (fd < 0) { return nil: **u8, 0; };
|
||||||
let maxnames: i32 = 256;
|
let maxnames: i32 = 256;
|
||||||
let names: **u8 = amalloc(a, (maxnames: u64) * 8u64): **u8;
|
let names: []*u8 = alloc([], maxnames: u64)!;
|
||||||
let nlens: *u64 = amalloc(a, (maxnames: u64) * 8u64): *u64;
|
let nlens: []u64 = alloc([], maxnames: u64)!;
|
||||||
let n: i32 = 0;
|
let n: i32 = 0;
|
||||||
let buf: []u8 = alloc([], 8192u64)!;
|
let buf: []u8 = alloc([], 8192u64)!;
|
||||||
buf.len = 8192;
|
buf.len = 8192;
|
||||||
@@ -416,11 +416,11 @@ fn enumeratedir(a: *arena, dirpath: *u8) (**u8, i32) = {
|
|||||||
let nl: u64 = cstrlen(nm);
|
let nl: u64 = cstrlen(nm);
|
||||||
if (dirfilekeep(nm, nl)) {
|
if (dirfilekeep(nm, nl)) {
|
||||||
if (n < maxnames) {
|
if (n < maxnames) {
|
||||||
let cp: *u8 = amalloc(a, nl + 1u64): *u8;
|
let cp: []u8 = alloc([], nl + 1u64)!;
|
||||||
let i: u64 = 0u64;
|
let i: u64 = 0u64;
|
||||||
for (i < nl) { cp[i] = nm[i]; i += 1u64; };
|
for (i < nl) { cp[i] = nm[i]; i += 1u64; };
|
||||||
cp[nl] = 0u8;
|
cp[nl] = 0u8;
|
||||||
names[n] = cp;
|
names[n] = cp.ptr;
|
||||||
nlens[n] = nl;
|
nlens[n] = nl;
|
||||||
n += 1;
|
n += 1;
|
||||||
};
|
};
|
||||||
@@ -450,7 +450,7 @@ fn enumeratedir(a: *arena, dirpath: *u8) (**u8, i32) = {
|
|||||||
};
|
};
|
||||||
i += 1;
|
i += 1;
|
||||||
};
|
};
|
||||||
return names, n;
|
return names.ptr, n;
|
||||||
};
|
};
|
||||||
|
|
||||||
// ---- file slurp -------------------------------------------------------
|
// ---- file slurp -------------------------------------------------------
|
||||||
@@ -633,11 +633,11 @@ fn peekpackage(a: *arena, pathcs: *u8) *u8 = {
|
|||||||
};
|
};
|
||||||
let plen: u64 = t - start;
|
let plen: u64 = t - start;
|
||||||
if (plen == 0u64) { return nil; };
|
if (plen == 0u64) { return nil; };
|
||||||
let r: *u8 = amalloc(a, plen + 1u64): *u8;
|
let r: []u8 = alloc([], plen + 1u64)!;
|
||||||
let k: u64 = 0u64;
|
let k: u64 = 0u64;
|
||||||
for (k < plen) { r[k] = buf[start + k]; k += 1u64; };
|
for (k < plen) { r[k] = buf[start + k]; k += 1u64; };
|
||||||
r[plen] = 0u8;
|
r[plen] = 0u8;
|
||||||
return r;
|
return r.ptr;
|
||||||
}; }; }; }; }; }; };
|
}; }; }; }; }; }; };
|
||||||
};
|
};
|
||||||
return nil;
|
return nil;
|
||||||
@@ -678,21 +678,21 @@ fn expanddir(c: *expctx, dirpath: *u8) void = {
|
|||||||
let i: i32 = 0;
|
let i: i32 = 0;
|
||||||
for (i < n) {
|
for (i < n) {
|
||||||
let nlen: u64 = cstrlen(names[i]);
|
let nlen: u64 = cstrlen(names[i]);
|
||||||
let fp: *u8 = amalloc(c.a, dlen + 1u64 + nlen + 1u64): *u8;
|
let fp: []u8 = alloc([], dlen + 1u64 + nlen + 1u64)!;
|
||||||
let k: u64 = 0u64;
|
let k: u64 = 0u64;
|
||||||
for (k < dlen) { fp[k] = dirpath[k]; k += 1u64; };
|
for (k < dlen) { fp[k] = dirpath[k]; k += 1u64; };
|
||||||
fp[dlen] = 47u8; // '/'
|
fp[dlen] = 47u8; // '/'
|
||||||
k = 0u64;
|
k = 0u64;
|
||||||
for (k < nlen) { fp[dlen + 1u64 + k] = names[i][k]; k += 1u64; };
|
for (k < nlen) { fp[dlen + 1u64 + k] = names[i][k]; k += 1u64; };
|
||||||
fp[dlen + 1u64 + nlen] = 0u8;
|
fp[dlen + 1u64 + nlen] = 0u8;
|
||||||
let pkg: *u8 = peekpackage(c.a, fp);
|
let pkg: *u8 = peekpackage(c.a, fp.ptr);
|
||||||
if (pkg != nil) {
|
if (pkg != nil) {
|
||||||
if (dirpkg == nil) { dirpkg = pkg; }
|
if (dirpkg == nil) { dirpkg = pkg; }
|
||||||
else { if (!cstreq(dirpkg, pkg)) {
|
else { if (!cstreq(dirpkg, pkg)) {
|
||||||
strictpkgmismatch(fp, pkg, dirpkg, dirpath);
|
strictpkgmismatch(fp.ptr, pkg, dirpkg, dirpath);
|
||||||
}; };
|
}; };
|
||||||
};
|
};
|
||||||
expand(c, fp);
|
expand(c, fp.ptr);
|
||||||
i += 1;
|
i += 1;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@@ -985,18 +985,18 @@ fn basenameoff(p: *u8, plen: u64) u64 = {
|
|||||||
// arenadupcstr — copy `plen` bytes from `src` into a fresh NUL-sealed
|
// arenadupcstr — copy `plen` bytes from `src` into a fresh NUL-sealed
|
||||||
// arena buffer.
|
// arena buffer.
|
||||||
fn arenadupcstr(a: *arena, src: *u8, plen: u64) *u8 = {
|
fn arenadupcstr(a: *arena, src: *u8, plen: u64) *u8 = {
|
||||||
let buf: *u8 = amalloc(a, plen + 1u64): *u8;
|
let buf: []u8 = alloc([], plen + 1u64)!;
|
||||||
let i: u64 = 0u64;
|
let i: u64 = 0u64;
|
||||||
for (i < plen) { buf[i] = src[i]; i += 1u64; };
|
for (i < plen) { buf[i] = src[i]; i += 1u64; };
|
||||||
buf[plen] = 0u8;
|
buf[plen] = 0u8;
|
||||||
return buf;
|
return buf.ptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
// builddirmodulepath — alloc <dir>/<base>.ww, NUL-terminated, in `a`.
|
// builddirmodulepath — alloc <dir>/<base>.ww, NUL-terminated, in `a`.
|
||||||
fn builddirmodulepath(a: *arena, dir: *u8, dlen: u64,
|
fn builddirmodulepath(a: *arena, dir: *u8, dlen: u64,
|
||||||
base: *u8, blen: u64) *u8 = {
|
base: *u8, blen: u64) *u8 = {
|
||||||
let need: u64 = dlen + 1u64 + blen + 3u64 + 1u64;
|
let need: u64 = dlen + 1u64 + blen + 3u64 + 1u64;
|
||||||
let buf: *u8 = amalloc(a, need): *u8;
|
let buf: []u8 = alloc([], need)!;
|
||||||
let off: u64 = 0u64;
|
let off: u64 = 0u64;
|
||||||
let i: u64 = 0u64;
|
let i: u64 = 0u64;
|
||||||
for (i < dlen) { buf[off] = dir[i]; off += 1u64; i += 1u64; };
|
for (i < dlen) { buf[off] = dir[i]; off += 1u64; i += 1u64; };
|
||||||
@@ -1007,26 +1007,26 @@ fn builddirmodulepath(a: *arena, dir: *u8, dlen: u64,
|
|||||||
buf[off] = 119u8; off += 1u64; // 'w'
|
buf[off] = 119u8; off += 1u64; // 'w'
|
||||||
buf[off] = 119u8; off += 1u64; // 'w'
|
buf[off] = 119u8; off += 1u64; // 'w'
|
||||||
buf[off] = 0u8;
|
buf[off] = 0u8;
|
||||||
return buf;
|
return buf.ptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
// buildsearchpath — compose the colon-separated lookup path used by
|
// buildsearchpath — compose the colon-separated lookup path used by
|
||||||
// resolvemodule's case (4). Order: "." : <incs> : <selfdir>/../../lib
|
// resolvemodule's case (4). Order: "." : <incs> : <selfdir>/../../lib
|
||||||
fn buildsearchpath(a: *arena, selfdir: *u8, incs: *u8) *u8 = {
|
fn buildsearchpath(a: *arena, selfdir: *u8, incs: *u8) *u8 = {
|
||||||
let buf: *u8 = amalloc(a, PATH_MAX * 2u64): *u8;
|
let buf: []u8 = alloc([], PATH_MAX * 2u64)!;
|
||||||
let off: u64 = 0u64;
|
let off: u64 = 0u64;
|
||||||
buf[off] = 46u8; off += 1u64; // '.'
|
buf[off] = 46u8; off += 1u64; // '.'
|
||||||
if (incs != nil) {
|
if (incs != nil) {
|
||||||
if (incs[0u64] != 0u8) {
|
if (incs[0u64] != 0u8) {
|
||||||
buf[off] = 58u8; off += 1u64; // ':'
|
buf[off] = 58u8; off += 1u64; // ':'
|
||||||
off = cstrinto(buf, off, incs);
|
off = cstrinto(buf.ptr, off, incs);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
buf[off] = 58u8; off += 1u64;
|
buf[off] = 58u8; off += 1u64;
|
||||||
off = cstrinto(buf, off, selfdir);
|
off = cstrinto(buf.ptr, off, selfdir);
|
||||||
off = strinto(buf, off, "/../../lib");
|
off = strinto(buf.ptr, off, "/../../lib");
|
||||||
cstrseal(buf, off);
|
cstrseal(buf.ptr, off);
|
||||||
return buf;
|
return buf.ptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
// resolvemodule — map a name like "foo", "lib/foo", "foo.ww", or
|
// resolvemodule — map a name like "foo", "lib/foo", "foo.ww", or
|
||||||
|
|||||||
Reference in New Issue
Block a user