# Base Conversion tools
# Author:  Yotam Medini  yotam.medini@gmail.com -- Created: 2008/June/20

import string


# Return the number represented by a string  s  in base  b . 
# Return None if  s  is illegal.
# We assume  2 <= b <= 16
def intbase(s, b):
    digits = '0123456789abcdef'
    n = 0
    negative = False
    ci = 0
    if len(s) > 0 and s[0] == '-':
        negative = True
        ci = 1
    while ci < len(s) and n != None:
        c = s[ci]
        c = string.lower(c) # {A, B, C, D, E, F} -> {a, b, c, d, e, f} 
        d = 0
        while d < b and digits[d] != c:
            d += 1
        if d < b:
            n = b * n + d
        else:
            n = None
        ci += 1
    if negative and n != None:
        n = -n
    return n


# Return a string representing a number  n  in base  b .
# We assume  2 <= b <= 16
def strbase(n, b):
    digits = '0123456789abcdef'
    s = ''
    sign = ''
    if n < 0:
        sign = '-'
        n = -n
    while n > 0:
        d = n % b
        n = n / b
        c = digits[d]
        s = c + s
    if s == '':
        s = '0'
    else:
        s = sign + s
    return s


# Just a test
if __name__ == '__main__':
    import sys

    def usage_exit():

        sys.stderr.write("""
Usage:  
    python %s intbase <s> <b>
or
    python %s strbase <n> <b>
""" % (sys.argv[0], sys.argv[0]))
        sys.exit(1)

    if len(sys.argv) != 4:
        usage_exit()

    b = int(sys.argv[3])
    if sys.argv[1] == 'intbase':
        s = sys.argv[2]
        n = intbase(s, b)
        sys.stdout.write("intbase('%s', %d) = %d\n" % (s, b, n))
    elif sys.argv[1] == 'strbase':
        n = int(sys.argv[2])
        s = strbase(n, b)
        sys.stdout.write("strbase(%d, %d) = '%s'\n" % (n, b, s))
    else:
        usage_exit()
    sys.exit(0)

        
