home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ober1096.zip / libsrc / intsequences.obe < prev    next >
Text File  |  1995-04-04  |  5KB  |  207 lines

  1. MODULE IntSequences;
  2.  
  3. IMPORT SYSTEM;
  4.  
  5. TYPE
  6.   ElemPtr = POINTER TO Elem;
  7.  
  8.   Elem = RECORD
  9.            prev,next : ElemPtr;
  10.            num : INTEGER;
  11.          END;
  12.  
  13.   Sequence* = RECORD
  14.                 first,last,cursor : ElemPtr;
  15.                 length : INTEGER;
  16.               END;
  17.  
  18.  
  19. PROCEDURE (VAR s : Sequence) Create*;
  20. (* initialize the sequence *)
  21. BEGIN
  22.   s.length := 0;
  23.   s.first := NIL;
  24.   s.last := NIL;
  25. END Create;
  26.  
  27. PROCEDURE (VAR s : Sequence) LinkLeft* (num : INTEGER);
  28. VAR
  29.   elem : ElemPtr;
  30. BEGIN
  31.   NEW(elem);
  32.   elem.num := num;
  33.   IF s.last = NIL THEN
  34.     s.last := elem;
  35.   ELSE
  36.     elem.next := s.first;
  37.     s.first.prev := elem;
  38.   END;
  39.   s.first := elem;
  40.   INC(s.length);
  41. END LinkLeft;
  42.  
  43. PROCEDURE (VAR s : Sequence) LinkRight* (num : INTEGER);
  44. VAR
  45.   elem : ElemPtr;
  46. BEGIN
  47.   NEW(elem);
  48.   elem.num := num;
  49.   IF s.first = NIL THEN
  50.     s.first := elem;
  51.   ELSE
  52.     elem.prev := s.last;
  53.     s.last.next := elem;
  54.   END;
  55.   s.last := elem;
  56.   INC(s.length);
  57. END LinkRight;
  58.  
  59. PROCEDURE (VAR s : Sequence) GetNext* (VAR result : INTEGER);
  60. (* pre:  the cursor has been initialized using GetFirst or GetLast *)
  61. (* post: returns 0 if ended *)
  62. BEGIN
  63.   IF (s.cursor = NIL) OR (s.cursor.next = NIL) THEN
  64.     result := 0;
  65.     s.cursor := NIL;
  66.   ELSE
  67.     s.cursor := s.cursor.next;
  68.     result := s.cursor.num;
  69.   END;
  70. END GetNext;
  71.   
  72. PROCEDURE (VAR s : Sequence) GetPrevious* (VAR result : INTEGER);
  73. (* pre:  the cursor has been initialized using GetFirst or GetLast *)
  74. (* post: memory error if sequence is ended *)
  75. BEGIN
  76.   IF (s.cursor = NIL) OR (s.cursor.prev = NIL) THEN
  77.     result := 0;
  78.     s.cursor := NIL;
  79.   ELSE
  80.     s.cursor := s.cursor.prev;
  81.     result := s.cursor.num;
  82.   END;
  83. END GetPrevious;
  84.  
  85. PROCEDURE (VAR s : Sequence) GetFirst* (VAR result : INTEGER);
  86. (* pre: none *)
  87. (* post: the cursor is initialized and the first element is returned, *)
  88. (*       memory error if sequence is empty                            *)
  89. BEGIN
  90.   IF s.first = NIL THEN
  91.     result := 0;
  92.     s.cursor := NIL;
  93.   ELSE
  94.     s.cursor := s.first;
  95.     result := s.first.num;
  96.   END;
  97. END GetFirst;
  98.  
  99. PROCEDURE (VAR s : Sequence) GetLast* (VAR result : INTEGER);
  100. (* pre: none *)
  101. (* post: the cursor is initialized and the last element is returned, *)
  102. (*       memory error if sequence is empty                           *)
  103. BEGIN
  104.   IF s.last = NIL THEN
  105.     result := 0;
  106.     s.cursor := NIL;
  107.   ELSE
  108.     s.cursor := s.last;
  109.     result := s.last.num;
  110.   END;
  111. END GetLast;
  112.  
  113. PROCEDURE (VAR s : Sequence) LengthOf* () : INTEGER;
  114. BEGIN
  115.   RETURN s.length;
  116. END LengthOf;
  117.  
  118. PROCEDURE (VAR s : Sequence) Ended*() : BOOLEAN;
  119. (* pre: a cursor is attached *)
  120. (* post: returns cursor = NIL *)
  121. BEGIN
  122.   RETURN s.cursor = NIL;
  123. END Ended;
  124.  
  125. PROCEDURE (VAR s : Sequence) NextIsLast*() : BOOLEAN;
  126. BEGIN
  127.   IF s.cursor = NIL THEN RETURN FALSE;
  128.   ELSE
  129.     RETURN s.cursor.next = s.last;
  130.   END;
  131. END NextIsLast;
  132.  
  133. PROCEDURE (VAR s : Sequence) NextIsFirst*() : BOOLEAN;
  134. BEGIN
  135.   IF s.cursor = NIL THEN RETURN FALSE;
  136.   ELSE
  137.     RETURN s.cursor.prev = s.first;
  138.   END;
  139. END NextIsFirst;
  140.  
  141. PROCEDURE (VAR s : Sequence) IsEmpty*() : BOOLEAN;
  142. BEGIN
  143.   RETURN s.length = 0;
  144. END IsEmpty;
  145.  
  146. PROCEDURE (VAR s : Sequence) Remove*;
  147. (* pre: sequence is not empty and a cursor has been attached *)
  148. (* post: the element at the cursor position is removed from the sequence *)
  149. VAR
  150.   temp : ElemPtr;
  151. BEGIN
  152.   ASSERT(s.cursor # NIL);
  153.   temp := s.cursor;
  154.   temp.next.prev := temp.prev;
  155.   temp.prev.next := temp.next;
  156.   DEC(s.length);
  157.   s.cursor := temp.next;
  158.   IF s.first = temp THEN
  159.     s.first := temp.next;
  160.   END;
  161.   IF s.last = temp THEN
  162.     s.last := temp.prev;
  163.   END;
  164. END Remove;
  165.  
  166. PROCEDURE (VAR s : Sequence) InsertRight* (num : INTEGER);
  167. (* pre: sequence is not empty and a cursor has been attached *)
  168. (* post: the element is inserted right of the element at the cursor position *)
  169. VAR
  170.   temp : ElemPtr;
  171. BEGIN
  172.   NEW(temp);
  173.   temp.num := num;
  174.   temp.next := s.cursor.next;
  175.   temp.prev := s.cursor;
  176.   s.cursor.next := temp;
  177.   INC(s.length); 
  178.   IF s.last = s.cursor THEN
  179.     s.last := temp;
  180.   ELSE
  181.     temp.next.prev := temp; 
  182.   END;
  183. END InsertRight;
  184.   
  185. PROCEDURE (VAR s : Sequence) InsertLeft* (num : INTEGER);
  186. (* pre: sequence is not empty and a cursor has been attached *)
  187. (* post: the element is inserted left of the element at the cursor position *)
  188. VAR
  189.   temp : ElemPtr;
  190. BEGIN
  191.   NEW(temp);
  192.   temp.num := num;
  193.   temp.next := s.cursor;
  194.   temp.prev := s.cursor.prev;
  195.   s.cursor.prev := temp;
  196.   INC(s.length); 
  197.   IF s.first = s.cursor THEN
  198.     s.first := temp;
  199.   ELSE
  200.     temp.prev.next := temp; 
  201.   END;
  202. END InsertLeft;
  203.   
  204. END IntSequences.  
  205.   
  206.   
  207.