#!/bin/bash
# $Header: /usr/local/scalawags_cvs/Scalawags/Frc2006/scripts/getstring,v 1.1 2005/01/30 00:24:59 abrown Exp $
# Header: getstring,v 1.7 95/03/03 10:44:40 abrown Exp
# Allen Brown  date ="20040127 12:49:00"
typeset GETprogname GETinteractive
GETprogname="${0##*/}"

# To use getstring first source this file.
#    . getstring
# Then you can use it.
#    getstring -l y "Do you want to exit?" dummy '^[yn]$' \
#	"Please answer 'y' or 'n'."

# On exit, echos new value for <envariable>.
# stderr is used for prompt strings.
# Quote characters '"' are illegal input.

# GETinteractive="${-%%i*}"
# echo "=${-}=${GETinteractive}=${GETprogname}="
# if [ -z "${GETinteractive}" ]; then
if [ "${GETfile##*/}" != "${GETprogname}" ]; then
  # script is sourced
  function getstring
  {
    GETfile="/home/abrown/public_html/first/first2004/coprocessor/scripts/getstring"
    # For ksh, the following needs to be 'typeset'.  For bash, it
    # needs to be 'local'.  Envariables don't work here.
    local \
      usage help done default prompt required pattern pat_err \
      new_value helpforce
    local \
      -i error forcecaseEither forcecaseUpper forcecaseLower \
      forcecase PromptLength
    typeset \
      -i error forcecaseEither forcecaseUpper forcecaseLower \
      forcecase PromptLength

    usage="Usage: ${GETfile##*/} [<options>] <default> <prompt> <required> <pattern> <pat_err>"
    usage="${usage}\n\t\t[-l]		# Translate to lower case"
    usage="${usage}\n\t\t[-u]		# Translate to upper case"
    usage="${usage}\n\t\t[-h]	<help>	# Give help if answer == '?'."
    usage="${usage}\n\t			# <help> may be null string ''."
    usage="${usage}\n\t\t[-p]	<num>	# Max chars in prompt before wrap."
    usage="${usage}\n\t\t<default>	# default value"
    usage="${usage}\n\t\t<prompt> 	# How to ask for input"
    usage="${usage}\n\t\t<required>	# Error message if no input given"
    usage="${usage}\n\t\t<pattern>	# egrep pattern that must be matched"
    usage="${usage}\n\t\t<pat_err>	# Error message pattern not matched"

    LOCOS=$(uname)
    case "${LOCOS}" in
      HP-UX)
	echoopt=
	echoterm='\c'
	echoext=
	;;
      Linux)
	echoopt='-n'
	echoterm=
	echoext='-e'
	;;
      *)
	echo "Unable to identify system: ${SYSNAME}='${LOCOS}'"
	exit -1
	;;
    esac

    error=0
      # enum
      forcecaseEither=1
      forcecaseUpper=2
      forcecaseLower=3
    PromptLength=30
    help=
    forcecase=${forcecaseEither}
    done=false
    if [ $# -lt 5 ]; then
      error=-1
      done=true
    fi
    while [ ${done} = false ]; do
      case ${1-"-?"} in
        -l)
	  forcecase=${forcecaseLower}; shift
	  ;;
        -u)
	  forcecase=${forcecaseUpper}; shift
	  ;;
        -p)
	  PromptLength=${2}; shift; shift
	  ;;
        -h)
	  help="  ${2}"; shift; shift
	  ;;
        "-?") # help
	  shift
	  error=-1
	  ;;
        -*) # huh?
	  echo ${echoext} "${GETprogname} ERROR\007: Unrecognized option '${1}'." 1>&2
	  shift
	  error=-1
	  ;;
        *) # start of parameters
	  done=true
	  ;;
      esac
    done
    if [ $# -ne 5 -o ${error} -ne 0 ]; then
      error=-1
    else
      case ${forcecase} in
        ${forcecaseEither})
	  default="${1}"
	  ;;
        ${forcecaseUpper})
	  default="$(echo "${1}" | tr '[a-z]' '[A-Z]')"
	  ;;
        ${forcecaseLower})
	  default="$(echo "${1}" | tr '[A-Z]' '[a-z]')"
	  ;;
      esac

      prompt="${2}";	# How to ask for input.
      required="${3}";	# Error message if user gives no input.
      pattern="${4}";	# The result must match this egrep pattern.
			# "." to allow any input.
      pat_err="${5}";	# Error message if input fails egrep pattern.
      new_value=
      while [ "x${new_value}" = "x" ]; do
	if [ "x${default}" = "x" ]; then
	  echo ${echoopt} "${prompt}: ${echoterm}" 1>&2
	  read new_value
	else
	  if [ ${PromptLength} \
		-gt $(echo "${prompt} (CR='${default}'): " | wc -c) ]; then
	    echo ${echoopt} "${prompt} (CR='${default}'): ${echoterm}" 1>&2
	    read new_value
	  else # Default value is long.
	    echo "${prompt} (CR='${default}')" 1>&2
	    echo ${echoopt} ": ${echoterm}" 1>&2
	    read new_value
	  fi
	fi
        : ${new_value:=${default}}
        if [ "x${new_value}" = "x" ]; then
	  echo "  Unacceptable input.  ${required}" 1>&2
        else
	  case ${forcecase} in
	    ${forcecaseEither})
	      new_value="${new_value}"
	      helpforce=
	      ;;
	    ${forcecaseUpper})
	      new_value="$(echo "${new_value}" | tr '[a-z]' '[A-Z]')"
	      helpforce=" after folding to upper case"
	      ;;
	    ${forcecaseLower})
	      new_value="$(echo "${new_value}" | tr '[A-Z]' '[a-z]')"
	      helpforce=" after folding to lower case"
	      ;;
	  esac
	  if [ "x${help}" != "x" -a "x${new_value}" = "x?" ]; then
	    echo "  Answer will be egreped against" \
		  "'${pattern}'${helpforce}."  1>&2
	    if [ "x${help}" != "x  " ]; then
	      echo "${help}"  1>&2
	    fi
	    new_value=
	  else
	    if [ "$(echo "x${new_value}" | grep -e '\"')" != "" ]; then
	      echo "  Unacceptable input. " \
		"'\"' is an illegal character." 1>&2
	      new_value=
	    else
	      if [ "$(echo "${new_value}" | egrep -e "${pattern}")" = "" ]; then
	        echo "  Unacceptable input.  ${pat_err}"  1>&2
	        new_value=
	      fi
	    fi
	  fi
        fi
      done
      echo ${new_value}
    fi
    if [ ${error} -ne 0 ]; then
      echo ${echoext} "${usage}" 1>&2
    fi
  }
else
  # script is not sourced.
  echo ${echoext} "${GETprogname} WARNING\007: This file must be" \
    "sourced to be effective." 1>&2
fi
unset GETfile GETprogname GETinteractive


syntax highlighted by Code2HTML, v. 0.9.1