typeset -g -a svtab
typeset -g -A svtab_flags svtab_sh svtab_src
typeset -g zsv_flags zsv_sh
local f name flags sh line
local -a split

# invoked from zsv.exec, don't parse other files unnecessarily
if [[ -n $1 && -e $zsv_svd/$1 ]]; then
	svtab=( $1 )
	svtab_src[$1]=$zsv_svd/$1
	svtab_sh[$1]="$(<$zsv_svd/$1)"
	line=${${=svtab_sh[$1]}[1]}
	if [[ $line == '#flags:'* ]]; then
		svtab_flags[$1]=$zsv_default_flags${line#\#flags:}
	else
		svtab_flags[$1]=$zsv_default_flags
	fi
	return 0
fi

# read svtab
if [[ -e $zsv_svtab ]]; then
	while IFS=: read line; do
		[[ $line == '#'* ]] && continue
		if [[ $line == [$~IFS]* ]]; then
			svtab_sh[$name]+=$'\n'$line
		else
			split=( ${(s.:.)line} )
			name=$split[1]
			svtab_src[$name]=$zsv_svtab
			if [[ ${line#*:} == :* ]]; then
				sh=${line#*::}
			else
				flags=$split[2]
				if (( $#split >= 3 )); then
					sh=${${line#*:}#*:}
				else
					unset sh
				fi
			fi

			svtab+=( $name )
			svtab_flags[$name]=$zsv_default_flags$flags
			svtab_sh[$name]=${sh}
		fi
	done <$zsv_svtab
fi

# read all plain files (or symlinks to) in sv.d
for f in $zsv_svd/*(N-.); do
	name=$f:t
	svtab+=( $name )
	svtab_src[$name]=$f
	svtab_sh[$name]="$(<$f)"
	line=${${=svtab_sh[$name]}[1]}
	if [[ $line == '#flags:'* ]]; then
		svtab_flags[$name]=$zsv_default_flags${line#\#flags:}
	fi
done
# vim: ft=zsh noet ts=4 sts=4 sw=4