made "usage:" error message take $0 instead of being hardcoded
[baseconv.git] / tobin
1 #!/bin/sh
2
3 conv() {
4 while [ $# -gt 0 ]; do
5 if printf "%s" "$1" | grep -qE '^[0-9]+$'; then
6 if [ "$m" -eq 0 ]; then
7 printf "Decimal %s → Binary: " "$1"
8 fi
9 printf "%s" "$p"
10 printf "obase=2; %s" "$1" | bc
11
12 elif printf "%s" "$1" | grep -qE '^([0-9A-Fa-f]+|0x[0-9A-Fa-f]+)$'; then
13 if [ "$m" -eq 0 ]; then
14 printf "Hex %s → Binary: " "$1"
15 fi
16 printf "%s" "$p"
17 printf "ibase=16; obase=2; %s" "$(printf "%s" "$1" | sed 'y/abcdef/ABCDEF/; s/^0x//')" | bc
18
19 else
20 printf "Error: '%s' is not a valid decimal or hexadecimal number\n" "$1" >&2
21 stat=1
22
23 fi
24 shift
25 done
26 return "$stat"
27 }
28
29
30 main() {
31 USAGE="usage: ${0} [-mnp] ..."
32 if ! [ "$1" = "x" ] && ! [ -t 0 ]; then
33 cat | tr '\n' ' ' | xargs tobin "x" "$@"
34 return "$?"
35
36 elif [ "$1" = "x" ]; then
37 shift
38
39 fi
40
41 if [ $# -eq 0 ]; then
42 printf "Error: No arguments provided\n%s\n" "$USAGE" >&2
43 return 2
44
45 fi
46
47 stat=0
48 m=0; n=0; p=""
49 while getopts "lmnp" flag; do
50 case "$flag" in
51 m) m=1; ;;
52 n) n=1; ;;
53 p) p="0b" ;;
54 *) printf "%s\n" "$USAGE" >&2 ; return 2 ;;
55 esac
56 done
57
58 shift $(( OPTIND - 1 ))
59
60 t=$(conv "$@")
61 stat=$?
62
63 if [ "$n" -eq 1 ] && [ "$m" -eq 1 ]; then
64 t=$(printf "%s" "$t" | tr '\n' ' ')
65
66 elif [ "$n" -eq 1 ] && [ "$m" -eq 0 ]; then
67 t=$(printf "%s" "$t" | tr '\n' ';')
68
69 else
70 t=$(printf "%s" "$t")
71
72 fi
73
74 printf "%s\n" "$t"
75 return "$stat"
76 }
77
78 main "$@"