Files
radare/vala/default_layout.c

649 lines
19 KiB
C

/*
* Grava - General purpose graphing library for Vala
* Copyright (C) 2007, 2008 pancake <youterm.com>
*
* This program 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.
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "default_layout.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "edge.h"
struct _GravaDefaultLayoutPrivate {
GravaGraph* graph;
};
#define GRAVA_DEFAULT_LAYOUT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GRAVA_TYPE_DEFAULT_LAYOUT, GravaDefaultLayoutPrivate))
enum {
GRAVA_DEFAULT_LAYOUT_DUMMY_PROPERTY
};
static gboolean grava_default_layout_d = FALSE;
static void _g_slist_free_g_object_unref (GSList* self);
static void grava_default_layout_treenodes (GravaDefaultLayout* self, GravaNode* n);
static void grava_default_layout_real_set_graph (GravaLayout* base, GravaGraph* graph);
static void grava_default_layout_real_run (GravaLayout* base, GravaGraph* graph);
static void _g_object_unref_gdestroy_notify (void* data);
static GObject * grava_default_layout_constructor (GType type, guint n_construct_properties, GObjectConstructParam * construct_properties);
static gpointer grava_default_layout_parent_class = NULL;
static void grava_default_layout_finalize (GObject* obj);
#line 34 "default_layout.vala"
void grava_default_layout_reset_layout (GravaDefaultLayout* self) {
#line 34 "default_layout.vala"
g_return_if_fail (self != NULL);
#line 36 "default_layout.vala"
fprintf (stdout, "RESETING LAYOUT\n");
{
GSList* node_collection;
GSList* node_it;
#line 37 "default_layout.vala"
node_collection = self->priv->graph->nodes;
for (node_it = node_collection; node_it != NULL; node_it = node_it->next) {
GravaNode* node;
#line 37 "default_layout.vala"
node = (GravaNode*) node_it->data;
{
#line 38 "default_layout.vala"
fprintf (stdout, "RESETING LAYOUT+++++\n");
#line 39 "default_layout.vala"
grava_default_layout_setxy (self, node);
}
}
}
}
#line 43 "default_layout.vala"
void grava_default_layout_reset_real (GravaDefaultLayout* self) {
#line 43 "default_layout.vala"
g_return_if_fail (self != NULL);
{
GSList* node_collection;
GSList* node_it;
#line 45 "default_layout.vala"
node_collection = self->priv->graph->nodes;
for (node_it = node_collection; node_it != NULL; node_it = node_it->next) {
GravaNode* node;
#line 45 "default_layout.vala"
node = (GravaNode*) node_it->data;
{
#line 46 "default_layout.vala"
self->priv->graph->nodes = g_slist_remove (self->priv->graph->nodes, node);
}
}
}
}
static void _g_slist_free_g_object_unref (GSList* self) {
g_slist_foreach (self, (GFunc) g_object_unref, NULL);
g_slist_free (self);
}
#line 50 "default_layout.vala"
static void grava_default_layout_treenodes (GravaDefaultLayout* self, GravaNode* n) {
gint ox;
GSList* nodes;
#line 50 "default_layout.vala"
g_return_if_fail (self != NULL);
#line 50 "default_layout.vala"
g_return_if_fail (n != NULL);
ox = 0;
nodes = grava_graph_outer_nodes (self->priv->graph, n);
{
GSList* node_collection;
GSList* node_it;
#line 54 "default_layout.vala"
node_collection = nodes;
for (node_it = node_collection; node_it != NULL; node_it = node_it->next) {
GravaNode* node;
#line 54 "default_layout.vala"
node = (GravaNode*) node_it->data;
{
#line 55 "default_layout.vala"
node->y = (n->y + n->h) + self->y_offset;
#line 56 "default_layout.vala"
node->x = node->x + (n->w + ox);
#line 57 "default_layout.vala"
ox = ox + (50);
#line 58 "default_layout.vala"
grava_default_layout_treenodes (self, node);
}
}
}
(nodes == NULL) ? NULL : (nodes = (_g_slist_free_g_object_unref (nodes), NULL));
}
#line 62 "default_layout.vala"
void grava_default_layout_setxy (GravaDefaultLayout* self, GravaNode* n) {
GravaNode* _tmp1;
char* _tmp0;
GravaNode* _tmp2;
GravaNode* m;
#line 62 "default_layout.vala"
g_return_if_fail (self != NULL);
#line 62 "default_layout.vala"
g_return_if_fail (n != NULL);
#line 64 "default_layout.vala"
_tmp1 = NULL;
#line 61 "node.vala"
_tmp0 = NULL;
#line 64 "default_layout.vala"
_tmp2 = NULL;
m = (_tmp2 = (_tmp1 = (GravaNode*) g_hash_table_lookup (self->data, _tmp0 = grava_node_get (n, "offset")), (_tmp1 == NULL) ? NULL : g_object_ref (_tmp1)), _tmp0 = (g_free (_tmp0), NULL), _tmp2);
#line 65 "default_layout.vala"
if (m == NULL) {
GravaNode* no;
char* _tmp3;
GravaNode* _tmp4;
no = grava_node_new ();
#line 61 "node.vala"
_tmp3 = NULL;
#line 67 "default_layout.vala"
g_object_set ((GObject*) no, "offset", _tmp3 = grava_node_get (n, "offset"), NULL);
_tmp3 = (g_free (_tmp3), NULL);
#line 68 "default_layout.vala"
no->x = n->x;
#line 69 "default_layout.vala"
no->y = n->y;
#line 70 "default_layout.vala"
no->w = n->w;
#line 71 "default_layout.vala"
no->h = n->h;
#line 72 "default_layout.vala"
_tmp4 = NULL;
#line 72 "default_layout.vala"
g_hash_table_insert (self->data, grava_node_get (n, "offset"), (_tmp4 = no, (_tmp4 == NULL) ? NULL : g_object_ref (_tmp4)));
(no == NULL) ? NULL : (no = (g_object_unref (no), NULL));
} else {
#line 74 "default_layout.vala"
m->x = n->x;
#line 75 "default_layout.vala"
m->y = n->y;
#line 76 "default_layout.vala"
m->w = n->w;
#line 77 "default_layout.vala"
m->h = n->h;
}
(m == NULL) ? NULL : (m = (g_object_unref (m), NULL));
}
#line 81 "default_layout.vala"
gboolean grava_default_layout_getxy (GravaDefaultLayout* self, GravaNode** n) {
GravaNode* _tmp1;
char* _tmp0;
GravaNode* _tmp2;
GravaNode* m;
char* _tmp5;
gboolean _tmp6;
#line 81 "default_layout.vala"
g_return_val_if_fail (self != NULL, FALSE);
#line 81 "default_layout.vala"
g_return_val_if_fail (n != NULL, FALSE);
#line 83 "default_layout.vala"
_tmp1 = NULL;
#line 61 "node.vala"
_tmp0 = NULL;
#line 83 "default_layout.vala"
_tmp2 = NULL;
m = (_tmp2 = (_tmp1 = (GravaNode*) g_hash_table_lookup (self->data, _tmp0 = grava_node_get ((*n), "offset")), (_tmp1 == NULL) ? NULL : g_object_ref (_tmp1)), _tmp0 = (g_free (_tmp0), NULL), _tmp2);
#line 84 "default_layout.vala"
if (m != NULL) {
char* _tmp3;
gboolean _tmp4;
#line 85 "default_layout.vala"
(*n)->x = m->x;
#line 86 "default_layout.vala"
(*n)->y = m->y;
#line 87 "default_layout.vala"
(*n)->w = m->w;
#line 88 "default_layout.vala"
(*n)->h = m->h;
#line 61 "node.vala"
_tmp3 = NULL;
#line 89 "default_layout.vala"
fprintf (stdout, "TAKEND FOR %s\n", _tmp3 = grava_node_get ((*n), "offset"));
_tmp3 = (g_free (_tmp3), NULL);
#line 90 "default_layout.vala"
return (_tmp4 = TRUE, (m == NULL) ? NULL : (m = (g_object_unref (m), NULL)), _tmp4);
}
#line 61 "node.vala"
_tmp5 = NULL;
#line 92 "default_layout.vala"
fprintf (stdout, "NOT TAKEND FOR %s\n", _tmp5 = grava_node_get ((*n), "offset"));
_tmp5 = (g_free (_tmp5), NULL);
#line 94 "default_layout.vala"
return (_tmp6 = FALSE, (m == NULL) ? NULL : (m = (g_object_unref (m), NULL)), _tmp6);
}
#line 97 "default_layout.vala"
void grava_default_layout_walkChild (GravaDefaultLayout* self, GravaNode* node, gint level) {
#line 97 "default_layout.vala"
g_return_if_fail (self != NULL);
#line 97 "default_layout.vala"
g_return_if_fail (node != NULL);
#line 99 "default_layout.vala"
if (level < 1) {
#line 99 "default_layout.vala"
return;
}
{
GSList* edge_collection;
GSList* edge_it;
#line 100 "default_layout.vala"
edge_collection = self->priv->graph->edges;
for (edge_it = edge_collection; edge_it != NULL; edge_it = edge_it->next) {
GravaEdge* edge;
#line 100 "default_layout.vala"
edge = (GravaEdge*) edge_it->data;
{
#line 101 "default_layout.vala"
if (edge->orig == node) {
#line 102 "default_layout.vala"
edge->dest->y = (edge->orig->y + edge->orig->h) + self->y_offset;
#line 103 "default_layout.vala"
grava_default_layout_walkChild (self, edge->dest, (level = level - 1));
}
}
}
}
}
#line 108 "default_layout.vala"
GravaNode* grava_default_layout_get_parent (GravaDefaultLayout* self, GravaNode* node) {
#line 108 "default_layout.vala"
g_return_val_if_fail (self != NULL, NULL);
#line 108 "default_layout.vala"
g_return_val_if_fail (node != NULL, NULL);
{
GSList* edge_collection;
GSList* edge_it;
#line 110 "default_layout.vala"
edge_collection = self->priv->graph->edges;
for (edge_it = edge_collection; edge_it != NULL; edge_it = edge_it->next) {
GravaEdge* edge;
#line 110 "default_layout.vala"
edge = (GravaEdge*) edge_it->data;
{
#line 111 "default_layout.vala"
if (edge->dest == node) {
#line 112 "default_layout.vala"
return edge->orig;
}
}
}
}
#line 114 "default_layout.vala"
return NULL;
}
#line 117 "default_layout.vala"
static void grava_default_layout_real_set_graph (GravaLayout* base, GravaGraph* graph) {
GravaDefaultLayout * self;
self = (GravaDefaultLayout*) base;
#line 117 "default_layout.vala"
g_return_if_fail (graph != NULL);
#line 119 "default_layout.vala"
self->priv->graph = graph;
}
#line 122 "default_layout.vala"
static void grava_default_layout_real_run (GravaLayout* base, GravaGraph* graph) {
GravaDefaultLayout * self;
double last_y;
gint i;
gint k;
GravaNode* n;
GravaNode* p;
GravaNode* destn;
gboolean found;
self = (GravaDefaultLayout*) base;
#line 122 "default_layout.vala"
g_return_if_fail (graph != NULL);
#line 124 "default_layout.vala"
self->priv->graph = graph;
last_y = 0.0;
i = 0;
k = 0;
n = NULL;
p = NULL;
destn = NULL;
found = FALSE;
/* reset all node positions*/
#line 132 "default_layout.vala"
last_y = (double) 50;
/* Tots vertical, un sota l'altr ordenats per base addr*/
{
GSList* node_collection;
GSList* node_it;
#line 135 "default_layout.vala"
node_collection = graph->nodes;
for (node_it = node_collection; node_it != NULL; node_it = node_it->next) {
GravaNode* node;
#line 135 "default_layout.vala"
node = (GravaNode*) node_it->data;
{
#line 136 "default_layout.vala"
if (!node->visible) {
#line 136 "default_layout.vala"
continue;
}
/* reset node positions*/
#line 138 "default_layout.vala"
node->x = (double) 50;
#line 139 "default_layout.vala"
grava_node_fit (node);
#line 140 "default_layout.vala"
node->y = last_y;
#line 141 "default_layout.vala"
last_y = (node->y + node->h) + 50;
#line 142 "default_layout.vala"
if (grava_default_layout_d) {
char* _tmp0;
#line 61 "node.vala"
_tmp0 = NULL;
#line 142 "default_layout.vala"
fprintf (stdout, " at %f %s %x\n", node->y, _tmp0 = grava_node_get (node, "label"), node->baseaddr);
_tmp0 = (g_free (_tmp0), NULL);
}
}
}
}
/* Per cada node. Segueixo la condició certa, tots els nodes que estiguin
entre el node que estic mirant i el de la condicio certa els desplaço a la dreta.
Tambe apropo el node desti a l'origen.
Entre el node que miro i el desti vol dir que la x sigui la mateixa.
*/
#line 151 "default_layout.vala"
for (i = 0; i < g_slist_length (graph->nodes); i++) {
GravaNode* _tmp2;
GravaNode* _tmp1;
GravaNode* _tmp4;
char* _tmp3;
GravaNode* _tmp5;
GravaNode* m;
gboolean _tmp9;
_tmp2 = NULL;
#line 152 "default_layout.vala"
_tmp1 = NULL;
#line 152 "default_layout.vala"
n = (_tmp2 = (_tmp1 = (GravaNode*) g_slist_nth_data (graph->nodes, (guint) i), (_tmp1 == NULL) ? NULL : g_object_ref (_tmp1)), (n == NULL) ? NULL : (n = (g_object_unref (n), NULL)), _tmp2);
/*
if (getxy(ref n))
continue;
*/
#line 157 "default_layout.vala"
_tmp4 = NULL;
#line 61 "node.vala"
_tmp3 = NULL;
#line 157 "default_layout.vala"
_tmp5 = NULL;
m = (_tmp5 = (_tmp4 = (GravaNode*) g_hash_table_lookup (self->data, _tmp3 = grava_node_get (n, "offset")), (_tmp4 == NULL) ? NULL : g_object_ref (_tmp4)), _tmp3 = (g_free (_tmp3), NULL), _tmp5);
#line 158 "default_layout.vala"
if (m != NULL) {
#line 159 "default_layout.vala"
n->x = m->x;
#line 160 "default_layout.vala"
n->y = m->y;
#line 161 "default_layout.vala"
n->w = m->w;
#line 162 "default_layout.vala"
n->h = m->h;
#line 163 "default_layout.vala"
// fprintf (stdout, "FUCKA! %f %f\n", n->x, n->y);
(m == NULL) ? NULL : (m = (g_object_unref (m), NULL));
#line 164 "default_layout.vala"
continue;
}
#line 166 "default_layout.vala"
//fprintf (stdout, "---- not ounfd !\n");
/*/ busco l'edge verd d'aquest node
/*/
#line 170 "default_layout.vala"
found = FALSE;
{
GSList* edge_collection;
GSList* edge_it;
#line 171 "default_layout.vala"
edge_collection = graph->edges;
for (edge_it = edge_collection; edge_it != NULL; edge_it = edge_it->next) {
GravaEdge* edge;
#line 171 "default_layout.vala"
edge = (GravaEdge*) edge_it->data;
{
gboolean _tmp6;
_tmp6 = FALSE;
#line 172 "default_layout.vala"
if (edge->orig == n) {
#line 172 "default_layout.vala"
_tmp6 = edge->jmpcnd == TRUE;
} else {
#line 172 "default_layout.vala"
_tmp6 = FALSE;
}
#line 172 "default_layout.vala"
if (_tmp6) {
GravaNode* _tmp8;
GravaNode* _tmp7;
#line 173 "default_layout.vala"
if (grava_default_layout_d) {
#line 173 "default_layout.vala"
fprintf (stdout, "0x%x ----> 0x%x\n", edge->orig->baseaddr, edge->dest->baseaddr);
}
_tmp8 = NULL;
#line 174 "default_layout.vala"
_tmp7 = NULL;
#line 174 "default_layout.vala"
destn = (_tmp8 = (_tmp7 = edge->dest, (_tmp7 == NULL) ? NULL : g_object_ref (_tmp7)), (destn == NULL) ? NULL : (destn = (g_object_unref (destn), NULL)), _tmp8);
#line 175 "default_layout.vala"
found = TRUE;
#line 176 "default_layout.vala"
break;
}
}
}
}
/*/ n es el node origen.
/ destn es el node desti
/*/
#line 183 "default_layout.vala"
last_y = (n->y + n->h) + 10;
_tmp9 = FALSE;
#line 188 "default_layout.vala"
if ((found == TRUE)) {
#line 188 "default_layout.vala"
_tmp9 = (n->baseaddr < destn->baseaddr);
} else {
#line 188 "default_layout.vala"
_tmp9 = FALSE;
}
/* Si la base del node origen es < que le desti .
sempre anem avall.
*/
#line 188 "default_layout.vala"
if (_tmp9) {
double maxw;
/*/ Busco el node mes ample.
/*/
maxw = (double) 0;
#line 192 "default_layout.vala"
for (k = (i + 1); k < g_slist_length (graph->nodes); k++) {
GravaNode* _tmp11;
GravaNode* _tmp10;
gboolean _tmp12;
_tmp11 = NULL;
#line 193 "default_layout.vala"
_tmp10 = NULL;
#line 193 "default_layout.vala"
p = (_tmp11 = (_tmp10 = (GravaNode*) g_slist_nth_data (graph->nodes, (guint) k), (_tmp10 == NULL) ? NULL : g_object_ref (_tmp10)), (p == NULL) ? NULL : (p = (g_object_unref (p), NULL)), _tmp11);
_tmp12 = FALSE;
#line 194 "default_layout.vala"
if ((p->x == n->x)) {
#line 194 "default_layout.vala"
_tmp12 = (p->w > maxw);
} else {
#line 194 "default_layout.vala"
_tmp12 = FALSE;
}
#line 194 "default_layout.vala"
if (_tmp12) {
#line 195 "default_layout.vala"
maxw = p->w;
}
}
/*/ Desplaço
/*/
#line 199 "default_layout.vala"
for (k = (i + 1); k < g_slist_length (graph->nodes); k++) {
GravaNode* _tmp14;
GravaNode* _tmp13;
_tmp14 = NULL;
#line 200 "default_layout.vala"
_tmp13 = NULL;
#line 200 "default_layout.vala"
p = (_tmp14 = (_tmp13 = (GravaNode*) g_slist_nth_data (graph->nodes, (guint) k), (_tmp13 == NULL) ? NULL : g_object_ref (_tmp13)), (p == NULL) ? NULL : (p = (g_object_unref (p), NULL)), _tmp14);
#line 202 "default_layout.vala"
if (grava_default_layout_d) {
#line 202 "default_layout.vala"
fprintf (stdout, "Displacing 0x%x\n", p->baseaddr);
}
/* El node estava entre el node origen i el desti*/
#line 205 "default_layout.vala"
if (p->x == n->x) {
#line 206 "default_layout.vala"
p->x = p->x + ((maxw + 10));
}
/*/ Es ja el node desti.*/
#line 209 "default_layout.vala"
if (p == destn) {
#line 210 "default_layout.vala"
if (grava_default_layout_d) {
#line 210 "default_layout.vala"
fprintf (stdout, "AT 0x%x\n", p->baseaddr);
}
#line 211 "default_layout.vala"
destn->x = n->x;
#line 212 "default_layout.vala"
destn->y = (n->y + n->h) + 50;
#line 213 "default_layout.vala"
break;
}
}
}
#line 217 "default_layout.vala"
grava_default_layout_setxy (self, n);
(m == NULL) ? NULL : (m = (g_object_unref (m), NULL));
}
(n == NULL) ? NULL : (n = (g_object_unref (n), NULL));
(p == NULL) ? NULL : (p = (g_object_unref (p), NULL));
(destn == NULL) ? NULL : (destn = (g_object_unref (destn), NULL));
#line 220 "default_layout.vala"
return;
}
#line 21 "default_layout.vala"
GravaDefaultLayout* grava_default_layout_construct (GType object_type) {
GravaDefaultLayout * self;
self = g_object_newv (object_type, 0, NULL);
return self;
}
#line 21 "default_layout.vala"
GravaDefaultLayout* grava_default_layout_new (void) {
#line 21 "default_layout.vala"
return grava_default_layout_construct (GRAVA_TYPE_DEFAULT_LAYOUT);
}
#line 182 "gobject-2.0.vapi"
static void _g_object_unref_gdestroy_notify (void* data) {
g_object_unref (data);
}
/* debug output*/
static GObject * grava_default_layout_constructor (GType type, guint n_construct_properties, GObjectConstructParam * construct_properties) {
GObject * obj;
GravaDefaultLayoutClass * klass;
GObjectClass * parent_class;
GravaDefaultLayout * self;
klass = GRAVA_DEFAULT_LAYOUT_CLASS (g_type_class_peek (GRAVA_TYPE_DEFAULT_LAYOUT));
parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass));
obj = parent_class->constructor (type, n_construct_properties, construct_properties);
self = GRAVA_DEFAULT_LAYOUT (obj);
{
GHashTable* _tmp0;
_tmp0 = NULL;
#line 31 "default_layout.vala"
self->data = (_tmp0 = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, _g_object_unref_gdestroy_notify), (self->data == NULL) ? NULL : (self->data = (g_hash_table_unref (self->data), NULL)), _tmp0);
}
return obj;
}
static void grava_default_layout_class_init (GravaDefaultLayoutClass * klass) {
grava_default_layout_parent_class = g_type_class_peek_parent (klass);
g_type_class_add_private (klass, sizeof (GravaDefaultLayoutPrivate));
G_OBJECT_CLASS (klass)->constructor = grava_default_layout_constructor;
G_OBJECT_CLASS (klass)->finalize = grava_default_layout_finalize;
GRAVA_LAYOUT_CLASS (klass)->set_graph = grava_default_layout_real_set_graph;
GRAVA_LAYOUT_CLASS (klass)->run = grava_default_layout_real_run;
}
static void grava_default_layout_instance_init (GravaDefaultLayout * self) {
self->priv = GRAVA_DEFAULT_LAYOUT_GET_PRIVATE (self);
self->y_offset = (double) 100;
self->x_offset = (double) 50;
}
static void grava_default_layout_finalize (GObject* obj) {
GravaDefaultLayout * self;
self = GRAVA_DEFAULT_LAYOUT (obj);
(self->data == NULL) ? NULL : (self->data = (g_hash_table_unref (self->data), NULL));
G_OBJECT_CLASS (grava_default_layout_parent_class)->finalize (obj);
}
GType grava_default_layout_get_type (void) {
static GType grava_default_layout_type_id = 0;
if (grava_default_layout_type_id == 0) {
static const GTypeInfo g_define_type_info = { sizeof (GravaDefaultLayoutClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) grava_default_layout_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (GravaDefaultLayout), 0, (GInstanceInitFunc) grava_default_layout_instance_init, NULL };
grava_default_layout_type_id = g_type_register_static (GRAVA_TYPE_LAYOUT, "GravaDefaultLayout", &g_define_type_info, 0);
}
return grava_default_layout_type_id;
}