shithub: mc

Download patch

ref: 4beafe65a028cf5f83b0a810a2419a597fe3c6f9
parent: 076b8c43103645df52a89ca1f163974cadc4e677
author: Ori Bernstein <[email protected]>
date: Mon Aug 6 19:20:20 EDT 2012

Advance through the args in std.put

--- a/fmt.myr
+++ b/fmt.myr
@@ -25,39 +25,51 @@
 	var s_val;
 
 	n = 0
+	ap = &args castto(byte*)
 	while fmt.len
 		(c, fmt) = striter(fmt)
 		if c == '%'
 			(c, fmt) = striter(fmt)
-			ap = &args
 			match c
 			's':
+				ap = align(ap, sizeof(void*))
 				s_val = *(ap castto(byte[,]*))
 				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))
 				;;
 			/*
 			'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))
 				;;
 			*/
 			'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))
 				;;
 			'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))
 				;;
 			'p':
-				strfmt(buf[n,buf.len], "0x")
+				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*))
 				;;
 			;;
 		else
@@ -109,4 +121,16 @@
 	else
 		-> a
 	;;
+}
+
+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*)
 }
--- a/test.myr
+++ b/test.myr
@@ -25,7 +25,7 @@
 	;;
 	std.write(1, "Hello, 世界\n")
 	chartypes()
-	std.put("format output %i\n", 123)
+	std.put("format output %i %i\n", 123, 321)
 }
 
 const chartypes = {