shithub: mc

ref: 04d647955b3d83e2fb3731d63887ae499809141e
dir: /libstd/strjoin.myr/

View raw version
use "alloc.use"
use "die.use"
use "slcp.use"

pkg std =
	const strcat	: (a : byte[:], b : byte[:] -> byte[:])
	const strjoin	: (strings : byte[:][:], delim : byte[:] -> byte[:])
;;

const strcat = {a, b
	-> strjoin([a, b][:], "")
}

const strjoin = {strings, delim
	var len, off
	var i
	var s

	len = 0
	for i = 0; i < strings.len; i++
		len += strings[i].len
	;;
	if strings.len > 0
		len += (strings.len - 1)*delim.len
	;;

	s = slalloc(len)
	off = 0
	for i = 0; i < strings.len; i++
		slcp(s[off:off + strings[i].len], strings[i])
		off += strings[i].len
		/* we don't want to terminate the last string with delim */
		if i != strings.len - 1
			slcp(s[off:off + delim.len], delim)
			off += delim.len
		;;
	;;
	-> s
}