Contributor: MIKE PHILLIPS


UNIT Queues;  { see test program at the end ! }

INTERFACE

TYPE
  PStrRec = ^TStrQueue;
  TStrQueue = RECORD
                 Data : string;
                 Next : PStrRec;
              END; (* of RECORD *)
  StrQueue = OBJECT
             Private
               Start, Finish, Temp : PStrRec;
             Public
               CONSTRUCTOR Init;
               PROCEDURE Reset;
               FUNCTION Copy : String;
               FUNCTION AtEnd : boolean;
               PROCEDURE Enqueue (S : string);
               PROCEDURE Dequeue (VAR S : string);
               FUNCTION Empty : boolean;
               DESTRUCTOR Done;
             END; (* of Object StrQueue *)
  pStrQueue = ^StrQueue;

IMPLEMENTATION

CONSTRUCTOR StrQueue.Init;
BEGIN
  Start := nil;
  Finish := nil;
  Temp := nil;
END; (* of CONSTRUCTOR StrQueue.Init *)



PROCEDURE StrQueue.Reset;
BEGIN
  Temp := Start;
END;  (* of StrQueue.Reset *)



FUNCTION StrQueue.Copy : String;
BEGIN
  if Temp <> nil then Copy := Temp^.Data
  else Copy := '';

  if Temp <> Finish then Temp := Temp^.Next
  else Temp := nil;
END; (* of StrQueue.Copy *)


FUNCTION StrQueue.AtEnd : boolean;
BEGIN
  AtEnd := Temp = nil;
END; (* of StrQueue.AtEnd *)



PROCEDURE StrQueue.Enqueue (S : string);
VAR
  T : PStrRec;

BEGIN
  new (T);
  T^.Data := S;
  T^.Next := nil;

  IF Start = nil THEN
    Start := T
  ELSE
    Finish^.Next := T;
  Finish := T;
END; (* of StrQueue.Enqueue *)



PROCEDURE StrQueue.Dequeue (VAR S : string);
VAR
  T : PStrRec;

BEGIN

  IF Start = nil THEN BEGIN
    S := '';
    exit;
  END; (* of IF *)

  S := Start^.Data;
  T := Start^.Next;
  dispose (Start);
  Start := T;
END; (* of StrQueue.Dequeue *)



FUNCTION StrQueue.Empty : boolean;
BEGIN
  Empty := Start = nil;
END; (* of StrQueue.Empty *)



DESTRUCTOR StrQueue.Done;
VAR
  Belch : string;
BEGIN
  REPEAT
    Dequeue (Belch);
  UNTIL Empty;
END; (* of Destructor StrQueue.Done *)


END. (* of UNIT Queues *)

---------------

PROGRAM TestStr;

USES Queues,strings;

CONST
  MaxStrLen = $FFF8;

VAR
  ThisString : StrQueue;
  Temp : string;
  blah : pchar;
  theend : pointer;
  T2 : array[0..80] of char;

BEGIN

  ThisString.Init;

  readln (temp);
  WHILE Temp <> '' DO BEGIN
    ThisString.enqueue (Temp);
    readln (temp);
  END; (* of WHILE *)

  getmem (blah, MaxStrLen);
  fillchar (blah^, MaxStrLen, #0);


  WHILE (NOT ThisString.Empty) and (strlen (blah) < (MaxStrLen - 81)) DO BEGIN
    ThisString.dequeue (Temp);
    StrPCopy (T2, Temp);
    StrLCat (blah, T2, MaxStrLen);
    StrLCat (blah, #13#10, MaxStrLen);
  END; (* of WHILE *)

  write (blah);

  freemem (blah, MaxStrLen);

  readln;
END.