Files
sx/library/modules/std/log.sx
agra 59f0aa7716 std: restructure — std/ modules, namespace tail, std/xml.sx
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.
2026-06-11 06:10:59 +03:00

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);"; }