/*
edge.c -- edge tree management
- Copyright (C) 2000,2001 Guus Sliepen <guus@sliepen.warande.net>,
- 2000,2001 Ivo Timmermans <itimmermans@bigfoot.com>
+ Copyright (C) 2000-2002 Guus Sliepen <guus@sliepen.warande.net>,
+ 2000-2002 Ivo Timmermans <itimmermans@bigfoot.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
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- $Id: edge.c,v 1.1.2.2 2001/10/28 10:16:18 guus Exp $
+ $Id: edge.c,v 1.1.2.7 2002/02/18 16:25:16 guus Exp $
*/
#include "config.h"
{
int result;
- result = strcmp(a->from->name, b->from->name);
-
+ result = strcmp(a->from.node->name, b->from.node->name);
+
if(result)
return result;
else
- return strcmp(a->to->name, b->to->name);
+ return strcmp(a->to.node->name, b->to.node->name);
}
/* Evil edge_compare() from a parallel universe ;)
{
int result;
- return (result = strcmp(a->from->name, b->from->name)) || (result = strcmp(a->to->name, b->to->name)), result;
+ return (result = strcmp(a->from.node->name, b->from.node->name)) || (result = strcmp(a->to.node->name, b->to.node->name)), result;
}
*/
-int edge_weight_compare(edge_t *a, edge_t *b)
+int edge_name_compare(edge_t *a, edge_t *b)
{
int result;
char *name_a1, *name_a2, *name_b1, *name_b2;
-
-
- result = a->weight - b->weight;
-
- if(result)
- return result;
- if(strcmp(a->from->name, a->to->name) < 0)
- name_a1 = a->from->name, name_a2 = a->to->name;
+ if(strcmp(a->from.node->name, a->to.node->name) < 0)
+ name_a1 = a->from.node->name, name_a2 = a->to.node->name;
else
- name_a1 = a->to->name, name_a2 = a->from->name;
+ name_a1 = a->to.node->name, name_a2 = a->from.node->name;
- if(strcmp(b->from->name, b->to->name) < 0)
- name_b1 = b->from->name, name_b2 = b->to->name;
+ if(strcmp(b->from.node->name, b->to.node->name) < 0)
+ name_b1 = b->from.node->name, name_b2 = b->to.node->name;
else
- name_b1 = b->to->name, name_b2 = b->from->name;
+ name_b1 = b->to.node->name, name_b2 = b->from.node->name;
result = strcmp(name_a1, name_b1);
-
+
if(result)
return result;
else
return strcmp(name_a2, name_b2);
}
+int edge_weight_compare(edge_t *a, edge_t *b)
+{
+ int result;
+
+ result = a->weight - b->weight;
+
+ if(result)
+ return result;
+ else
+ return edge_name_compare(a, b);
+}
+
void init_edges(void)
{
cp
cp
}
+avl_tree_t *new_edge_tree(void)
+{
+cp
+ return avl_alloc_tree((avl_compare_t)edge_name_compare, NULL);
+cp
+}
+
+void free_edge_tree(avl_tree_t *edge_tree)
+{
+cp
+ avl_delete_tree(edge_tree);
+cp
+}
+
void exit_edges(void)
{
cp
edge_t *new_edge(void)
{
+ edge_t *e;
cp
- edge_t *e = (edge_t *)xmalloc_and_zero(sizeof(*e));
+ e = (edge_t *)xmalloc_and_zero(sizeof(*e));
cp
return e;
}
cp
avl_insert(edge_tree, e);
avl_insert(edge_weight_tree, e);
+ avl_insert(e->from.node->edge_tree, e);
+ avl_insert(e->to.node->edge_tree, e);
cp
}
cp
avl_delete(edge_tree, e);
avl_delete(edge_weight_tree, e);
+ avl_delete(e->from.node->edge_tree, e);
+ avl_delete(e->to.node->edge_tree, e);
cp
}
{
edge_t v, *result;
cp
- v.from = from;
- v.to = to;
+ v.from.node = from;
+ v.to.node = to;
result = avl_search(edge_tree, &v);
if(result)
return result;
cp
- v.from = to;
- v.to = from;
+ v.from.node = to;
+ v.to.node = from;
return avl_search(edge_tree, &v);
}
{
avl_node_t *node;
edge_t *e;
+ char *from_tcp, *from_udp;
+ char *to_tcp, *to_udp;
cp
syslog(LOG_DEBUG, _("Edges:"));
for(node = edge_tree->head; node; node = node->next)
{
e = (edge_t *)node->data;
- syslog(LOG_DEBUG, _(" %s - %s options %ld"),
- e->from->name, e->to->name, e->options);
+ from_tcp = sockaddr2hostname(&e->from.tcpaddress);
+ from_udp = sockaddr2hostname(&e->from.udpaddress);
+ to_tcp = sockaddr2hostname(&e->to.tcpaddress);
+ to_udp = sockaddr2hostname(&e->to.udpaddress);
+ syslog(LOG_DEBUG, _(" %s tcp at %s udp at %s - %s tcp at %s udp at %s options %ld weight %d"),
+ e->from.node->name, from_tcp, from_udp,
+ e->to.node->name, to_tcp, to_udp,
+ e->options, e->weight);
+ free(from_tcp);
+ free(from_udp);
+ free(to_tcp);
+ free(to_udp);
}
-
+
syslog(LOG_DEBUG, _("End of edges."));
cp
}