shithub: mc

Download patch

ref: 7f27f03b1887e599d6e9be6644895e8ab2bd5940
parent: da811fdf191b82d2706f86b82c39f9f6eb1dbb4b
author: Ori Bernstein <ori@eigenstate.org>
date: Mon Jan 19 18:19:07 EST 2015

Add putint.myr.

    Forgot to add the int packing and unpacking code. NB, the
    function names may need a bit of rethink.

--- /dev/null
+++ b/libstd/putint.myr
@@ -1,0 +1,44 @@
+use "types.use"
+use "die.use"
+
+pkg std =
+	generic putle64	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
+	generic putbe64	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
+	generic putle32	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
+	generic putbe32	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
+	generic putle16	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
+	generic putbe16	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
+	generic putle8	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
+	generic putbe8	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
+;;
+
+generic putle64	= {buf, v;	-> putle(buf, v castto(uint64), 8)}
+generic putbe64	= {buf, v;	-> putbe(buf, v castto(uint64), 8)}
+generic putle32	= {buf, v;	-> putle(buf, v castto(uint64), 4)}
+generic putbe32	= {buf, v;	-> putbe(buf, v castto(uint64), 4)}
+generic putle16	= {buf, v;	-> putle(buf, v castto(uint64), 2)}
+generic putbe16	= {buf, v;	-> putbe(buf, v castto(uint64), 2)}
+generic putle8	= {buf, v;	-> putle(buf, v castto(uint64), 1)}
+generic putbe8	= {buf, v;	-> putbe(buf, v castto(uint64), 1)}
+
+const putbe = {buf, val, n
+	var i, k
+	
+	assert(buf.len >= n, "buffer too small")
+	for i = 0; i < n; i++
+		k = val >> (8*(n-i-1))
+		buf[i] = (k & 0xff) castto(byte)
+	;;
+	-> n castto(size)
+}
+
+const putle = {buf, val, n
+	var i
+
+	assert(buf.len >= n, "buffer too small")
+	for i = 0; i < n; i++
+		buf[i] = (val & 0xff) castto(byte)
+		val >>= 8
+	;;
+	-> n castto(size)
+}