home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / N / TCPIP / NET-TOOL.1 / NET-TOOL / net-tools / Configure.sh < prev    next >
Encoding:
Linux/UNIX/POSIX Shell Script  |  1993-12-12  |  2.8 KB  |  137 lines

  1. #! /bin/sh
  2. #
  3. # Make sure we're really running bash.
  4. #
  5. # I would really have preferred to write this script in a language with
  6. # better string handling, but alas, bash is the only scripting language
  7. # that I can be reasonable sure everybody has on their Linux machine.
  8. #
  9.  
  10. CONFIG=config.h
  11.  
  12.  
  13. [ -z "$BASH" ] && { echo "Configure requires bash" 1>&2; exit 1; }
  14.  
  15. # Disable filename globbing once and for all.
  16. # Enable function cacheing.
  17. set -f -h
  18.  
  19. #
  20. # readln reads a line into $ans.
  21. #
  22. #    readln prompt default
  23. #
  24. function readln()
  25. {
  26.   echo -n "$1"
  27.   IFS='@' read ans </dev/tty || exit 1
  28.   [ -z "$ans" ] && ans=$2
  29. }
  30.  
  31. # bool processes a boolean argument
  32. #
  33. #    bool tail
  34. #
  35. function bool()
  36. {
  37.   # Slimier hack to get bash to rescan a line.
  38.   eval "set -- $1"
  39.   ans=""
  40.   while [ "$ans" != "y" -a "$ans" != "n" ]
  41.   do
  42.     readln "$1 ($2) [$3] " "$3"
  43.   done
  44.   if [ "$ans" = "y" ]; then
  45.     echo "#define $2 1" >>${CONFIG}
  46.     else
  47.     echo "#define $2 0" >>${CONFIG}
  48.   fi
  49.   raw_input_line="bool '$1' $2 $ans"
  50.   eval "$2=$ans"
  51. }
  52.  
  53. # int processes an integer argument
  54. #
  55. #    int tail
  56. #
  57. function int()
  58. {
  59.   # Slimier hack to get bash to rescan a line.
  60.   eval "set -- $1"
  61.   ans="x"
  62.   while [ $[$ans+0] != "$ans" ];
  63.   do
  64.     readln "$1 ($2) [$3] " "$3"
  65.   done
  66.   echo "#define $2 ($ans)" >>${CONFIG}
  67.   raw_input_line="int '$1' $2 $ans"
  68.   eval "$2=$ans"
  69. }
  70.  
  71.   #
  72.   # Make sure we start out with a clean slate.
  73.   #
  74.   > config.new
  75.   echo "/*" > ${CONFIG}
  76.   echo " * Automatically generated by Configure - don't edit" >> ${CONFIG}
  77.   echo " */" >> ${CONFIG}
  78.  
  79.   stack=''
  80.   branch='t'
  81.  
  82.   while IFS='@' read raw_input_line
  83.   do
  84.     # Slimy hack to get bash to rescan a line.
  85.     read cmd rest <<-END_OF_COMMAND
  86.         $raw_input_line
  87.     END_OF_COMMAND
  88.  
  89.     if [ "$cmd" = "*" ]; then
  90.         if [ "$branch" = "t" ]; then
  91.             echo "$raw_input_line"
  92.             echo "# $rest" >>$CONFIG
  93.             if [ "$prevcmd" != "*" ]; then
  94.                 echo >>${CONFIG}
  95.                 echo "/* $rest" >>${CONFIG}
  96.             else
  97.                 echo " * $rest" >>${CONFIG}
  98.             fi
  99.             prevcmd="*"
  100.         fi
  101.     else
  102.         [ "$prevcmd" = "*" ] && echo " */" >>${CONFIG}
  103.         prevcmd=""
  104.         case "$cmd" in
  105.         :)    [ "$branch" = "t" ] && echo "$raw_input_line" ;;
  106.         int)    [ "$branch" = "t" ] && int "$rest" ;;
  107.         bool)    [ "$branch" = "t" ] && bool "$rest" ;;
  108.         exec)    [ "$branch" = "t" ] && ( sh -c "$rest" ) ;;
  109.         if)    stack="$branch $stack"
  110.             if [ "$branch" = "t" ] && eval "$rest"; then
  111.                 branch=t
  112.             else
  113.                 branch=f
  114.             fi ;;
  115.         else)    if [ "$branch" = "t" ]; then
  116.                 branch=f
  117.             else
  118.                 read branch rest <<-END_OF_STACK
  119.                     $stack
  120.                 END_OF_STACK
  121.             fi ;;
  122.         fi)    [ -z "$stack" ] && echo "Error!  Extra fi." 1>&2
  123.             read branch stack <<-END_OF_STACK
  124.                 $stack
  125.             END_OF_STACK
  126.             ;;
  127.         esac
  128.     fi
  129.     echo "$raw_input_line" >>config.new
  130.   done
  131.   [ "$prevcmd" = "*" ] && echo " */" >>${CONFIG}
  132.  
  133.   [ -z "$stack" ] || echo "Error!  Untermiated if." 1>&2
  134.  
  135.   mv config.new config.status
  136.   exit 0
  137.