# Copyright 2012 The Go Authors.  All rights reserved.
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.

# These function names are also known to
# (and are the plan for transitioning to) run.go.

compile() {
	$G $D/$F.go
}

compiledir() {
	for gofile in $D/$F.dir/*.go
	do
		$G -I. "$gofile" || return 1
	done
}

errorcheckdir() {
	lastzero=""
	if [ "$1" = "-0" ]; then
		lastzero="-0"
	fi
	files=($D/$F.dir/*.go)
	for gofile in ${files[@]}
	do
		zero="-0"
		if [ ${files[${#files[@]}-1]} = $gofile ]; then
			zero=$lastzero
		fi
		errchk $zero $G -D. -I. -e $gofile
	done
}

rundir() {
	lastfile=""
	for gofile in $D/$F.dir/*.go
	do
		name=$(basename ${gofile/\.go/} )
		$G -D. -I. -e "$gofile" || return 1
		lastfile=$name
	done
	$L -o $A.out -L. $lastfile.$A
	./$A.out
}

rundircmpout() {
	lastfile=""
	for gofile in $D/$F.dir/*.go
	do
		name=$(basename ${gofile/\.go/} )
		$G -D. -I. -e "$gofile" || return 1
		lastfile=$name
	done
	$L -o $A.out -L. $lastfile.$A
	./$A.out | cmp - $D/$F.out
}

build() {
	$G $D/$F.go && $L $F.$A
}

runoutput() {
	go run "$D/$F.go" > tmp.go
	go run tmp.go
}

run() {
	gofiles=""
	ingo=true
	while $ingo; do
		case "$1" in
		*.go)
			gofiles="$gofiles $1"
			shift
			;;
		*)
			ingo=false
			;;
		esac
	done

	$G $D/$F.go $gofiles && $L $F.$A && ./$A.out "$@"
}

cmpout() {
	$G $D/$F.go && $L $F.$A && ./$A.out 2>&1 | cmp - $D/$F.out
}

errorcheck() {
	zero=""
	if [ "$1" = "-0" ]; then
		zero="-0"
		shift
	fi
	errchk $zero $G -e $* $D/$F.go
}

skip() {
	true
}
