summaryrefslogtreecommitdiff
path: root/src/glibext/gbufferline.h
blob: 028ae8e9841aefb4f71d5b3257c0714f35c07a6f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159

/* OpenIDA - Outil d'analyse de fichiers binaires
 * gbufferline.h - prototypes pour la représentation de fragments de texte en ligne
 *
 * Copyright (C) 2010-2012 Cyrille Bagard
 *
 *  This file is part of OpenIDA.
 *
 *  OpenIDA is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  OpenIDA is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
 */


#ifndef _GLIBEXT_GBUFFERLINE_H
#define _GLIBEXT_GBUFFERLINE_H


#include <glib-object.h>
#include <stdbool.h>


#include "gbuffersegment.h"
#include "../arch/archbase.h"



#define G_TYPE_BUFFER_LINE                  (g_buffer_line_get_type())
#define G_BUFFER_LINE(obj)                  (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_BUFFER_LINE, GBufferLine))
#define G_BUFFER_LINE_CLASS(klass)          (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_BUFFER_LINE, GBufferLineClass))
#define G_IS_BUFFER_LINE(obj)               (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_BUFFER_LINE))
#define G_IS_BUFFER_LINE_CLASS(klass)       (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_BUFFER_LINE))
#define G_BUFFER_LINE_GET_CLASS(obj)        (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_BUFFER_LINE, GBufferLineClass))



/* Représentation de fragments de texte en ligne (instance) */
typedef struct _GBufferLine GBufferLine;

/* Représentation de fragments de texte en ligne (classe) */
typedef struct _GBufferLineClass GBufferLineClass;


/* Désignation des colonnes d'une ligne */
typedef enum _BufferLineColumn
{
    BLC_ADDRESS,                            /* Adresse virtuelle           */
    BLC_BINARY,                             /* Contenu sous forme binaire  */
    BLC_ASSEMBLY_HEAD,                      /* Instruction pour assembleur */
    BLC_ASSEMBLY,                           /* Code pour assembleur        */
    BLC_COMMENTS,                           /* Commentaires éventuels      */

    BLC_COUNT,

    BLC_LAST_USED                           /* Dernière colonne utilisée   */

} BufferLineColumn;

/* Types de partie de rendu */
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           */

    RTT_IMMEDIATE,                          /* Valeur immédiate            */

    RTT_REGISTER,                           /* Registre                    */

    RTT_PUNCT,                              /* Signes de ponctuation       */
    RTT_HOOK,                               /* Crochets '[' et ']'         */
    RTT_SIGNS,                              /* Signes '+', '-' et '*'      */
    RTT_LTGT,                               /* Caractères '<' et '>'       */

    RTT_SECTION,                            /* Identifiant de section      */
    RTT_SEGMENT,                            /* Indication de segment       */
    RTT_STRING,                             /* Chaîne de caractères avec " */

    RTT_VAR_NAME,                           /* Nom de variable             */

    RTT_KEY_WORD,                           /* Mot clef de langage         */

    RTT_ERROR,                              /* Erreur "interne"            */

    RTT_COUNT

} RenderingTagType;


#define RTT_NONE RTT_RAW    /* TODO : remme */



/* Confort pour l'insertion de texte */
#define SL(str) str, strlen(str)

/* Espace entre les colonnes */
#define COL_MARGIN 23


/* Accompagnement du dessin pour compléments */
typedef void (* buffer_line_draw_fc) (GBufferLine *, GdkDrawable *, GdkGC *, gint, gint, void *);


/* Détermine le type de la représentation de fragments de texte en ligne. */
GType g_buffer_line_get_type(void);

/* Crée une nouvelle représentation de fragments de texte. */
GBufferLine *g_buffer_line_new(vmpa_t);

/* Indique l'adresse à laquelle se situe la ligne. */
vmpa_t g_buffer_line_get_address(const GBufferLine *);

/* Ajoute un fragment de texte à une colonne de ligne. */
void g_buffer_line_add_segment(GBufferLine *, BufferLineColumn, GBufferSegment *);

/* Donne le segment présent à une abscisse donnée. */
GBufferSegment *g_buffer_line_get_segment_at(const GBufferLine *, const gint [BLC_COUNT], gint);

/*  Met en surbrillance des segments similaires. */
GSList *g_buffer_line_highlight_all_same_segments(const GBufferLine *, GSList *, const GBufferSegment *);

/* Ajoute du texte à formater dans une ligne donnée. */
void g_buffer_line_insert_text(GBufferLine *, BufferLineColumn, const char *, size_t, RenderingTagType);

/* Donne le texte représenté par une ligne de tampon. */
char *g_buffer_line_get_text(const GBufferLine *);

/* Marque la ligne comme étant sans largeur à comptabiliser. */
void g_buffer_line_skip_width(GBufferLine *);

/* Fournit la largeur requise pour une colonne de ligne donnée. */
gint g_buffer_line_get_width(GBufferLine *, BufferLineColumn);

/* Définit la colonne à partir de laquelle la fusion opère. */
void g_buffer_line_start_merge_at(GBufferLine *, BufferLineColumn);

/* Imprime la ligne de texte représentée. */
void g_buffer_line_draw(GBufferLine *, cairo_t *, GFontCache *, const gint [BLC_COUNT], gint, gint, bool, bool);

/* Exporte la ligne de texte représentée. */
void g_buffer_line_export(GBufferLine *, int, BufferExportType, bool, bool, bool);



#endif  /* _GLIBEXT_GBUFFERLINE_H */