#!/bin/bash
#set -x

# 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 big6ga4
do
  for transient in 0
  do
    for diskmode in 0
    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 ../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
	  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 ../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
	  testit $lastok $real $transient $diskmode
	  cp /tmp/big.asc $outfile.asc
	  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.com $outfile.debug
          rm -f $outfile.debug
	  mv plot.pdf $outfile.pdf
	  mv /tmp/lksk.dat $outfile.dat
	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))]}
	for k in "${!failpass[@]}"
	do
	  echo "key  : $k"
	  echo "value: ${failpass[$k]}"
	done
		  
      done
    done
  done
done
