#!/usr/bin/ksh93
################################################################
#### Program: head_k93
####
#### Description: Emulation of the Unix "head" command
####
#### Author: Dana French (dfrench@mtxia.com)
####
#### Date: 07/22/2004
####
################################################################
function head_k93 {
typeset TRUE="0"
typeset FALSE="1"
typeset VERYFALSE="2"
typeset CAT="${FALSE}"
typeset LINES="${TRUE}"
typeset BYTES="${FALSE}"
typeset OLDPREV=""
typeset FNAME=""
typeset HEADCNT=""
typeset STDIN="${1:+${FALSE}}"
STDIN="${STDIN:-${TRUE}}"
while getopts ":0123456789c#n#vV" OPTION
do
case "${OPTION}" in
'c') BYTES="${TRUE}"
HEADCNT="${OPTARG}"
LINES="${FALSE}";;
'n') LINES="${TRUE}"
HEADCNT="${OPTARG}"
BYTES="${FALSE}";;
'v') VERBOSE="${TRUE}";;
'V') VERYVERB="${TRUE}";;
'?') print "Syntax: head [-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 )) && HEADCNT="${HEADCNT}${OPTION}"
done
shift $(( ${OPTIND} - 1 ))
typeset STDIN="${1:+${FALSE}}"
STDIN="${STDIN:-${TRUE}}"
if (( STDIN == TRUE ))
then
getHeadLine_k93 "${HEADCNT}" "${BYTES}" "${LINES}"
else
for FNAME in "${@}"
do
if [[ -f "${FNAME}" ]]
then
exec 0<"${FNAME}"
getHeadLine_k93 "${HEADCNT}" "${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 getHeadLine_k93 {
typeset HEADCNT="${1}"
typeset BYTES="${2}"
typeset LINES="${3}"
[[ "_${HEADCNT}" = "_" ]] && HEADCNT="10"
for (( CNT=0; CNT<HEADCNT; ++CNT ))
do
if (( BYTES == TRUE ))
then
if IFS="" read -r -- LINE
then
for (( IND=0; IND<${#LINE}; ++IND ))
do
(( IND <= HEADCNT )) && print -r -n -- "${LINE:IND:1}"
(( CNT++ ))
done
print
(( CNT++ ))
else
break
fi
fi
if (( LINES == TRUE ))
then
if IFS="" read -r -- LINE
then
print -r -- "${LINE}"
else
break
fi
fi
done
return 0
}
################################################################
head_k93 "${@}"