home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / database / postgres / postgre4.z / postgre4 / src / lib / C / fstack.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-08-27  |  2.8 KB  |  166 lines

  1. /*
  2.  * fstack.c --
  3.  *    Fixed format stack definitions.
  4.  */
  5.  
  6. #include "tmp/c.h"
  7.  
  8. RcsId("$Header: /private/postgres/src/lib/C/RCS/fstack.c,v 1.3 1990/09/25 16:22:12 kemnitz Exp $");
  9.  
  10. #include "tmp/fstack.h"
  11.  
  12. /*
  13.  * Internal function definitions
  14.  */
  15.  
  16. /*
  17.  * FixedItemIsValid --
  18.  *    True iff item is valid.
  19.  */
  20. #define FixedItemIsValid(item)    PointerIsValid(item)
  21.  
  22. /*
  23.  * FixedStackGetItemBase --
  24.  *    Returns base of enclosing structure.
  25.  */
  26. #define FixedStackGetItemBase(stack, item) \
  27.     ((Pointer)((char *)(item) - (stack)->offset))
  28.  
  29. /*
  30.  * FixedStackGetItem --
  31.  *    Returns item of given pointer to enclosing structure.
  32.  */
  33. #define FixedStackGetItem(stack, pointer) \
  34.     ((FixedItem)((char *)(pointer) + (stack)->offset))
  35.  
  36. /*
  37.  * External functions
  38.  */
  39.  
  40. bool
  41. FixedStackIsValid(stack)
  42.     FixedStack    stack;
  43. {
  44.     return ((bool)PointerIsValid(stack));
  45. }
  46.  
  47. void
  48. FixedStackInit(stack, offset)
  49.     FixedStack    stack;
  50.     Offset        offset;
  51. {
  52.     AssertArg(PointerIsValid(stack));
  53.  
  54.     stack->top = NULL;
  55.     stack->offset = offset;
  56. }
  57.  
  58. Pointer
  59. FixedStackPop(stack)
  60.     FixedStack    stack;
  61. {
  62.     Pointer    pointer;
  63.  
  64.     AssertArg(FixedStackIsValid(stack));
  65.  
  66.     if (!PointerIsValid(stack->top)) {
  67.         return (NULL);
  68.     }
  69.  
  70.     pointer = FixedStackGetItemBase(stack, stack->top);
  71.     stack->top = stack->top->next;
  72.  
  73.     return (pointer);
  74. }
  75.  
  76. void
  77. FixedStackPush(stack, pointer)
  78.     FixedStack    stack;
  79.     Pointer        pointer;
  80. {
  81.     FixedItem    item = FixedStackGetItem(stack, pointer);
  82.  
  83.     AssertArg(FixedStackIsValid(stack));
  84.     AssertArg(PointerIsValid(pointer));
  85.  
  86.     item->next = stack->top;
  87.     stack->top = item;
  88. }
  89.  
  90. Count
  91. FixedStackIterate(stack, function)
  92.     FixedStack    stack;
  93.     void        (*function) ARGS((Pointer pointer));
  94. {
  95.     Pointer    pointer;
  96.     Count    count = 0;
  97.  
  98.     /* AssertArg(FixedStackIsValid(stack)); */
  99.  
  100.     for (pointer = FixedStackGetTop(stack);
  101.             PointerIsValid(pointer);
  102.             pointer = FixedStackGetNext(stack, pointer)) {
  103.  
  104.         if (PointerIsValid(function)) {
  105.             (*function)(pointer);
  106.         }
  107.         count += 1;
  108.     }
  109.     return (count);
  110. }
  111.  
  112.  
  113. bool
  114. FixedStackContains(stack, pointer)
  115.     FixedStack    stack;
  116.     Pointer        pointer;
  117. {
  118.     FixedItem    next;
  119.     FixedItem    item;
  120.  
  121.     AssertArg(FixedStackIsValid(stack));
  122.     AssertArg(PointerIsValid(pointer));
  123.  
  124.     item = FixedStackGetItem(stack, pointer);
  125.  
  126.     for (next = stack->top; FixedItemIsValid(next); next = next->next) {
  127.         if (next == item) {
  128.             return (true);
  129.         }
  130.     }
  131.     return (false);
  132. }
  133.  
  134. Pointer
  135. FixedStackGetTop(stack)
  136.     FixedStack    stack;
  137. {
  138.     AssertArg(FixedStackIsValid(stack));
  139.  
  140.     if (!PointerIsValid(stack->top)) {
  141.         return (NULL);
  142.     }
  143.  
  144.     return (FixedStackGetItemBase(stack, stack->top));
  145. }
  146.  
  147. Pointer
  148. FixedStackGetNext(stack, pointer)
  149.     FixedStack    stack;
  150.     Pointer        pointer;
  151. {
  152.     FixedItem    item;
  153.  
  154.     /* AssertArg(FixedStackIsValid(stack)); */
  155.     /* AssertArg(PointerIsValid(pointer)); */
  156.     AssertArg(FixedStackContains(stack, pointer));
  157.  
  158.     item = FixedStackGetItem(stack, pointer)->next;
  159.  
  160.     if (!PointerIsValid(item)) {
  161.         return (NULL);
  162.     }
  163.  
  164.     return(FixedStackGetItemBase(stack, item));
  165. }
  166.