|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T n
Length: 5878 (0x16f6)
Types: TextFile
Names: »nodes.c«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit
└─⟦3f75c1919⟧ »EurOpenD3/utils/decomp.tar.Z«
└─⟦510c4d5ee⟧
└─⟦this⟧ »decomp/nodes.c«
/*
* Module: nodes.c
*
* Author: J. Reuter
*
* This module contains the functions to manage nodes, perform
* generic node manipulation, and debug graphs and trees of nodes.
*/
#include "defs.h"
#include "nodes.h"
#include "setjmp.h"
extern jmp_buf badbranch;
struct node head_node; /* head of node chain--used to create nodes */
struct node *last_node = &head_node; /* pointer to last node of chain */
int node_count; /* number of nodes */
int node_max; /* amount of node space in node_array */
struct node **node_array; /* used for dyn. alloc. node array */
struct node_info node_info[MAX_TYPES] = {
0, "N_UNREACH",
0, "N_FLOW",
2, "N_BRANCH",
0, "N_CASE",
0, "N_END",
2, "N_IF",
1, "N_LOOP",
1, "N_ITER",
2, "N_ANDIF",
2, "N_ORIF",
1, "N_SWITCH",
0, "N_GOTO",
0, "N_BREAK",
0, "N_CONTINUE",
0, "N_CASELAB",
1, "N_WHILE",
1, "N_UNTIL",
};
/*
* get_node allocates a node and puts it at the end of the node chain.
* The chain will be converted into an array (node_array) when we are
* finished creating nodes and know how many exist.
*/
struct node *
get_node( arc_count )
int arc_count; /* number of node exit 'arcs' */
{
register struct node *node;
/* allocate the node space */
node = (struct node *) malloc( sizeof( struct node ) );
if ( node == NULL ) {
fprintf( stderr, "Out of memory\n" );
exit(1);
}
node->node_pscratch = NULL;
node->arcs = NULL;
if ( arc_count > 0 ) {
node->arcs = (address *) malloc( arc_count * sizeof( address ) );
if ( node->arcs == NULL ) {
fprintf( stderr, "Out of memory\n" );
exit(1);
}
}
node_count += 1;
/* now put the node at the end of the chain */
last_node -> node_pscratch = node;
last_node = node;
return node;
}
array_nodes()
{
register struct node *n;
register int i, j;
if ( node_count <= 0 ) {
fprintf( stderr, "Bad node_count in array_nodes()\n" );
longjmp( badbranch, 1 );
}
node_max = node_count * 4;
node_array = (struct node **) malloc( node_max * sizeof( struct node * ) );
if ( node_array == NULL ) {
fprintf( stderr, "Out of memory\n" );
exit( 1 );
}
/*
* using the node_pscratch chain, put the nodes into node_array
* in the order that they are chained together
*/
for ( i = 0, n = head_node.node_pscratch; n != NULL;
i++, n = n->node_pscratch )
node_array[i] = n;
/* now convert all the arcs from `addresses' to array indices */
for ( i = 0; i < node_count; i++ ) {
n = node_array[i];
for ( j = 0; j < n->num_arcs; j++ ) {
/* binary search for start_address == n->arcs[j] */
register int lower, upper, k;
lower = 0;
upper = node_count - 1;
while ( upper >= lower ) {
k = ( lower + upper ) / 2;
if ( n->arcs[j] < node_array[k]->start_address )
upper = k - 1;
else if ( n->arcs[j] > node_array[k]->start_address )
lower = k + 1;
else {
n->arcs[j] = k;
goto found;
}
}
fprintf( stderr, "Can't find arc target by start_address\n" );
longjmp( badbranch, 1 );
found: ;
}
}
}
node_grow()
{
fprintf( stderr, "Grow nodes!\n" );
}
free_nodes()
{
register int i;
for ( i = 0; i < node_count; i++ ) {
if ( node_array[i]->arcs != NULL )
free( node_array[i]->arcs );
free( node_array[i] );
}
free( node_array );
node_array = NULL;
node_count = 0;
node_max = 0;
head_node.node_pscratch = NULL;
last_node = &head_node;
}
dump_nodes()
{
register int i, j;
register struct node *n;
fprintf( stderr, "Head node link: %d\n", head_node.node_scratch );
if ( node_array != NULL ) {
fprintf( stderr, "%d nodes\n", node_count );
for ( i = 0; i < node_count; i++ ) {
fprintf( stderr, "Node %d: type %d start %d end %d\n", i,
node_array[i]->node_type, node_array[i]->start_address,
node_array[i]->end_address );
fprintf( stderr, " scratch %d num_arcs %d\n",
node_array[i]->node_scratch, node_array[i]->num_arcs );
if ( node_array[i]->arcs != NULL )
for ( j = 0; j < node_array[i]->num_arcs; j++ )
fprintf(stderr, " arc: %d\n", node_array[i]->arcs[j]);
}
} else {
i = 0;
n = head_node.node_pscratch;
while ( n != NULL ) {
fprintf( stderr, "Node %d: type %d start %d end %d\n", i,
n->node_type, n->start_address,
n->end_address );
fprintf( stderr, " scratch %d num_arcs %d\n",
n->node_scratch, n->num_arcs );
if ( n->arcs != NULL )
for ( j = 0; j < n->num_arcs; j++ )
fprintf(stderr, " arc: %d\n", n->arcs[j]);
i++;
n = n->node_pscratch;
}
}
fflush( stdout );
}
prgraph()
{
int v;
int i;
for ( v = 0; v < node_count; v++ ) {
fprintf( stderr, "%d %s:", v,
node_info[node_array[v]->node_type].name );
for ( i = 0; i < node_array[v]->num_arcs; i++ )
fprintf( stderr, "%d ", node_array[v]->arcs[i] );
fprintf( stderr, "\n" );
}
fprintf( stderr, "\n\n" );
}
prtree()
{
pr_tree( 0, 1 );
}
static
pr_tree( v, tabstop )
int v;
int tabstop;
{
int i;
tabover( tabstop );
fprintf( stderr, "%d %s:", v, node_info[node_array[v]->node_type].name );
for ( i = 0; i < node_array[v]->num_arcs; i++ )
fprintf( stderr, " %d", node_array[v]->arcs[i] );
fprintf( stderr, "\n" );
for ( i = 0; i < node_info[node_array[v]->node_type].num_children; i++ ) {
tabover( tabstop + 1 );
fprintf( stderr, "{\n" );
if ( DEFINED( node_array[v]->child[i] ) )
pr_tree( node_array[v]->child[i], tabstop + 1 );
tabover( tabstop + 1 );
fprintf( stderr, "}\n" );
}
if ( DEFINED( node_array[v]->right_sibling ) )
pr_tree( node_array[v]->right_sibling, tabstop );
}
static
tabover( n )
int n;
{
int i;
for ( i = 0; i < n; i++ )
putc( '\t', stderr );
}