aboutsummaryrefslogtreecommitdiff
path: root/src/cpt-lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/cpt-lib')
-rw-r--r--src/cpt-lib166
1 files changed, 85 insertions, 81 deletions
diff --git a/src/cpt-lib b/src/cpt-lib
index bb7cc2d..ccba660 100644
--- a/src/cpt-lib
+++ b/src/cpt-lib
@@ -46,16 +46,16 @@ trap_set() {
# This is the public domain getoptions shell library. It also forms a usage
# function.
-# URL: https://github.com/ko1nksm/getoptions (v1.1.0)
+# URL: https://github.com/ko1nksm/getoptions (v2.0.1)
# License: Creative Commons Zero v1.0 Universal
# shellcheck disable=2016
getoptions() {
- _error='' _on=1 _off='' _export='' _plus='' _mode='' _alt='' restargs=''
- _opts='' _no='' _equal=1 indent='' IFS=' '
+ _error='' _on=1 _off='' _export='' _plus='' _mode='' _alt='' _rest=''
+ _opts='' _help='' _indent='' _init=@empty IFS=' '
for i in 0 1 2 3 4 5; do
- eval "_$i() { echo \"$indent\$*\"; }"
- indent="$indent "
+ eval "_$i() { echo \"$_indent\$@\"; }"
+ _indent="$_indent "
done
quote() {
@@ -64,27 +64,31 @@ getoptions() {
q="'${r%????}'" && q=${q#\'\'} && q=${q%\'\'}
eval "$1=\${q:-\"''\"}"
}
-
code() {
[ "${1#:}" = "$1" ] && c=3 || c=4
eval "[ ! \${$c:+x} ] || $2 \"\$$c\""
}
+ invoke() { eval '"_$@"'; }
+ prehook() { invoke "$@"; }
+ for i in setup flag param option disp msg; do
+ eval "$i() { prehook $i \"\$@\"; }"
+ done
+
args() {
- on=$_on off=$_off export=$_export init='@empty' _hasarg=$1
+ on=$_on off=$_off export=$_export init=$_init _hasarg=$1
while [ $# -gt 2 ] && [ "$3" != '--' ] && shift; do
case $2 in
- --no-* | --\{no-\}*) _no=1 ;;
- -?) [ "${_hasarg#%}" ] || _opts="$_opts${2#-}" ;;
+ -?) [ "$_hasarg" ] || _opts="$_opts${2#-}" ;;
+*) _plus=1 ;;
[!-+]*) eval "${2%%:*}=\${2#*:}"
esac
done
}
-
defvar() {
case $init in
@none) : ;;
+ @export) code "$1" _0 "export $1" ;;
@empty) code "$1" _0 "${export:+export }$1=''" ;;
@unset) code "$1" _0 "unset $1 ||:" "unset OPTARG ||:; ${1#:}" ;;
*)
@@ -94,80 +98,78 @@ getoptions() {
code "$1" _0 "${export:+export }$1=$init" "OPTARG=$init; ${1#:}"
esac
}
-
- setup() {
- restargs=$1 && shift
+ _setup() {
+ [ $# -gt 0 ] && { [ "$1" ] && _rest=$1; shift; }
for i; do [ "$i" = '--' ] && break; eval "_${i%%:*}=\${i#*:}"; done
}
- flag() { args : "$@"; defvar "$@"; }
- param() { args % "$@"; defvar "$@"; }
- option() { args % "$@"; defvar "$@"; }
- disp() { args : "$@"; }
- msg() { args : _ "$@"; }
+ _flag() { args : "$@"; defvar "$@"; }
+ _param() { args '' "$@"; defvar "$@"; }
+ _option() { args '' "$@"; defvar "$@"; }
+ _disp() { args : "$@"; }
+ _msg() { args : _ "$@"; }
"$@"
- _0 "${restargs:?}=''"
+ _0 "${_rest:?}=''"
args() {
- sw='' on=$_on off=$_off validate='' pattern='' counter='' default=''
+ sw='' validate='' pattern='' counter='' on=$_on off=$_off export=$_export
while [ $# -gt 1 ] && [ "$2" != '--' ] && shift; do
case $1 in
- --\{no-\}* ) sw="${sw}${sw:+ | }--${1#--?no-?} | --no-${1#--?no-?}" ;;
- [-+]? | --*) sw="${sw}${sw:+ | }$1" ;;
+ --\{no-\}*) sw="$sw${sw:+ | }--${1#--?no-?} | --no-${1#--?no-?}" ;;
+ [-+]? | --*) sw="$sw${sw:+ | }$1" ;;
*) eval "${1%%:*}=\"\${1#*:}\""
esac
done
}
-
setup() { :; }
- flag() {
+ _flag() {
args "$@"
- code='$OPTARG'
- [ "$counter" ] && on=1 off=-1 code="\$((\${$1:-0}+\${OPTARG:-0}))"
quote on "$on" && quote off "$off"
+ [ "$counter" ] && on=1 off=-1 v="\$((\${$1:-0}+\${OPTARG:-0}))" || v=''
_3 "$sw)"
- _4 '[ "${OPTARG:-}" ] && set -- "$1" noarg && break'
+ _4 '[ "${OPTARG:-}" ] && OPTARG=${OPTARG#*\=} && set -- noarg "$1" && break'
_4 "eval '[ \${OPTARG+x} ] &&:' && OPTARG=$on || OPTARG=$off"
- valid "$1" "$code"
+ valid "$1" "${v:-\$OPTARG}"
_4 ';;'
}
- param() {
+ _param() {
args "$@"
_3 "$sw)"
- _4 '[ $# -le 1 ] && set -- "$1" required && break'
+ _4 '[ $# -le 1 ] && set -- required "$1" && break'
_4 'OPTARG=$2'
valid "$1" '$OPTARG'
_4 'shift ;;'
}
- option() {
+ _option() {
args "$@"
- quote default "$default"
+ quote on "$on" && quote off "$off"
_3 "$sw)"
- _4 'case $OPTARG in'
- _5 '?*) OPTARG=$2 ;;'
- _5 " *) OPTARG=$default &&" 'set -- "$1" "$@"'
- _4 "esac"
+ _4 'set -- "$1" "$@"'
+ _4 '[ ${OPTARG+x} ] && {'
+ _5 'case $1 in --no-*) set -- noarg "${1%%\=*}"; break; esac'
+ _5 '[ "${OPTARG:-}" ] && { shift; OPTARG=$2; } ||' "OPTARG=$on"
+ _4 "} || OPTARG=$off"
valid "$1" '$OPTARG'
_4 'shift ;;'
}
valid() {
- set -- "$validate" "$pattern" "$@"
+ set -- "$validate" "$pattern" "$1" "$2"
+ [ "$1" ] && _4 "$1 || { set -- ${1%% *}:\$? \"\$1\" $1; break; }"
[ "$2" ] && {
quote pattern "$2"
_4 "case \$OPTARG in $2) ;;"
- _5 "*) set -- \"\$1\" pattern $pattern; break"
+ _5 "*) set -- pattern:$pattern \"\$1\"; break"
_4 "esac"
}
- [ "$1" ] && _4 "$1 || { set -- \"\$1\" $1; break; }"
- code "$3" _4 "$3=$4" "${3#:}"
+ code "$3" _4 "${export:+export }$3=\"$4\"" "${3#:}"
}
- disp() {
+ _disp() {
args "$@"
_3 "$sw)"
code "$1" _4 "echo \"\${$1}\"" "${1#:}"
_4 'exit 0 ;;'
}
- msg() { :; }
+ _msg() { :; }
_0 "$2() {"
_1 'OPTIND=$(($#+1))'
@@ -175,12 +177,10 @@ getoptions() {
[ "$_alt" ] && _2 'case $1 in -[!-]?*) set -- "-$@"; esac'
_2 'case $1 in'
wa() { _4 "eval '${1% *}' \${1+'\"\$@\"'}"; }
- [ "$_equal" ] && {
- _3 '--?*=*) OPTARG=$1; shift'
- wa 'set -- "${OPTARG%%\=*}" "${OPTARG#*\=}" "$@"'
- _4 ';;'
- }
- [ "$_no" ] && _3 '--no-*) unset OPTARG ;;'
+ _3 '--?*=*) OPTARG=$1; shift'
+ wa 'set -- "${OPTARG%%\=*}" "${OPTARG#*\=}" "$@"'
+ _4 ';;'
+ _3 '--no-*) unset OPTARG ;;'
[ "$_alt" ] || {
[ "$_opts" ] && {
_3 "-[$_opts]?*) OPTARG=\$1; shift"
@@ -200,74 +200,78 @@ getoptions() {
_2 'esac'
_2 'case $1 in'
"$@"
- restargs() {
+ rest() {
_3 "$1"
_4 'while [ $# -gt 0 ]; do'
- _5 "$restargs=\"\${$restargs}" '\"\${$((${OPTIND:-0}-$#))}\""'
+ _5 "$_rest=\"\${$_rest}" '\"\${$((${OPTIND:-0}-$#))}\""'
_5 'shift'
_4 'done'
_4 'break ;;'
}
- restargs '--) shift'
- _3 "[-${_plus:++}]?*)" 'set -- "$1" unknown && break ;;'
+ rest '--) shift'
+ _3 "[-${_plus:++}]?*)" 'set -- unknown "$1" && break ;;'
case $_mode in
- +) restargs '*)' ;;
- *) _3 "*) $restargs=\"\${$restargs}" '\"\${$((${OPTIND:-0}-$#))}\""'
+ +) rest '*)' ;;
+ *) _3 "*) $_rest=\"\${$_rest}" '\"\${$((${OPTIND:-0}-$#))}\""'
esac
_2 'esac'
_2 'shift'
_1 'done'
_1 '[ $# -eq 0 ] && { OPTIND=1; unset OPTARG; return 0; }'
- [ "$_error" ] && _1 "$_error" '"$@" >&2 && exit 1'
- _1 'case $2 in'
- _2 "unknown) echo \"unrecognized option '\$1'\" ;;"
- _2 "noarg) echo \"option '\$1' doesn't allow an argument\" ;;"
- _2 "required) echo \"option '\$1' requires an argument\" ;;"
- _2 "pattern) echo \"option '\$1' does not match the pattern (\$3)\" ;;"
- _2 "*) echo \"option '\$1' validation error: \$2\""
- _1 'esac >&2'
+ _1 'case $1 in'
+ _2 'unknown) set -- "Unrecognized option: $2" "$@" ;;'
+ _2 'noarg) set -- "Does not allow an argument: $2" "$@" ;;'
+ _2 'required) set -- "Requires an argument: $2" "$@" ;;'
+ _2 'pattern:*) set -- "Does not match the pattern (${1#*:}): $2" "$@" ;;'
+ _2 '*) set -- "Validation error ($1): $2" "$@"'
+ _1 'esac'
+ [ "$_error" ] && _1 "$_error" '"$@" >&2 || exit $?'
+ _1 'echo "$1" >&2'
_1 'exit 1'
_0 '}'
+
+ [ ! "$_help" ] || eval "shift 2; getoptions_help $1 $_help" ${3+'"$@"'}
}
-# URL: https://github.com/ko1nksm/getoptions (v1.1.0)
+# URL: https://github.com/ko1nksm/getoptions (v2.0.1)
# License: Creative Commons Zero v1.0 Universal
getoptions_help() {
- width=30 plus='' here='GETOPTIONS-HEREDOC'
+ width=30 plus='' leading=' '
pad() { p=$2; while [ ${#p} -lt "$3" ]; do p="$p "; done; eval "$1=\$p"; }
args() {
- _type=$1 var=$2 sw='' hidden='' _width=$width _pre='' && shift 2
+ _type=$1 var=${2%% *} sw='' label='' hidden='' _width=$width && shift 2
while [ $# -gt 0 ] && i=$1 && shift && [ ! "$i" = '--' ]; do
case $i in
- --*) pad sw "$sw${sw:+, }" $((${plus:+4} + 4)); sw="$sw$i" ;;
- -? ) sw="$sw${sw:+, }$i" ;;
- +? ) pad sw "$sw${sw:+, }" 4; sw="$sw$i" ;;
- * ) eval "${i%%:*}=\"\${i#*:}\"" ;;
+ --*) pad sw "$sw${sw:+, }" $((${plus:+4}+4)); sw="$sw$i" ;;
+ -?) sw="$sw${sw:+, }$i" ;;
+ +?) [ ! "$plus" ] || { pad sw "$sw${sw:+, }" 4; sw="$sw$i"; } ;;
+ *) eval "${i%%:*}=\${i#*:}"
esac
done
[ "$hidden" ] && return 0
- case $_type in
- setup | msg) _pre='' _width=0 ;;
- flag | disp) pad _pre " $sw " "$_width" ;;
- param ) pad _pre " $sw $var " "$_width" ;;
- option ) pad _pre " $sw [$var] " "$_width" ;;
+ [ "$label" ] || case $_type in
+ setup | msg) label='' _width=0 ;;
+ flag | disp) label="$sw " ;;
+ param) label="$sw $var " ;;
+ option) label="${sw}[=$var] "
esac
- [ ${#_pre} -le "$_width" ] && [ $# -gt 0 ] && _pre="$_pre$1" && shift
- echo "$_pre"
- pad _pre '' "$_width"
- for i; do echo "$_pre$i"; done
+ pad label "${label:+$leading}$label" "$_width"
+ [ ${#label} -le "$_width" ] && [ $# -gt 0 ] && label="$label$1" && shift
+ echo "$label"
+ pad label '' "$_width"
+ for i; do echo "$label$i"; done
}
- for i in 'setup :' 'flag' 'param' 'option' 'disp' 'msg :'; do
+ for i in 'setup :' flag param option disp 'msg :'; do
eval "${i% *}() { args $i \"\$@\"; }"
done
echo "$2() {"
- echo "cat<<$here"
+ echo "cat<<'GETOPTIONSHERE'"
"$@"
- echo "$here"
+ echo "GETOPTIONSHERE"
echo "}"
}