ref: 957f1f01589ac9278578e2f6cdcab0c6fb5f77fb
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*)) write(1, "int\n") ;; '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 } /* generic intfmt = {buf, val:@a::tcnum, base write("int \n") -> 0 } */ const min = {a : size, b : size if a < b -> b else -> a ;; }