X-Git-Url: http://git.tuebingen.mpg.de/?p=gsu.git;a=blobdiff_plain;f=funcs%2Fgsu;h=673605e43bbca8e66940722b7c587b72ba84964b;hp=b873ad9386b872f4a98bdd731a1d8495b04e06c0;hb=ad6133ac9cea3d873291675a030c1361cd5cf6b9;hpb=7eff3dc75f0059537b5ae6013ee4dc5511c86c32 diff --git a/funcs/gsu b/funcs/gsu index b873ad9..673605e 100644 --- a/funcs/gsu +++ b/funcs/gsu @@ -14,6 +14,8 @@ E_GSU_BAD_BOOL bad value for boolian option E_GSU_BAD_OPTION_TYPE invalid option type E_GSU_BAD_ARG_COUNT invalid number of arguments E_GSU_EDITOR failed to execute editor +E_GSU_MKDIR failed to create directory +E_GSU_GETOPTS getopts error $gsu_errors " local a b i=0 @@ -179,9 +181,14 @@ _com_prefs() local i conf="${gsu_config_file:=$HOME/.$gsu_name.rc}" if [[ "$1" = "-e" ]]; then + ret=-$E_GSU_MKDIR + result="${conf%/*}" + mkdir -p "$result" + [[ $? -ne 0 ]] && return ret=-$E_GSU_EDITOR result="${EDITOR:-vi}" "$result" "$conf" + [[ $? -ne 0 ]] && return ret=$GSU_SUCCESS return fi @@ -391,20 +398,96 @@ _gsu_check_options() } export -f _gsu_check_options -gsu() +# Wrapper for bash's getopts. +# +# 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 an argument or the emtpy string/the +# given argument, depending on whether this option was contained in the "$@" +# array. +# +# Example: +# gsu_getopts abc:x:y +# eval "$result" +# [[ $ret -lt 0 ]] && return +# +# [[ "$o_a" = "true ]] && echo "The -a flag was given" +# [[ -n "$o_c" ]] && echo "The -c option was given with arg $o_c" +gsu_getopts() { - local i + local i c tab=' ' cr=' +' - gsu_is_a_number "${BASH_VERSINFO[0]}" + gsu_check_arg_count $# 1 1 if [[ $ret -lt 0 ]]; then - gsu_msg "fatal: failed to determine bash version" + gsu_err_msg exit 1 fi - if [[ "${BASH_VERSINFO[0]}" -lt 4 ]]; then - gsu_msg "fatal: This script requires at least bash 4.0" + ret=-$E_GSU_GETOPTS + result="invalid optstring $1" + if [[ -z "$1" || "$1" =~ "::" ]]; then + gsu_err_msg exit 1 fi + + for ((i=0; i < ${#1}; i++)); do + c=${1:$i:1} + case "$c" in + [a-zA-Z:]);; + *) + ret=-$E_GSU_GETOPTS + result="invalid character $c in optstring" + gsu_err_msg + exit 1 + esac + done + result="local opt" + for ((i=0; i < ${#1}; i++)); do + c1=${1:$i:1} + c2=${1:$(($i + 1)):1} + result+=" o_$c1" + if [[ "$c2" = ":" ]]; then + let i++ + else + result+="=false" + fi + done + result+=" + OPTIND=1 + while getopts $1 opt \"\$@\"; do + case \"\$opt\" in +" + for ((i=0; i < ${#1}; i++)); do + c1=${1:$i:1} + c2=${1:$(($i + 1)):1} + result+="$tab$tab$c1) o_$c1=" + if [[ "$c2" = ":" ]]; then + result+="\"\$OPTARG\"" + let i++ + else + result+="true" + fi + result+=";;$cr" + done + result+=" + *) + ret=-\$E_GSU_GETOPTS + result=\"invalid option given\" + return + ;; + esac + done + shift \$((\$OPTIND - 1)) +" + ret=$GSU_SUCCESS +} +export -f gsu_getopts + +gsu() +{ + local i _gsu_self="$(basename $0)" gsu_name="${gsu_name:=$_gsu_self}" gsu_config_var_prefix="${gsu_config_var_prefix:=$gsu_name}"