diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2013-02-24 11:09:36 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2013-02-24 11:09:36 (GMT) |
commit | 02c2cf555953f335a825e34c869c9999668fd42c (patch) | |
tree | 59395c04d509f9fae8314d311f6ab90e163df45d /src/decomp/lang | |
parent | 34e1a14aced520ba06ee1b81cfd7710e97c1643f (diff) |
Refined comparisons decompilation and fixed some bugs.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@340 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/decomp/lang')
-rw-r--r-- | src/decomp/lang/java.c | 77 |
1 files changed, 76 insertions, 1 deletions
diff --git a/src/decomp/lang/java.c b/src/decomp/lang/java.c index f4466a5..65383b0 100644 --- a/src/decomp/lang/java.c +++ b/src/decomp/lang/java.c @@ -2,7 +2,7 @@ /* OpenIDA - Outil d'analyse de fichiers binaires * java.c - sorties en langage Java * - * Copyright (C) 2010-2012 Cyrille Bagard + * Copyright (C) 2010-2013 Cyrille Bagard * * This file is part of OpenIDA. * @@ -66,6 +66,9 @@ static GBufferLine *g_java_output_write_comments(GJavaOutput *, GCodeBuffer *, c /* Imprime dans un tampon donné une méthode de comparaison. */ static void g_java_output_write_comp_sign(GJavaOutput *, GBufferLine *, CompSignType); +/* Imprime dans un tampon donné un opérateur logique. */ +static void g_java_output_write_cond_operator(GLangOutput *, GBufferLine *, CondOperatorType); + /* Débute la définition d'une classe. */ static GBufferLine *g_java_output_start_class(GJavaOutput *, GCodeBuffer *, const GDataType *); @@ -90,6 +93,9 @@ static GBufferLine *g_java_output_start_code_block(GJavaOutput *, GCodeBuffer *, /* Termine la définition d'un bloc de code. */ static GBufferLine *g_java_output_end_code_block(GJavaOutput *, GCodeBuffer *, GBufferLine *, size_t); +/* Emballe une expression conditionelle. */ +static GBufferLine *g_java_output_encapsulate_condition(GLangOutput *, GCodeBuffer *, GBufferLine *, bool); + /* Indique le type défini pour une sortie en langage Java. */ @@ -139,6 +145,7 @@ static void g_java_output_init(GJavaOutput *output) lang->write_comments = (write_comments_fc)g_java_output_write_comments; lang->comp_sign = (write_comp_sign_fc)g_java_output_write_comp_sign; + lang->cond_op = (write_cond_op_fc)g_java_output_write_cond_operator; lang->start_class = (rlgbuftp_fc)g_java_output_start_class; lang->end_class = (lgbuf_fc)g_java_output_end_class; @@ -150,6 +157,7 @@ static void g_java_output_init(GJavaOutput *output) lang->start_code_block = (rlgbuflnsz_fc)g_java_output_start_code_block; lang->end_code_block = (rlgbuflnsz_fc)g_java_output_end_code_block; + lang->encaps_cond = (lo_buf_ln_bool_fc)g_java_output_encapsulate_condition; } @@ -342,6 +350,42 @@ static void g_java_output_write_comp_sign(GJavaOutput *output, GBufferLine *line /****************************************************************************** * * * Paramètres : output = encadrant de l'impression en langage de prog. * +* line = tampon de sortie à disposition. * +* op = opérateur logique à imprimer. * +* * +* Description : Imprime dans un tampon donné un opérateur logique. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_java_output_write_cond_operator(GLangOutput *output, GBufferLine *line, CondOperatorType op) +{ + g_buffer_line_insert_text(line, BLC_ASSEMBLY_HEAD, " ", 1, RTT_RAW); + + switch (op) + { + case COT_AND: + g_buffer_line_insert_text(line, BLC_ASSEMBLY_HEAD, "&&", 2, RTT_SIGNS); + break; + case COT_OR: + g_buffer_line_insert_text(line, BLC_ASSEMBLY_HEAD, "||", 2, RTT_SIGNS); + break; + default: + g_buffer_line_insert_text(line, BLC_ASSEMBLY_HEAD, "??", 2, RTT_SIGNS); + break; + } + + g_buffer_line_insert_text(line, BLC_ASSEMBLY_HEAD, " ", 1, RTT_RAW); + +} + + +/****************************************************************************** +* * +* Paramètres : output = encadrant de l'impression en langage de prog. * * buffer = tampon de sortie à disposition. * * type = désignation de la classe à définir. * * * @@ -575,3 +619,34 @@ static GBufferLine *g_java_output_end_code_block(GJavaOutput *output, GCodeBuffe return result; } + + +/****************************************************************************** +* * +* Paramètres : output = encadrant de l'impression en langage de prog. * +* buffer = tampon de sortie à disposition. * +* line = ligne contenant le prototype de la routine traitée.* +* opening = précise si la condition débute ou se termine. * +* * +* Description : Emballe une expression conditionelle. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static GBufferLine *g_java_output_encapsulate_condition(GLangOutput *output, GCodeBuffer *buffer, GBufferLine *line, bool opening) +{ + GBufferLine *result; /* Nouvelle ligne à utiliser */ + + result = line; + + if (opening) + g_buffer_line_insert_text(result, BLC_ASSEMBLY_HEAD, "(", 1, RTT_HOOK); + else + g_buffer_line_insert_text(result, BLC_ASSEMBLY_HEAD, ")", 1, RTT_HOOK); + + return result; + +} |