Contributor: GAYLE DAVIS              

{$V-,S-}
{ this SIMPLE little ditty let's you read SWAG or QWK files which have
  EXACTLY the same format }
Program ReadQWKORSWAGFile;

Uses
  Crt;

Const
  Seperator = '---------------------------------------------------------------------------';

Type

  CharArray = ARRAY[1..6] OF CHAR;  { to read in chunks }

  MSGDATHdr = Record  { ALSO the format for SWAG files !!! }
    Status   : Char;
    MSGNum   : Array [1..7] of Char;
    Date     : Array [1..8] of Char;
    Time     : Array [1..5] of Char;
    UpTO     : Array [1..25] of Char;
    UpFROM   : Array [1..25] of Char;
    Subject  : Array [1..25] of Char;
    PassWord : Array [1..12] of Char;
    ReferNum : Array [1..8] of Char;
    NumChunk : CharArray;
    Alive    : Byte;
    LeastSig : Byte;
    MostSig  : Byte;
    Reserved : Array [1..3] of Char;
  end;

Var
  F           : File;
  DefSaveFile : String;
  Number      : Word;

FUNCTION ArrayTOInteger(B : CharArray; Len : BYTE) : LONGINT;

VAR I : Byte;
    S : STRING;
    E  : Integer;
    T  : Integer;

BEGIN
    S := '';
    FOR I := 1 TO PRED(Len) DO IF B[i] <> #32 THEN S := S + B[i];
    Val (S, T, E);
    IF E = 0 THEN ArrayToInteger := T;
END;

Procedure ReadMSG (NumChunks : INTEGER);
Var
  Buff : Array [1..128] of Char;
  J    : INTEGER;
  I    : Byte;

begin
  For J := 1 to PRED(NumChunks) do
  begin
    BlockRead (F, Buff, 1);
    For I := 1 to 128 do
      If Buff [I] = #$E3 then
        Writeln
      else
        Write (Buff [I]);
  end;
end;

Procedure ReadWriteHdr (Var HDR : MSGDatHdr);
begin
  BlockRead (F, Hdr, 1);
  With Hdr do
  begin
    Write ('Date: ', Date, ' (', Time, ')');
    Writeln ('' : 23, 'Number: ', MSGNum);
    Write ('From: ', UpFROM);
    Writeln ('' : 14, 'Refer#: ', ReferNum);
    Write ('  To: ', UpTO);
    Write ('' : 15, 'Recvd: ');
    If Status in ['-', '`', '^', '#'] then
      Writeln ('YES')
    else
      Writeln ('NO');
    Write ('Subj: ', Subject);
    Writeln ('' : 16, 'Conf: ', '(', LeastSig, ')');
    Writeln(Seperator);
  end;
end;

Procedure ReadMessage (HDR : MSGDatHdr; RelNum : LONGINT; VAR Chunks : INTEGER);
begin
  Seek(F,RelNum-1);
  ReadWriteHdr (HDR);
  Chunks := ArrayToInteger(HDR.NumChunk,6);
  ReadMsg (Chunks);
end;

Var
  MSGHdr   : MSGDatHdr;
  REPorDAT : Boolean;
  ch       : CHAR;
  count    : INTEGER;
  chunks   : INTEGER;

begin

  DefSaveFile := '';
  DirectVideo := False;
  Assign (F, '\SWAG\FILES\EGAVGA.SWG'); { whatever file ..    }
                                        { MESSAGES.DAT for .QWK}
  Reset (F, SizeOf(MsgHdr));
  Count := 2;  { start at RECORD #2 }
  WHILE (Count < FileSize(F)) DO
        BEGIN
        ClrScr;
        ReadMessage (MSGHdr, Count, Chunks);
        Writeln;
        WriteLn('..any key to continue .. (any FN Key quits)');
        ch := Readkey;  { any FN key quits }
        IF Ch = #0 THEN HALT;
        INC(Count,Chunks);
        END;
  Close (F);

end.