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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
|
/* Chrysalide - Outil d'analyse de fichiers binaires
* gbufferline.h - prototypes pour la représentation de fragments de texte en ligne
*
* Copyright (C) 2010-2014 Cyrille Bagard
*
* This file is part of Chrysalide.
*
* 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 "../analysis/content.h"
#include "../arch/archbase.h"
#include "../arch/vmpa.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_PHYSICAL, /* Position physique */
BLC_VIRTUAL, /* 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 */
BLC_INVALID, /* Valeur de non-initialisation*/
BLC_MAIN /* Colonne principale (cf. imm)*/
} BufferLineColumn;
/* Première colonne de l'ensemble */
#define BLC_FIRST BLC_PHYSICAL
/* Première colonne toujours affichée */
#define BLC_DISPLAY BLC_ASSEMBLY_HEAD
/* Confort pour l'insertion de texte */
#define SL(str) str, strlen(str)
/* Espace entre les colonnes */
#define COL_MARGIN 23
/* Propriétés particulières supplémentaires */
typedef enum _BufferLineFlags
{
BLF_NONE = 0 << 0, /* Aucune */
BLF_HAS_CODE = 1 << 0, /* La ligne contient du code */
BLF_IS_LABEL = 1 << 1, /* Etiquette pour symbole */
BLF_ENTRYPOINT = 1 << 2, /* Représentation d'une entrée */
BLF_BOOKMARK = 1 << 3, /* Signet associé */
BLF_WIDTH_MANAGER = 1 << 4, /* Début de groupe des largeurs*/
BLF_ALL = ((1 << 5) - 1)
} BufferLineFlags;
/* 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(const mrange_t *, BufferLineColumn);
/* Indique la zone mémoire où se situe la ligne. */
const mrange_t *g_buffer_line_get_range(const GBufferLine *);
/* Construit le tronc commun d'une ligne autour de sa position. */
void g_buffer_line_fill_mrange(GBufferLine *, MemoryDataSize, MemoryDataSize);
/* Construit le tronc commun d'une ligne d'instruction. */
void g_buffer_line_fill_for_instr(GBufferLine *, MemoryDataSize, MemoryDataSize, const GBinContent *, phys_t);
/* Donne le segment présent à une abscisse donnée. */
GBufferSegment *g_buffer_line_get_segment_at(const GBufferLine *, const gint [BLC_COUNT], const bool *, gint *, gint *, GdkScrollDirection, bool);
/* Fournit le segment voisin d'un autre segment identifié. */
GBufferSegment *g_buffer_line_find_near_segment(const GBufferLine *, GBufferSegment *, const gint [BLC_COUNT], const bool *, GdkScrollDirection, gint *);
/* Recherche le premier créateur enregistré dans des segments. */
GObject *g_buffer_line_find_first_segment_creator(const GBufferLine *, BufferLineColumn);
/* Fournit le segment créé par un objet particulier. */
GBufferSegment *g_buffer_line_find_segment_from_creator(const GBufferLine *, GObject *);
/* Ajoute du texte à formater dans une ligne donnée. */
GBufferSegment *g_buffer_line_insert_text(GBufferLine *, BufferLineColumn, const char *, size_t, RenderingTagType);
/* Indique si du texte est présent dans une ligne de tampon. */
bool g_buffer_line_has_text(const GBufferLine *, BufferLineColumn, BufferLineColumn);
/* Donne le texte représenté par une ligne de tampon. */
char *g_buffer_line_get_text(const GBufferLine *, BufferLineColumn, BufferLineColumn, bool);
/* Supprime du texte représenté par une ligne de tampon. */
void g_buffer_line_delete_text(GBufferLine *, BufferLineColumn, BufferLineColumn);
/* Retient les largeurs d'une ligne si maximales. */
void g_buffer_line_update_max_widths(GBufferLine *, GBufferLine *);
/* Renvoie la ligne comptabilisant les largeurs pour un groupe. */
GBufferLine *g_buffer_line_get_width_manager(GBufferLine *);
/* Filtre des largeurs de lignes et ne garde que les maximales. */
void g_buffer_line_apply_max_widths(GBufferLine *, gint *, gint *);
/* Fournit la largeur d'une colonne finalement appliquée. */
gint g_buffer_line_compute_max_width(const GBufferLine *, BufferLineColumn, const gint *);
/* Fournit la colonne à partir de laquelle une fusion opère. */
BufferLineColumn g_buffer_line_get_merge_start(const GBufferLine *);
/* Définit la colonne à partir de laquelle la fusion opère. */
void g_buffer_line_start_merge_at(GBufferLine *, BufferLineColumn);
/* Ajoute une propriété particulière à une ligne donnée. */
void g_buffer_line_add_flag(GBufferLine *, BufferLineFlags);
/* Renseigne sur les propriétés particulières liées à une ligne. */
BufferLineFlags g_buffer_line_get_flags(const GBufferLine *);
/* Retire une propriété particulière à une ligne donnée. */
void g_buffer_line_remove_flag(GBufferLine *, BufferLineFlags);
/* Imprime la ligne de texte représentée. */
void g_buffer_line_draw(GBufferLine *, cairo_t *, const gint [BLC_COUNT], gint, gint, const bool *, const segcnt_list *);
/* Exporte la ligne de texte représentée. */
void g_buffer_line_export(GBufferLine *, buffer_export_context *, BufferExportType, const bool *);
/* Petite aide pour la détection de commentaire */
#define g_buffer_line_has_comment(ln) \
({ \
bool __result; \
__result = g_buffer_line_has_text(ln, BLC_COMMENTS, BLC_COUNT); \
__result |= (g_buffer_line_get_merge_start(ln) == BLC_DISPLAY \
&& !(g_buffer_line_get_flags(ln) & BLF_IS_LABEL)); \
__result; \
})
#endif /* _GLIBEXT_GBUFFERLINE_H */
|