# buf.ludic — a growable byte buffer for building IR text. The emitter writes # module-level material (types, globals, string constants) into one buffer and # function bodies into another, then prints them in order. property Buf { data: pointer = null, len: int = 0, cap: int = 0 } function buf_new() -> Buf { let b = new Buf b.cap = 256 b.data = bytes(b.cap) b.len = 0 return b } function buf_ensure(b: Buf, extra: int) -> void { if b.len + extra + 1 <= b.cap { return } while b.len + extra + 1 > b.cap { b.cap = b.cap * 2 } b.data = resize(b.data, b.cap) } function buf_putc(b: Buf, c: int) -> void { buf_ensure(b, 1) b.data[b.len] = c b.len = b.len + 1 } function buf_puts(b: Buf, s: pointer) -> void { var i = 0 while s[i] != 0 { buf_putc(b, s[i]); i = i + 1 } } function buf_puti(b: Buf, n: int) -> void { buf_puts(b, itoa(n)) } function buf_str(b: Buf) -> pointer { b.data[b.len] = 0; return b.data }