Wrapper for Clustal Omega.
[jabaws.git] / binaries / src / clustalo / src / squid / stack.c
diff --git a/binaries/src/clustalo/src/squid/stack.c b/binaries/src/clustalo/src/squid/stack.c
new file mode 100644 (file)
index 0000000..66050d2
--- /dev/null
@@ -0,0 +1,102 @@
+/*****************************************************************
+ * 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;
+}