allocators/fs/process/socket/log/trace/test move under modules/std/ (allocators.sx becomes std/mem.sx; the Allocator protocol moves into the std.sx prelude, impls stay in mem.sx). New std/xml.sx holds xml_escape as xml.escape. std.sx gains the carried namespace tail — flat-importing std.sx now also provides mem./xml./log. — with the remaining modules (fs/process/socket/json/cli/hash/test) deferred from the tail until the global last-wins maps are fully own-wins (pulling them into every closure collides bare names corpus-wide; they stay direct imports: modules/std/fs.sx etc.). log.sx's internal emit renamed log_emit (it clobbered consumer fns named emit program-wide). bundle.sx uses xml.escape via the carried alias. Consumer import paths swept mechanically; .ir snapshots recaptured for the larger std closure. m3te + game build unchanged.
30 lines
1.5 KiB
Plaintext
30 lines
1.5 KiB
Plaintext
#import "modules/std.sx";
|
|
|
|
// =====================================================================
|
|
// log.sx — plain leveled logging (ERR step E4.1), orthogonal to the
|
|
// error channel. Each entry is written to stderr as `LEVEL: <msg>\n`,
|
|
// where <msg> is the formatted `fmt` + args (same `{}` interpolation as
|
|
// `print`). Sink is stderr (fd 2) so log output stays out of a program's
|
|
// stdout data stream.
|
|
//
|
|
// Note: PLAN-ERR §log sketches a `LEVEL ts msg` line with an ISO-8601
|
|
// UTC timestamp. The timestamp is deferred — it needs a clock binding
|
|
// and would make golden tests time-dependent; the level + message are
|
|
// the load-bearing parts. Add `ts` once a pinnable clock lands.
|
|
// =====================================================================
|
|
|
|
libc :: #library "c";
|
|
|
|
write :: (fd: s32, buf: [*]u8, count: usize) -> isize #foreign libc;
|
|
|
|
// Prefix the level, append a newline, write the whole line to stderr.
|
|
log_emit :: (level: string, msg: string) {
|
|
line := concat(concat(level, msg), "\n");
|
|
write(2, line.ptr, xx line.len);
|
|
}
|
|
|
|
warn :: ($fmt: string, ..$args) { #insert build_format(fmt); #insert "log_emit(\"WARN: \", result);"; }
|
|
info :: ($fmt: string, ..$args) { #insert build_format(fmt); #insert "log_emit(\"INFO: \", result);"; }
|
|
debug :: ($fmt: string, ..$args) { #insert build_format(fmt); #insert "log_emit(\"DEBUG: \", result);"; }
|
|
err :: ($fmt: string, ..$args) { #insert build_format(fmt); #insert "log_emit(\"ERROR: \", result);"; }
|