#!/usr/bin/ksh93
################################################################
#### Program: tail_k93
#### 
#### Description: Emulation of the Unix "tail" command
#### 
#### Author: Dana French (dfrench@mtxia.com)
#### 
#### Date: 07/22/2004
#### 
################################################################
function tail_k93 {
  typeset TRUE="0"
  typeset FALSE="1"
  typeset VERYFALSE="2"
  typeset CAT="${FALSE}"
  typeset LINES="${TRUE}"
  typeset BYTES="${FALSE}"
  typeset OLDPREV=""
  typeset FNAME=""
  typeset TAILCNT=""

  typeset STDIN="${1:+${FALSE}}"
  STDIN="${STDIN:-${TRUE}}"

  while getopts ":0123456789c#n#vV" OPTION
  do
    case "${OPTION}" in
        'c') BYTES="${TRUE}"
             TAILCNT="${OPTARG}"
             LINES="${FALSE}";;
        'n') LINES="${TRUE}"
             TAILCNT="${OPTARG}"
             BYTES="${FALSE}";;
        'v') VERBOSE="${TRUE}";;
        'V') VERYVERB="${TRUE}";;
        '?') print "Syntax: tail [-Count|-c bytes|-n lines] [FILE]..." && exit 1 ;;
    esac

    let "${OPTION} + 0" > /dev/null 2>&1 &&
        (( CAT == FALSE )) &&
        CAT="${TRUE}"

    ! let "${OPTION} + 0" > /dev/null 2>&1 &&
        (( CAT == TRUE )) &&
        CAT="${VERYFALSE}"

    let "${OPTION} + 0" > /dev/null 2>&1 &&
        (( OPTION == 0 )) &&
        (( CAT == VERYFALSE )) &&
        CAT="${TRUE}"

    (( CAT == TRUE )) && TAILCNT="${TAILCNT}${OPTION}"
  done
 
  shift $(( ${OPTIND} - 1 ))

  typeset STDIN="${1:+${FALSE}}"
  STDIN="${STDIN:-${TRUE}}"

  if (( STDIN == TRUE ))
  then
          getTailLine_k93 "${TAILCNT}" "${BYTES}" "${LINES}"
  else
    for FNAME in "${@}"
    do
      if [[ -f "${FNAME}" ]]
      then      
        exec 0<"${FNAME}"
          getTailLine_k93 "${TAILCNT}" "${BYTES}" "${LINES}"
        exec 0<&-
      else
        print -u 2 "ERROR: \"${FNAME}\" does not exist or is not a regular file."
      fi
    done
  fi
  return 0
}
################################################################
function getTailLine_k93 {
  typeset TAILCNT="${1}"
  typeset BYTES="${2}"
  typeset LINES="${3}"

  [[ "_${TAILCNT}" = "_" ]] && TAILCNT="10"

    if (( BYTES == TRUE ))
    then

      CCNT="0"
      while IFS="" read -r -- LINE
      do
        (( CCNT = CCNT + ${#LINE} ))
        if (( CCNT >= TAILCNT ))
        then
          TAILLINE="${TAILLINE}"$'\n'"${LINE}"
          TCNT="${#TAILLINE}"
          (( DIFF = TCNT - TAILCNT ))
          TAILLINE="${TAILLINE:DIFF-1}"
        fi
        (( CCNT = CCNT + ${#TAILLINE} ))
      done

      (( DIFF = ${#TAILLINE} - TAILCNT ))
      print -- "${TAILLINE:DIFF}"
    fi

    if (( LINES == TRUE ))
    then

      LCNT="0"
      while IFS="" read -r -- LINE
      do
        if (( LCNT >= TAILCNT ))
        then
          for (( i=1; i<TAILCNT; ++i ))
          do
            ARRY[i-1]="${ARRY[i]}"
          done
          ARRY[TAILCNT-1]="${LINE}"
        else
          ARRY[LCNT]="${LINE}"
        fi
        (( LCNT++ ))
      done
      for LINE in "${ARRY[@]}"
      do
          print -r -- "${LINE}"
      done
    fi

  return 0
}
################################################################

tail_k93 "${@}"