blob: a8feba5428c51ad52096268a66d6118b7b96e6a0 [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)
*
*/
/*
* systemCallMap.h
*
* Created on: Feb 5, 2013
* Author: Brian "Rig" Rigdon, Marcus Smith, Samuel Mulder
*/
#ifndef SYSTEMCALLMAP_H_
#define SYSTEMCALLMAP_H_
#include <stdbool.h>
#include "node.h"
/* A signature is an array of character pointers. Signature arrays
* are terminated with a NULL pointer so we don't have to have an
* additional datum to contain the length of the array. To make
* the code more readable, we are using this typedef:
*/
typedef char **Signature; /* code must be careful to ensure NULL termination */
/*
* SystemCallMapStruct specifies a label and all the nodes that are associated with
* that label. Currently, this is sub-optimal, managing via strcmp. If optimization
* is needed, that is left as an exercise for the future. We could see the future
* addition of hash values
*/
typedef struct SystemCallMapElementStruct SystemCallMapElement;
struct SystemCallMapElementStruct
{
char *label;
int index;
NodePtrVec *nodes;
};
SystemCallMapElement *SystemCallMapElement_new ( char *label, int initialSize ); /* Element constructor */
void SystemCallMapElement_delete( SystemCallMapElement *trash ); /* Element destructor */
/* The call map is actually a stack (managed like the STL deque) of SystemCallMapElements.
* It will insert up to its capacity, and then double its size (allocating a new space, copying
* and then freeing the old) when it grows beyond its capacity.
*/
typedef struct SystemCallMapStruct SystemCallMap;
struct SystemCallMapStruct
{
int contentSize;
int allocatedSize;
SystemCallMapElement **vector; /* a pointer to an array of pointers */
};
SystemCallMap *SystemCallMap_new( int initialSize );
void SystemCallMap_delete( SystemCallMap *trash ); /* destructor for an ENTIRE MAP!!! */
/* insert checks to see if there is already an entry for the name passed in. If so,
* it appends the node to that map element. If not, a new element is created, the
* name is duplicated
*/
bool SystemCallMap_insert ( SystemCallMap *map, char *label, Node *node );
/* Finds a list of nodes associated with a label. */
NodePtrVec *SystemCallMap_findLabeledNodes( SystemCallMap *systemCalls, char *label );
/* Returns the index of a given label */
int SystemCallMap_getLabelIndex( SystemCallMap *map, char *label );
/*
* Determines if all the labels in a given signature are represented
* within this graph. If not, we know the search will fail. There's
* gotta be a better name for this...
*/
bool SystemCallMap_signatureRepresented( SystemCallMap *map, Signature signature );
#endif /* SYSTEMCALLMAP_H_ */