#!/usr/bin/env python

import sys
import re
import shelve
import json


regs_map = {
        '%r0':{'op': None, 'src': None, 'dest': None},
        '%r1':{'op': None, 'src': None, 'dest': None},
        '%r2':{'op': None, 'src': None, 'dest': None},
        '%r3':{'op': None, 'src': None, 'dest': None},
        '%r4':{'op': None, 'src': None, 'dest': None},
        '%r5':{'op': None, 'src': None, 'dest': None},
        '%r6':{'op': None, 'src': None, 'dest': None},
        '%r7':{'op': None, 'src': None, 'dest': None},
        '%r8':{'op': None, 'src': None, 'dest': None},
        '%r9':{'op': None, 'src': None, 'dest': None},
        '%r10':{'op': None, 'src': None, 'dest': None},
        '%r11':{'op': None, 'src': None, 'dest': None},
        '%r12':{'op': None, 'src': None, 'dest': None},
        '%r13':{'op': None, 'src': None, 'dest': None},
        '%r14':{'op': None, 'src': None, 'dest': None},
        '%r15':{'op': None, 'src': None, 'dest': None},		
        '%rax':{'op': None, 'src': None, 'dest': None},		
        '%rcx':{'op': None, 'src': None, 'dest': None},		
        '%rdx':{'op': None, 'src': None, 'dest': None},		
        '%rbx':{'op': None, 'src': None, 'dest': None},		
        '%rsp':{'op': None, 'src': None, 'dest': None},		
        '%rbp':{'op': None, 'src': None, 'dest': None},		
        '%rsi':{'op': None, 'src': None, 'dest': None},		
        '%rdi':{'op': None, 'src': None, 'dest': None},		
        '%rip':{'op': None, 'src': None, 'dest': None},		
        '%r0d':{'op': None, 'src': None, 'dest': None},		
        '%r1d':{'op': None, 'src': None, 'dest': None},		
        '%r2d':{'op': None, 'src': None, 'dest': None},		
        '%r3d':{'op': None, 'src': None, 'dest': None},		
        '%r4d':{'op': None, 'src': None, 'dest': None},		
        '%r5d':{'op': None, 'src': None, 'dest': None},		
        '%r6d':{'op': None, 'src': None, 'dest': None},		
        '%r7d':{'op': None, 'src': None, 'dest': None},		
        '%r8d':{'op': None, 'src': None, 'dest': None},		
        '%r9d':{'op': None, 'src': None, 'dest': None},		
        '%r10d':{'op': None, 'src': None, 'dest': None},		
        '%r11d':{'op': None, 'src': None, 'dest': None},		
        '%r12d':{'op': None, 'src': None, 'dest': None},		
        '%r13d':{'op': None, 'src': None, 'dest': None},		
        '%r14d':{'op': None, 'src': None, 'dest': None},		
        '%r15d':{'op': None, 'src': None, 'dest': None},		
        '%eax':{'op': None, 'src': None, 'dest': None},		
        '%ecx':{'op': None, 'src': None, 'dest': None},		
        '%edx':{'op': None, 'src': None, 'dest': None},		
        '%ebx':{'op': None, 'src': None, 'dest': None},		
        '%esp':{'op': None, 'src': None, 'dest': None},		
        '%ebp':{'op': None, 'src': None, 'dest': None},		
        '%esi':{'op': None, 'src': None, 'dest': None},		
        '%edi':{'op': None, 'src': None, 'dest': None},		
        '%eip':{'op': None, 'src': None, 'dest': None},		
        '%r0w':{'op': None, 'src': None, 'dest': None},		
        '%r1w':{'op': None, 'src': None, 'dest': None},		
        '%r2w':{'op': None, 'src': None, 'dest': None},		
        '%r3w':{'op': None, 'src': None, 'dest': None},		
        '%r4w':{'op': None, 'src': None, 'dest': None},		
        '%r5w':{'op': None, 'src': None, 'dest': None},		
        '%r6w':{'op': None, 'src': None, 'dest': None},		
        '%r7w':{'op': None, 'src': None, 'dest': None},		
        '%r8w':{'op': None, 'src': None, 'dest': None},		
        '%r9w':{'op': None, 'src': None, 'dest': None},		
        '%r10w':{'op': None, 'src': None, 'dest': None},		
        '%r11w':{'op': None, 'src': None, 'dest': None},		
        '%r12w':{'op': None, 'src': None, 'dest': None},		
        '%r13w':{'op': None, 'src': None, 'dest': None},		
        '%r14w':{'op': None, 'src': None, 'dest': None},		
        '%r15w':{'op': None, 'src': None, 'dest': None},		
        '%ax':{'op': None, 'src': None, 'dest': None},		
        '%cx':{'op': None, 'src': None, 'dest': None},		
        '%dx':{'op': None, 'src': None, 'dest': None},		
        '%bx':{'op': None, 'src': None, 'dest': None},		
        '%sp':{'op': None, 'src': None, 'dest': None},		
        '%bp':{'op': None, 'src': None, 'dest': None},		
        '%si':{'op': None, 'src': None, 'dest': None},		
        '%di':{'op': None, 'src': None, 'dest': None},		
        '%r0b':{'op': None, 'src': None, 'dest': None},		
        '%r1b':{'op': None, 'src': None, 'dest': None},		
        '%r2b':{'op': None, 'src': None, 'dest': None},		
        '%r3b':{'op': None, 'src': None, 'dest': None},		
        '%r4b':{'op': None, 'src': None, 'dest': None},		
        '%r5b':{'op': None, 'src': None, 'dest': None},		
        '%r6b':{'op': None, 'src': None, 'dest': None},		
        '%r7b':{'op': None, 'src': None, 'dest': None},		
        '%r8b':{'op': None, 'src': None, 'dest': None},		
        '%r9b':{'op': None, 'src': None, 'dest': None},		
        '%r10b':{'op': None, 'src': None, 'dest': None},		
        '%r11b':{'op': None, 'src': None, 'dest': None},		
        '%r12b':{'op': None, 'src': None, 'dest': None},		
        '%r13b':{'op': None, 'src': None, 'dest': None},		
        '%r14b':{'op': None, 'src': None, 'dest': None},		
        '%r15b':{'op': None, 'src': None, 'dest': None},		
        '%al':{'op': None, 'src': None, 'dest': None},		
        '%cl':{'op': None, 'src': None, 'dest': None},		
        '%dl':{'op': None, 'src': None, 'dest': None},		
        '%bl':{'op': None, 'src': None, 'dest': None},		
        '%spl':{'op': None, 'src': None, 'dest': None},		
        '%bpl':{'op': None, 'src': None, 'dest': None},		
        '%sil':{'op': None, 'src': None, 'dest': None},		
        '%dil':{'op': None, 'src': None, 'dest': None},		
        '%xmm0':{'op': None, 'src': None, 'dest': None},		
        '%xmm1':{'op': None, 'src': None, 'dest': None},		
        '%xmm2':{'op': None, 'src': None, 'dest': None},		
        '%xmm3':{'op': None, 'src': None, 'dest': None},		
        '%xmm4':{'op': None, 'src': None, 'dest': None},		
        '%xmm5':{'op': None, 'src': None, 'dest': None},		
        '%xmm6':{'op': None, 'src': None, 'dest': None},		
        '%xmm7':{'op': None, 'src': None, 'dest': None},		
        '%xmm8':{'op': None, 'src': None, 'dest': None},		
        '%xmm9':{'op': None, 'src': None, 'dest': None},		
        '%xmm10':{'op': None, 'src': None, 'dest': None},		
        '%xmm11':{'op': None, 'src': None, 'dest': None},		
        '%xmm12':{'op': None, 'src': None, 'dest': None},		
        '%xmm13':{'op': None, 'src': None, 'dest': None},		
        '%xmm14':{'op': None, 'src': None, 'dest': None},		
        '%xmm15':{'op': None, 'src': None, 'dest': None} 
        }


