Summary Files Commits Branches @commit @diff @stats
path: root / bin / coolc
blob: e59572afbcd0a36f213988676804834855205176 (plain) (blame)
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
#!/usr/bin/env sh

: "${CONTAINER:=cool-session}"
: "${CONTAINER_HOME:=/home/student/$USER}"
: "${CONTAINER_URL:=ghcr.io/aristotelis2002/uni-cool}"
: "${COOLC_PATH:=/usr/class/bin/coolc}"
: "${SPIM_PATH:=/usr/class/bin/spim}"
: "${EXEC_EXTENSION:=out}"

container_relative_path() {
	__file="$(realpath "$1")"
	__file="$CONTAINER_HOME${__file##$HOME}"
	echo "$__file"
}

if ! command -v docker >/dev/null 2>&1
then
	echo 'You must install docker on your machine!'
	exit 1
fi

if [ -z "$(docker ps -qa -f name="$CONTAINER")" ]
then
	echo "Container image '$CONTAINER' doesn't exist, creating..."
	docker pull ghcr.io/aristotelis2002/uni-cool:latest
	docker run -td --name "$CONTAINER" --mount type=bind,src="$HOME",dst="$CONTAINER_HOME" "$CONTAINER_URL"
fi

if [ "$(docker inspect -f '{{.State.Running}}' "$CONTAINER")" = 'false' ]
then
	echo "Container image '$CONTAINER' isn't running, starting..."
	docker start "$CONTAINER"
fi

files=
bin=
exec=
for file in "$@"
do
	[ -z "$exec" ] && exec="${file%\.*}.s"
	file="$(container_relative_path "$file")"
	files="$files $file"
	[ -z "$bin" ] && bin="${file%\.*}.s"
done

eval "docker exec -u root -w '$(container_relative_path .)' '$CONTAINER' '$COOLC_PATH' $files || exit \$?"

exec="${exec%\.s}.$EXEC_EXTENSION"

cat <<EXECUTABLE > "$exec"
#!/usr/bin/env sh
eval "docker exec -u root -w '$(container_relative_path .)' '$CONTAINER' '$SPIM_PATH' -file '$bin'" \
	| sed '1,5d;/^COOL program successfully executed$/d;\$s/COOL program successfully executed$//'
EXECUTABLE

chmod +x "$exec"