#!python
import click
import sys
import os
from ctypes import *
import ctypes.util
from binascii import unhexlify
import time

@click.command()
@click.argument('file', type=str, default="")
@click.option('-c', 'inline', help='Display canonical Unicode inline (WIP)', default=False, is_flag=True)
@click.option('-C', 'outside', help='Display canonical Unicode', default=False, is_flag=True)
@click.option('-G', 'color', help='Display hexadecimal as color (WIP)', default=False, is_flag=True)
@click.version_option(version='0.0.2')
@click.help_option('--help', '-h')

def main(file, inline, outside, color):
    """Print FILE, or if none given STDIN, in hexadecimal."""
    
    if file == "":
        raw = sys.stdin.buffer.read().hex()
    else:
        try:
            with open(file, "rb") as f:
                raw = f.read().hex()
        except FileNotFoundError:
            print(f"pyhex: {file}: No such file or directory")
            exit()

    if outside:
        split = [raw[i:i+2] for i in range(0, len(raw), 2)]
        cprint_hex_w_unicode(split)
    else:
        split = [raw[i:i+2] for i in range(0, len(raw), 2)]
        cprint_hex_wout_unicode(split)

# hexdump.py

def cprint_hex_w_unicode(data):
    libc = CDLL(ctypes.util.find_library("c"))
    for i in range(0, len(data), 16):
        libc.printf(b"%08x ", i)
        libc.printf(b"%s  %s |%s|\n", bytes(" ".join(data[i:i+8]), "ascii"), bytes(" ".join(data[i+8:i+16]), "ascii"), bytes(repr(unhexlify("".join(data[i:i+16])).decode("utf-8", "replace")), "utf-8"))

def cprint_hex_wout_unicode(data):
    libc = CDLL(ctypes.util.find_library("c"))
    for i in range(0, len(data), 16):
        libc.printf(b"%08x ", i)
        libc.printf(b"%s  %s\n", bytes(" ".join(data[i:i+8]), "ascii"), bytes(" ".join(data[i+8:i+16]), "ascii"))

if __name__ == '__main__':
    main()