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

SCVER=0.03

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"; 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) [-ghNV] [-r reader] [-w writer] input_file output_file [--] [$PYCONVN options]
Long help: $(basename $0) -h"
FUsage="
-h		Get this help
-g		Print alota debug info
-r TYPE		Select reader TYPE
-w TYPE		Select writer TYPE
-N		Don't generate objects, just list them
-F		Generate a fragment (don't use writer pattern)
-V		Print version and exit

$PYCONVN options are theese, 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 ;;
    -w) W="$2"; shift; shift ;;
    -F) Patt="."; shift ;;
    -N) NOGEN="YES"; shift ;;
    -h) echo "$Usage" "$FUsage"; exit 2 ;;
    -V) echo "$(basename $0) $SCVER"; $PYCONV --info; $PYCONV --version; exit 0;;
    --) shift; ARGS="$@"; break ;;
    -*) ARGS="$@"; 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"; exit 2 ; }
test -z "$OutFile" && { echo "$Usage"; 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"; exit 2 ; }
test "$Patt" == "." || ARGS="-P $Patt $ARGS"
PYCONV=$LIBEXEC/$PYCONVN

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

##TOMAKE=$(mktemp "$TMPD$(basename "$0".XXXXXXX)")
TMPD=$(mktemp -d "$TMPDIR/$(basename $0)".XXXXXXXX)
IND=$(dirname "$InFile")
OUTD=$(dirname "$OutFile")
python "$PYCONV" $ARGS -r "$R" -w "$W" -e - "$InFile" -o "$OutFile" |
	while read To arrow From
	do
	  if [ "$arrow" != "<-" ]
	  then
	    echo "WARNING: extra output from $PYCONV:" >&2
	    echo "\t$To $arrow $From" >&2
	  else
	    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
	  fi
	done
