subcommand: Do not duplicate options to com_prefs().
[gsu.git] / subcommand
index f668f2adb5332bce964fdb1d5cc28e07ad0d7b2f..343f248ea45a07411fa61a576532b5566a2bf9b1 100644 (file)
@@ -1,14 +1,16 @@
 #!/bin/bash
-# (C) 2006-2011 Andre Noll
+# Copyright (C) 2006 Andre Noll
+# Licensed under the LGPL, version 3. See COPYING and COPYING.LESSER.
 
-if [[ $(type -t gsu_is_a_number) != "function" ]]; then
-       GSU_DIR=${GSU_DIR:=${HOME-}/.gsu}
-       . $GSU_DIR/common || exit 1
+if [[ "$(type -t _gsu_setup)" != "function" ]]; then
+       gsu_dir=${gsu_dir:-${BASH_SOURCE[0]%/*}}
+       . $gsu_dir/common || exit 1
+       _gsu_setup
 fi
 
 _gsu_usage()
 {
-       gsu_short_msg "# Usage: $_gsu_self command [options]"
+       gsu_short_msg "# Usage: $gsu_name command [options]"
 }
 
 # Return an extended regular expression to match against $0.
@@ -23,7 +25,7 @@ _gsu_usage()
 # exactly one parenthesized subexpression for matching the command name.
 _gsu_get_command_regex()
 {
-       local cmd="${1:-[-a-zA-Z_0-9]+}"
+       local cmd="${1:-[-a-zA-Z_0-9]{1,\}}"
        result="^com_($cmd)\(\)"
 }
 
@@ -50,13 +52,15 @@ _gsu_available_commands()
 
 _gsu_print_available_commands()
 {
-       local cmd
+       local cmd cmds
        local -i count=0
 
+       _gsu_available_commands
+       cmds="$result"
        printf 'Available commands:\n'
-       for cmd in $gsu_cmds; do
+       for cmd in $cmds; do
                printf '%s' "$cmd"
-               let count++
+               let ++count
                if (($count % 4)); then
                        printf '\t'
                        ((${#cmd} < 8)) && printf '\t'
@@ -67,6 +71,8 @@ _gsu_print_available_commands()
        printf '\n'
 }
 
+# Print all options of the given optstring to stdout if the word in the current
+# command line begins with a hyphen character.
 gsu_complete_options()
 {
        local opts="$1" cword="$2" cur opt
@@ -87,19 +93,23 @@ gsu_complete_options()
        done
 }
 
+com_prefs_options='e'
+
 export gsu_prefs_txt="
 Print the current preferences.
 
 Usage: prefs [-e]
 
-If -e is given, the config file is opened with the default editor.  Without
-options, the command prints out a list of all cmt config variables, together
-with their current value and the default value."
-_com_prefs()
+If -e is given, the config file is opened with the default editor.
+Without options, the command prints out a list of all config variables,
+together with their current value and the default value.
+"
+
+com_prefs()
 {
        local i conf="${gsu_config_file:=${HOME:-}/.$gsu_name.rc}"
 
-       gsu_getopts "e"
+       gsu_getopts "$com_prefs_options"
        eval "$result"
        (($ret < 0)) && return
        gsu_check_arg_count $# 0 0
@@ -109,11 +119,11 @@ _com_prefs()
                ret=-$E_GSU_MKDIR
                result="${conf%/*}"
                mkdir -p "$result"
-               [[ $? -ne 0 ]] && return
+               (($? != 0)) && return
                ret=-$E_GSU_EDITOR
                result="${EDITOR:-vi}"
                "$result" "$conf"
-               [[ $? -ne 0 ]] && return
+               (($? != 0)) && return
                ret=$GSU_SUCCESS
                return
        fi
@@ -145,7 +155,7 @@ _com_prefs()
 
 complete_prefs()
 {
-       gsu_complete_options "e" "$@"
+       gsu_complete_options "$com_prefs_options" "$@"
 }
 
 export gsu_man_txt="
@@ -153,21 +163,22 @@ Print the manual.
 
 Usage: man"
 
-_com_man()
+
+com_man()
 {
        local equal_signs="=================================================="
        local minus_signs="--------------------------------------------------"
-        local com num
+       local com num
 
-       echo "$_gsu_self (_${gsu_banner_txt}_) manual"
-       echo "${equal_signs:0:${#_gsu_self} + ${#gsu_banner_txt} + 16}"
+       echo "$gsu_name (_${gsu_banner_txt}_) manual"
+       echo "${equal_signs:0:${#gsu_name} + ${#gsu_banner_txt} + 16}"
        echo
 
-        sed -e '1,/^#\{70,\}/d' -e '/^#\{70,\}/,$d' $0 -e 's/^# *//'
+       sed -e '1,/^#\{70,\}/d' -e '/^#\{70,\}/,$d' $0 -e 's/^# *//'
        echo "----"
-        echo
-       echo "$_gsu_self usage"
-       echo "${minus_signs:0:${#_gsu_self} + 6}"
+       echo
+       echo "$gsu_name usage"
+       echo "${minus_signs:0:${#gsu_name} + 6}"
        printf "\t"
        _gsu_usage 2>&1
        echo "Each command has its own set of options as described below."
@@ -177,23 +188,16 @@ _com_man()
        echo "Available commands:"
 
        _gsu_available_commands
-        for com in $result; do
+       for com in $result; do
                num=${#com}
-               if test $num -lt 4; then
-                       num=4
-               fi
-                echo "${minus_signs:0:$num}"
-                echo "$com"
-                echo "${minus_signs:0:$num}"
-                $0 help $com
+               (($num < 4)) && num=4
+               echo "${minus_signs:0:$num}"
+               echo "$com"
+               echo "${minus_signs:0:$num}"
+               $0 help $com
                echo
-        done
-        ret=$GSU_SUCCESS
-}
-
-_gsu_banner_msg()
-{
-       gsu_short_msg "### $_gsu_self -- ###"
+       done
+       ret=$GSU_SUCCESS
 }
 
 export gsu_help_txt="
@@ -218,7 +222,7 @@ written to stdout. This can be used from the completion function of
 the subcommand.
 "
 
-_com_help()
+com_help()
 {
        local a b ere tab='     '
 
@@ -226,7 +230,7 @@ _com_help()
        ere="$result"
 
        if (($# == 0)); then
-               _gsu_banner_msg 2>&1
+               gsu_short_msg "### $gsu_name -- $gsu_banner_txt ###"
                _gsu_usage 2>&1
                {
                        printf "com_help()\n$gsu_help_txt" | head -n 4; echo "--"
@@ -256,7 +260,7 @@ _com_help()
                                # and print the sucker
                                p'
                echo
-               echo "# Try $_gsu_self help <command> for info on <command>."
+               echo "# Try $gsu_name help <command> for info on <command>."
                ret=$GSU_SUCCESS
                return
        fi
@@ -320,7 +324,7 @@ complete_help()
 # Aborts on programming errors such as missing or invalid option string.  On
 # success $result contains shell code that can be eval'ed. For each defined
 # option x, the local variable o_x will be created when calling eval "$result".
-# o_x contains true/false for options without argument and either the emtpy
+# o_x contains true/false for options without argument and either the empty
 # string or the given argument for options that take an argument.
 #
 # Example:
@@ -336,7 +340,7 @@ gsu_getopts()
 '
 
        gsu_check_arg_count $# 1 1
-       if [[ $ret -lt 0 ]]; then
+       if (($ret < 0)); then
                gsu_err_msg
                exit 1
        fi
@@ -400,7 +404,7 @@ gsu_getopts()
        ret=$GSU_SUCCESS
 }
 
-_com_complete()
+com_complete()
 {
        local cmd n cword
        local -a words
@@ -530,38 +534,22 @@ gsu_get_unnamed_arg_num()
 gsu()
 {
        local i
-       _gsu_setup
-       _gsu_available_commands
-       gsu_cmds="$result"
-       if test $# -eq 0; then
+
+       if (($# == 0)); then
                _gsu_usage
                _gsu_print_available_commands
                exit 1
        fi
        arg="$1"
        shift
-       # check internal commands
-       if [[ "$arg" = "help" || "$arg" = "man" || "$arg" = "prefs" || "$arg" = "complete" ]]; then
-               _com_$arg "$@"
-               if [[ "$ret" -lt 0 ]]; then
+       if [[ "$(type -t com_$arg)" == 'function' ]]; then
+               com_$arg "$@"
+               if (("$ret" < 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 [[ "$ret" -lt 0 ]]; then
-                               gsu_err_msg
-                               exit 1
-                       fi
-                       exit 0
-               fi
-       done
-
        ret=-$E_GSU_BAD_COMMAND
        result="$arg"
        gsu_err_msg
@@ -580,21 +568,20 @@ gsu()
 #      0 0 no argument allowed
 #      1 1 exactly one argument required
 #      0 2 at most two arguments admissible
-#      2   at least two arguments reqired
-#
+#      2   at least two arguments required
 gsu_check_arg_count()
 {
        ret=-$E_GSU_BAD_ARG_COUNT
-       if [[ $# -eq 2 ]]; then # only num1 is given
+       if (($# == 2)); then # only num1 is given
                result="at least $2 args required, $1 given"
-               [[ $1 -lt $2 ]] && return
+               (($1 < $2)) && return
                ret=$GSU_SUCCESS
                return
        fi
        # num1 and num2 given
        result="need at least $2 args, $1 given"
-       [[ $1 -lt $2 ]] && return
+       (($1 < $2)) && return
        result="need at most $3 args, $1 given"
-       [[ $1 -gt $3 ]] && return
+       (($1 > $3)) && return
        ret=$GSU_SUCCESS
 }