#!/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 big6
#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 3
      do
        echo config: $config transient: $transient diskmode: $diskmode real: $real `date`
	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 [ $diskmode -eq 1 ]
	then
	  outfile=$config'_d'$real
	else
	  outfile=$config$real
	fi
	if [ $transient -eq 1 ]
	then
	  outfile=$outfile'tr'
	fi
	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
          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))]}
      done
    done
  done
done

echo quit >>$demo
sleep 1
cleanup

