d48311dcc687249e017648cf31fafaf6d1abc0d6
[baseconv.git] / todec
1 #!/bin/sh
2
3 conv() {
4 while [ $# -gt 0 ]; do
5 if printf "%s" "$1" | grep -qE '^0b[0-1]+$'; then
6 if [ "$m" -eq 0 ]; then
7 printf "Binary %s → Decimal: " "$1"
8 fi
9 t=$(printf "%s" "$1" | sed 's/^0b//')
10 printf "ibase=2; %s / %s" "$t" "$k" | bc | tr -d '\n' && printf "%s\n" "$p"
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 → Decimal: " "$1"
15 fi
16 t=$(printf "%s" "$1" | sed 's/^0x//')
17 printf "ibase=16; %s / %X" "$(printf "%s" "$t" | sed 'y/abcdef/ABCDEF/')" "0b$k" | bc | tr -d '\n' && printf "%s\n" "$p"
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 if ! [ "$1" = "x" ] && ! [ -t 0 ]; then
32 cat | tr '\n' ' ' | xargs todec "x" "$@"
33 return "$?"
34
35 elif [ "$1" = "x" ]; then
36 shift
37
38 fi
39
40 if [ $# -eq 0 ]; then
41 printf "Error: No arguments provided\nusage: todec [-mn] number1 number2 ...\n" >&2
42 return 2
43
44 fi
45
46 stat=0
47 k=1; m=0; n=0; p='';
48 while getopts "bmnKMG" flag; do
49 case "$flag" in
50 m) m=1; ;;
51 n) n=1; ;;
52 # 1024
53 K) k=10000000000; p='K'; ;;
54 # 1 048 576
55 M) k=100000000000000000000; p='M'; ;;
56 # 1 073 741 824
57 G) k=1000000000000000000000000000000; p='G'; ;;
58 *) printf "usage: todec [-mnKMG] number1 number2 ...\n" >&2 ; return 2 ;;
59 esac
60 done
61
62 shift $(( OPTIND - 1 ))
63
64 t=$(conv "$@")
65 stat=$?
66
67 if [ "$n" -eq 1 ] && [ "$m" -eq 1 ]; then
68 t=$(printf "%s" "$t" | tr '\n' ' ')
69
70 elif [ "$n" -eq 1 ] && [ "$m" -eq 0 ]; then
71 t=$(printf "%s" "$t" | tr '\n' ';')
72
73 else
74 t=$(printf "%s" "$t")
75
76 fi
77
78 printf "%s\n" "$t"
79 return "$stat"
80 }
81
82 main "$@"