ref: dc5040ca44220629fb40e077ae8127fc764f43db
dir: /fmt.myr/
use "die.use" use "sys.use" use "types.use" use "utf.use" pkg std = const bfmt : (buf : byte[,], fmt : byte[,], args:... -> size) const put : (fmt : byte[,], args:... -> size) ;; const put = {fmt, args var buf : byte[2048] var n n = bfmt(buf[0,2048], fmt, args) write(1, buf[0,n]) -> n } const bfmt = {buf, fmt, args var c var n var ap var i_val; var s_val; n = 0 while fmt.len (c, fmt) = striter(fmt) if c == '%' (c, fmt) = striter(fmt) ap = &args match c 's': s_val = *(ap castto(byte[,]*)) n += strfmt(buf[n, buf.len], s_val) ;; /* format integers */ 'b': i_val = *(ap castto(int8*)) castto(int64) n += intfmt(buf[n, buf.len], i_val, 10) ;; /* 'w': i_val = *(ap castto(int16*)) castto(int64) n += intfmt(buf[n, buf.len], i_val, 10) ;; */ 'i': i_val = *(ap castto(int32*)) castto(int64) n += intfmt(buf[n, buf.len], i_val, 10) ;; 'l': i_val = *(ap castto(int64*)) n += intfmt(buf[n, buf.len], i_val, 10) ;; 'p': n += strfmt(buf[n,buf.len], "0x") i_val = *(ap castto(int64*)) n += intfmt(buf[n, buf.len], i_val, 16) ;; ;; else n += encode(buf[n,buf.len], c) ;; ;; -> n } const strfmt = {buf, str var i for i = 0; i < min(str.len, buf.len); i++ buf[i] = str[i] ;; -> i } const intfmt = {buf, val, base var digits = [ '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f' ] var isneg var b : char[32] var i var j var n n = 0 i = 0 if val < 0 isneg = true ;; while val != 0 b[i] = digits[val % base] val /= base i++ ;; n = 0 if isneg n += encode(buf[n,buf.len], '-') ;; for j = i-1; j >= 0; j-- n += encode(buf[n,buf.len], b[j]) ;; -> n } const min = {a : size, b : size if a < b -> a else -> b ;; }