shithub: mc

ref: ea3c3bcded6031ba1f72e1af6683e0c6bcade96d
dir: /str.myr/

View raw version
use "die.use"
use "sys.use"
use "types.use"

pkg std =
	const Badchar	: char = -1 castto(char)

	const encode	: (buf : byte[,], chr : char -> bool)
	const decode	: (str : byte[,] -> char)

	const striter	: (str : byte[,] -> [char, byte[,]])
	const strjoin	: (lst : byte[,][,], delim:byte[,] -> byte[,])
	const strsep	: (str : byte[,], delim:byte[,] -> byte[,][,])
	const strbjoin	: (lst : byte[,][,], delim:byte[,] -> byte[,])
	const strbsep	: (str : byte[,], delim:byte[,] -> byte[,][,])
;;

const striter = {str
	var len
	var mask
	var chr
	var i
	var c
	var tmp

	c = str[0]
	if c & 0x80 == 0	/* 0b0xxx_xxxx */
		len = 1
	elif c & 0xe0 == 0xc0	/* 0b110x_xxxx */
		len = 2
	elif c & 0xf0 == 0xe0 	/* 0b1110_xxxx */
		len = 3
	elif c & 0xf8 == 0xf0 	/* 0b1111_0xxx */
		len = 4
	else
		/* skip one char forward so we can try
		   resyncing the character stream */
		-> (Badchar, str[1,str.len])
	;;

	mask = (1 << (7 - len)) - 1
	chr = (c castto(uint32)) & mask
	for i = 1; i < len; i++
		tmp = str[i] castto(uint32)
		chr = (chr << 6) | (tmp & 0x3f)
	;;

	-> (chr castto(char), str[len, str.len])
}