ref: 125d94765ebb698b565c859a7266a885adbbf7f7
parent: 90115699edf954c715cf319a374cffd3208248ce
author: Ori Bernstein <[email protected]>
date: Mon Aug 6 21:56:13 EDT 2012
Add a vararg iterator function.
--- a/bld.sh
+++ b/bld.sh
@@ -44,6 +44,7 @@
MYR="types.myr \
sys-$SYS.myr \
die.myr \
+ varargs.myr \
alloc.myr\
utf.myr \
fmt.myr \
--- a/fmt.myr
+++ b/fmt.myr
@@ -2,10 +2,11 @@
use "sys.use"
use "types.use"
use "utf.use"
+use "varargs.use"
pkg std =
const bfmt : (buf : byte[,], fmt : byte[,], args:... -> size)
- const bfmtv : (buf : byte[,], fmt : byte[,], ap:byte* -> size)
+ const bfmtv : (buf : byte[,], fmt : byte[,], ap:valist -> size)
const put : (fmt : byte[,], args:... -> size)
;;
@@ -13,20 +14,24 @@
var buf : byte[2048]
var n
- n = bfmtv(buf[0,2048], fmt, &args castto(byte*))
+ n = bfmtv(buf[0,2048], fmt, vastart(&args))
write(1, buf[0,n])
-> n
}
const bfmt = {buf, fmt, args
- -> bfmtv(buf, fmt, &args castto(byte*))
+ -> bfmtv(buf, fmt, vastart(&args))
}
const bfmtv = {buf, fmt, ap
var c
var n
- var i_val;
- var s_val;
+ var s_val : byte[,]
+ var b_val : int8
+ var w_val : int16
+ var i_val : int32
+ var l_val : int64
+ var p_val : byte*
n = 0
while fmt.len
@@ -35,42 +40,29 @@
(c, fmt) = striter(fmt)
match c
's':
- ap = align(ap, sizeof(void*))
- s_val = *(ap castto(byte[,]*))
+ (s_val, ap) = vanext(ap)
n += strfmt(buf[n, buf.len], s_val)
- ap = add(ap, sizeof(byte[,]))
;;
/* format integers */
'b':
- ap = align(ap, sizeof(int8));
- i_val = *(ap castto(int8*)) castto(int64)
- n += intfmt(buf[n, buf.len], i_val, 10)
- ap = add(ap, sizeof(int8))
+ (b_val, ap) = vanext(ap)
+ n += intfmt(buf[n, buf.len], b_val castto(int64), 10)
;;
'w':
- ap = align(ap, sizeof(int16));
- i_val = *(ap castto(int16*)) castto(int64)
- n += intfmt(buf[n, buf.len], i_val, 10)
- ap = add(ap, sizeof(int16))
+ (w_val, ap) = vanext(ap)
+ n += intfmt(buf[n, buf.len], i_val castto(int64), 10)
;;
'i':
- ap = align(ap, sizeof(int32));
- i_val = *(ap castto(int32*)) castto(int64)
- n += intfmt(buf[n, buf.len], i_val, 10)
- ap = add(ap, sizeof(int32))
+ (i_val, ap) = vanext(ap)
+ n += intfmt(buf[n, buf.len], i_val castto(int64), 10)
;;
'l':
- ap = align(ap, sizeof(int64));
- i_val = *(ap castto(int64*))
- n += intfmt(buf[n, buf.len], i_val, 10)
- ap = add(ap, sizeof(int64))
+ (l_val, ap) = vanext(ap)
+ n += intfmt(buf[n, buf.len], i_val castto(int64), 10)
;;
'p':
- ap = align(ap, sizeof(byte*));
- i_val = *(ap castto(int64*))
- strfmt(buf[n,buf.len], "0x")
- n += intfmt(buf[n, buf.len], i_val, 16)
- ap = add(ap, sizeof(byte*))
+ (p_val, ap) = vanext(ap)
+ n += intfmt(buf[n, buf.len], p_val castto(int64), 16)
;;
;;
else
@@ -124,14 +116,3 @@
;;
}
-const align = {p, align
- var v
-
- v = p castto(intptr)
- v = (v + align - 1) & ~(align - 1)
- -> v castto(byte*)
-}
-
-const add = {p, sz
- -> ((p castto(intptr)) + sz) castto(byte*)
-}