home *** CD-ROM | disk | FTP | other *** search
Text File | 1991-08-23 | 9.0 KB | 359 lines | [TEXT/PJMM] |
- unit MyLists;
- { DeHQX v2.0.0 © Peter Lewis, Aug 1991 }
-
- interface
-
- { Some types have been changed to avoid clashing with the list manager }
- type
- listHead = ^listItemPtr; { Use to be listHeadHandle }
- listItem = ^listItemPtr; { Use to be listHandle }
- listItemPtr = ^listNode; { Use to be listPtr }
- listNode = record
- head: boolean;
- next: listItem;
- prev: listItem;
- this: handle;
- end;
-
- var
- listError: boolean;
-
- procedure CreateList (var l: listHead);
- procedure DestroyList (var l: listHead; dispose: boolean);
-
- procedure ReturnHead (lh: listHead; var l: listItem);
- (* <a> b c / <a> b c / <a> b c / <a> / <a> / <> *)
- procedure ReturnTail (lh: listHead; var l: listItem);
- (* a b c <> / a b c <> / a b c <> / a b c <> / a <> / a <> / <> *)
-
- procedure MoveToHead (var l: listItem);
- (* <a> b c / <a> b c / <a> b c / <a> b c / <a> / <a> / <> *)
- procedure MoveToTail (var l: listItem);
- (* a b c <> / a b c <> / a b c <> / a b c <> / a <> / a <> / <> *)
- procedure MoveToNext (var l: listItem);
- (* a <b> c / a b <c> / a b c <> / error / a <> / error / error *)
- procedure MoveToPrev (var l: listItem);
- (* error / <a> b c / a <b> c / a b <c> / error / <a> / error *)
-
- procedure AddHead (l: listHead; it: univ handle);
- (* x <a> b c / x a <b> c / x a b <c> / x a b c <> / x <a> / x a <> / x <>*)
- procedure AddTail (l: listHead; it: univ handle);
- (* <a> b c x / a <b> c x / a b <c> x / a b c x <> / <a> x / a x <> / x <>*)
- procedure AddBefore (l: listItem; it: univ handle);
- (* x <a> b c / a x <b> c / a b x <c> / a b c x <> / x <a> / a x <> / x <>*)
- procedure AddAfter (l: listItem; it: univ handle);
- (* <a> x b c / a <b> x c / a b <c> x / error / <a> x / error / error *)
-
- procedure DeleteHead (l: listHead; var it: univ handle);
- (* <?> b c / <b> c / b <c> / b c <> / <?> / <> / error *)
- procedure DeleteTail (l: listHead; var it: univ handle);
- (* <a> b / a <b> / a b <?> / a b <> / <?> / <> / error *)
- procedure DeletePrev (l: listItem; var it: univ handle);
- (* error / <b> c / a <c> / a b <> / error / <> / error *)
- procedure DeleteNext (l: listItem; var it: univ handle);
- (* <a> c / a <b> / error / error / error / error / error *)
- procedure DeleteItem (var l: listItem; var it: univ handle);
- (* <b> c / a <c> / a b <> / error / <> / error / error *)
-
- procedure FetchHead (l: listHead; var it: univ handle);
- (* a / a / a / a / a / a / error *)
- procedure FetchTail (l: listHead; var it: univ handle);
- (* c / c / c / c / a / a / error *)
- procedure FetchNext (l: listItem; var it: univ handle);
- (* b / c / error / error / error / error / error *)
- procedure FetchPrev (l: listItem; var it: univ handle);
- (* error / a / b / c / error / a / error *)
- procedure Fetch (l: listItem; var it: univ handle);
- (* a / b / c / error / a / error / error *)
-
- function IsHead (l: listItem): boolean;
- (* T / F / F / F / T / F / T *)
- function IsTail (l: listItem): boolean;
- (* F / F / F / T / F / T / T *)
- function IsEmpty (l: listHead): boolean;
- (* F / F / F / F / F / F / T *)
-
- procedure DisplayList (lh: listHead);
- (* To the Text Screen *)
-
- implementation
-
- { Internal Routines }
-
- procedure DestroyListHandle (var l: univ listItem);
- begin
- { l^^.next := nil; These dont do any good }
- { l ^ ^ . prev := nil; cause DisposHandle }
- { l ^ ^ . this := nil; destroys the data }
- DisposHandle(handle(l));
- l := nil;
- end;
-
- procedure CreateListHandle (var l: univ listItem);
- begin
- l := listItem(NewHandle(SizeOf(listNode)));
- end;
-
- procedure MoveToStart (var l: univ listItem);
- var
- tmp: listItem;
- begin
- if not l^^.head then begin
- tmp := l;
- repeat
- l := l^^.next;
- until (tmp = l) or l^^.head;
- if tmp = l then
- listError := true;
- end;
- end;
-
- procedure InsertBefore (l: univ listItem; var it: univ handle);
- var
- tmp: listItem;
- begin
- CreateListHandle(tmp);
- tmp^^.head := false;
- tmp^^.this := it;
- tmp^^.next := l;
- tmp^^.prev := l^^.prev;
- l^^.prev^^.next := tmp;
- l^^.prev := tmp;
- end;
-
- procedure DeleteNode (l: listItem; var it: univ handle);
- begin
- if l^^.head then
- listError := true
- else begin
- it := l^^.this;
- l^^.prev^^.next := l^^.next;
- l^^.next^^.prev := l^^.prev;
- DestroyListHandle(l);
- end;
- end;
-
- procedure FetchNode (l: listItem; var it: univ handle);
- begin
- if l^^.head then
- listError := true;
- it := l^^.this;
- end;
-
- { External Routines }
-
- procedure CreateList (var l: listHead);
- begin
- CreateListHandle(l);
- l^^.head := true;
- l^^.next := listItem(l);
- l^^.prev := listItem(l);
- l^^.this := nil;
- end;
-
- procedure DestroyList (var l: listHead; dispose: boolean);
- var
- tmp, tmp2: listItem;
- begin
- tmp := l^^.next;
- while tmp <> listItem(l) do begin
- tmp2 := tmp;
- tmp := tmp^^.next;
- if dispose then
- DisposHandle(tmp2^^.this);
- DestroyListHandle(tmp2);
- end;
- if dispose then
- DisposHandle(l^^.this);
- DestroyListHandle(l);
- end;
-
- procedure ReturnHead (lh: listHead; var l: listItem);
- (* <a> b c / <a> b c / <a> b c / <a> / <a> / <> *)
- begin
- l := lh^^.next;
- end;
-
- procedure ReturnTail (lh: listHead; var l: listItem);
- (* a b c <> / a b c <> / a b c <> / a b c <> / a <> / a <> / <> *)
- begin
- l := listItem(lh);
- end;
-
- procedure MoveToHead (var l: listItem);
- (* <a> b c / <a> b c / <a> b c / <a> b c / <a> / <a> / <> *)
- begin
- MoveToStart(l);
- l := l^^.next;
- end;
-
- procedure MoveToTail (var l: listItem);
- (* a b c <> / a b c <> / a b c <> / a b c <> / a <> / a <> / <> *)
- begin
- MoveToStart(l);
- end;
-
- procedure MoveToNext (var l: listItem);
- (* a <b> c / a b <c> / a b c <> / error / a <> / error / error *)
- begin
- if l^^.head then
- listError := true
- else
- l := l^^.next;
- end;
-
- procedure MoveToPrev (var l: listItem);
- (* error / <a> b c / a <b> c / a b <c> / error / <a> / error *)
- begin
- if l^^.prev^^.head then
- listError := true
- else
- l := l^^.prev;
- end;
-
- procedure AddHead (l: listHead; it: univ handle);
- (* x <a> b c / x a <b> c / x a b <c> / x a b c <> / x <a> / x a <> / x <>*)
- begin
- InsertBefore(l^^.next, it);
- end;
-
- procedure AddTail (l: listHead; it: univ handle);
- (* <a> b c x / a <b> c x / a b <c> x / a b c x <> / <a> x / a x <> / x <>*)
- begin
- InsertBefore(l, it);
- end;
-
- procedure AddBefore (l: listItem; it: univ handle);
- (* x <a> b c / a x <b> c / a b x <c> / a b c x <> / x <a> / a x <> / x <>*)
- begin
- InsertBefore(l, it);
- end;
-
- procedure AddAfter (l: listItem; it: univ handle);
- (* <a> x b c / a <b> x c / a b <c> x / error / <a> x / error / error *)
- begin
- if l^^.head then
- listError := true
- else
- InsertBefore(l^^.next, it);
- end;
-
- procedure DeleteHead (l: listHead; var it: univ handle);
- (* <?> b c / <b> c / b <c> / b c <> / <?> / <> / error *)
- begin
- DeleteNode(l^^.next, it);
- end;
-
- procedure DeleteTail (l: listHead; var it: univ handle);
- (* <a> b / a <b> / a b <?> / a b <> / <?> / <> / error *)
- begin
- DeleteNode(l^^.prev, it);
- end;
-
- procedure DeletePrev (l: listItem; var it: univ handle);
- (* error / <b> c / a <c> / a b <> / error / <> / error *)
- var
- tmp: listItem;
- begin
- DeleteNode(l^^.prev, it);
- end;
-
- procedure DeleteNext (l: listItem; var it: univ handle);
- (* <a> c / a <b> / error / error / error / error / error *)
- begin
- if l^^.head then begin
- listError := true;
- it := nil;
- end
- else
- DeleteNode(l^^.next, it);
- end;
-
- procedure DeleteItem (var l: listItem; var it: univ handle);
- (* <b> c / a <c> / a b <> / error / <> / error / error *)
- var
- tmp: listItem;
- begin
- if l^^.head then begin
- listError := true;
- it := nil;
- end
- else begin
- tmp := l^^.next;
- DeleteNode(l, it);
- l := tmp;
- end;
- end;
-
- procedure FetchHead (l: listHead; var it: univ handle);
- (* a / a / a / a / a / a / error *)
- begin
- FetchNode(l^^.next, it);
- end;
-
- procedure FetchTail (l: listHead; var it: univ handle);
- (* c / c / c / c / a / a / error *)
- begin
- FetchNode(l^^.prev, it);
- end;
-
- procedure FetchNext (l: listItem; var it: univ handle);
- (* b / c / error / error / error / error / error *)
- begin
- if l^^.head then begin
- listError := true;
- it := nil;
- end
- else
- FetchNode(l^^.next, it);
- end;
-
- procedure FetchPrev (l: listItem; var it: univ handle);
- (* error / a / b / c / error / a / error *)
- begin
- FetchNode(l^^.prev, it);
- end;
-
- procedure Fetch (l: listItem; var it: univ handle);
- (* a / b / c / error / a / error / error *)
- begin
- FetchNode(l, it);
- end;
-
- function IsHead (l: listItem): boolean;
- (* T / F / F / F / T / F / T *)
- begin
- IsHead := l^^.prev^^.head;
- end;
-
- function IsTail (l: listItem): boolean;
- (* F / F / F / T / F / T / T *)
- begin
- IsTail := l^^.head;
- end;
-
- function IsEmpty (l: listHead): boolean;
- (* F / F / F / F / F / F / T *)
- begin
- IsEmpty := l^^.next = listItem(l);
- end;
-
- procedure DisplayList (lh: listHead);
- var
- l: listItem;
- h: longInt;
- begin
- ShowText;
- ReturnHead(lh, l);
- write('(');
- while not IsTail(l) do begin
- Fetch(l, h);
- MoveToNext(l);
- write(h : 1);
- if not IsTail(l) then
- write(',');
- end;
- writeln(' )');
- end;
-
- end.