/*
** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2001.
** See ../LICENSE for license information.
**
*/
/*
** sRefSetStack.h
*/

# ifndef sRefSetStack_H
# define sRefSetStack_H

typedef struct _sRefSetStack *sRefSetStack ;

typedef struct _sRefSetStack
{
  sRefSet elements;
  sRefSet allElements;
  sRefSetStack thisbranch;
  sRefSetStack lastbranch;
  sRefSetStack parent;
  int lexlevel;
} _sRefSetStack ;

extern sRefSetStack sRefSetStack_new(void);

extern void sRefSetStack_push (sRefSetStack s, sRef el) ;
extern sRefSetStack sRefSetStack_pop (sRefSetStack s) ;
extern sRefSet sRefSetStack_top (sRefSetStack s) ;

extern cstring sRefSetStack_unparse (sRefSetStack s) ;
extern void sRefSetStack_free (/*@only@*/ sRefSetStack s) ;
extern sRefSetStack sRefSetStack_init (void);

extern sRefSetStack sRefSetStack_branch (sRefSetStack s);
extern sRefSetStack sRefSetStack_trueBranch (sRefSetStack s);
extern sRefSetStack sRefSetStack_altBranch (sRefSetStack s);
extern sRefSetStack sRefSetStack_popBranches (sRefSetStack alt);
extern sRefSetStack sRefSetStack_popTrueBranch (sRefSetStack s);

# define sRefSetStackBASESIZE    MIDBASESIZE
# define sRefSetStackNULL        ((sRefSetStack)0)
# define sRefSetStack_undefined  (sRefSetStackNULL)

# else
# error "Multiple include"
# endif




