summaryrefslogtreecommitdiff
path: root/tests/t0036-lang-string.sh
blob: 8e400227a04aced9c569887451f3d0faf6c35e9d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#!/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'"