shithub: mc

ref: 094e3fb0ee4dd4b8aaaca40da90bf770ae42674f
dir: /lib/inifile/access.myr/

View raw version
use std
use bio

use "types"

pkg inifile =
	type inisectiter = struct
		it : std.htkviter((byte[:], byte[:]), byte[:])
	;;
	impl iterable inisectiter -> byte[:]

	/* key getting/setting */
	const get	: (ini : inifile#, sect : byte[:], key : byte[:]	-> std.option(byte[:]))
	const getv	: (ini : inifile#, sect : byte[:], key : byte[:], val : byte[:]	-> byte[:])
	const has	: (ini : inifile#, sect : byte[:], key : byte[:] -> bool)
	const put	: (ini : inifile#, sect : byte[:], key : byte[:], val : byte[:]	-> void)

	const bysection	: (ini : inifile# -> inisectiter)
;;

const get = {ini, sect, key
	-> std.htget(ini.elts, (sect, key))
}

const getv = {ini, sect, key, val
	-> std.htgetv(ini.elts, (sect, key), val)
}

const has = {ini, sect, key
	-> std.hthas(ini.elts, (sect, key))
}

const put = {ini, sect, key, val
	if std.hthas(ini.elts, (sect, key))
		std.slfree(std.htgetv(ini.elts, (sect, key), ""))
	else
		sect = std.sldup(sect)
		key = std.sldup(key)
	;;
	std.htput(ini.elts, (sect, key), std.sldup(val))
}

const bysection = {ini
	-> [.it=std.htbykeyvals(ini.elts)]
}

impl iterable inisectiter -> byte[:] =
	__iternext__ = {itp, valp : byte[:]#
		var kvp : ((byte[:], byte[:]), byte[:])
		if __iternext__(&itp.it, &kvp)
			match kvp
			| ((s, _), _):	valp# = s
			;;
			-> true
		;;
		-> false
	}

	__iterfin__ = {itp, valp -> void
	}
;;