shithub: mc

Download patch

ref: 17ede35bdd7237b9d3353d996fad3b1cf506fa5f
parent: fca3ac4c15e4691e230c2f90f8af71313cddc0a5
author: Ori Bernstein <ori@eigenstate.org>
date: Sat Jun 17 04:44:05 EDT 2017

Add host-order getters for ints.

	Ugly, but necessary for some file formats.

--- a/lib/std/getint.myr
+++ b/lib/std/getint.myr
@@ -1,14 +1,28 @@
+use "die"
+use "memops"
+
 pkg std =
-	generic getle64	: (buf : byte[:]	-> @a::(numeric,integral))
-	generic getbe64	: (buf : byte[:]	-> @a::(numeric,integral))
-	generic getle32	: (buf : byte[:]	-> @a::(numeric,integral))
-	generic getbe32	: (buf : byte[:]	-> @a::(numeric,integral))
-	generic getle16	: (buf : byte[:]	-> @a::(numeric,integral))
-	generic getbe16	: (buf : byte[:]	-> @a::(numeric,integral))
-	generic getle8	: (buf : byte[:]	-> @a::(numeric,integral))
-	generic getbe8	: (buf : byte[:]	-> @a::(numeric,integral))
+	generic gethost64	: (buf : byte[:]	-> @a::(numeric,integral))
+	generic getle64		: (buf : byte[:]	-> @a::(numeric,integral))
+	generic getbe64		: (buf : byte[:]	-> @a::(numeric,integral))
+	generic gethost32	: (buf : byte[:]	-> @a::(numeric,integral))
+	generic getle32		: (buf : byte[:]	-> @a::(numeric,integral))
+	generic getbe32		: (buf : byte[:]	-> @a::(numeric,integral))
+	generic gethost16	: (buf : byte[:]	-> @a::(numeric,integral))
+	generic getle16		: (buf : byte[:]	-> @a::(numeric,integral))
+	generic getbe16		: (buf : byte[:]	-> @a::(numeric,integral))
+	generic gethost8	: (buf : byte[:]	-> @a::(numeric,integral))
+	generic getle8		: (buf : byte[:]	-> @a::(numeric,integral))
+	generic getbe8		: (buf : byte[:]	-> @a::(numeric,integral))
 ;;
 
+generic gethost64 = {buf -> @a::(numeric,integral)
+	var val : int64
+	iassert(buf.len >= 8, "gethost64: index out of bounds")
+	memblit((&val : byte#), (buf : byte#), 8)
+	-> (val : @a::(numeric,integral))
+}
+
 generic getbe64 = {buf -> @a::(numeric,integral)
 	-> ((buf[0] : @a::(numeric,integral)) << 56) | \
 		((buf[1] : @a::(numeric,integral)) << 48) | \
@@ -31,6 +45,13 @@
 		((buf[7] : @a::(numeric,integral))  << 56)
 }
 
+generic gethost32 = {buf -> @a::(numeric,integral)
+	var val : int32
+	iassert(buf.len >= 4, "gethost32: index out of bounds")
+	memblit((&val : byte#), (buf : byte#), 4)
+	-> (val : @a::(numeric,integral))
+}
+
 generic getbe32 = {buf
 	-> ((buf[0] : @a::(numeric,integral)) << 24) | \
 		((buf[1] : @a::(numeric,integral)) << 16) | \
@@ -45,6 +66,13 @@
 		((buf[3] : @a::(numeric,integral)) << 24)
 }
 
+generic gethost16 = {buf -> @a::(numeric,integral)
+	var val : int16
+	iassert(buf.len >= 2, "gethost16: index out of bounds")
+	memblit((&val : byte#), (buf : byte#), 4)
+	-> (val : @a::(numeric,integral))
+}
+
 generic getbe16 = {buf
 	-> ((buf[0] : @a::(numeric,integral)) << 8) | \
 		((buf[1] : @a::(numeric,integral)) << 0)
@@ -53,6 +81,10 @@
 generic getle16 = {buf
 	-> ((buf[0] : @a::(numeric,integral)) << 0) | \
 		((buf[1] : @a::(numeric,integral)) << 8)
+}
+
+generic gethost8 = {buf
+	-> (buf[0] : @a::(numeric,integral)) << 0
 }
 
 generic getbe8 = {buf
--- a/lib/std/putint.myr
+++ b/lib/std/putint.myr
@@ -1,30 +1,39 @@
-use "assert"
+use "die"
+use "memops"
 use "types"
 
 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 puthost64	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
+	generic putle64		: (buf : byte[:], v :  @a::(numeric,integral) -> size)
+	generic putbe64		: (buf : byte[:], v :  @a::(numeric,integral) -> size)
+	generic puthost32	: (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 puthost16	: (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 puthost8	: (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 : uint64), 8)}
-generic putbe64	= {buf, v;	-> putbe(buf, (v : uint64), 8)}
-generic putle32	= {buf, v;	-> putle(buf, (v : uint64), 4)}
-generic putbe32	= {buf, v;	-> putbe(buf, (v : uint64), 4)}
-generic putle16	= {buf, v;	-> putle(buf, (v : uint64), 2)}
-generic putbe16	= {buf, v;	-> putbe(buf, (v : uint64), 2)}
-generic putle8	= {buf, v;	-> putle(buf, (v : uint64), 1)}
-generic putbe8	= {buf, v;	-> putbe(buf, (v : uint64), 1)}
+generic puthost64	= {buf, v;	-> puthost(buf, (v : uint64), 8)}
+generic putle64		= {buf, v;	-> putle(buf, (v : uint64), 8)}
+generic putbe64		= {buf, v;	-> putbe(buf, (v : uint64), 8)}
+generic puthost32	= {buf, v;	-> puthost(buf, (v : uint64), 4)}
+generic putle32		= {buf, v;	-> putle(buf, (v : uint64), 4)}
+generic putbe32		= {buf, v;	-> putbe(buf, (v : uint64), 4)}
+generic puthost16	= {buf, v;	-> puthost(buf, (v : uint64), 2)}
+generic putle16		= {buf, v;	-> putle(buf, (v : uint64), 2)}
+generic putbe16		= {buf, v;	-> putbe(buf, (v : uint64), 2)}
+generic puthost8	= {buf, v;	-> puthost(buf, (v : uint64), 1)}
+generic putle8		= {buf, v;	-> putle(buf, (v : uint64), 1)}
+generic putbe8		= {buf, v;	-> putbe(buf, (v : uint64), 1)}
 
 const putbe = {buf, val, n
 	var k
 	
-	assert(buf.len >= n, "buffer too small")
+	iassert(buf.len >= n, "buffer too small")
 	for var i = 0; i < n; i++
 		k = val >> (8*(n-i-1))
 		buf[i] = (k & 0xff: byte)
@@ -33,10 +42,16 @@
 }
 
 const putle = {buf, val, n
-	assert(buf.len >= n, "buffer too small")
+	iassert(buf.len >= n, "buffer too small")
 	for var i = 0; i < n; i++
 		buf[i] = (val & 0xff : byte)
 		val >>= 8
 	;;
+	-> (n : size)
+}
+
+const puthost = {buf, val, n
+	iassert(buf.len >= n, "buffer too small")
+	memblit((buf : byte#), (&val : byte#), n)
 	-> (n : size)
 }