fstack.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:3k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * fstack.c
  4.  *   Fixed format stack definitions.
  5.  *
  6.  * Copyright (c) 1994, Regents of the University of California
  7.  *
  8.  *
  9.  * IDENTIFICATION
  10.  *   $Header: /usr/local/cvsroot/pgsql/src/backend/lib/fstack.c,v 1.11 1999/05/25 16:08:52 momjian Exp $
  11.  *
  12.  *-------------------------------------------------------------------------
  13.  */
  14. #include <postgres.h>
  15. #include <lib/fstack.h>
  16. /*
  17.  * Internal function definitions
  18.  */
  19. /*
  20.  * FixedItemIsValid
  21.  * True iff item is valid.
  22.  */
  23. #define FixedItemIsValid(item) PointerIsValid(item)
  24. /*
  25.  * FixedStackGetItemBase
  26.  * Returns base of enclosing structure.
  27.  */
  28. #define FixedStackGetItemBase(stack, item) 
  29. ((Pointer)((char *)(item) - (stack)->offset))
  30. /*
  31.  * FixedStackGetItem
  32.  * Returns item of given pointer to enclosing structure.
  33.  */
  34. #define FixedStackGetItem(stack, pointer) 
  35. ((FixedItem)((char *)(pointer) + (stack)->offset))
  36. #define FixedStackIsValid(stack) ((bool)PointerIsValid(stack))
  37. /*
  38.  * External functions
  39.  */
  40. void
  41. FixedStackInit(FixedStack stack, Offset offset)
  42. {
  43. AssertArg(PointerIsValid(stack));
  44. stack->top = NULL;
  45. stack->offset = offset;
  46. }
  47. Pointer
  48. FixedStackPop(FixedStack stack)
  49. {
  50. Pointer pointer;
  51. AssertArg(FixedStackIsValid(stack));
  52. if (!PointerIsValid(stack->top))
  53. return NULL;
  54. pointer = FixedStackGetItemBase(stack, stack->top);
  55. stack->top = stack->top->next;
  56. return pointer;
  57. }
  58. void
  59. FixedStackPush(FixedStack stack, Pointer pointer)
  60. {
  61. FixedItem item = FixedStackGetItem(stack, pointer);
  62. AssertArg(FixedStackIsValid(stack));
  63. AssertArg(PointerIsValid(pointer));
  64. item->next = stack->top;
  65. stack->top = item;
  66. }
  67. #ifdef USE_ASSERT_CHECKING
  68. /*
  69.  * FixedStackContains
  70.  * True iff ordered stack contains given element.
  71.  *
  72.  * Note:
  73.  * This is inefficient.  It is intended for debugging use only.
  74.  *
  75.  * Exceptions:
  76.  * BadArg if stack is invalid.
  77.  * BadArg if pointer is invalid.
  78.  */
  79. static bool
  80. FixedStackContains(FixedStack stack, Pointer pointer)
  81. {
  82. FixedItem next;
  83. FixedItem item;
  84. AssertArg(FixedStackIsValid(stack));
  85. AssertArg(PointerIsValid(pointer));
  86. item = FixedStackGetItem(stack, pointer);
  87. for (next = stack->top; FixedItemIsValid(next); next = next->next)
  88. {
  89. if (next == item)
  90. return true;
  91. }
  92. return false;
  93. }
  94. #endif
  95. Pointer
  96. FixedStackGetTop(FixedStack stack)
  97. {
  98. AssertArg(FixedStackIsValid(stack));
  99. if (!PointerIsValid(stack->top))
  100. return NULL;
  101. return FixedStackGetItemBase(stack, stack->top);
  102. }
  103. Pointer
  104. FixedStackGetNext(FixedStack stack, Pointer pointer)
  105. {
  106. FixedItem item;
  107. /* AssertArg(FixedStackIsValid(stack)); */
  108. /* AssertArg(PointerIsValid(pointer)); */
  109. AssertArg(FixedStackContains(stack, pointer));
  110. item = FixedStackGetItem(stack, pointer)->next;
  111. if (!PointerIsValid(item))
  112. return NULL;
  113. return FixedStackGetItemBase(stack, item);
  114. }