#!/bin/bash
#set -x

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


# help3demo:
#
# int:   10596
# real:   9914
# real2: 10063
#
# help3demo _d:
#
# int:   5780
# real:  4954
# real2: 5112

clock=455000


testit ()
{
  local n=$1
  local real=$2
  local transient=$3
  local diskmode=$4
  local tape=/tmp/big.asc
  local demo=findbig.demo
  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 -gt 1 ]
      then
        echo -n "+$i.0" >>$tape
      else
        echo -n "+$i" >>$tape
      fi
    fi
  done
  echo ";" >>$tape
  echo "writecr;" >>$tape
  echo "writeinteger(|<p|>,i)" >>$tape
  echo "_e_n_d;" >>$tape
  echo "t<" >>$tape
  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 "FINISHPUNCH" >>$demo
  echo "QUIT" >>$demo
  ../GIER $demo
  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 drum180bufga4 drum180buf drum180nobufga4 drum180nobuf drum1bufga4 drum1buf drum1nobufga4 drum1nobuf drum3bufcarrga4 drum3bufcarr drum3bufdiskga4 drum3bufdisk drum3bufga4 drum3buf drum3buftapega4 drum3buftape drum3nobufga4 drum3nobuf
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`
	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 ../build/$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
	  testit $mid $real $transient $diskmode
	  flx2a </tmp/bigout.flx
	  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
	outfile=$outfile'_'$lastok
	if [ $lastok -gt 0 ]
	then
	  cp ../build/$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
	  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
	  mv /tmp/big.asc big$outfile.asc
	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
