#!/bin/bash
#set -x

tailpid=0
gierpid=0

cleanup ()
{
  echo cleanup called
  rm -f /tmp/passes.flx
  if [ $tailpid -ne 0 ]
  then
    echo kill tail
    kill $tailpid
    tailpid=0
  fi
  if [ $gierpid -ne 0 ]
  then
    echo kill gier
    kill $gierpid
    gierpid=0
  fi
  rm in.demo in2.demo
  exit 0
}

trap "cleanup" INT

cp ../tapes/tapet1/passes.flx /tmp/passes.flx
echo "      t<" | a2flx >>/tmp/passes.flx

clock=460850

mkfifo in.demo
mkfifo in2.demo
tail -1f in.demo | tee in.demo.tee >in2.demo &
tailpid=$!
../GIER in2.demo > GIER.out 2>&1 &
gierpid=$!
demo=in.demo

testit ()
{
  local n=$1
  local real=$2
  local transient=$3
  local diskmode=$4
  local tape=/tmp/big.asc
  if [ $diskmode -eq 1 ]
  then
    echo "algol,_i_d<" >$tape
  else
    echo "algol,_i<" >$tape
  fi
  echo "n: $n" >>$tape
  echo "_b_e_g_i_n" >>$tape
  echo "_i_n_t_e_g_e_r i;" >>$tape
  echo -n "i:=" >>$tape
  for((i=1; i<=n; i++))
  do
    if [ $i -eq 1 ]
    then
      if [ $real -gt 0 ]
      then
        echo -n "1.0" >>$tape
      else
        echo -n "1" >>$tape
      fi
    else
      if [ $real -eq 3 ]
      then
	echo -n "+_i_n_t_e_g_e_r _4_0 $i" >>$tape
      else
	if [ $real -gt 1 ]
	then
	  echo -n "+$i.0" >>$tape
	else
	  echo -n "+$i" >>$tape
	fi
      fi
    fi
  done
  echo ";" >>$tape
  echo "writecr;" >>$tape
  echo "writeinteger(|<p|>,i)" >>$tape
  echo "_e_n_d;" >>$tape
  echo "t<" >>$tape
  rm -f /tmp/bigout.flx
  echo "LOADPUNCH /tmp/bigout.flx" >>$demo
  if [ $transient -eq 1 ]
  then
    echo "LOADREADER ../tapes/tapet1/pass1.flx" >>$demo
    echo "WAITINPUT" >>$demo
#   r
    echo "TYPE 41" >>$demo
    echo "WAITINPUT" >>$demo
#   ,
    echo "TYPE 27" >>$demo
    echo "WAITINPUT" >>$demo
#   a
    echo "TYPE 49" >>$demo
    echo "WAITINPUT" >>$demo
#   l
    echo "TYPE 35" >>$demo
    echo "WAITINPUT" >>$demo
#   g
    echo "TYPE 55" >>$demo
    echo "WAITINPUT" >>$demo
#   o
    echo "TYPE 38" >>$demo
    echo "WAITINPUT" >>$demo
#   l
    echo "TYPE 35" >>$demo
    echo "WAITINPUT" >>$demo
#   ,
    echo "TYPE 27" >>$demo
    echo "WAITINPUT" >>$demo
#   r
    echo "TYPE 41" >>$demo
    echo "WAITINPUT" >>$demo
#   ,
    echo "TYPE 27" >>$demo
    echo "WAITINPUT" >>$demo
#   _
    echo "TYPE 14" >>$demo
    echo "WAITINPUT" >>$demo
#   i
    echo "TYPE 57" >>$demo
    if [ $diskmode -eq 1 ]
    then
      echo "WAITINPUT" >>$demo
#     ,
      echo "TYPE 27" >>$demo
      echo "WAITINPUT" >>$demo
#     _
      echo "TYPE 14" >>$demo
      echo "WAITINPUT" >>$demo
#     d
      echo "TYPE 52" >>$demo
    fi
    echo "WAITINPUT" >>$demo
#   <
    echo "TYPE 17" >>$demo
    echo "WAITINPUT" >>$demo
    echo "LOADREADER /tmp/big.asc" >>$demo
#   space
    echo "TYPE 0" >>$demo
    echo "WAITINPUT" >>$demo
    echo "LOADREADER /tmp/passes.flx" >>$demo
#   space
    echo "TYPE 0" >>$demo
  else
    echo "LOADREADER $tape" >>$demo
    echo "WAITINPUT" >>$demo
#   r
    echo "TYPE 41" >>$demo
    echo "WAITINPUT" >>$demo
#   <
    echo "TYPE 17" >>$demo
  fi
  echo "WAITINPUT" >>$demo
  echo "TYPE 13" >>$demo
  echo "WAITINPUT" >>$demo
  while :
  do
    if [ -f /tmp/bigout.flx ]
    then
      echo punch file available
      break
    else
      echo wait for punch file
      sleep 1
    fi
  done
  while :
  do
    flx2a </tmp/bigout.flx|grep -E -q 'annul|undef'
    result=$?
    if [ $result -eq 0 ]
    then
      break
    fi
    usleep 100000
  done
  echo "FINISHPUNCH" >>$demo
  flx2a </tmp/bigout.flx|fgrep -q undef
  badga4=$?
  flx2a </tmp/bigout.flx|fgrep -q ok
  result=$?
}

