summarylogtreecommitdiffstats
path: root/mkmake.bash
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