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])
+}