Contained here are the Korn shell 93 functions that comprise the frenchMenus library. Make not these functions are Korn Shell 93 compliant and will not work with Korn shell 88.
################################################################
cnt_sleep()
{
move ${MAX_LINES} 1
clrtoeol
attrset blink
attrset rev
addstr "Sleeping for ${1} second(s)"
attroff
refresh
SLEEP_CNT="0"
while (( ${SLEEP_CNT} < ${1} ))
do
SLEEP_CNT="$(( ${SLEEP_CNT} + 1 ))"
addstr "."
refresh
sleep 1
done
mvclrtoeol ${MAX_LINES} 1
refresh
}
################################################################
drawEntry()
{
CNT_DRAW=0
while LAB_RAW="$( getstr )"
do
CNT_DRAW="$(( ${CNT_DRAW} + 1 ))"
LAB_FILL="${LAB_RAW%%\|*}"
E_TMP="${LAB_RAW#*\|}"
E_TMP="${E_TMP%\|*}"
eval E_DFLT="\"${E_TMP}\""
eval E_${LABEL}_${CNT_DRAW}=\"\${E_DFLT}\"
LAB_PROMPT=$( fillcol "${LAB_FILL}" "${E_DFLT}" 37 )
COL_DRAW="2"
(( ${CNT_DRAW} >= 10 )) && COL_DRAW="1"
mvaddstr "$(( 4 + ${CNT_DRAW} ))" ${COL_DRAW} "${CNT_DRAW}: ${LAB_PROMPT}:"
done < ${DD_TOPDIR}/entry${1}.shtml
NBR_LINES="${CNT_DRAW}"
CNT_DRAW="$(( ${NBR_LINES} + 1 ))"
COL_DRAW="2"
(( ${CNT_DRAW} >= 10 )) && COL_DRAW="1"
CNT_LINE="$(( ${NBR_LINES} + 6 ))"
eval mvaddstr \${CNT_LINE} \${COL_DRAW} \"$( fillcol "${CNT_DRAW}: Line to Change" "0" 40 ):\"
clrtoeol
putMessage
return ${NBR_LINES}
}
################################################################
drawMenu()
{
CNT_DRAW=0
CNT_LINE=0
while LAB_RAW="$( getstr )"
do
CNT_DRAW="$(( ${CNT_DRAW} + 1 ))"
LAB_FILL="${LAB_RAW%%\|*}"
M_DFLT="${LAB_RAW#*\|}"
M_DFLT="${M_DFLT%\|*}"
eval M_${LABEL}_${CNT_DRAW}="\"${M_DFLT}\""
CNT_LINE="$(( ${CNT_DRAW} * 2 ))"
COL_DRAW="26"
(( ${CNT_DRAW} >= 10 )) && COL_DRAW="25"
mvaddstr "$(( 3 + ${CNT_LINE} ))" ${COL_DRAW} "${CNT_DRAW} = ${LAB_FILL}"
done < ${DD_TOPDIR}/menu${1}.shtml
LAB_PROMPT=$( fillcol "Select Menu Option" "0" 32 )
mvaddstr "$(( ${CNT_LINE} + 6 ))" 5 "${LAB_PROMPT}:"
clrtoeol
refresh
return ${CNT_DRAW}
}
################################################################
entryScreen()
{
eval BUF_TMP=\"\${e${LABEL}:=\"\"}\"
if [[ -n "${BUF_TMP}" ]]
then
refresh "e${LABEL}"
NBR_LINES="${LIN_[${LABEL}]}"
else
putMessage "Assembling data entry screen..."
savescr ${DEV_NULL}
clear
header
drawEntry "${1}"
NBR_LINES="${?}"
LIN_[${LABEL}]="${NBR_LINES}"
savescr e${LABEL}
fi
getAnswer ${NBR_LINES} && resetAnswer ${NBR_LINES}
putMessage
return 0
}
################################################################
errend()
{
move "$(( ${MAX_LINES} - 1 ))" 1
clrtoeol
addstr "ERROR: ${1}"
scrnend
}
################################################################
fillcol()
{
LEN_DIFF="$(( ${3} - ${#1} - ${#2} ))"
typeset -L${LEN_DIFF} DOTS="................................................................................"
# ${CMD_ECHO} "${1}${DOTS}(${2})"
eval \${CMD_ECHO} ${OPT_ECHO} \"\${1}\${DOTS}\(\${2}\)\"
}
################################################################
frenchMenus()
{
initscr
MENULEV="0"
LABEL=""
SERVER=""
SCRDATE=""
HDRSAV0=${HDRLIN2}
eval MENUANS${MENULEV}=""
SH_MENU="${DD_TOPDIR}/menu${LABEL}.sh"
[[ -f ${SH_MENU} ]] && . ${SH_MENU} ${LABEL}
while :
do
putMessage "Assembling menu screen..."
eval BUF_TMP=\"\${m${LABEL}:=\"\"}\"
if [[ -n "${BUF_TMP}" ]]
then
refresh "m${LABEL}"
STATUS="${LIN_[${LABEL}]}"
else
savescr ${DEV_NULL}
clear
header
drawMenu "${LABEL}"
STATUS=${?}
LIN_[${LABEL}]="${STATUS}"
savescr "m${LABEL}"
fi
getMenu ${STATUS}
(( ${MENULEV} < 0 )) && break
SH_MENU="${DD_TOPDIR}/menu${LABEL}.sh"
SH_ENTRY="${DD_TOPDIR}/entry${LABEL}.sh"
TXT_MENU="${DD_TOPDIR}/menu${LABEL}.shtml"
TXT_ENTRY="${DD_TOPDIR}/entry${LABEL}.shtml"
[[ -f ${SH_MENU} ]] && . ${SH_MENU} ${LABEL}
[[ -f ${TXT_MENU} ]] && continue
[[ -f ${TXT_ENTRY} ]] && entryScreen "${LABEL}"
[[ -s ${SH_ENTRY} ]] && . ${SH_ENTRY}
reset_level
done
putMessage
}
################################################################
getAnswer()
{
STATUS="0"
eval FUNCTION="\${M_${LABDAT}_${LTC}}"
if [[ "${FUNCTION}" = @(modify|config|delete) ]]
then
selectRecord "${1}"
STATUS="${?}"
return ${STATUS}
fi
CNT_ANS="0"
while (( ${CNT_ANS} < ${1} ))
do
CNT_ANS="$(( ${CNT_ANS} + 1 ))"
move "$(( 4 + ${CNT_ANS} ))" 46
refresh
ANS="$( getstr )"
eval ANS\[\${CNT_ANS}\]=\"${ANS}\"
done
return ${STATUS}
}
################################################################
getMenu()
{
while :
do
CNT_ANS="0"
move "$(( ${1} * 2 + 6 ))" 41
clrtoeol
refresh
LTC="$( getstr )"
[[ "_${LTC}" = "_" ]] && LTC="0"
[[ "_${LTC}" = "_0" ]] && reset_level && return ${LTC}
[[ "_${LTC}" = *[!0-9]* ]] || continue
(( ${LTC} < 0 )) && cnt_sleep "$(( ${LTC} * -1 ))"
(( ${LTC} < 0 )) ||
(( ${LTC} > ${1} )) &&
continue
break
done
set_level ${LTC}
return ${LTC}
}
################################################################
getRecord()
{
putMessage "Retrieving data record..."
RECORD=""
CNT_ANS="0"
IFS="${FIELDDELIM:=|}"
set -- ${1}
IFS="${IFS_NORM}"
for FIELD in "${@}"
do
CNT_ANS="$(( ${CNT_ANS} + 1 ))"
ANS[${CNT_ANS}]="${FIELD}"
done
putMessage
return ${CNT_ANS}
}
################################################################
header()
{
SCRNUM="${LABEL}"
[[ "_${SCRDATE}" = "_" ]] && SCRDATE=$( date +"%m/%d/%y" )
[[ "_${SERVER}" = "_" ]] && SERVER="${LOGNAME}@$( uname -n )"
attrset rev
mvaddstr 1 1 "PGM${PRGNUM}"
justifyCenter 1 "${HDRLIN1}"
justifyLeft 1 "${SERVER}"
mvaddstr 2 1 "SCR${SCRNUM}"
justifyCenter 2 "${HDRLIN2}"
justifyLeft 2 "${SCRDATE}"
attroff
}
################################################################
invalidKey()
{
putMessage "ERROR: Invalid keystroke..."
sleep 2
return 0
}
################################################################
justifyCenter()
{
mvaddstr ${1} "$(( ( ${MAX_COLS} - ${#2} ) / 2 ))" "${2}"
}
################################################################
justifyLeft()
{
mvaddstr ${1} "$(( ${MAX_COLS} - ${#2} ))" "${2}"
}
################################################################
mkrecord()
{
putMessage "Assembling data record..."
RECORD=""
CNT_ANS="0"
while (( ${CNT_ANS} < ${1} ))
do
CNT_ANS="$(( ${CNT_ANS} + 1 ))"
ANS="${ANS[${CNT_ANS}]}"
eval E_DFLT=\"\${E_${LABEL}_${CNT_ANS}}\"
[[ "_${ANS}" = "_" ]] && ANS="${E_DFLT}"
RECORD="${RECORD}${ANS}${FIELDDELIM:=|}"
done
putMessage
}
################################################################
putAnswer()
{
putMessage "Processing user data..."
CNT_ANS="0"
while (( ${CNT_ANS} < ${1} ))
do
CNT_ANS="$(( ${CNT_ANS} + 1 ))"
move "$(( 4 + ${CNT_ANS} ))" 46
clrtoeol
addstr "${ANS[${CNT_ANS}]}"
refresh
done
putMessage
}
################################################################
putMessage()
{
move $(( ${MAX_LINES} - 1 )) 1
clrtoeol
attrset blink
addstr "${1}"
attroff
addstr "${2}"
refresh
}
################################################################
removeRecord()
{
# RECORD=$( ${CMD_ECHO} "${RECORD}" | tr '/' "${DIRSEP:=!}" )
# RECORD=$( ${CMD_ECHO} "${RECORD}" | sed -e "s/\//${DIRSEP:=!}/g;s/ /_/g" )
RECORD="${RECORD//\//${DIRSEP:=!}}"
RECORD="${RECORD// /_}"
rm -f "${DD_DATABASE}${1}/${RECORD}"
STATUS="${?}"
return ${STATUS}
}
################################################################
resetAnswer()
{
mkrecord "${1}"
if [[ "_${FUNCTION}" = "_delete" ]]
then
removeRecord "table${LABDAT}0"
return 0
fi
RECORD_OLD="${RECORD}"
while :
do
mvclrtoeol "$(( ${1} + 6 ))" 46
refresh
LTC="$( getstr )"
[[ "_${LTC}" = "_" ]] && LTC="0"
[[ "_${LTC}" = "_0" ]] && mkrecord "${1}" && break
[[ "_${LTC}" = *[!0-9]* ]] || continue
if (( ${LTC} == -1 ))
then
LTC="$(( ${1} + 1 ))"
refresh "e${LABEL}"
putAnswer ${1}
fi
(( ${LTC} >= 1 )) &&
(( ${LTC} <= ${1} )) &&
mvclrtoeol "$(( 4 + ${LTC} ))" 46 &&
refresh &&
ANS="$( getstr )" &&
eval ANS\[\${LTC}\]=\"${ANS}\"
done
if [[ "_${RECORD}" != "_${RECORD_OLD}" ||
"${FUNCTION}" != @(modify|config) ]]
then
if saveRecord "table${LABDAT}0"
then
RECORD="${RECORD_OLD}"
[[ "${FUNCTION}" = @(modify|config) ]] &&
removeRecord "table${LABDAT}0"
fi
else
attrset rev
attrset blink
mvaddstr ${MAX_LINES} 1 "Record is unchanged"
refresh
sleep 2
attroff
refresh
fi
return 0
}
################################################################
reset_level()
{
MENULEV="$(( ${MENULEV} - 1 ))"
MENUPREV="$(( ${MENULEV} - 1 ))"
MENUNEXT="$(( ${MENULEV} + 1 ))"
(( ${MENUPREV} <= 0 )) && MENUPREV="0"
set_label
return 0
}
################################################################
saveRecord()
{
STATUS=1
YORNMSG="Save Record"
[[ "_${FUNCTION}" = "_transient" ]] && YORNMSG="Process Record"
if yesOrNo "${YORNMSG}"
then
if [[ "_${FUNCTION}" != "_transient" ]]
then
[[ ! -d ${DD_DATABASE}${1} ]] &&
mkdir ${DD_DATABASE}${1} &&
chmod 777 ${DD_DATABASE}${1}
# RECORD=$( ${CMD_ECHO} "${RECORD}" | tr '/' "${DIRSEP:=!}" )
# RECORD=$( ${CMD_ECHO} "${RECORD}" | sed -e "s/\//${DIRSEP:=!}/g;s/ /_/g" )
RECORD="${RECORD//\//${DIRSEP:=!}}"
RECORD="${RECORD// /_}"
[[ "_${FUNCTION}" = "_config" ]] && rm -f ${DD_DATABASE}${1}/*
touch "${DD_DATABASE}${1}/${RECORD}"
STATUS="${?}"
else
STATUS="0"
fi
fi
return ${STATUS}
}
################################################################
scrnend()
{
move ${MAX_LINES} 1
clrtoeol
attrset blink
attrset rev
addstr "Press to contine"
attroff
refresh
SCRNEND="$( getch )"
}
################################################################
selectRecord()
{
STATUS="1"
putMessage "Retrieving list of data records..."
IFS="${IFS_CR}"
# for RECORD in $( ls -1 ${DD_DATABASE}table${LABDAT}0 )
for RECORD in ${DD_DATABASE}table${LABDAT}0/*
do
RECORD="${RECORD#${DD_DATABASE}table${LABDAT}0/}"
RECORD="${RECORD//${DIRSEP:=!}//}"
# RECORD=$( ${CMD_ECHO} "${RECORD}" | sed -e "s/${DIRSEP:=!}/\//g" )
IFS="${IFS_NORM}"
getRecord "${RECORD}"
putAnswer "${1}"
[[ "${FUNCTION}" = @(modify|config) ]] && TMP="Modify"
[[ "${FUNCTION}" = "delete" ]] && TMP="Delete"
if yesOrNo "${TMP} this record"
then
STATUS="0"
break
fi
IFS=${IFS_CR}
done
IFS=${IFS_NORM}
putMessage
return ${STATUS}
}
################################################################
set_label()
{
LABEL=""
LABDAT=""
ISFL=0
if (( ${MENULEV} >= 1 ))
then
while (( ${ISFL} <= ${MENUPREV} ))
do
ISFL="$(( ${ISFL} + 1 ))"
LABEL="${LABEL}${MENUANS[${ISFL}]}"
(( ${ISFL} <= ${MENUPREV} )) && LABDAT="${LABEL}"
done
fi
}
################################################################
set_level()
{
MENUPREV=${MENULEV}
MENULEV="$(( ${MENULEV} + 1 ))"
MENUNEXT="$(( ${MENULEV} + 1 ))"
MENUANS[${MENULEV}]="${1}"
set_label
return 0
}
################################################################
yesOrNo()
{
TORF="0"
putMessage "${1}..." "(Y/N)?"
YORN="$( getch )"
case _${YORN} in
"_Y") TORF="0";;
"_y") TORF="0";;
"_N") TORF="1";;
"_n") TORF="1";;
*) TORF="1";;
esac
putMessage
return ${TORF}
}
################################################################