--- /dev/null
+/*****************************************************************
+ * SQUID - a library of functions for biological sequence analysis
+ * Copyright (C) 1992-2002 Washington University School of Medicine
+ *
+ * This source code is freely distributed under the terms of the
+ * GNU General Public License. See the files COPYRIGHT and LICENSE
+ * for details.
+ *****************************************************************/
+
+/* stack.c
+ * SRE, Thu Mar 3 10:08:48 1994
+ *
+ * Implementation of generic stack structures.
+ * RCS $Id: stack.c 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: stack.c,v 1.2 1998/10/09 18:07:16 eddy Exp)
+ */
+
+#include <stdlib.h>
+#include "squid.h"
+
+#ifdef MEMDEBUG
+#include "dbmalloc.h"
+#endif
+
+
+/************************************************************
+ * intstack_s implementation.
+ *
+ * Functions: InitIntStack() - returns ptr to new stack
+ * PushIntStack() - (void)
+ * PopIntStack() - returns 1 on success, 0 if stack empty
+ * FreeIntStack() - returns number of elements free'd, or 0 if
+ * stack was empty.
+ *
+ * Implementation of the pushdown stack for storing single
+ * integers.
+ *************************************************************/
+struct intstack_s *
+InitIntStack(void)
+{
+ struct intstack_s *stack;
+
+ if ((stack = (struct intstack_s *) malloc (sizeof(struct intstack_s))) == NULL)
+ Die("Memory allocation failure at %s line %d", __FILE__, __LINE__);
+ stack->nxt = NULL;
+ return stack;
+}
+void
+PushIntStack(struct intstack_s *stack, int data)
+{
+ struct intstack_s *new;
+
+ if ((new = (struct intstack_s *) malloc (sizeof(struct intstack_s))) == NULL)
+ Die("Memory allocation failure at %s line %d", __FILE__, __LINE__);
+ new->data = data;
+
+ new->nxt = stack->nxt;
+ stack->nxt = new;
+}
+
+int
+PopIntStack(struct intstack_s *stack, int *ret_data)
+{
+ struct intstack_s *old;
+
+ if (stack->nxt == NULL) return 0;
+
+ old = stack->nxt;
+ stack->nxt = old->nxt;
+
+ *ret_data = old->data;
+ free(old);
+ return 1;
+}
+
+void
+ReverseIntStack(struct intstack_s *stack)
+{
+ struct intstack_s *old;
+ struct intstack_s *new;
+
+ old = stack->nxt;
+ stack->nxt = NULL;
+ while (old != NULL)
+ {
+ new = old; /* remove one from top of old stack */
+ old = old->nxt;
+ new->nxt = stack->nxt; /* push it onto new stack */
+ stack->nxt = new;
+ }
+}
+
+int
+FreeIntStack( struct intstack_s *stack )
+{
+ int data;
+ int count = 0;
+
+ while (PopIntStack(stack, &data))
+ count++;
+ free(stack);
+ return count;
+}