shithub: mc

Download patch

ref: ce1d62e095493346ea500219a9c11a97562275bb
parent: 0b9c76ce13eb15dff5454b719ab8ee284c73b894
author: Ori Bernstein <[email protected]>
date: Fri Jul 27 10:56:54 EDT 2012

Add more API:

    - Slice allocation
    - Unicode character iteration

--- a/alloc.myr
+++ b/alloc.myr
@@ -6,6 +6,9 @@
 	generic alloc	: (		-> @a*)
 	generic free	: (v:@a*	-> void)
 
+	generic mkslice	: (n : size	-> @a[,])
+	generic freeslice: (sl : @a[,]	-> void)
+
 	const bytealloc	: (sz:size	-> byte*)
 	const bytefree	: (m:byte*, sz:size	-> void)
 ;;
@@ -47,6 +50,17 @@
 
 generic free = {v:@a* -> void
 	bytefree(v castto(byte*), sizeof(@a))
+}
+
+generic mkslice = {n
+	var p
+
+	p = (bytealloc(n*sizeof(@a)) castto(@a*))
+	-> p[0,n]
+}
+
+generic freeslice = {sl
+	-> bytefree(sl castto(byte*), sl.len * sizeof(@a))
 }
 
 const bytealloc = {sz
--- a/bld.sh
+++ b/bld.sh
@@ -45,6 +45,7 @@
     types.myr \
     sys-$SYS.myr \
     die.myr \
+    str.myr \
     alloc.myr"
 
 OBJ="$(echo $ASM | sed 's/\.s/.o /g') $(echo $MYR | sed 's/\.myr/.o /g')"
--- /dev/null
+++ b/str.myr
@@ -1,0 +1,50 @@
+use "die.use"
+use "sys.use"
+use "types.use"
+
+pkg std =
+	const Badchar	: char = -1 castto(char)
+
+	const nextc	: (str : byte[,] -> [char, byte[,]])
+	const chrlen	: (chr : char -> size)
+;;
+
+/* utf8 conversion constants */
+const Utfx = 0xe0	/* mask for "rest" chars */
+const Utf1 = 0x80	/* mask for length 1 char */
+const Utf2 = 0xe0	/* mask for length 1 char */
+const Utf3 = 0xf0	/* mask for length 1 char */
+const Utf4 = 0xf8	/* mask for length 1 char */
+
+const nextc = {str
+	var len : size
+	var mask
+	var chr
+	var i
+	var c
+	var tmp
+
+	c = str[0]
+	if c & 0x80 == 0
+		len = 1
+	elif c & 0xe0 == 0xc0
+		len = 2
+	elif c & 0xf0 == 0xe0
+		len = 3
+	elif c & 0xf8 == 0xf0
+		len = 4
+	else
+		/* skip one char forward so we can try
+		   resyncing the character stream */
+		-> (Badchar, str[1,str.len])
+	;;
+
+	mask = ((1 << (8 - len)) - 1) ^ 0xff
+	chr = c castto(uint32)
+	for i = 1; i < len; i++
+		tmp = str[i]
+		chr = chr << 8 | tmp castto(uint32)
+	;;
+
+	-> (chr castto(char), str[len, str.len])
+}