#!/usr/bin/ksh93
################################################################
function usagemsg_onedim2xyz_k93 {
print -- "
Program: onedim2xyz_k93
Allows simulation of multi-dimensional Korn Shell Arrays.
This functions calculates the array element positions
of a multi-dimensional array from a numeric value representing a position
in a single dimension array. Arguments to this function designate the
size of the array in each dimension.
Usage: ${1##*/} [-vV] -p POSITION Xsize Ysize [Zsize]...
Where -v = Verbose mode -V = Very Verbose mode
-p = Array element number in a single dimension array
Xsize = Number of array elements in the X dimension
Ysize = Number of array elements in the Y dimension
Zsize = Number of array elements in the Z dimension
As many dimension size arguments may be entered as desired to represent a
multi-dimensional array. Two, three, or more dimension may be designated.
Author: Dana French (dfrench@mtxia.com)
\"AutoContent\" enabled"
return 0
}
################################################################
####
#### Description:
####
#### Allows simulation of multi-dimensional Korn Shell
#### Arrays. This functions calculates the array element
#### positions of a multi-dimensional array from a numeric
#### value representing a position in a single dimension
#### array. Arguments to this function designate the size of
#### the array in each dimension.
####
#### If the array is three dimensional, there should be three
#### dimensional arguments to this function to represent the
#### size of the array in the X, Y, and Z directions. All
#### array elements are assumed to begin at position 0.
####
####
#### This function is the companion to "xyz2onedim_k93", which
#### performs the reverse calculation of this function.
####
#### Assumptions:
####
#### The returned value is assumed to represent the array
#### element positions of a multi-dimensional array. The
#### array is assumed to have been filled sequentially
#### beginning from the first dimension specific through the
#### last.
####
#### Dependencies:
####
####
#### Products:
####
#### This script returns a segmented numeric value sequence.
#### This sequence contains each array element position
#### beginning with the first element through the last. If
#### three dimensional arguments were specified on the
#### command line, the returned value with have three
#### segments containing numeric values.
####
#### 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 onedim2xyz_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 ":p#vV" OPTION
do
case "${OPTION}" in
'p') POS="${OPTARG}";;
'v') VERBOSE="${TRUE}";;
'V') VERYVERB="${TRUE}";;
'?') usagemsg_onedim2xyz_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
(( VERBOSE == TRUE )) && print -u 2 "Arry element position: ${POS}"
for COORDSIZ in "${@}"
do
(( CNT++ ))
(( VERBOSE == TRUE )) && print -u 2 "Dimension ${CNT}: ${COORDSIZ}"
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 [[ "_COORDSIZ" = "_" ]]
then
print -u 2 "ERROR: Unspecified dimension size: ${i}."
return 5
fi
(( SLICE = SLICE * COORDSIZ ))
(( VERBOSE == TRUE )) && print -u 2 "Slice ${CNT}: ${SLICE}"
DIM[CNT-1]="${COORDSIZ}"
HOWBIG[CNT-1]="${SLICE}"
done
(( VERBOSE == TRUE )) && print -u 2 "Number of array elements: $(( SLICE ))"
REMAIN=POS
for (( CNT=${#}; CNT>1; --CNT ))
do
COORDSIZ="${DIM[CNT-2]}"
SLICE="${HOWBIG[CNT-2]}"
(( VERBOSE == TRUE )) && print -u 2 "Slice Size of dimension ${CNT}: ${SLICE}"
(( VERBOSE == TRUE )) && print -u 2 "Element in dimension ${CNT}: $(( REMAIN / SLICE ))"
ELEM[CNT-1]="$(( REMAIN / SLICE ))"
(( REMAIN = REMAIN % SLICE ))
(( VERBOSE == TRUE )) && print -u 2 "Element position in dimension ${CNT}: ${REMAIN}"
done
ELEM[0]="${REMAIN}"
IFS=":"
print -- "${ELEM[*]}"
return 0
}
################################################################
onedim2xyz_k93 "${@}"