text: /**CFile****************************************************************
  
    FileName    [parseStack.c]
  
    PackageName [MVSIS 1.3: Multi-valued logic synthesis system.]
  
    Synopsis    [Stacks used by the formula parser.]
  
    Author      [MVSIS Group]
    
    Affiliation [UC Berkeley]
  
    Date        [Ver. 1.0. Started - August 18, 2003.]
  
    Revision    [$Id: parseStack.c,v 1.0 2003/02/01 00:00:00 alanmi Exp $]
  
  ***********************************************************************/
  
  #include "parseInt.h"
  
  ////////////////////////////////////////////////////////////////////////
  ///                        DECLARATIONS                              ///
  ////////////////////////////////////////////////////////////////////////
  
  struct ParseStackFnStruct
  {
      void **     pData;        // the array of elements
      int           Top;          // the index
      int           Size;         // the stack size
  };
  
  struct ParseStackOpStruct
  {
      int *         pData;        // the array of elements
      int           Top;          // the index
      int           Size;         // the stack size
  };
  
  ////////////////////////////////////////////////////////////////////////
  ///                     FUNCTION DEFINITIONS                         ///
  ////////////////////////////////////////////////////////////////////////
  
  /**Function*************************************************************
  
    Synopsis    [Starts the stack.]
  
    Description []
                 
    SideEffects []
  
    SeeAlso     []
  
  ***********************************************************************/
  Parse_StackFn_t * Parse_StackFnStart( int nDepth )
  {
      Parse_StackFn_t * p;
      p = ALLOC( Parse_StackFn_t, 1 );
      memset( p, 0, sizeof(Parse_StackFn_t) );
      p->pData = ALLOC( void *, nDepth );
      p->Size = nDepth;
      return p;
  }
  
  /**Function*************************************************************
  
    Synopsis    [Checks whether the stack is empty.]
  
    Description []
                 
    SideEffects []
  
    SeeAlso     []
  
  ***********************************************************************/
  bool Parse_StackFnIsEmpty( Parse_StackFn_t * p )
  {
      return (bool)(p->Top == 0);
  }
  
  /**Function*************************************************************
  
    Synopsis    [Pushes an entry into the stack.]
  
    Description []
                 
    SideEffects []
  
    SeeAlso     []
  
  ***********************************************************************/
  void Parse_StackFnPush( Parse_StackFn_t * p, void * bFunc )
  {
      if ( p->Top >= p->Size )
      {
          printf( "Parse_StackFnPush(): Stack size is too small!\n" );
          return;
      }
      p->pData[ p->Top++ ] = bFunc;
  }
  
  /**Function*************************************************************
  
    Synopsis    [Pops an entry out of the stack.]
  
    Description []
                 
    SideEffects []
  
    SeeAlso     []
  
  ***********************************************************************/
  void * Parse_StackFnPop( Parse_StackFn_t * p )
  {
      if ( p->Top == 0 )
      {
          printf( "Parse_StackFnPush(): Trying to extract data from the empty stack!\n" );
          return NULL;
      }
      return p->pData[ --p->Top ];
  }
  
  /**Function*************************************************************
  
    Synopsis    [Deletes the stack.]
  
    Description []
                 
    SideEffects []
  
    SeeAlso     []
  
  ***********************************************************************/
  void Parse_StackFnFree( Parse_StackFn_t * p )
  {
      FREE( p->pData );
      FREE( p );
  }
  
  
  
  
  /**Function*************************************************************
  
    Synopsis    [Starts the stack.]
  
    Description []
                 
    SideEffects []
  
    SeeAlso     []
  
  ***********************************************************************/
  Parse_StackOp_t * Parse_StackOpStart( int nDepth )
  {
      Parse_StackOp_t * p;
      p = ALLOC( Parse_StackOp_t, 1 );
      memset( p, 0, sizeof(Parse_StackOp_t) );
      p->pData = ALLOC( int, nDepth );
      p->Size = nDepth;
      return p;
  }
  
  /**Function*************************************************************
  
    Synopsis    [Checks whether the stack is empty.]
  
    Description []
                 
    SideEffects []
  
    SeeAlso     []
  
  ***********************************************************************/
  bool Parse_StackOpIsEmpty( Parse_StackOp_t * p )
  {
      return (bool)(p->Top == 0);
  }
  
  /**Function*************************************************************
  
    Synopsis    [Pushes an entry into the stack.]
  
    Description []
                 
    SideEffects []
  
    SeeAlso     []
  
  ***********************************************************************/
  void Parse_StackOpPush( Parse_StackOp_t * p, int Oper )
  {
      if ( p->Top >= p->Size )
      {
          printf( "Parse_StackOpPush(): Stack size is too small!\n" );
          return;
      }
      p->pData[ p->Top++ ] = Oper;
  }
  
  /**Function*************************************************************
  
    Synopsis    [Pops an entry out of the stack.]
  
    Description []
                 
    SideEffects []
  
    SeeAlso     []
  
  ***********************************************************************/
  int Parse_StackOpPop( Parse_StackOp_t * p )
  {
      if ( p->Top == 0 )
      {
          printf( "Parse_StackOpPush(): Trying to extract data from the empty stack!\n" );
          return -1;
      }
      return p->pData[ --p->Top ];
  }
  
  /**Function*************************************************************
  
    Synopsis    [Deletes the stack.]
  
    Description []
                 
    SideEffects []
  
    SeeAlso     []
  
  ***********************************************************************/
  void Parse_StackOpFree( Parse_StackOp_t * p )
  {
      FREE( p->pData );
      FREE( p );
  }
  
  
  ////////////////////////////////////////////////////////////////////////
  ///                       END OF FILE                                ///
  ////////////////////////////////////////////////////////////////////////
  
  
  