aboutsummaryrefslogtreecommitdiff
path: root/src/backend/lib/fstack.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/lib/fstack.c')
-rw-r--r--src/backend/lib/fstack.c153
1 files changed, 153 insertions, 0 deletions
diff --git a/src/backend/lib/fstack.c b/src/backend/lib/fstack.c
new file mode 100644
index 00000000000..541767183d8
--- /dev/null
+++ b/src/backend/lib/fstack.c
@@ -0,0 +1,153 @@
+/*-------------------------------------------------------------------------
+ *
+ * fstack.c--
+ * Fixed format stack definitions.
+ *
+ * Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * $Header: /cvsroot/pgsql/src/backend/lib/Attic/fstack.c,v 1.1.1.1 1996/07/09 06:21:28 scrappy Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "c.h"
+#include "lib/fstack.h"
+
+/*
+ * Internal function definitions
+ */
+
+/*
+ * FixedItemIsValid --
+ * True iff item is valid.
+ */
+#define FixedItemIsValid(item) PointerIsValid(item)
+
+/*
+ * FixedStackGetItemBase --
+ * Returns base of enclosing structure.
+ */
+#define FixedStackGetItemBase(stack, item) \
+ ((Pointer)((char *)(item) - (stack)->offset))
+
+/*
+ * FixedStackGetItem --
+ * Returns item of given pointer to enclosing structure.
+ */
+#define FixedStackGetItem(stack, pointer) \
+ ((FixedItem)((char *)(pointer) + (stack)->offset))
+
+/*
+ * External functions
+ */
+
+/*
+ * FixedStackIsValid --
+ * True iff stack is valid.
+ */
+static bool
+FixedStackIsValid(FixedStack stack)
+{
+ return ((bool)PointerIsValid(stack));
+}
+
+
+void
+FixedStackInit(FixedStack stack, Offset offset)
+{
+ AssertArg(PointerIsValid(stack));
+
+ stack->top = NULL;
+ stack->offset = offset;
+}
+
+Pointer
+FixedStackPop(FixedStack stack)
+{
+ Pointer pointer;
+
+ AssertArg(FixedStackIsValid(stack));
+
+ if (!PointerIsValid(stack->top)) {
+ return (NULL);
+ }
+
+ pointer = FixedStackGetItemBase(stack, stack->top);
+ stack->top = stack->top->next;
+
+ return (pointer);
+}
+
+void
+FixedStackPush(FixedStack stack, Pointer pointer)
+{
+ FixedItem item = FixedStackGetItem(stack, pointer);
+
+ AssertArg(FixedStackIsValid(stack));
+ AssertArg(PointerIsValid(pointer));
+
+ item->next = stack->top;
+ stack->top = item;
+}
+
+
+/*
+ * FixedStackContains --
+ * True iff ordered stack contains given element.
+ *
+ * Note:
+ * This is inefficient. It is intended for debugging use only.
+ *
+ * Exceptions:
+ * BadArg if stack is invalid.
+ * BadArg if pointer is invalid.
+ */
+static bool
+FixedStackContains(FixedStack stack, Pointer pointer)
+{
+ FixedItem next;
+ FixedItem item;
+
+ AssertArg(FixedStackIsValid(stack));
+ AssertArg(PointerIsValid(pointer));
+
+ item = FixedStackGetItem(stack, pointer);
+
+ for (next = stack->top; FixedItemIsValid(next); next = next->next) {
+ if (next == item) {
+ return (true);
+ }
+ }
+ return (false);
+}
+
+Pointer
+FixedStackGetTop(FixedStack stack)
+{
+ AssertArg(FixedStackIsValid(stack));
+
+ if (!PointerIsValid(stack->top)) {
+ return (NULL);
+ }
+
+ return (FixedStackGetItemBase(stack, stack->top));
+}
+
+Pointer
+FixedStackGetNext(FixedStack stack, Pointer pointer)
+{
+ FixedItem item;
+
+ /* AssertArg(FixedStackIsValid(stack)); */
+ /* AssertArg(PointerIsValid(pointer)); */
+ AssertArg(FixedStackContains(stack, pointer));
+
+ item = FixedStackGetItem(stack, pointer)->next;
+
+ if (!PointerIsValid(item)) {
+ return (NULL);
+ }
+
+ return(FixedStackGetItemBase(stack, item));
+}