#! /usr/bin/env python
import os



filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)

from miasm2.core.cpu  import parse_ast
from miasm2.arch.x86_arch  import mn_x86, base_expr, variable
from miasm2.core.bin_stream import bin_stream
from miasm2.core import parse_asm
from elfesteem import *
from pdb import pm
from miasm2.core import asmbloc
import struct
from miasm2.expression.expression import *


def my__sub__(self, a):
    return ExprOp('-', self, a)
Expr.__sub__ = my__sub__


def my_parse_op(t):
    print "OP", t
    v = t[0]
    return (ExprOp, v)



reg_and_id = {}

def my_ast_int2expr(a):
    return ExprInt32(a)
def my_ast_id2expr(t):
    #print "XXX", t
    t = 'f_'+t
    if not t in reg_and_id:
        i = ExprId(t)
        reg_and_id[t] = i
    return reg_and_id.get(t, ExprId(t, size=32))

my_var_parser = parse_ast(my_ast_id2expr, my_ast_int2expr)
base_expr.setParseAction(my_var_parser)

all_bloc, symbol_pool = parse_asm.parse_txt(mn_x86, 32, '''
main:
    PUSH q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3
''')



a = all_bloc[0][0].lines[0].args[0]




def ExprOp_to_Math(self):
    print self.op, self.args
    ops2 = {'+':'f32_add',
           '*':'f32_mul',
            '-':'f32_sub',
           }
    out = [x.Expr_to_Math() for x in self.args]
    if len(self.args) == 1:
        return "f32_neg(%s)"%(out[0])
    elif self.op in ops2:
        last = out.pop()
        print out
        while out:
            o = out.pop()
            last = '%s(%s, %s)'%(ops2[self.op],
                                 o, last)
        return last
    fds
def ExprId_to_Math(self):
    return self.name


def ExprInt_to_Math(self):
    return "f32_from_double(%s)"%int(self.arg)
ExprOp.Expr_to_Math = ExprOp_to_Math
ExprId.Expr_to_Math = ExprId_to_Math
ExprInt.Expr_to_Math = ExprInt_to_Math

xx = a.Expr_to_Math()
print xx

