X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=scripts%2Fshader-cpp.sh;h=95568f6f7c4a4515440de4b93af4633552791896;hb=HEAD;hp=28890ae3e9cd135fd22bc8af1f57870f93673938;hpb=cf7e86e402578c8a807ffcb15041ec19b0dffe23;p=xonotic%2Fxonotic-maps.pk3dir.git diff --git a/scripts/shader-cpp.sh b/scripts/shader-cpp.sh index 28890ae3..95568f6f 100755 --- a/scripts/shader-cpp.sh +++ b/scripts/shader-cpp.sh @@ -7,6 +7,13 @@ case "$0" in esac . ./shader-parser.subr +set -e + +err() +{ + echo >&2 "(EE) $*" + exit 1 +} LF=" " @@ -71,47 +78,58 @@ shaderkill() } preprocess() { - condstack= - echo "$shadertext" | while IFS= read -r L; do - [ -n "$L" ] || continue - set -- $L - k=$1 - shift - case "$k" in - '#if') - case "$LF$conds$LF" in - *"$LF$*$LF"*) - condstack=0$condstack - ;; - *) - condstack=1$condstack - ;; - esac - ;; - '#else') - case "$condstack" in - 0*) - condstack=1${condstack#0} - ;; - 1*) - condstack=0${condstack#1} - ;; - esac - ;; - '#endif') - condstack=${condstack#?} - ;; - *) - case "$condstack" in - *0*) - ;; - *) - echo "${L% }" - ;; - esac - ;; - esac - done + echo "$shadertext" | { + condstack= + while IFS= read -r L; do + [ -n "$L" ] || continue + set -- $L + k=$1 + shift + case "$k" in + '#if') + case "$LF$conds$LF" in + *"$LF$*$LF"*) + condstack=0$condstack + ;; + *) + condstack=1$condstack + ;; + esac + ;; + '#else') + if [ -z "$condstack" ]; then + err "unmatched #else" + fi + case "$condstack" in + 0*) + condstack=1${condstack#0} + ;; + 1*) + condstack=0${condstack#1} + ;; + esac + ;; + '#endif') + if [ -z "$condstack" ]; then + err "unmatched #endif" + fi + condstack=${condstack#?} + ;; + *) + case "$condstack" in + *0*) + ;; + *) + echo "${L% }" + ;; + esac + ;; + esac + done + if [ -n "$condstack" ]; then + err "unmatched #if" + fi + } } conditionalize() { @@ -156,7 +174,7 @@ conditionalize() } parse_shader_post() { - allconds=`echo "$shaderconds" | sort -u | grep .` + allconds=`echo "$shaderconds" | sort -u | grep . || true` conds= conditionalize "$allconds" }