# $Id$

set -e

# Be sure that we know the target name
[[ -z $1 ]] && exit
TARGET=$1  # Remember the target build we are looking for
MAKE_PPID=$2

declare -r  CSI=$'\e['  # DEC terminology, Control Sequence Introducer
declare -r  CURSOR_OFF=${CSI}$'?25l'
declare -r  CURSOR_ON=${CSI}$'?25h'
declare -r  ERASE_LINE=${CSI}$'2K'
declare -r  FRAME_OPEN=${CSI}$'2G['
declare -r  FRAME_CLOSE=${CSI}$'63G]'
declare -r  TS_POSITION=${CSI}$'65G'
declare -r  LINE_WRAP_OFF=${CSI}$'?7l'
declare -r  LINE_WRAP_ON=${CSI}$'?7h'
declare -a  RESET_LINE=${CURSOR_OFF}${ERASE_LINE}${FRAME_OPEN}${FRAME_CLOSE}

declare -a  GRAPHIC_STR="| / - \\ + "
declare -i  SEC=0  # Seconds accumulator
declare -i  PREV_SEC=0

# Prevent segfault on stripping phases
if [[ "$BASHBIN" = "/tools/bin/bash" ]] ; then
  SLEEP=/tools/bin/sleep
elif [ -x /bin/sleep ] ; then
  SLEEP=/bin/sleep
else
  SLEEP=/usr/bin/sleep
fi

write_or_exit() {
    # make has been killed or failed or run to completion, leave
  [[ ! -e /proc/${MAKE_PPID} ]] && echo -n "${CURSOR_ON}" && exit

    # Target build complete, leave.
  [[ -f ${TARGET} ]] && echo -n "${CURSOR_ON}" && exit

    # It is safe to write to the screen
  echo -n "$1"
}

  # initialize screen
write_or_exit "${RESET_LINE}${TS_POSITION}0 min. 0 sec"

  # loop forever..
while true ; do

      # Loop through the animation string
    for GRAPHIC_CHAR in ${GRAPHIC_STR} ; do
      write_or_exit "${CSI}$((SEC + 3))G${GRAPHIC_CHAR}"
      $SLEEP .12 # This value MUST be less than .2 seconds.
    done

      # A BASH internal variable, the number of seconds the script
      # has been running. modulo convert to 0-59
    SEC=$(($SECONDS % 60))

      # Detect rollover of the seconds.
    (( PREV_SEC > SEC )) && write_or_exit "${RESET_LINE}"
    PREV_SEC=$SEC

      # Display the accumulated time. div minutes.. modulo seconds.
    write_or_exit "${TS_POSITION}$(($SECONDS / 60)) min. $SEC sec"
done

exit