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