X-Git-Url: http://git.tuebingen.mpg.de/?p=gsu.git;a=blobdiff_plain;f=funcs%2Fgsu;h=d78233ed3a8e2dab0fbaa092006f5ecc167391ff;hp=75e569cb0a00789badb00735bf3a36f8391ce6db;hb=33ed4a27159aae243c71991fb71c2948cd1042e0;hpb=b3e4039f76f3af4dc2c11642e9edd8309161951c diff --git a/funcs/gsu b/funcs/gsu index 75e569c..d78233e 100644 --- a/funcs/gsu +++ b/funcs/gsu @@ -45,17 +45,25 @@ gsu_is_a_number() } export -f gsu_is_a_number +# Check number of arguments. +# # Usage: gsu_check_arg_count [] # -# If only ist given, then must equal . -# Otherwise, .. is treated as a range and it is checked -# that lies between and inclusively. +# Check that is between and inclusively. +# If only ist given, num2 is assumed to be infinity. +# +# Examples: +# 0 0 no argument allowed +# 1 1 exactly one argument required +# 0 2 at most two arguments admissible +# 2 at least two arguments reqired +# gsu_check_arg_count() { ret=-$E_GSU_BAD_ARG_COUNT if [[ $# -eq 2 ]]; then # only num1 is given - result="exactly $2 args needed, $1 given" - [[ $1 -ne $2 ]] && return + result="at least $2 args required, $1 given" + [[ $1 -lt $2 ]] && return ret=$GSU_SUCCESS return fi @@ -90,13 +98,13 @@ export -f gsu_date_msg _gsu_banner_msg() { - local txt="*** $_gsu_self --" + 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 ***" + gsu_short_msg "$txt ###" } export -f _gsu_banner_msg @@ -125,7 +133,7 @@ export -f gsu_err_msg _gsu_usage() { - gsu_short_msg "Usage: $_gsu_self command [options]" + gsu_short_msg "# Usage: $_gsu_self command [options]" } export -f _gsu_usage @@ -167,7 +175,7 @@ Usage: prefs Print out a list of all cmt config variables, together with their current value and the default value." -com_prefs() +_com_prefs() { local i @@ -195,14 +203,14 @@ com_prefs() echo done } -export -f com_prefs +export -f _com_prefs export gsu_man_txt=" Print the manual. Usage: man" -com_man() +_com_man() { local equal_signs="==================================================" local minus_signs="--------------------------------------------------" @@ -239,7 +247,7 @@ com_man() done ret=$GSU_SUCCESS } -export -f com_man +export -f _com_man export gsu_help_txt=" Print online help. @@ -249,19 +257,18 @@ Usage: help [command] Without arguments, print the list of available commands. Otherwise, print the help text for the given command." -com_help() +_com_help() { local a b if test -z "$1"; then _gsu_banner_msg 2>&1 _gsu_usage 2>&1 - # sed is magic, baby - (printf "com_help()\n$gsu_help_txt" | head -n 4; echo "--" - printf "com_man()\n$gsu_man_txt" | head -n 4; echo "--" - printf "com_prefs()\n$gsu_prefs_txt" | head -n 4; echo "--" - - grep -A 2 "^com_\([a-zA-Z_0-9]\+\)()" $0) \ - | grep -v -- '--' \ + { + printf "com_help()\n$gsu_help_txt" | head -n 4; echo "--" + printf "com_man()\n$gsu_man_txt" | head -n 4; echo "--" + printf "com_prefs()\n$gsu_prefs_txt" | head -n 4; echo "--" + 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 \ @@ -276,7 +283,7 @@ com_help() echo "$b" done echo - echo "Try $_gsu_self help for info on ." + echo "# Try $_gsu_self help for info on ." ret=$GSU_SUCCESS return fi @@ -297,14 +304,14 @@ com_help() fi ret=$GSU_SUCCESS if grep -q "^com_$1()" $0; then - sed -e "1,/com_$1()/d" -e '/^{/,$d' -e 's/^## *//' $0 + 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 +export -f _com_help # internal gsu function that syntactically checks the gsu_options array # for errors and parses the config file. @@ -357,7 +364,7 @@ _gsu_check_options() return esac - eval ${gsu_config_var_prefix}_$name="\"${val:=$default_value}\"" + eval ${gsu_config_var_prefix}_$name='"'${val:=$default_value}'"' # Check option type. ATM, only num and string are supported # Other types may be added without breaking compatibility case "$option_type" in @@ -381,6 +388,16 @@ gsu() { local i + gsu_is_a_number "${BASH_VERSINFO[0]}" + if [[ $ret -lt 0 ]]; then + gsu_msg "fatal: failed to determine bash version" + exit 1 + fi + + if [[ "${BASH_VERSINFO[0]}" -lt 4 ]]; then + gsu_msg "fatal: This script requires at least bash 4.0" + exit 1 + fi _gsu_self="$(basename $0)" gsu_name="${gsu_name:=$_gsu_self}" gsu_config_var_prefix="${gsu_config_var_prefix:=$gsu_name}" @@ -401,16 +418,28 @@ gsu() fi arg="$1" shift + # check internal commands + if [[ "$arg" = "help" || "$arg" = "man" || "$arg" = "prefs" ]]; then + _com_$arg "$@" + if [[ "$ret" -lt 0 ]]; then + gsu_err_msg + exit 1 + fi + exit 0 + fi + + # external commands for i in $gsu_cmds; do if test "$arg" = "$i"; then com_$arg "$@" - if test $ret -lt 0; then + if [[ "$ret" -lt 0 ]]; then gsu_err_msg exit 1 fi exit 0 fi done + ret=-$E_GSU_BAD_COMMAND result="$arg" gsu_err_msg