# gsu -- the global subcommand utility # (C) 2006-2007 Andre Noll gsu_init_errors() { gsu_errors=" GSU_SUCCESS success E_GSU_BAD_COMMAND invalid command E_GSU_NOT_A_NUMBER not a number $gsu_errors " local a b i=0 while read a b; do if test -z "$a"; then continue fi #echo "a:$a, b: $b" gsu_error_txt[i]="$b" eval $a=$i i=$(($i + 1)) done << EOF $gsu_errors EOF } export -f gsu_init_errors # check if $1 is a number gsu_is_a_number() { result="$1" if test "$1" -eq "$1" &> /dev/null; then ret=$GSU_SUCCESS else ret=-$E_GSU_NOT_A_NUMBER fi } export -f gsu_is_a_number gsu_short_msg() { echo "$1" 1>&2 } export -f gsu_short_msg gsu_msg() { gsu_short_msg "$gsu_self: $1" } export -f gsu_msg gsu_date_msg() { gsu_short_msg "$gsu_self $(date): $1" } export -f gsu_date_msg gsu_banner_msg() { local txt="*** $gsu_self --" if test -z "$gsu_banner_txt"; then txt="$txt set \$gsu_banner_txt to customize this message" else txt="$txt $gsu_banner_txt" fi gsu_short_msg "$txt ***" } export -f gsu_banner_msg gsu_err_msg() { local txt="$result" err gsu_is_a_number "$ret" if test $ret -lt 0; then gsu_msg "unknown error ($ret:$txt)" exit 1 fi if test $result -ge 0; then gsu_msg "unknown error ($result:$txt)" exit 1 fi err=$((0 - $result)) if test -n "$txt"; then txt="$txt: ${gsu_error_txt[$err]}" else txt="${gsu_error_txt[$err]}" fi gsu_msg "$txt" } export -f gsu_err_msg gsu_usage() { gsu_short_msg "Usage: $gsu_self command [options]" } export -f gsu_usage export gsu_help_txt=" Print online help. Usage: help [command] Without arguments, print the list of available commands. Otherwise, print the help text for the given command." com_help() { local a b if test -z "$1"; then gsu_banner_msg gsu_usage # sed is magic, baby grep -A 2 "^com_\([a-zA-Z_0-9]\+\)()" $0 \ | grep -v -- '--' \ | sed -e '/^com_\([a-zA-Z_0-9]\+\)()/bs' \ -e 'H;$!d;x;s/\n//g;b' \ -e :s \ -e 'x;s/\n//g;${p;x;}' \ | sed -e 's/^com_\([a-zA-Z_0-9]\+\)()#*/\1\t/' \ | sort \ | while read a b; do printf "$a\t" if test ${#a} -lt 8; then printf "\t" fi echo "$b" done echo gsu_msg "Try $gsu_self help for info on ." ret=$GSU_SUCCESS return fi if test "$1" = "help"; then gsu_short_msg "$gsu_help_txt" ret=$GSU_SUCCESS return fi ret=$GSU_SUCCESS if grep -q "^com_$1()" $0; then sed -e "1,/com_$1()/d" -e '/^{/,$d' -e 's/^## *//' $0 return fi gsu_print_available_commands result="$1" ret=-$E_GSU_BAD_COMMAND } export -f com_help gsu_available_commands() { result="$( (echo help; grep "^com_[a-z_]\+()" $0) \ | sed -e 's/^com_//' -e 's/()//' \ | sort \ | tr '\n' ' ')" ret=$SUCCESS } export -f gsu_available_commands gsu_print_available_commands() {( local i count gsu_short_msg "Available commands:" for i in $gsu_cmds; do printf "$i" count=$(($count + 1)) if test $(($count % 4)) -eq 0; then echo else printf "\t" if test ${#i} -lt 8; then printf "\t" fi fi done echo ) 2>&1 } export -f gsu_print_available_commands gsu() { local i gsu_self="$(basename $0)" gsu_init_errors gsu_available_commands gsu_cmds="$result" if test $# -eq 0; then gsu_usage gsu_print_available_commands exit 1 fi arg="$1" shift for i in $gsu_cmds; do if test "$arg" = "$i"; then com_$arg "$@" ret=1 if test $ret -lt 0; then gsu_err_msg exit 1 fi exit 0 fi done ret=-$E_GSU_BAD_COMMAND result="$arg" gsu_err_msg gsu_print_available_commands exit 1 } # no need to export this