summaryrefslogtreecommitdiff
path: root/src/decomp/lang
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2013-02-24 11:09:36 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2013-02-24 11:09:36 (GMT)
commit02c2cf555953f335a825e34c869c9999668fd42c (patch)
tree59395c04d509f9fae8314d311f6ab90e163df45d /src/decomp/lang
parent34e1a14aced520ba06ee1b81cfd7710e97c1643f (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.c77
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;
+
+}