home *** CD-ROM | disk | FTP | other *** search
/ norge.freeshell.org (192.94.73.8) / 192.94.73.8.tar / 192.94.73.8 / pub / computers / 3b2 / askx < prev    next >
Text File  |  1985-07-02  |  3KB  |  167 lines

  1. #
  2. # ask
  3. #
  4. # Ask a question.
  5. #
  6.  
  7. set -ue
  8.  
  9. exprpfx="#"            # To avoid expr "/" bug
  10.  
  11. exprnum="^${exprpfx}[0-9][0-9]*$"
  12. exprpath="^${exprpfx}/[-a-zA-Z0-9_./]*$"
  13. exprstr="^${exprpfx}[-a-zA-Z0-9_./]*$"
  14.  
  15. aflag=
  16. choice=
  17. default=
  18. help=
  19. hidden=
  20. menu=
  21. num_max=
  22. num_min=
  23. pflag=
  24. question=
  25. split=' '
  26.  
  27. while [ $# -ne 0 ]
  28. do
  29.     case "${1}" in
  30.     -H) hidden="${hidden} ${2}" ; shift 2 ;;
  31.     -a) aflag=y ; shift 1 ;;
  32.     -c) choice="${choice} ${2}" ; shift 2 ;;
  33.     -d) default="${2}" ; shift 2 ;;
  34.     -h) help="${2}" ; shift 2 ;;
  35.     -m) menu="${2}" ; shift 2 ;;
  36.     -p) pflag=y ; shift 1 ;;
  37.     -q) question="${2}" ; shift 2 ;;
  38.     -s) split='\n' ; shift 1 ;;
  39.     -n)
  40.         eval `echo "${2}" | (IFS="${IFS}:" ; read num_min num_max ;\
  41.              echo num_min=\'${num_min}\' num_max=\'${num_max}\')`
  42.         shift 2 ;;
  43.     -*)
  44.         echo "${0}: \"${1}\": Unknown option" >&2
  45.         exit 1 ;;
  46.     *)
  47.         echo "${0}: \"${1}\": Unknown operand" >&2
  48.         exit 1 ;;
  49.     esac
  50. done
  51.  
  52. if [ -n "${num_min}" -a -n "${default}" ]
  53. then
  54.     if expr "${exprpfx}${default}" : "${exprnum}" > /dev/null
  55.     then
  56.         if [ ${default} -lt ${num_min} ]
  57.         then
  58.             default=${num_min}
  59.         elif [ ${default} -gt ${num_max} ]
  60.         then
  61.             default=${num_max}
  62.         fi
  63.     fi
  64. fi
  65.  
  66. while true
  67. do
  68.     if [ -n "${menu}" ]
  69.     then
  70.         echo "\n${menu}" >&2
  71.     fi
  72.     while true
  73.     do
  74.         echo "\n${question:-Choice?}${split}[${num_min:+ (${num_min} - ${num_max})}${aflag:+ (alphanumeric string)}${pflag:+ (pathname)}${choice}${help:+ help} ]${default:+ (default ${default})} \07\c" >&2
  75.         if read answer
  76.         then
  77.             :
  78.         else
  79.             echo "EOF" >&2
  80.             continue
  81.         fi
  82.         if [ "'${answer}'" = "''" ]
  83.         then
  84.             if [ -z "${default}" ]
  85.             then
  86.                 echo "\nThere is no default answer." >&2
  87.                 continue
  88.             fi
  89.             answer="${default}"
  90.         fi
  91.         if [ "'${answer}'" = "'magic mode'" ]
  92.         then
  93.             if [ -n "${hidden}" ]
  94.             then
  95.                 choice=" `echo ${choice} ${hidden}`"
  96.                 hidden=
  97.                 echo "\nPOOF!" >&2
  98.             else
  99.                 echo "\nYour incantation has no effect." >&2
  100.             fi
  101.             continue
  102.         fi
  103.         if [ -n "${num_min}" ]
  104.         then
  105.             if expr "${exprpfx}${answer}" : "${exprnum}" > /dev/null
  106.             then
  107.                 if [ ${answer} -ge ${num_min} -a ${answer} -le ${num_max} ]
  108.                 then
  109.                     echo ${answer}
  110.                     exit 0
  111.                 fi
  112.             fi
  113.         fi
  114.         if [ -n "${help}" -a "'${answer}'" = "'help'" ]
  115.         then
  116.             echo "\n${help}\n\nPress RETURN to continue \c" >&2
  117.             read x
  118.             break
  119.         fi
  120.         if [ ${aflag:-n} = y ]
  121.         then
  122.             if expr "${exprpfx}${answer}" : "${exprstr}" > /dev/null
  123.             then
  124.                 echo "${answer}"
  125.                 exit 0
  126.             fi
  127.         fi
  128.         if [ ${pflag:-n} = y ]
  129.         then
  130.             if expr "${exprpfx}${answer}" : "${exprpath}" > /dev/null
  131.             then
  132.                 echo "${answer}"
  133.                 exit 0
  134.             fi
  135.         fi
  136.         for x in ${choice}
  137.         do
  138.             if [ "'${answer}'" = "'${x}'" ]
  139.             then
  140.                 echo "${answer}"
  141.                 exit 0
  142.             fi
  143.         done
  144.         echo "\nInvalid response ... please enter one of:" >&2
  145.         if [ -n "${num_min}" ]
  146.         then
  147.             echo "\to A number from ${num_min} thru ${num_max}" >&2
  148.         fi
  149.         if [ ${aflag:-n} = y ]
  150.         then
  151.             echo "\to A string made up of letters, numbers, '-', '_' and '.'" >&2
  152.         fi
  153.         if [ ${pflag:-n} = y ]
  154.         then
  155.             echo "\to An absolute pathname (\"/name[/name ...]\")" >&2
  156.         fi
  157.         for x in ${choice}
  158.         do
  159.             echo "\to ${x}" >&2
  160.         done
  161.         if [ -n "${help}" ]
  162.         then
  163.             echo "\to help" >&2
  164.         fi
  165.     done
  166. done
  167.