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}.txt
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}.txt
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}.txt"
TXT_ENTRY="${DD_TOPDIR}/entry${LABEL}.txt"
[[ -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}
}
################################################################
French Menus Function cnt_sleep
French Menus Function drawEntry
French Menus Function drawMenu
French Menus Function entryScreen
French Menus Function errend
French Menus Function fillcol
French Menus Function frenchMenus
French Menus Function getAnswer
French Menus Function getMenu
French Menus Function getRecord
French Menus Function header
French Menus Function invalidKey
French Menus Function justifyCenter
French Menus Function justifyLeft
French Menus Function mkrecord
French Menus Function putAnswer
French Menus Function putMessage
French Menus Function removeRecord
French Menus Function resetAnswer
French Menus Function reset_level
French Menus Function saveRecord
French Menus Function scrnend
French Menus Function selectRecord
French Menus Function set_label
French Menus Function set_level
French Menus Function yesOrNo
|