Listing 1: Sound Driver Configuration Utility

#!/bin/sh

# temporary file
TEMP=/tmp/answer$$

# set default values
EXCLUDE_PAS=1 ; EXCLUDE_SB=0 ; EXCLUDE_ADLIB=1
EXCLUDE_GUS=1 ; EXCLUDE_SBPRO=1 ; EXCLUDE_SB16=1
SBC_IRQ=5 ; SBC_DMA=1

# clean up and exit
clean_up() {
  clear
  rm -f $TEMP
  exit
}

# utility function
on_off() {
  if [ "$1" = "$2" ] ; then echo on ; else echo off ; fi
}

# write configuration data to file "local.h"
save() {
  dialog --infobox "Saving..." 3 13
  echo "/* created by configure */" >local.h
  for var in EXCLUDE_SB EXCLUDE_SBPRO EXCLUDE_SB16 \
             EXCLUDE_PAS EXCLUDE_GUS EXCLUDE_ADLIB
  do
    if [ 'eval echo \\\$${var}' = 1 ]
    then
      echo "#define $var"  >>local.h
    else
      echo "#undef  $var"  >>local.h
    fi
  done
  echo "#define SBC_IRQ $SBC_IRQ" >>local.h
  echo "#define SBC_DMA $SBC_DMA" >>local.h
}

select_irq() {
  dialog --title "IRQ Configuration" \
    --radiolist "Select IRQ channel:" 11 60 4 \
    1 "IRQ 5"  'on_off $SBC_IRQ 5' \
    2 "IRQ 7"  'on_off $SBC_IRQ 7' \
    3 "IRQ 9"  'on_off $SBC_IRQ 9' \
    4 "IRQ 10" 'on_off $SBC_IRQ 10' 2>$TEMP

  if [ "$?" != "0" ] ; then return ; fi

  choice='cat $TEMP'
  case $choice in
      1) SBC_IRQ=5;;
      2) SBC_IRQ=7;;
      3) SBC_IRQ=9;;
      4) SBC_IRQ=10;;
  esac
}
select_dma() {
  dialog --title "DMA Configuration" \
    --radiolist "Select DMA channel:" 11 60 4 \
    1 "DMA 0" 'on_off $SBC_DMA 0' \
    2 "DMA 1" 'on_off $SBC_DMA 1' \
    3 "DMA 2" 'on_off $SBC_DMA 2' \
    4 "DMA 3" 'on_off $SBC_DMA 3' \
    2>$TEMP

  if [ "$?" != "0" ] ; then return ; fi

  choice='cat $TEMP'
  case $choice in
      1) SBC_DMA=0;;
      2) SBC_DMA=1;;
      3) SBC_DMA=2;;
      4) SBC_DMA=3;;
  esac
}

view_summary() {
  echo "Enabled Cards:" >$TEMP
  if [ "$EXCLUDE_ADLIB" = "0" ] ; then
echo "Adlib" >>$TEMP ; fi
  if [ "$EXCLUDE_SB" = "0" ] ; then
echo "SoundBlaster" >>$TEMP ; fi
  if [ "$EXCLUDE_SB16" = "0" ] ; then
echo "SoundBlaster 16" >>$TEMP ; fi
  if [ "$EXCLUDE_SBPRO" = "0" ] ; then
echo "SoundBlaster/Pro" >>$TEMP ; fi
  if [ "$EXCLUDE_GUS" = "0" ] ; then
echo "GravisUltraSound" >>$TEMP ; fi
  if [ "$EXCLUDE_PAS" = "0" ] ; then
echo "ProAudioSpectrum 16" >>$TEMP ; fi
  echo "IRQ channel: $SBC_IRQ" >>$TEMP
  echo "DMA channel: $SBC_DMA" >>$TEMP

  dialog \
  --title "Configuration Summary" \
  --textbox $TEMP 13 65 2>/dev/null
}

select_cards() {
  dialog --title "Select Sound Cards" \
  --checklist "Choose one or more sound cards:" 13 60 6 \
  1 "Adlib"               'on_off $EXCLUDE_ADLIB 0' \
  2 "SoundBlaster"        'on_off $EXCLUDE_SB 0' \
  3 "SoundBlaster/Pro"    'on_off $EXCLUDE_SBPRO 0' \
  4 "SoundBlaster 16"     'on_off $EXCLUDE_SB16 0' \
  5 "GravisUltraSound"    'on_off $EXCLUDE_GUS 0' \
  6 "ProAudioSpectrum 16" 'on_off $EXCLUDE_PAS 0' 2>$TEMP

  if [ "$?" != "0" ] ; then return ; fi

  EXCLUDE_ADLIB=1 ; EXCLUDE_SB=1 ; EXCLUDE_SBPRO=1
  EXCLUDE_SB16=1 ; EXCLUDE_GUS=1 ; EXCLUDE_PAS=1
  choice='cat $TEMP'
  for card in $choice
  do
    case $card in
      \"1\") EXCLUDE_ADLIB=0;;
      \"2\") EXCLUDE_SB=0;;
      \"3\") EXCLUDE_SBPRO=0;;
      \"4\") EXCLUDE_SB16=0;;
      \"5\") EXCLUDE_GUS=0;;
      \"6\") EXCLUDE_PAS=0;;
    esac
  done
}

config_menu() {
  while true
  do
    dialog \
    --title "Edit Configuration" \
    --menu "Select a function:" 12 60 5 \
    1 "Sound cards" \
    2 "IRQ configuration" \
    3 "DMA channel" \
    4 "View current configuration" \
    5 "Return to main menu" 2>$TEMP

    choice='cat $TEMP'
    case $choice in
      1) select_cards;;
      2) select_irq;;
      3) select_dma;;
      4) view_summary;;
      5) return;;
    esac
  done
}

main_menu() {
  dialog \
    --title "Sound Driver Configuration Utility" \
    --menu "Select a function:" 10 60 3 \
    1 "Edit configuration" \
    2 "Save configuration" \
    3 "Exit" 2>$TEMP

  choice='cat $TEMP'
  case $choice in
    1) config_menu;;
    2) save;;
    3) clean_up;;
  esac
}

while true
do
  main_menu