#!/bin/sh set -eu dir="${TMPDIR-/tmp}/mcpu-cpp-lang-string-$$" mkdir -p "$dir" trap 'rm -rf "$dir"' EXIT HUP INT TERM cat > "$dir/normalize.c" <<'EOT' # lang "DiFf" #endlang #lang "dIfT" #endlang EOT "$MCPU_CPP" --no-config "$dir/normalize.c" -o "$dir/normalize.out" grep '^#lang "DiFf"$' "$dir/normalize.out" >/dev/null grep '^#lang "dIfT"$' "$dir/normalize.out" >/dev/null if grep '^[[:space:]][[:space:]]*#lang' "$dir/normalize.out" >/dev/null then echo '#lang leading whitespace was not normalized' >&2 exit 1 fi cat > "$dir/case.c" <<'EOT' #lang "diff" #endlang #lang "Diff" #endlang #lang "DIFF" #endlang #lang "dIfF" y' = 1; #endlang #lang "dIfT" #endlang #lang "ALG" #endlang #lang "As" #endlang #lang "aVm" #endlang #lang "aCs" #endlang EOT "$MCPU_CPP" --no-config "$dir/case.c" -o "$dir/case.out" for spelling in diff Diff DIFF dIfF dIfT ALG As aVm aCs do grep "^#lang \"$spelling\"$" "$dir/case.out" >/dev/null done grep "^y' = 1;$" "$dir/case.out" >/dev/null check_bad() { name=$1 pattern=$2 if "$MCPU_CPP" --no-config "$dir/$name.c" -o "$dir/$name.out" 2> "$dir/$name.err" then echo "$name unexpectedly accepted" >&2 exit 1 fi grep -F "$pattern" "$dir/$name.err" >/dev/null } cat > "$dir/unquoted.c" <<'EOT' #lang diff EOT check_bad unquoted 'string constant expected after #lang' cat > "$dir/empty.c" <<'EOT' #lang "" EOT check_bad empty 'empty language name in #lang' cat > "$dir/leading-space.c" <<'EOT' #lang " diff" EOT check_bad leading-space 'one word without whitespace' cat > "$dir/trailing-space.c" <<'EOT' #lang "diff " EOT check_bad trailing-space 'one word without whitespace' cat > "$dir/internal-space.c" <<'EOT' #lang "di ff" EOT check_bad internal-space 'one word without whitespace' printf '#lang "di\tff"\n' > "$dir/internal-tab.c" check_bad internal-tab 'one word without whitespace' cat > "$dir/unknown.c" <<'EOT' #lang "cplusplus" EOT check_bad unknown "unknown language 'cplusplus'" cat > "$dir/zero.c" <<'EOT' #lang "0" EOT check_bad zero "unknown language '0'" cat > "$dir/extra.c" <<'EOT' #lang "diff" extra EOT check_bad extra 'extra text after #lang string constant' cat > "$dir/multiline.c" <<'EOT' #lang "di ff" EOT check_bad multiline 'unterminated #lang string constant' cat > "$dir/spliced.c" <<'EOT' #lang "di\ ff" EOT check_bad spliced 'one physical source line' cat > "$dir/no-escape.c" <<'EOT' #lang "d\iff" EOT check_bad no-escape "unknown language 'd\\iff'"