blob: 526878edb29f5968ec9f1fdee28cf1a3bd1a2fd1 (
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
|
#!/bin/bash
stack=(t)
ctest() {
[[ "${stack[0]}" = "$1" ]]
return "$?"
}
cpush() {
stack=("$1" "${stack[@]}")
}
cpop() {
stack=("${stack[@]:1}")
}
cswap() {
stack[0]="$1"
}
ceval() {
local test="$1"
shift
local item
for item in "$@"; do
if [[ -n "${!item}" ]]; then
! [[ "$test" = *ndef ]]
return "$?"
fi
done
[[ "$test" = *ndef ]]
return "$?"
}
for item in "$@"; do
eval "$item=1"
done
while IFS=$'\r' read -r line; do
case "$line" in
@ifdef*|@ifndef*)
if ctest t; then
if ceval $line; then
cpush t
else
cpush w
fi
else
cpush e
fi
;;
@elifdef*|@elifndef*)
if ctest w; then
if ceval $line; then
cswap t
else
cswap w
fi
else
cswap e
fi
;;
@else*)
if ctest w; then
cswap t
else
cswap e
fi
;;
@endif*)
cpop
;;
*)
if ctest t; then
echo "$line"
fi
;;
esac
done
exit 0
|