fun_stack = []
var_stack = []
var_count = 0
par_stack = []
par_count = 0


fun_list = ['main']


# instruct match list
def handler_cmpx(pattern, regs_map_new):
    vals = pattern[0]
    print(vals)
    s = "{1} == {0}".format(vals[1], vals[2])
    s = re.sub(r'\$', '', s)
    s = re.sub(r'\(%rdi\)', '*param_1', s)
    s = re.sub(r'%rdi', 'param_1', s)
    # print(s)


def handler_movx(pattern, regs_map_new):
    print(pattern)


def handler_addx(pattern, regs_map_new):
    print(pattern)


def handler_subx(pattern, regs_map_new):
    print(pattern)


inst_re_list = {
        r'cmp([blqw]*)[ ]+([0-9a-fA-Fx-]*\(%[a-z]+\)|%[a-z]+|\$0x[0-9a-fA-F]+)[ ]*,[ ]*([0-9a-fA-Fx-]*\(%[a-z]+\)|%[a-z]+|\$0x[0-9a-fA-F]+)': handler_cmpx,
        r'mov([blqw]*)[ ]+([0-9a-fA-Fx-]*\(%[a-z]+\)|%[a-z]+|\$0x[0-9a-fA-F]+)[ ]*,[ ]*([0-9a-fA-Fx-]*\(%[a-z]+\)|%[a-z]+|\$0x[0-9a-fA-F]+)': handler_movx,
        r'add([blqw]*)[ ]+([0-9a-fA-Fx-]*\(%[a-z]+\)|%[a-z]+|\$0x[0-9a-fA-F]+)[ ]*,[ ]*([0-9a-fA-Fx-]*\(%[a-z]+\)|%[a-z]+|\$0x[0-9a-fA-F]+)': handler_addx,
        r'sub([blqw]*)[ ]+([0-9a-fA-Fx-]*\(%[a-z]+\)|%[a-z]+|\$0x[0-9a-fA-F]+)[ ]*,[ ]*([0-9a-fA-Fx-]*\(%[a-z]+\)|%[a-z]+|\$0x[0-9a-fA-F]+)': handler_subx,
        }


def asm_to_json(db):
    """Convert asm to json format
    """
    global fun_list
    dats = db['dats']
    for l in fun_list:
        if l in dats: