#!/bin/sh ABC="0123456789ABCDEF" dec2any () { z=$1 b=$2 a="" while [ $z -ne 0 ] do t="`expr $z % $b`" a="`expr substr $ABC $(expr $t + 1) 1`$a" z="`expr $z / $b`" done echo "${a:-0}" } any2dec() { b=$2 a=0 for digit in `echo "$1" | sed 's/./& /g'` do digit=`expr $(expr index $ABC $digit) - 1` a=`expr $a \* $b + $digit` done echo "${a:-0}" } while [ -n "$1" ] do out="" case "$1" in -h | --help | help) cat << EOF ABOUT digish - small digit converter for small systems USAGE digish [-h] mode number [number number ...] MODES - sourceTOdestination (eg: 2TO10 | 7TO3 etc) - sbase2dbase (eg b2d | h2o etc) BASES - 2 | b - binary - 8 | o - octal - 10 | d - decimal - 16 | h - hexadezimal EXAMPLES - digish h2d FF -> 255 - digish h2b FF -> 11111111 - digish b2o AUTHOR - tobias gruetzmacher < > - mathias gumz EOF exit 0;; -a | --alphabet ) [ -n "$2" ] && ABC="$2" ;; *) if [ -n "$2" ]; then case "$1" in b2d)out=`any2dec "$2" 2`;; b2o)out=`dec2any $(any2dec "$2" 2) 8`;; b2h)out=`dec2any $(any2dec "$2" 2) 16`;; o2b)out=`dec2any $(any2dec "$2" 8) 2`;; o2d)out=`any2dec "$2" 8`;; o2h)out=`dec2any $(any2dec "$2" 8) 16`;; d2b)out=`dec2any "$2" 2`;; d2o)out=`dec2any "$2" 8`;; d2h)out=`dec2any "$2" 16`;; h2b)out=`dec2any $(any2dec "$2" 16) 2`;; h2o)out=`dec2any $(any2dec "$2" 16) 8`;; h2d)out=`any2dec "$2" 16`;; *[Tt][Oo]*) s=`echo $1 | sed -e 's/[Tt][Oo].\+$//g'` d=`echo $1 | sed -e 's/^.\+[Tt][Oo]//g'` out=`dec2any $(any2dec "$2" $s) $d` ;; esac else echo "error, missing value" exit 1 fi esac echo "${out:-0}" out="" shift 2 done