blob: c730b7514baf6b45b1205ba943cb7087edda87c8 [file] [log] [blame]
/*************************************************************************
*
* PathFinder: finding a series of labeled nodes within a
* two-layer directed, cyclic graph.
* Copyright (2013) Sandia Corporation
*
* Copyright (2013) Sandia Corporation. Under the terms of Contract
* DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
* retains certain rights in this software.
*
* This file is part of PathFinder.
*
* PathFinder is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* PathFinder 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 PathFinder. If not, see <http://www.gnu.org/licenses/>.
*
* Questions? Contact J. Brian Rigdon (jbrigdo@sandia.gov)
*
*/
/*
* utils.c
*
* Created on: Jan 10, 2013
* Author: Brian "Rig" Rigdon, Marcus Smith, Samuel Mulder
*/
#include "utils.h"
#include <stdio.h>
#include <stdlib.h>
void edgeListPrettyPrint( EdgeList *edges, int depth, char *header )
{
int i;
for ( i = 0; i < depth; ++i )
printf( "\t" );
printf( "%s: ", header );
for ( ; edges != NULL; edges = edges->nextEdge )
printf( " %d,", edges->targetNodeId );
printf( "\n" );
}
void nodeListPrettyPrint( NodeList *nodes, int depth, char *separator, bool multiLine )
{
int i;
if ( !nodes )
return;
if ( nodes->node )
printf( "%d", nodes->node->id );
if ( nodes->nextNode )
{
if ( multiLine )
{
printf( "\n" );
for ( i = 0; i < depth; ++i )
{
printf( " " );
}
}
printf( "%s", separator );
nodeListPrettyPrint( nodes->nextNode, depth + 1, separator, multiLine );
}
else
printf( "\n" );
}
void graphPrettyPrint ( Graph *graph )
{
NodeList *outerPtr;
NodeList *innerPtr;
for ( outerPtr = graph->outerNodes;
outerPtr != NULL;
outerPtr = outerPtr->nextNode )
{
printf( "Outer Node: %d, idx: %d, label: %s (%d)\n", outerPtr->node->id,
outerPtr->node->nodeCount, outerPtr->node->label ? outerPtr->node->label : "none",
outerPtr->node->labelIdx );
edgeListPrettyPrint( outerPtr->node->edges, 1, "Edges" );
/* Deprecated: edgeListPrettyPrint( outerPtr->node->entranceNodes, 1, "EntranceNodes" ); */
for ( innerPtr = outerPtr->node->interiorNodes;
innerPtr != NULL;
innerPtr = innerPtr->nextNode )
{
printf( "\tInner Node: %d\n", innerPtr->node->id );
edgeListPrettyPrint( innerPtr->node->edges, 2, "Edges" );
}
}
printf ( "\n\n" );
}
void systemCallMapPrettyPrint( SystemCallMap *map )
{
SystemCallMapElement *element = NULL;
int i = 0;
int j = 0;
if ( !map )
return;
for ( i = 0; i < map->contentSize; ++i )
{
element = map->vector[i];
printf( "'%s'\n\t:", element->label );
for ( j = 0; element->nodes && j < element->nodes->contentSize; ++j )
{
printf( "%d", element->nodes->vector[j]->id );
if ( j < element->nodes->contentSize-1 )
printf( ", " );
else
printf( "\n\n" );
}
}
printf( "\t%d total System Call Map elements\n", map->contentSize );
}
bool testGraph()
{
/* Build it and see if it will get made */
Graph *graph = malloc( sizeof( Graph ) );
Node *outerNode1 = Node_new( 10, 0 );
Node *outerNode2 = Node_new( 20, 1 );
Node *innerNode11 = Node_new( 11, 2 );
Node *innerNode12 = Node_new( 12, 3 );
Node *innerNode21 = Node_new( 21, 4 );
Node *innerNode22 = Node_new( 22, 5 );
Node *innerNode23 = Node_new( 23, 6 );
if ( !graph ) return( false );
Graph_addOuterNode( graph, outerNode1 );
Graph_addOuterNode( graph, outerNode2 );
Node_addInteriorNode( outerNode1, innerNode11 );
Node_addInteriorNode( outerNode1, innerNode12 );
Node_addInteriorNode( outerNode2, innerNode21 );
Node_addInteriorNode( outerNode2, innerNode22 );
Node_addInteriorNode( outerNode2, innerNode23 );
/* Ok, let's print out the graph and see if it works */
graphPrettyPrint( graph );
return( true );
}
void printStack ( NodePtrVec *stack )
{
if ( !stack ) return;
int i;
// printf ( "stack size %d out of %d max\n", stack->contentSize, stack->allocatedSize );
for ( i = 0; i < stack->contentSize; ++i )
{
printf("%d", stack->vector[i]->id );
fflush(stdout);
if ( stack->vector[i]->label )
{
printf( "(%s)", stack->vector[i]->label );
fflush(stdout);
}
if ( i != stack->contentSize-1 )
{
printf ( " : " );
fflush(stdout);
}
}
printf( "\n" );
fflush(stdout);
}
void testStack()
{
/* This was written when the stack was storing integers
int a, b, c, d, e;
printf ( "\n\nTesting stack operations" );
NodePtrVec *vector = Stack_new(3);
if ( !vector )
{
printf( "stack allocation failed\n" );
return;
}
Stack_push( vector, 1 );
Stack_push( vector, 2 );
printStack( vector );
Stack_push( vector, 3 );
printStack( vector );
Stack_push( vector, 4 );
printStack( vector );
printf ( "\n2 %s in the stack\n", Stack_find( vector, 2 ) ? "is" : "is not" );
printf ( "5 %s in the stack\n\n", Stack_find( vector, 5 ) ? "is" : "is not" );
printf ( "\n4 %s in the stack\n", Stack_findReverse( vector, 4 ) ? "is" : "is not" );
printf ( "45 %s in the stack\n\n", Stack_findReverse( vector, 45 ) ? "is" : "is not" );
a = Stack_pop( vector );
printStack( vector );
b = Stack_pop( vector );
c = Stack_pop( vector );
d = Stack_pop( vector );
e = Stack_pop( vector );
printStack( vector );
printf ( "%d, %d, %d, %d, %d\n", a, b, c, d, e );
*/
}
/* The below code gives compile warnings about the size difference
* between pointers and ints. Since this doesn't impact execution,
* I am not going to chase down a fix.
*/
void searchDiagramPrettyPrint ( SearchDiagram *diagram )
{
#if 0
SearchDiagram *node;
EdgeReferences *edge;
for ( node = diagram; node != NULL && node->node != NULL; ++node )
{
printf ( "Node %x -> %d\n", (unsigned int)node, node->node->id );
if ( node->edgeReferenceArray )
{
printf ( "\t%x\n", (int)node->edgeReferenceArray );
for ( edge = node->edgeReferenceArray; edge->edgeTarget != NULL; ++edge )
{
printf ( "\t\tEdge (target %d) -> %x\n",
edge->edgeTarget->id, (int)edge->targetNodeEdges );
}
}
}
#endif
}