#!/usr/bin/ksh93 ################################################################ #### Program: expand_k93 #### #### Description: Emulation of the Unix "expand" command #### #### Author: Dana French (dfrench@mtxia.com) #### Copyright 2004 #### #### Date: 07/22/2004 #### ################################################################ function expand_k93 { typeset TRUE="0" typeset FALSE="1" typeset INITIAL="${FALSE}" typeset VERBOSE="${FALSE}" typeset VERYVERB="${FALSE}" typeset FNAME while getopts ":ivV" OPTION do case "${OPTION}" in 'i') INITIAL="${TRUE}";; 'v') VERBOSE="${TRUE}";; 'V') VERYVERB="${TRUE}";; '?') print "Syntax: expand_k93 [-i] [file ...]" && exit 1 ;; esac done shift $(( ${OPTIND} - 1 )) typeset STDIN="${1:+${FALSE}}" STDIN="${STDIN:-${TRUE}}" #### Read in the data either from STDIN or one or more files if (( STDIN == TRUE )) then tabconvert_k93 "${INITIAL}" else for FNAME in "${@}" do exec 0<"${FNAME}" tabconvert_k93 "${INITIAL}" exec 0<&- done fi return 0 } ################################################################ function tabconvert_k93 { typeset INITIAL="${1}" typeset TRUE="0" typeset FALSE="1" typeset NONWHITE="${FALSE}" typeset PREVTAB="${FALSE}" typeset SPCS=" " typeset IDX="0" typeset CURCOL="0" typeset LINE typeset END typeset MODU while IFS="" read -r -- LINE do END="${#LINE}" NONWHITE="${FALSE}" PREVTAB="${FALSE}" CURCOL=0 for (( IDX=0; IDX<=(END-1); ++IDX )) do if [[ "_${LINE:IDX:1}" = _$'\t' ]] then if (( INITIAL == TRUE )) && (( NONWHITE == TRUE )) then print -r -n -- "${LINE:IDX:1}" (( CURCOL++ )) else (( FILL = 8 - ( CURCOL % 8 ) )) (( PREVTAB == TRUE)) && FILL="8" print -r -n -- "${SPCS:0:FILL}" (( FILL == 8 )) && PREVTAB="${TRUE}" (( CURCOL = CURCOL + FILL )) fi else print -r -n -- "${LINE:IDX:1}" NONWHITE="${TRUE}" PREVTAB="${FALSE}" (( CURCOL++ )) fi done # for loop print done # while loop } ################################################################ expand_k93 "${@}"