"Collection of tools for displaying bit representation of numbers."""

import StringIO


def binary(n, width=None):
    """
    Return a list of (0|1)'s for the binary representation of n where n >= 0.
    If you specify a width, it must be > 0, otherwise it is ignored.  The list
    could be padded with 0 bits if width is specified.
    """
    l = []
    if width and width <= 0:
        width = None
    while n > 0:
        l.append(1 if n & 1 else 0)
        n = n >> 1

    if width:
        for i in range(width - len(l)):
            l.append(0)

    l.reverse()
    return l


def twos_complement(n, width):
    """
    Return a list of (0|1)'s for the binary representation of a width-bit two's
    complement numeral system of an integer n which may be negative.
    """
    val = 2**(width - 1)
    if n >= 0:
        if n > (val - 1):
            return None
        # It is safe to represent n with width-bits.
        return binary(n, width)

    if n < 0:
        if abs(n) > val:
            return None
        # It is safe to represent n (a negative int) with width-bits.
        return binary(val * 2 - abs(n))

# print binary(0xABCD)
# [1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1]
# print binary(0x1F, 8)
# [0, 0, 0, 1, 1, 1, 1, 1]
# print twos_complement(-5, 4)
# [1, 0, 1, 1]
# print twos_complement(7, 4)
# [0, 1, 1, 1]
# print binary(7)
# [1, 1, 1]
# print twos_complement(-5, 64)
# [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1]


def positions(width):
    """Helper function returning a list describing the bit positions.
    Bit positions greater than 99 are truncated to 2 digits, for example,
    100 -> 00 and 127 -> 27."""
    return ['{0:2}'.format(i)[-2:] for i in reversed(range(width))]


def utob(debugger, command_line, result, dict):
    """Convert the unsigned integer to print its binary representation.
    args[0] (mandatory) is the unsigned integer to be converted
    args[1] (optional) is the bit width of the binary representation
    args[2] (optional) if specified, turns on verbose printing"""
    args = command_line.split()
    try:
        n = int(args[0], 0)
        width = None
        if len(args) > 1:
            width = int(args[1], 0)
            if width < 0:
                width = 0
    except:
        print utob.__doc__
        return

    if len(args) > 2:
        verbose = True
    else:
        verbose = False

    bits = binary(n, width)
    if not bits:
        print "insufficient width value: %d" % width
        return
    if verbose and width > 0:
        pos = positions(width)
        print ' ' + ' '.join(pos)
    print ' %s' % str(bits)


def itob(debugger, command_line, result, dict):
    """Convert the integer to print its two's complement representation.
    args[0] (mandatory) is the integer to be converted
    args[1] (mandatory) is the bit width of the two's complement representation
    args[2] (optional) if specified, turns on verbose printing"""
    args = command_line.split()
    try:
        n = int(args[0], 0)
        width = int(args[1], 0)
        if width < 0:
            width = 0
    except:
        print itob.__doc__
        return

    if len(args) > 2:
        verbose = True
    else:
        verbose = False

    bits = twos_complement(n, width)
    if not bits:
        print "insufficient width value: %d" % width
        return
    if verbose and width > 0:
        pos = positions(width)
        print ' ' + ' '.join(pos)
    print ' %s' % str(bits)
