/* fairly public information; not hidden */

#include <X11/Intrinsic.h>

typedef struct {
	XtArgVal *data;
	int allocated;
	int top;
	int current;
} Stack;

#define StackIsEmpty(stack)     (0==(stack)->top)
#define StackCurrent(stack)     ((stack)->current)
#define StackSize(stack)        ((stack)->top)
#define StackArray(stack)       ((stack)->data)
#define PopStack(stack)         ((stack)->data[--((stack)->top)])

#if NeedFunctionPrototypes
extern Stack *InitStack(void);
extern void FreeStack (Stack *stack);
extern XtArgVal PushStack (Stack *stack,XtArgVal value);
#else
extern Stack *InitStack();
extern void FreeStack ();
extern XtArgVal PushStack ();
#endif

/*
 * Here are some macros that use these generic functions for
 * specific purposes.
 */
#define PushXmString(stack, string) \
    (XmString) PushStack((stack), (XtArgVal)(string))
#define FreeXmStrings(stack)\
    while (!StackIsEmpty((stack))) XmStringFree((XmString)PopStack((stack)))

#define PushChild(stack, w) \
    (Widget) PushStack((stack), (XtArgVal)(w))
#define ManageChildren(stack) \
    XtManageChildren(StackArray(stack), StackSize(stack))

	
