ref: 62ea6ad22c399c646e396efe264c8314f14027a3
dir: /lib/std/fmtfuncs.myr/
use "alloc.use" use "bigint.use" use "bitset.use" use "fmt.use" use "introspect.use" use "strbuf.use" use "varargs.use" pkg std = ;; const __init__ = { var bigint : bigint# var bitset : bitset# bigint = mkbigint(0) bitset = mkbs() fmtinstall(typeof(bigint), bigfmt, [][:]) fmtinstall(typeof(bitset), bsfmt, [][:]) bigfree(bigint) bsfree(bitset) } const bigfmt = {sb, ap, opts var a, n, buf a = vanext(ap) /* allocate a buffer guaranteed to be big enough. that's 2 + floor(nbits/(log_2(10))) or 2 + a.dig.len * 32/3.32... or 2 + a.dig.len * 10 plus one for the - sign. */ buf = slalloc(3 + a.dig.len * 10) n = bigbfmt(buf, a, 10) sbputs(sb, buf[:n]) slfree(buf) } const bsfmt = {sb, ap, opts var bs, sep bs = vanext(ap) sep = "" sbputs(sb, "bitset{") for var i = 0; i < bsmax(bs); i++ if bshas(bs, i) sbfmt(sb, sep) sbfmt(sb, "{}", i) sep = ", " ;; ;; sbputs(sb, "}") }