#!/bin/sh
# Main binary to convert ALD formats

SCVER=0.06

LIBEXEC=$(realpath $(dirname $(realpath "$0"))/../libexec/ALDConvert)
PYCONVN=ALDConvert.py
PYCONV=$LIBEXEC/$PYCONVN
TMPDIR=${TMP:-/tmp}/
uname -a | grep -q FreeBSD && MAKE=gmake || MAKE=make
$MAKE --version 2>&1 | grep -q "GNU" || { echo "GNU make is needed" >&2; exit 3 ; }
GMAKEFLAGS="-s"

exit_handler() {
  local rc=$?
  trap - EXIT
  test -d "$TMPD" && rm -rf -- "$TMPD" >&2
  exit $rc
}
trap exit_handler EXIT HUP INT QUIT PIPE TERM

Usage="Usage: $(basename $0) [-ghNvV] [-t[=file]] [-r reader] [-w writer] input_file output_file [--] [$PYCONVN options]
Long help: $(basename $0) -h"
FUsage="
-h		Get this help
-t[=file]	Test input file for errors, write ALDC tree to file if specified
-g		Print alota debug info
-r TYPE		Select reader TYPE
-w TYPE		Select writer TYPE
-v		Verbose output
-N		Don't generate objects, just list them
-F		Generate a fragment (don't use writer pattern)
-V		Print version number and exit

$PYCONVN options are these, except for -r -w -e and -o:
$(python $PYCONV -h 2>&1 ||:)
"
ARGS=""
while true
do
  case "$1" in
    -g) LIBEXEC="$LIBEXEC"_g; GMAKEFLAGS=""; shift ;;
    -r) R="$2"; shift; shift ;;
    -t*) T="/dev/null"; case "$1" in -t=*) T="${1##-t=}";; esac; Patt="."; shift ;;
    -w) W="$2"; shift; shift ;;
    -F) Patt="."; shift ;;
    -N) NOGEN="YES"; shift ;;
    -h) echo "$Usage" "$FUsage" >&2;  exit 2 ;;
    -v) Verb="-v"; shift ;;
    -V) echo "$(basename $0) $SCVER" >&2; $PYCONV --info; $PYCONV --version; exit 0;;
    --) shift; ARGS="$@"; break ;;
    -?*) ARGS="$@"; break ;;
    "") test -z "$OutFile" && OutFile="-" ||: ; break ;;
    *) if [ -z "$InFile" ]; then InFile="$1"; shift; else
       if [ -z "$OutFile" ]; then OutFile="$1"; shift; else
	  ARGS="$@"; break; fi;
       fi;
       ;;
  esac
done
test -z "$InFile" && { echo "$Usage" >&2; exit 2 ; }
test -z "$OutFile$T" && { echo "$Usage" >&2; exit 2 ; }
test -z "$R" && R=${InFile##*.}
test -z "$W" && W=${OutFile##*.}
test -z "$Patt" && Patt="$LIBEXEC/pattern.$W"
test -r "$Patt" || { echo "No $W writer pattern $Patt, use -F to generate fragment"; echo "$Usage" >&2; exit 2 ; }
test "$Patt" = "." || ARGS="-P $Patt $ARGS"
PYCONV=$LIBEXEC/$PYCONVN

if [ "$R" = "$InFile" -o "$W" = "$OutFile$T" ] ; then echo "$Usage" >&2; exit 3; fi

##TOMAKE=$(mktemp "$TMPD$(basename "$0".XXXXXXX)")
TMPD=$(mktemp -d "$TMPDIR/$(basename $0)".XXXXXXXX)
IND=$(dirname "$InFile")
OUTD=$(dirname "$OutFile")
if [ -z "$T" ]
then
{ python "$PYCONV" $Verb $ARGS -r "$R" -w "$W" -e - "$InFile" -o "$OutFile" || echo "$? ERROR"; } |
	while read To arrow From
	do
	  case "$arrow" in
	    ERROR) 
	      test -z "$Verb" || echo "Return: $To" >&2
	      exit $To
	    ;;
	    "<-")
	      if [ -z "$NOGEN" ]
	      then
	      F=$(realpath "$IND/$From")
		( cd "$TMPD"
		cp "$F" .
		${MAKE} $GMAKEFLAGS -f "$LIBEXEC/Makefile.production" LIBEXE="$LIBEXEC" $(basename "$To")
		)
		mkdir -p $(dirname "$OUTD/$To")
		cp $TMPD/$(basename "$To") "$OUTD/$To"
	      else
		echo "Object: $From -> $To" >&2
	      fi
	    ;;
	    *)
	      echo "WARNING: extra output from $PYCONV:" >&2
	      echo "\t$To $arrow $From" >&2
	    ;;
	  esac
	done
else
  python "$PYCONV" $Verb $ARGS -r "$R" -t "$T" "$InFile"
fi
test -z "$Verb" || echo "Return: $?" >&2
exit $?
