Contributor: SWAG SUPPORT TEAM { >Could someone post the structures For a QWK mail packet, and could >someone, post how to make a BBS Fido-Net compatible, in other Words the >File structures..Thanks in advance.. } {$V-} Program ReadQWKRepFile; Uses Crt; Const Seperator = '---------------------------------------------------------------------------'; Type ConfType = ^Conference; Conference = Record Number : Byte; Name : Array [1..10] of Char; end; CONDATHdr = Record BBSName : Array [1..25] of Char; Location : Array [1..25] of Char; Number : Array [1..12] of Char; SysopName: Array [1..25] of Char; SerialNum: Array [1..5] of Char; BBSID : Array [1..8] of Char; Date : Array [1..10] of Char; Time : Array [1..8] of Char; UserName : Array [1..25] of Char; NumConfs : Byte; Confs : Array [1..30] of ConfType; end; MSGDATHdr = Record 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 : Array [1..6] of Char; Alive : Byte; LeastSig : Byte; MostSig : Byte; Reserved : Array [1..3] of Char; end; MSSingle = Array[0..3] of Byte; Var F : File; DefSaveFile : String; ConfNum : String [8]; Number : Word; Function Valu2 (S : String) : Word; Var C : Word; E : Integer; begin Val (S, C, E); If E = 0 then Valu2 := C else Valu2 := 0; end; Procedure ParseCommandLine; Var I : Byte; C : Char; S : String; begin For I := 1 to ParamCount do begin S := ParamStr (I); If S [1] = '/' then begin C := UpCase (S [2]); Delete (S, 1, 2); Case C of 'C' : ConfNum := S; 'S' : begin While Length (S) <> 3 do S := '0' + S; DefSaveFile := S; end; 'N' : Number := Valu2 (S); end; end; end; end; Function MStoIEEE (MS : MSSingle) : Real; { Converts a 4 Byte Microsoft format single precision Real Variable as used in earlier versions of QuickBASIC and GW-BASIC to IEEE 6 Byte Real } Var r : Real; ieee : Array[0..5] of Byte Absolute r; begin FillChar(r,sizeof(r),0); ieee[0] := MS[3]; ieee[3] := MS[0]; ieee[4] := MS[1]; ieee[5] := MS[2]; MStoIEEE := r; end; { MStoIEEE } Function Valu (S : String) : LongInt; Var C : LongInt; T, E : Integer; I : Byte; Place : LongInt; begin Place := 1; C := 0; For I := 6 downto 1 do begin Val (S [I], T, E); If T <> 0 then begin C := C + T * Place; Place := Place * 10; end; end; Valu := C - 1; end; Procedure ReadMSG (NumChunks : LongInt); Var Buff : Array [1..128] of Char; J : LongInt; I : Byte; begin For J := 1 to NumChunks do begin BlockRead (F, Buff, 128); 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, SizeOf (Hdr)); 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; end; end; Procedure ReadMessage (HDR : MSGDatHdr; REPorDAT : Boolean); begin ReadWriteHdr (HDR); ReadMsg (Valu (HDR.NumChunk)); end; Procedure ReadControlFile (Var Control : CONDatHdr); Var CFile : Text; Procedure ReadToEOLN (Var FNAME; Length : Byte; Down : Boolean); Var I : Byte; C : Char; begin I := 0; Repeat Read (CFile, C); Mem [Seg (FNAME) : Ofs (FNAME) + I] := Ord (C); Inc (I); Until EOLN (CFile) or (I > Length) or (Not Down and (C = ',')); If Not Down then Dec (I); For I := I to Length do Mem [Seg (FNAME) : Ofs (FNAME) + I] :=32; If Down then Readln (CFile); end; Var TempChar : Char; S : String; I : Byte; begin Assign (CFile, 'CONTROL.DAT'); Reset (CFile); With Control do begin ReadToEOLN (BBSName, 25, True); ReadToEOLN (Location, 25, True); ReadToEOLN (Number, 12, True); ReadToEOLN (SysopName, 25, False); Readln (CFile); ReadToEOLN (SerialNum, 5, False); ReadToEOLN (BBSID, 8, True); ReadToEOLN (Date, 10, False); ReadToEOLN (Time, 8, True); ReadToEOLN (UserName, 25, True); For I := 1 to 4 do Readln (CFile, S); NumConfs := Valu (S) + 1; For I := 1 to NumConfs do begin New (Confs [I]); Readln (CFile, S); Confs [I]^.Number := Valu2 (S); ReadToEOLN (Confs [I]^.Name, 10, True); end; end; Close (CFile); end; Function GetSaveFile : String; Var S : String; begin Writeln ('Enter the name of the File to save it in (GIVE A DIRECTORY!) or [Return] for'); Writeln ('C:\SLMR\SAVE.TXT'); Readln (S); If S = '' then S := 'C:\SLMR\SAVE.TXT'; GetSaveFile := S; end; Function GetYN (S : String) : Boolean; Var X : Char; begin Repeat Write (S); X := UpCase (ReadKey); Writeln (X); Until X in ['Y', 'N']; GetYN := X = 'Y'; end; Procedure ScanMessages (REPorDAT : Boolean); Var HDR : MSGDatHdr; S : String [3]; I : Byte; F2 : File; MS : MSSingle; YN : Boolean; begin ClrScr; Repeat If ConfNum = '' then begin Writeln; Write ('Enter the name/number For the conference : '); Readln (ConfNum); Writeln; end; While (Length (ConfNum) < 3) do ConfNum := '0' + ConfNum; Writeln (ConfNum); Assign (F2, ConfNum + '.NDX'); {$I-} Reset (F2, 1); {$I+} If IOResult <> 0 then RunError (2); Repeat Repeat Writeln; If Number = 0 then begin Writeln ('Enter the SLMR number ( ??? / XXX ) of the message to pull, or 0 to quit : '); Readln (Number); end; If Number = 0 then begin Close (F2); Close (F); Halt; end; Writeln; Seek (F2, (Number - 1) * 5); BlockRead (F2, MS, 4); Seek (F, Round (MStoIEEE (MS) - 1) * 128); ReadWriteHdr (HDR); YN := GetYN ('Capture this message ? '); Number := 0; Until YN; Seek (F, Round (MStoIEEE (MS) - 1) * 128); Writeln; Writeln; If Not GetYN ('Extract to Screen ? [Y/N] (N sends to File): ') then Assign (Output, GetSaveFile); {$I-} Reset (Output); {$I+} If IOResult <> 0 then ReWrite (Output) else Append (Output); Writeln; Writeln (Seperator); Writeln; ReadMessage (Hdr, REPorDAT); Writeln; Writeln; Close (Output); Assign (Output, ''); ReWrite (Output); YN := GetYN ('Extract more messages? [Y/N] '); Until Not YN; Close (F2); YN := GetYN ('Select another message base? [Y/N] '); Until Not YN; end; Var Control : CONDatHdr; MSGHdr : MSGDatHdr; REPorDAT : Boolean; begin DefSaveFile := ''; ConfNum := ''; Number := 0; ParseCommandLine; DirectVideo := False; ReadControlFile (Control); { Assign (F, Control.BBSID + '.MSG');} Assign (F, 'MESSAGES.DAT'); Reset (F, 1); BlockRead (F, MSGHdr, SizeOf (MSGHdr)); REPorDAT := (MSGHdr.Status + MSGHdr.MSGNum = Control.BBSID); ScanMessages (REPorDAT); { While Not EOF (F) do ReadMessage (MSGHdr, REPorDAT);} Close (F); end.