diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2014-08-05 20:19:08 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2014-08-05 20:19:08 (GMT) |
commit | 56ee4d3ecddeee05f11083fcc1595e3756b91790 (patch) | |
tree | 5ec6e5449214093280629047c36016a0de09cbeb /src/glibext/gbufferline.c | |
parent | a2eb5483fe74923e488013b2d8b94ded6340499e (diff) |
Defined the first steps for a new disassembling approach.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@387 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/glibext/gbufferline.c')
-rw-r--r-- | src/glibext/gbufferline.c | 109 |
1 files changed, 89 insertions, 20 deletions
diff --git a/src/glibext/gbufferline.c b/src/glibext/gbufferline.c index 63804a5..201c64b 100644 --- a/src/glibext/gbufferline.c +++ b/src/glibext/gbufferline.c @@ -80,7 +80,7 @@ struct _GBufferLine { GObject parent; /* A laisser en premier */ - vmpa_t addr; /* Adresse geographique */ + const vmpa2t *addr; /* Emplacement geographique */ BufferLineColumn main_column; /* Colonne principale */ buffer_line_column columns[BLC_COUNT]; /* Répartition du texte */ @@ -343,7 +343,7 @@ static void g_buffer_line_init(GBufferLine *line) { BufferLineColumn i; /* Boucle de parcours */ - for (i = BLC_ADDRESS; i < BLC_COUNT; i++) + for (i = 0; i < BLC_COUNT; i++) reset_column(&line->columns[i]); line->merge_start = BLC_COUNT; @@ -354,7 +354,7 @@ static void g_buffer_line_init(GBufferLine *line) /****************************************************************************** * * -* Paramètres : addr = adresse où va se situer la ligne. * +* Paramètres : addr = emplacement où va se situer la ligne. * * main = colonne à référencer comme étant la principale. * * * * Description : Crée une nouvelle représentation de fragments de texte. * @@ -365,7 +365,7 @@ static void g_buffer_line_init(GBufferLine *line) * * ******************************************************************************/ -GBufferLine *g_buffer_line_new(vmpa_t addr, BufferLineColumn main) +GBufferLine *g_buffer_line_new(const vmpa2t *addr, BufferLineColumn main) { GBufferLine *result; /* Composant à retourner */ @@ -393,7 +393,66 @@ GBufferLine *g_buffer_line_new(vmpa_t addr, BufferLineColumn main) vmpa_t g_buffer_line_get_address(const GBufferLine *line) { - return line->addr; + return 0/* FIXME line->addr*/; + +} + + +/****************************************************************************** +* * +* Paramètres : line = ligne à venir compléter. * +* psize = taille souhaitée de l'impression des positions. * +* vsize = taille souhaitée de l'impression des adresses. * +* content = contenu binaire global. * +* length = taille de l'extrait de code à afficher. * +* full = la portion est assez courte pour être entière ? * +* * +* Description : Construit le tronc commun d'une ligne d'instruction. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_buffer_line_fill_for_instr(GBufferLine *line, MemoryDataSize psize, MemoryDataSize vsize, const bin_t *content, off_t length, bool full) +{ + size_t len; /* Taille de l'élément inséré */ + char *address; /* Adresse au format texte */ + char *bin_code; /* Tampon du code binaire */ + off_t start; /* Début de traitement */ + off_t end; /* Limite de traitement */ + off_t i; /* Boucle de parcours #1 */ + char *iter; /* Boucle de parcours #2 */ + int ret; /* Progression dans l'écriture */ + + /* Adresse physique puis virtuelle */ + + address = vmpa2_phys_to_string(line->addr, psize, &len); + g_buffer_line_insert_text(line, BLC_PHYSICAL, address, len, RTT_RAW); + + address = vmpa2_virt_to_string(line->addr, vsize, &len); + g_buffer_line_insert_text(line, BLC_VIRTUAL, address, len, RTT_RAW); + + /* Code brut */ + + bin_code = (char *)calloc(length * 3 + 3, sizeof(char)); + + start = get_phy_addr(line->addr); + end = start + length; + + for (i = start, iter = bin_code; i < end; i++, iter += ret) + { + if ((i + 1) < end) + ret = snprintf(iter, 4, "%02hhx ", content[i]); + else + ret = snprintf(iter, 6, "%02hhx%s", content[i], full ? "" : "..."); + + } + + g_buffer_line_insert_text(line, BLC_BINARY, bin_code, iter - bin_code, RTT_RAW_CODE); + + free(bin_code); } @@ -441,7 +500,7 @@ GBufferSegment *g_buffer_line_get_segment_at(const GBufferLine *line, const gint result = NULL; - for (i = BLC_ADDRESS; i < BLC_COUNT; i++) + for (i = 0; i < BLC_COUNT; i++) { /* FIXME : addr/code */ @@ -470,7 +529,8 @@ GBufferSegment *g_buffer_line_get_segment_at(const GBufferLine *line, const gint * caret = position du curseur à faire évoluer. * * ctrl = indique la demande d'un parcours rapide. * * dir = direction du parcours. * -* addr = indique si les positions doivent être affichées. * +* phys = indique si les positions doivent être affichées. * +* virt = indique si les adresses doivent être affichées. * * code = indique si le code binaire doit être affiché. * * * * Description : Déplace le curseur au sein d'une vue de tampon. * @@ -481,9 +541,11 @@ GBufferSegment *g_buffer_line_get_segment_at(const GBufferLine *line, const gint * * ******************************************************************************/ -bool g_buffer_line_move_caret(const GBufferLine *line, GdkRectangle *caret, bool ctrl, GdkScrollDirection dir, bool addr, bool code) +bool g_buffer_line_move_caret(const GBufferLine *line, GdkRectangle *caret, bool ctrl, GdkScrollDirection dir, bool phys, bool virt, bool code) { + /* TODO : utiliser les arguments booléens */ + caret->x += (dir == GDK_SCROLL_RIGHT ? 10 : -10); return true; @@ -512,7 +574,7 @@ GSList *g_buffer_line_highlight_all_same_segments(const GBufferLine *line, GSLis { BufferLineColumn i; /* Boucle de parcours */ - for (i = BLC_ADDRESS; i < BLC_COUNT; i++) + for (i = 0; i < BLC_COUNT; i++) list = highlight_all_same_segments(&line->columns[i], list, ref); return list; @@ -621,7 +683,8 @@ gint g_buffer_line_get_column_width(GBufferLine *line, BufferLineColumn index) * * * Paramètres : line = ligne à venir compléter. * * merge = précise la première colonne marquant la fusion. [OUT]* -* addr = indique si les positions doivent être affichées. * +* phys = indique si les positions doivent être affichées. * +* virt = indique si les adresses doivent être affichées. * * code = indique si le code binaire doit être affiché. * * * * Description : Fournit la dernière largeur d'une ligne avec fusion. * @@ -632,12 +695,14 @@ gint g_buffer_line_get_column_width(GBufferLine *line, BufferLineColumn index) * * ******************************************************************************/ -gint g_buffer_line_get_merge_width(GBufferLine *line, BufferLineColumn *merge, bool addr, bool code) +gint g_buffer_line_get_merge_width(GBufferLine *line, BufferLineColumn *merge, bool phys, bool virt, bool code) { gint result; /* Largeur à retourner */ result = 0; + /* TODO : wtf ?! quelle est l'utilité des arguments booléens ? */ + *merge = line->merge_start; if (line->merge_start < BLC_COUNT) @@ -678,7 +743,8 @@ void g_buffer_line_start_merge_at(GBufferLine *line, BufferLineColumn start) * max_widths = largeurs de colonne à respecter. * * x_init = abscisse du point d'impression de départ. * * y = ordonnée du point d'impression. * -* addr = indique si les positions doivent être affichées.* +* phys = indique si les positions doivent être affichées.* +* virt = indique si les adresses doivent être affichées. * * code = indique si le code binaire doit être affiché. * * * * Description : Imprime la ligne de texte représentée. * @@ -689,7 +755,7 @@ void g_buffer_line_start_merge_at(GBufferLine *line, BufferLineColumn start) * * ******************************************************************************/ -void g_buffer_line_draw(GBufferLine *line, cairo_t *cairo, const gint max_widths[BLC_COUNT], gint x_init, gint y, bool addr, bool code) +void g_buffer_line_draw(GBufferLine *line, cairo_t *cairo, const gint max_widths[BLC_COUNT], gint x_init, gint y, bool phys, bool virt, bool code) { GBufferLineClass *class; /* Stockage de briques de base */ gint x; /* Point de départ d'impression*/ @@ -702,9 +768,10 @@ void g_buffer_line_draw(GBufferLine *line, cairo_t *cairo, const gint max_widths x = x_init; - for (i = BLC_ADDRESS; i < BLC_COUNT; i++) + for (i = 0; i < BLC_COUNT; i++) { - if (i == BLC_ADDRESS && !addr) continue; + if (i == BLC_PHYSICAL && !phys) continue; + if (i == BLC_VIRTUAL && !virt) continue; if (i == BLC_BINARY && !code) continue; draw_segments_of_column(&line->columns[i], cairo, x, y); @@ -723,7 +790,8 @@ void g_buffer_line_draw(GBufferLine *line, cairo_t *cairo, const gint max_widths * Paramètres : line = ligne de texte à manipuler. * * fd = flux ouvert en écriture. * * type = type d'exportation attendue. * -* addr = indique si les positions doivent être affichées. * +* phys = indique si les positions doivent être affichées. * +* virt = indique si les adresses doivent être affichées. * * code = indique si le code binaire doit être affiché. * * content = indique si le gros du contenu doit être affiché. * * * @@ -735,15 +803,16 @@ void g_buffer_line_draw(GBufferLine *line, cairo_t *cairo, const gint max_widths * * ******************************************************************************/ -void g_buffer_line_export(GBufferLine *line, int fd, BufferExportType type, bool addr, bool code, bool content) +void g_buffer_line_export(GBufferLine *line, int fd, BufferExportType type, bool phys, bool virt, bool code, bool content) { BufferLineColumn i; /* Boucle de parcours */ - for (i = BLC_ADDRESS; i < BLC_COUNT; i++) + for (i = 0; i < BLC_COUNT; i++) { - if (i == BLC_ADDRESS && !addr) continue; + if (i == BLC_PHYSICAL && !phys) continue; + if (i == BLC_VIRTUAL && !virt) continue; if (i == BLC_BINARY && !code) continue; - if (!(i == BLC_ADDRESS || i == BLC_BINARY) && !content) continue; + if (!(i == BLC_PHYSICAL || i == BLC_VIRTUAL || i == BLC_BINARY) && !content) continue; dprintf(fd, "TODO\n"); |