From 946f5f093c7265dc5a5e00694325605b249eea43 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Tue, 9 Feb 2016 17:38:45 +0100
Subject: Built raw instructions from uleb128 values.

---
 ChangeLog      |  6 ++++++
 src/arch/raw.c | 40 ++++++++++++++++++++++++++++++++++++++++
 src/arch/raw.h |  3 +++
 3 files changed, 49 insertions(+)

diff --git a/ChangeLog b/ChangeLog
index 128478a..ddd89ea 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 16-02-09  Cyrille Bagard <nocbos@gmail.com>
 
+	* src/arch/raw.c:
+	* src/arch/raw.h:
+	Build raw instructions from uleb128 values.
+
+16-02-09  Cyrille Bagard <nocbos@gmail.com>
+
 	* src/arch/archbase.h:
 	Fix a bug by handling non rugular sizes of values.
 
diff --git a/src/arch/raw.c b/src/arch/raw.c
index d04f141..0dfb566 100644
--- a/src/arch/raw.c
+++ b/src/arch/raw.c
@@ -230,6 +230,7 @@ GArchInstruction *g_raw_instruction_new_from_value(const vmpa2t *addr, MemoryDat
             break;
 
         default:
+            assert(false);
             goto grinfv_error;
             break;
 
@@ -251,6 +252,45 @@ GArchInstruction *g_raw_instruction_new_from_value(const vmpa2t *addr, MemoryDat
 /******************************************************************************
 *                                                                             *
 *  Paramètres  : content = flux de données à analyser.                        *
+*                addr    = position courante dans ce flux. [OUT]              *
+*                                                                             *
+*  Description : Crée une instruction de type 'db/dw/etc' pour un uleb128.    *
+*                                                                             *
+*  Retour      : Instruction mise en place.                                   *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+GArchInstruction *g_raw_instruction_new_uleb128(const GBinContent *content, vmpa2t *addr)
+{
+    GArchInstruction *result;               /* Instruction à retourner     */
+    vmpa2t start;                           /* Départ original de lecture  */
+    uleb128_t value;                        /* Valeur uleb128 à représenter*/
+    MemoryDataSize leb_size;                /* Taille de la valeur         */
+
+    copy_vmpa(&start, addr);
+
+    if (!g_binary_content_read_uleb128(content, addr, &value))
+        goto grinu_error;
+
+    leb_size = MDS_FROM_BYTES(compute_vmpa_diff(&start, addr));
+    assert(leb_size != MDS_UNDEFINED);
+
+    result = g_raw_instruction_new_from_value(&start, leb_size, (uint64_t)value);
+
+    return result;
+
+ grinu_error:
+
+    return NULL;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : content = flux de données à analyser.                        *
 *                size    = taille de chacun des éléments à représenter.       *
 *                count   = nombre de ces éléments.                            *
 *                addr    = position courante dans ce flux. [OUT]              *
diff --git a/src/arch/raw.h b/src/arch/raw.h
index 459ade2..b40b411 100644
--- a/src/arch/raw.h
+++ b/src/arch/raw.h
@@ -55,6 +55,9 @@ GType g_raw_instruction_get_type(void);
 /* Crée une instruction de type 'db/dw/etc' simple. */
 GArchInstruction *g_raw_instruction_new_from_value(const vmpa2t *, MemoryDataSize, uint64_t);
 
+/* Crée une instruction de type 'db/dw/etc' pour un uleb128. */
+GArchInstruction *g_raw_instruction_new_uleb128(const GBinContent *content, vmpa2t *);
+
 /* Crée une instruction de type 'db/dw/etc' étendue. */
 GArchInstruction *g_raw_instruction_new_array(const GBinContent *, MemoryDataSize, size_t, vmpa2t *, SourceEndian);
 
-- 
cgit v0.11.2-87-g4458