X-Git-Url: http://git.tuebingen.mpg.de/?p=gsu.git;a=blobdiff_plain;f=subcommand;h=343f248ea45a07411fa61a576532b5566a2bf9b1;hp=f668f2adb5332bce964fdb1d5cc28e07ad0d7b2f;hb=71610bcb63f7e3d4bf33a8e766cad5d9b8f74acc;hpb=96dedb2c454e93e307a45721b202f304c9464a2b diff --git a/subcommand b/subcommand index f668f2a..343f248 100644 --- a/subcommand +++ b/subcommand @@ -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 for info on ." + echo "# Try $gsu_name help for info on ." 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 }