#!/usr/bin/ksh93
################################################################
function usagemsg_xyz2onedim_k93 {
print -- "
Program: xyz2onedim_k93
Allows simulation of multi-dimensional Korn Shell Arrays. This function uses
arguments of number of array dimensions and the array element position in
each dimension to calculate a corresponding single dimension array position.
Usage: ${1##*/} [-vV] Xsize:Xpos Ysize:Ypos [Zsize:Zpos]...
Where -v = Verbose mode -V = Very Verbose mode
Xsize = Number of array elements in the X dimension
Xpos = Array element number in the X dimension
Ysize = Number of array elements in the Y dimension
Ypos = Array element number in the Y dimension
Zsize = Number of array elements in the Z dimension
Zpos = Array element number in the Z dimension
As many Dimension Size:Pos pairs may be entered as desired to represent a
multi-dimensional array. Two, three, or more dimension pairs may be entered.
Author: Dana French (dfrench@mtxia.com)
\"AutoContent\" enabled"
return 0
}
################################################################
####
#### Description:
####
#### Allows simulation of multi-dimensional Korn Shell
#### Arrays. The arguments to this function represent the
#### multi-dimensional array sizes and element positions in
#### each dimension of the array. If the array is three
#### dimensional, the there should be three arguments to this
#### function to represent the size of the array in the X
#### direction, followed by a colon, followed by the position
#### number of an element in the X direction. All array
#### element begin at position 0.
####
#### This function is the companion to "onedim2xyz_k93", which
#### performs the reverse calculation of this function.
####
#### Assumptions:
####
#### The returned value is assumed to represent a single
#### dimension array with elements filled in the X direction
#### first, then the Y direction, then Z, and so-on.
####
#### Dependencies:
####
#### Array dimension pairs must be separated with a colon character
####
#### Products:
####
#### This script returns a single numeric value representing a
#### single dimensioned array element position.
####
#### Configured Usage:
####
#### This script would normally be used as a function in a Korn Shell
#### function library to aid in the building and usage of
#### multi-dimensional korn shell arrays.
####
#### Details:
####
################################################################
function xyz2onedim_k93 {
typeset TRUE="0"
typeset FALSE="1"
typeset VERBOSE="${FALSE}"
typeset VERYVERB="${FALSE}"
typeset DIMS="2"
typeset SLICE="1"
typeset POS="0"
typeset CNT="0"
typeset COORDSIZ
typeset COORDPOS
while getopts ":vV" OPTION
do
case "${OPTION}" in
'v') VERBOSE="${TRUE}";;
'V') VERYVERB="${TRUE}";;
'?') usagemsg_xyz2onedim_k93 "${0}" && return 1 ;;
esac
done
shift $(( ${OPTIND} - 1 ))
(( VERYVERB == TRUE )) && set -x
DIMS="${#}"
(( VERBOSE == TRUE )) && print -u 2 "Number of dimensions: ${DIMS}"
if (( DIMS < 2 ))
then
print -u 2 "ERROR: Array Dimensions is less than 2"
return 2
fi
for i in "${@}"
do
COORDPOS="${i##*:}"
COORDSIZ="${i%%:*}"
if ( [[ "_${COORDSIZ}" != "_0" ]] &&
! let "COORDSIZ = COORDSIZ + 0" > /dev/null 2>&1 ) ||
(( COORDSIZ < 0 ))
then
print -u 2 "ERROR: Invalid coordinate size."
return 3
fi
if ( [[ "_${COORDPOS}" != "_0" ]] &&
! let "COORDPOS = COORDPOS + 0" > /dev/null 2>&1 ) ||
(( COORDPOS < 0 ))
then
print -u 2 "ERROR: Invalid coordinate position."
return 4
fi
if [[ "_COORDSIZ" = "_" ]]
then
print -u 2 "ERROR: Unspecified dimension size: ${i}."
return 5
fi
if (( COORDPOS >= COORDSIZ ))
then
print -u 2 "ERROR: Coordinate position must be smaller than dimension size."
return 6
fi
(( SLICE = SLICE * COORDSIZ ))
(( POS = POS + ( COORDPOS * ( SLICE/COORDSIZ) ) ))
(( VERBOSE == TRUE )) && print -u 2 "Dimension $(( ++CNT )): $(( ( COORDPOS * ( SLICE/COORDSIZ) ) ))"
done
(( VERBOSE == TRUE )) && print -u 2 "Number of array elements: $(( SLICE ))"
print "${POS}"
return 0
}
################################################################
xyz2onedim_k93 "${@}"