diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/glibext/gbufferline.c | 10 | ||||
-rw-r--r-- | src/glibext/gbufferline.h | 1 | ||||
-rw-r--r-- | src/glibext/gbuffersegment.c | 3 | ||||
-rw-r--r-- | src/glibext/gcodebuffer.c | 175 | ||||
-rw-r--r-- | src/glibext/gcodebuffer.h | 6 |
5 files changed, 164 insertions, 31 deletions
diff --git a/src/glibext/gbufferline.c b/src/glibext/gbufferline.c index ce3e19f..c8ff5f2 100644 --- a/src/glibext/gbufferline.c +++ b/src/glibext/gbufferline.c @@ -345,6 +345,16 @@ static void g_buffer_line_class_init(GBufferLineClass *class) attrib = pango_attr_foreground_new(14335, 45311, 23551); pango_attr_list_insert(class->attribs[RTT_COMMENT], attrib); + /* RTT_INDICATION */ + + class->attribs[RTT_INDICATION] = pango_attr_list_new(); + + attrib = pango_attr_foreground_new(33410, 33410, 33410); + pango_attr_list_insert(class->attribs[RTT_INDICATION], attrib); + + attrib = pango_attr_style_new(PANGO_STYLE_ITALIC); + pango_attr_list_insert(class->attribs[RTT_INDICATION], attrib); + /* RTT_RAW_CODE */ class->attribs[RTT_RAW_CODE] = pango_attr_list_new(); diff --git a/src/glibext/gbufferline.h b/src/glibext/gbufferline.h index 3cc992b..670df99 100644 --- a/src/glibext/gbufferline.h +++ b/src/glibext/gbufferline.h @@ -71,6 +71,7 @@ typedef enum _RenderingTagType RTT_RAW, /* Contenu brut */ RTT_COMMENT, /* Commentaire */ + RTT_INDICATION, /* Aide à la lecture */ RTT_RAW_CODE, /* Code binaire brut */ RTT_INSTRUCTION, /* Code binaire brut */ diff --git a/src/glibext/gbuffersegment.c b/src/glibext/gbuffersegment.c index 5125631..9510fa2 100644 --- a/src/glibext/gbuffersegment.c +++ b/src/glibext/gbuffersegment.c @@ -231,6 +231,9 @@ static void g_buffer_segment_prepare(GBufferSegment *segment, PangoContext *cont attrib = pango_attr_iterator_get(iterator, PANGO_ATTR_WEIGHT); must_use_pango |= (attrib != NULL); + attrib = pango_attr_iterator_get(iterator, PANGO_ATTR_STYLE); + must_use_pango |= (attrib != NULL); + pango_attr_iterator_destroy(iterator); if (must_use_pango) diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c index aec3303..4ffc15a 100644 --- a/src/glibext/gcodebuffer.c +++ b/src/glibext/gcodebuffer.c @@ -121,6 +121,9 @@ static void g_code_buffer_class_init(GCodeBufferClass *); static void g_code_buffer_init(GCodeBuffer *); /* Convertit une adresse en indice de ligne. */ +static size_t _g_code_buffer_get_index_from_address(GCodeBuffer *, vmpa_t); + +/* Convertit une adresse en indice de ligne. */ static size_t g_code_buffer_get_index_from_address(GCodeBuffer *, vmpa_t); @@ -292,15 +295,16 @@ static void g_buffer_scan_process(GBufferScan *scan, GtkExtStatusBar *statusbar) id = gtk_extended_status_bar_push(statusbar, scan->message, true); - for (i = first; i <= last; i++) - { - if (!scan->process(scan->buffer, lines[i], scan->user_data)) - break; + if (scan->buffer->used > 0) + for (i = first; i <= last; i++) + { + if (!scan->process(scan->buffer, lines[i], scan->user_data)) + break; - gtk_extended_status_bar_update_activity(statusbar, id, - (i - first) * 1.0 / (last - first)); + gtk_extended_status_bar_update_activity(statusbar, id, + (i - first) * 1.0 / (last - first)); - } + } /* TODO : unlock scan->buffer->lines */ @@ -380,6 +384,7 @@ GCodeBuffer *g_code_buffer_new(void) } + /****************************************************************************** * * * Paramètres : buffer = composant GTK à mettre à jour. * @@ -393,17 +398,48 @@ GCodeBuffer *g_code_buffer_new(void) * * ******************************************************************************/ -static size_t g_code_buffer_get_index_from_address(GCodeBuffer *buffer, vmpa_t addr) +static size_t _g_code_buffer_get_index_from_address(GCodeBuffer *buffer, vmpa_t addr) { size_t result; /* Indice à retourner */ if (addr == VMPA_MAX) return (buffer->used > 0 ? buffer->used - 1 : 0); + /* TODO : coder un parcours plus optimal ! */ + for (result = 0; result < buffer->used; result++) if (g_buffer_line_get_address(buffer->lines[result]) == addr) break; + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : buffer = composant GTK à mettre à jour. * +* addr = adresse où va se situer la ligne. * +* * +* Description : Convertit une adresse en indice de ligne. * +* * +* Retour : Indice de l'adresse trouvée, ou 0 en cas d'échec. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static size_t g_code_buffer_get_index_from_address(GCodeBuffer *buffer, vmpa_t addr) +{ + size_t result; /* Indice à retourner */ + + result = _g_code_buffer_get_index_from_address(buffer, addr); + + /** + * Par commodités, on évite certaines instructions en cas d'échec dans les + * fonctions d'appels : la condition des boucles utilisant l'indice retourné (0) + * fait son office directement ! + */ if (result == buffer->used) result = 0; @@ -419,7 +455,7 @@ static size_t g_code_buffer_get_index_from_address(GCodeBuffer *buffer, vmpa_t a * * * Description : Ajoute une nouvelle ligne à un tampon pour code désassemblé. * * * -* Retour : - * +* Retour : Nouvelle ligne vierge à écrire. * * * * Remarques : - * * * @@ -451,6 +487,82 @@ GBufferLine *g_code_buffer_append_new_line(GCodeBuffer *buffer, vmpa_t addr) /****************************************************************************** * * * Paramètres : buffer = composant GTK à mettre à jour. * +* addr = adresse où va se situer la ligne. * +* before = emplacement de l'insertion. * +* * +* Description : Ajoute une nouvelle ligne à un tampon pour code désassemblé. * +* * +* Retour : Nouvelle ligne vierge à écrire. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GBufferLine *g_code_buffer_insert_at(GCodeBuffer *buffer, vmpa_t addr, bool before) +{ + GBufferLine *result; /* Instance à retourner */ + size_t index; /* Indice de la ligne visée */ + + index = _g_code_buffer_get_index_from_address(buffer, addr); + if (index == buffer->used) return NULL; + + if (buffer->used == buffer->count) + { + buffer->count += LINE_ALLOC_BULK; + buffer->lines = (GBufferLine **)realloc(buffer->lines, + buffer->count * sizeof(GBufferLine *)); + } + + if (before) + { + memmove(&buffer->lines[index + 1], &buffer->lines[index], + sizeof(GBufferLine *) * (buffer->used - index)); + + buffer->used++; + + result = g_buffer_line_new(addr); + buffer->lines[index] = result; + + } + + + else + /* FIXME */ + ; + + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : buffer = composant GTK à mettre à jour. * +* line = point d'insertion. * +* * +* Description : Ajoute une nouvelle ligne à un tampon pour code désassemblé. * +* * +* Retour : Nouvelle ligne vierge à écrire. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GBufferLine *g_code_buffer_insert_after(GCodeBuffer *buffer, GBufferLine *line) +{ + + /* FIXME */ + + return NULL; + + +} + + +/****************************************************************************** +* * +* Paramètres : buffer = composant GTK à mettre à jour. * * addr = adresse où retrouver la ligne recherchée. * * * * Description : Retrouve une ligne au sein d'un tampon avec une adresse. * @@ -464,15 +576,14 @@ GBufferLine *g_code_buffer_append_new_line(GCodeBuffer *buffer, vmpa_t addr) GBufferLine *g_code_buffer_find_line_by_addr(const GCodeBuffer *buffer, vmpa_t addr) { GBufferLine *result; /* Instance à retourner */ - size_t i; /* Boucle de parcours */ + size_t index; /* Indice de la ligne visée */ - result = NULL; + index = _g_code_buffer_get_index_from_address(buffer, addr); - /* TODO : coder un parcours plus optimal ! */ - - for (i = 0; i < buffer->used && result == NULL; i++) - if (g_buffer_line_get_address(buffer->lines[i]) == addr) - result = buffer->lines[i]; + if (index == buffer->used) + result = NULL; + else + result = buffer->lines[index]; return result; @@ -749,12 +860,13 @@ static void g_buffer_view_compute_required_widths(GBufferView *view) view->left_margin = 2 * view->line_height; view->left_text = 2.5 * view->line_height; - for (i = first; i <= last; i++) - for (j = 0; j < BLC_COUNT; j++) - { - width = g_buffer_line_get_width(lines[i], j); - view->max_widths[j] = MAX(view->max_widths[j], width); - } + if (view->buffer->used > 0) + for (i = first; i <= last; i++) + for (j = 0; j < BLC_COUNT; j++) + { + width = g_buffer_line_get_width(lines[i], j); + view->max_widths[j] = MAX(view->max_widths[j], width); + } } @@ -1086,19 +1198,20 @@ bool g_buffer_view_get_address_coordinates(GBufferView *view, vmpa_t addr, gint first = g_code_buffer_get_index_from_address(view->buffer, view->start); last = g_code_buffer_get_index_from_address(view->buffer, view->end); - for (i = first; i <= last; i++) - { - current = g_buffer_line_get_address(view->buffer->lines[i]); + if (view->buffer->used > 0) + for (i = first; i <= last; i++) + { + current = g_buffer_line_get_address(view->buffer->lines[i]); - if (current == addr) - break; + if (current == addr) + break; - if (current > addr) - return false; + if (current > addr) + return false; - *y += lheight; + *y += lheight; - } + } return (current == addr); diff --git a/src/glibext/gcodebuffer.h b/src/glibext/gcodebuffer.h index b92f38b..725bd1f 100644 --- a/src/glibext/gcodebuffer.h +++ b/src/glibext/gcodebuffer.h @@ -62,6 +62,12 @@ GCodeBuffer *g_code_buffer_new(void); /* Ajoute une nouvelle ligne à un tampon pour code désassemblé. */ GBufferLine *g_code_buffer_append_new_line(GCodeBuffer *, vmpa_t); +/* Ajoute une nouvelle ligne à un tampon pour code désassemblé. */ +GBufferLine *g_code_buffer_insert_at(GCodeBuffer *, vmpa_t, bool); + +/* Ajoute une nouvelle ligne à un tampon pour code désassemblé. */ +GBufferLine *g_code_buffer_insert_after(GCodeBuffer *, GBufferLine *); + /* Retrouve une ligne au sein d'un tampon avec une adresse. */ GBufferLine *g_code_buffer_find_line_by_addr(const GCodeBuffer *, vmpa_t); |