#for config in help3demo big1 buffertape disc1 drumtjek drumtjekga4
#for config in drum3bufga4 drum3nobufga4 aarhus drum1bufcarr
#for config in big3 aarhus2
#for config in help3demo big1 buffertape disc1 drumtjek drumtjekga4 drum3bufga4 drum3nobufga4 aarhus drum1bufcarr aarhus2
#for config in disc2 disc6 drum1bufcarr drum1ga3 drum1ga4 drum1 drum1nobuf drum3bufga4 drum3bufga4turbo drum3buf drum3ga3 drum3ga4 drum3 drum3nobufga4 drum3nobufga4turbo drum3nobuf drumtjekga4 drumtjek help3demo
#for config in drumtjek
for config in aarhus1 aarhus2 aarhus big1 big2 big3 big4ga4 big4 big5ga4 big5 big6ga4 big6 bufferdisk buffertape2 buffertape buffertapesamba buffertapew disc1ga4 disc1 disc2 disc6 drum1bufcarr drum1ga4 drum1 drum1nobuf drum3bufga4 drum3bufga4turbo drum3buf drum3ga4 drum3 drum3nobufga4 drum3nobufga4turbo drum3nobuf drumtjekga4 drumtjek help3demo
do
  for transient in 0 1
  do
    for diskmode in 0 1
    do
      for real in 0 1 2
      do
        echo config: $config transient: $transient diskmode: $diskmode real: $real `date`
	if [ $diskmode -eq 1 ]
	then
	  outfile=$config'_d'$real
	else
	  outfile=$config$real
	fi
	if [ $transient -eq 1 ]
	then
	  outfile=$outfile'tr'
	fi
	if [ -f $outfile.pdf ]
	then
	  echo Skipping, $outfile.pdf already exist
	else
	  lo=100
	  hi=100000
	  lastok=0
	  declare -A failpass
	  while [ $(expr $hi - $lo) -ne 1 ]
	  do
	    mid=$(expr $lo + '(' $hi - $lo ')' / 2)
	    echo $lo $mid $hi
	    cp ../configs/$config.gier default.gier
#         select(16) goes to punch, too:
	    echo "Select3	00000030" >>default.gier
	    echo "kb1_visible	00000000" >>default.gier
	    echo "kb2_visible	00000000" >>default.gier
	    echo "TEXT n: $mid $config transient: $transient diskmode: $diskmode real: $real" >>$demo
	    echo "loadconfig default.gier" >>$demo
	    testit $mid $real $transient $diskmode
	    flx2a </tmp/bigout.flx
	    if [ $badga4 -eq 0 ]
	    then
	      lastok=0
	      break
	    fi
	    if [ $result -eq 0 ]
	    then
	      echo $mid ok
	      lastok=$mid
	      lo=$mid
	    else
	      echo $mid bad
	      hi=$mid
	      lastpass=0
	      flx2a </tmp/bigout.flx >/tmp/bigout.asc
	      while read l
	      do
		c1=${l:0:1}
		c2=${l:1:1}
		if [ "$c2" == "." ]
		then
		  lastpass=$c1
		fi
	      done </tmp/bigout.asc
	      echo lastpass: $lastpass
	      failpass[$mid]=$lastpass
	    fi
	  done

	  if [ $lastok -gt 0 ]
	  then
	    cp ../configs/$config.gier default.gier
#         select(16) goes to punch, too:
	    echo "Select3	00000030" >>default.gier
#                       00000800 execute
#                       00000400 buffer
#                       00000100 drum
	    echo "debug	00000500" >>default.gier
	    echo "kb1_visible	00000000" >>default.gier
	    echo "kb2_visible	00000000" >>default.gier
	    echo "TEXT plot n: $mid $config transient: $transient diskmode: $diskmode real: $real" >>$demo
	    echo "loadconfig default.gier" >>$demo
	    testit $lastok $real $transient $diskmode
	    mv gier.debug $outfile.debug
#	  start=`grep -E '^[LS]K' $outfile.debug | awk '{printf "%.8f\n", $4/'$clock';}' | sort -n | head -1`
#	  finish=`grep -E '^[LS]K' $outfile.debug | awk '{printf "%.8f\n", $4/'$clock';}' | sort -n | tail -1`
#	  elapsed=`awk 'BEGIN{printf "%.8f",'$finish'-'$start'}'`
	    ../plot.sh $outfile.debug
#         set elapsed
	    cat plot.out
	    . ./plot.out
	    rm -f $outfile.debug
	    mv plot.pdf $outfile.pdf
	  else
	    elapsed=0
	    rm -f $outfile.pdf
	  fi
	  echo Result: real: $real transient: $transient config: $config _d: $diskmode elapsed: $elapsed lastok: $lastok lastpass: $lastpass failpass: ${failpass[$((lastok+1))]}
	fi
      done
    done
  done
done

echo quit >>$demo
sleep 1
cleanup

