ref: fdf750afef5e10f78f64bf5a219625de9fb3b03f
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 s_val; var b_val; /* var w_val; */ var i_val; var l_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': b_val = *(ap castto(int8*)) write(1, "int\n") ;; /* 'w': w_val = *(ap castto(int16*)) write(1, "int\n") ;; */ 'i': i_val = *(ap castto(int32*)) n += intfmt(buf[n, buf.len], i_val, 10) ;; 'l': l_val = *(ap castto(int64*)) write(1, "int\n") ;; 'p': write(1, "ptr\n") ;; ;; 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 b : char[32] var i var j var n n = 0 i = 0 while val > 0 b[i] = digits[val % base] val /= base i++ ;; n = 0 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 -> b else -> a ;; }