diff options
-rw-r--r-- | lib/cmd.sh | 121 | ||||
-rw-r--r-- | lib/local.mk | 3 |
2 files changed, 123 insertions, 1 deletions
diff --git a/lib/cmd.sh b/lib/cmd.sh new file mode 100644 index 0000000..d8550f0 --- /dev/null +++ b/lib/cmd.sh @@ -0,0 +1,121 @@ +# ProteanOS Development Kit +# lib/cmd.sh +# Command-related functions +# +# Copyright (C) 2013 Patrick "P. J." McDermott +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +[ "x${_CMD_SM+set}" = 'xset' ] && return 0 +_CMD_SM=1 + +use output +use locale + +CMDS='@cmds@' + +load_cmds() +{ + local cmd= + + for cmd in ${CMDS}; do + use "cmd/${cmd}" + done +} + +print_opt_summaries() +{ + local padding= + local opt= + local opt_out= + local summary= + + padding="$(printf '%24s' '')" + for opt in $(printf '%s' "${OPTSTRING}" | sed 's/\([a-zA-Z0-9]\)/ \1/g') + do + if [ ${#opt} -eq 1 ]; then + # No argument expected. + opt_out="-${opt}" + else + # Argument expected. + opt="${opt%?}" + opt_out="-${opt} $(get_msg "opt_${opt}_arg")" + fi + if [ ${#opt_out} -gt 20 ]; then + printf ' %s\n%24s' "${opt_out}" '' + else + printf ' %-20s ' "${opt_out}" + fi + summary="$(get_msg "opt_${opt}_summary")" + printf '%s\n' "${summary}" | fold -s -w 56 | \ + sed "2,\$s/^/${padding}/;" + done +} + +print_cmd_summaries() +{ + local padding= + local cmd= + local cmd_clean= + local summary= + + padding="$(printf '%24s' '')" + for cmd in ${CMDS}; do + if [ ${#cmd} -gt 20 ]; then + printf ' %s\n%24s' "${cmd}" '' + else + printf ' %-20s ' "${cmd}" + fi + cmd_clean="$(printf '%s' "${cmd}" | \ + tr '[A-Z]' '[a-z]' | tr -C '[a-z0-9_]' '_')" + summary="$(get_msg "cmd_${cmd_clean}_summary")" + printf '%s\n' "${summary}" | fold -s -w 56 | \ + sed "2,\$s/^/${padding}/;" + done +} + +print_cmd_usage() +{ + local cmd="${1}" + local cmd_clean= + local usage= + + cmd_clean="$(printf '%s' "${cmd}" | \ + tr '[A-Z]' '[a-z]' | tr -C '[a-z0-9_]' '_')" + usage="$(get_msg "cmd_${cmd_clean}_usage")" + + printf "$(get_msg 'cmd_usage')\n" "${0}" "${cmd}" "${usage}" +} + +is_cmd() +{ + local cmd="${1}" + + [ "x$(printf '%s\n' ${CMDS} | grep "^${cmd}$")" = "x${cmd}" ] +} + +run_cmd() +{ + local cmd="${1}" + local cmd_clean= + shift + + cmd_clean="$(printf '%s' "${cmd}" | \ + tr '[A-Z]' '[a-z]' | tr -C '[a-z0-9_]' '_')" + if is_cmd "${cmd}"; then + "cmd_${cmd_clean}_main" "${@}" + else + error 1 "$(get_msg 'cmd_not_found')" "${cmd}" + fi +} diff --git a/lib/local.mk b/lib/local.mk index 447d8b6..e058fa1 100644 --- a/lib/local.mk +++ b/lib/local.mk @@ -1,3 +1,4 @@ pkgdata_sources = \ lib/output.sh \ - lib/locale.sh + lib/locale.sh \ + lib/cmd.sh |