1
0
Fork 0
mirror of https://github.com/notwa/rc synced 2024-11-05 07:19:02 -08:00
rc/sh/argc

65 lines
1.5 KiB
Text
Raw Normal View History

#!/usr/bin/env sh
# compat: +ash +bash +dash +zsh
2021-08-01 07:35:26 -07:00
argc() { ### @- validate the number of arguments in a function.
### ```sh
### # usage: myfunc() { argc $# -(eq|le|ge) [0-9] "$0" || return; }
###
### myfunc() {
2021-07-31 23:32:43 -07:00
### # use one of the following:
### argc $# -eq N "$0" || return
### argc $# -le N "$0" || return
### argc $# -ge N "$0" || return
### # where N is an integer between 0 and 9.
### }
### ```
local usage='usage: myfunc() { %s $# -(eq|le|ge) [0-9] "$0" || return; }\n'
2021-07-31 23:32:43 -07:00
# note that $zero can be empty, but must be set.
if [ $# -ne 4 ] || [ -z "$1" ] || [ -z "$2" ] || [ -z "$3" ]; then
2021-07-31 23:32:43 -07:00
printf "$usage" argc >&2
2024-02-24 08:20:47 -08:00
return 1
fi
local argc="$1"; shift
2021-07-31 23:32:43 -07:00
local cond="$1"; shift
local want="$1"; shift
local zero="$1"; shift
2021-07-31 23:32:43 -07:00
local many='' plural=''
[ "$want" = 1 ] || plural='s'
if [ "$argc" != "${argc%%[!0-9]*}" ]; then
printf "$usage" argc >&2
2024-02-24 08:20:47 -08:00
return 1
fi
2021-07-31 23:32:43 -07:00
case "$cond" in
('-eq') many='exactly';;
('-le') many='at most';;
('-ge') many='at least';;
(*)
2021-07-31 23:32:43 -07:00
printf "$usage" argc >&2
2024-02-24 08:20:47 -08:00
return 1;;
2021-07-31 23:32:43 -07:00
esac
case "$want" in
([0-9]) :;; # no error, continue.
(*)
2021-07-31 23:32:43 -07:00
printf "$usage" argc >&2
2024-02-24 08:20:47 -08:00
return 1;;
esac
if [ "$argc" "$cond" "$want" ] 2>/dev/null; then
:
else
2021-07-31 23:32:43 -07:00
local err="expected $many $want argument$plural, got"
printf '%s: %s %s\n' "$zero" "$err" "$argc" >&2
2024-02-24 08:20:47 -08:00
return 64
fi
return 0
}
[ -n "${preload+-}" ] || argc "$@"