program ReadSwag; {+$X} uses Dos,Crt; type SwagHeader = RECORD HeadSize : BYTE; {size of header} HeadChk : BYTE; {checksum for header} HeadID : ARRAY [1..5] OF CHAR; {compression type tag} NewSize : LONGINT; {compressed size} OrigSize : LONGINT; {original size} Time : WORD; {packed time} Date : WORD; {packed date} Attr : WORD; {file attributes and flags} BufCRC : LONGINT; {32-CRC of the Buffer } Swag : STRING[12]; {stored SWAG filename} Subject : STRING[40]; {snipet subject} Contrib : STRING[35]; {contributor} Keys : STRING[70]; {search keys, comma deliminated} FName : PathStr; {filename (variable length)} CRC : WORD; {16-bit CRC (immediately follows FName)} END; PROCEDURE SWAGView (LzhFile : PathStr); VAR Swaghead : Swagheader; HeadA : ARRAY [1..SIZEOF (Swagheader) ] OF BYTE ABSOLUTE Swaghead; inFile : FILE; { File to be processed } J, LZHpos : LONGINT; numread, i : WORD; FUNCTION Mksum : BYTE; {calculate check sum For File header } VAR i : INTEGER; b : BYTE; BEGIN b := 0; FOR i := 3 TO Swaghead.headsize + 2 DO b := b + HeadA [i]; mksum := b; END; PROCEDURE ShowView; BEGIN with Swaghead do begin writeln('=================================================='); writeln('Header size = ', HeadSize); writeln('compressed size = ', NewSize); writeln('stored SWAG filename = ', Swag); writeln('snipet subject = ', Subject); writeln('Contributor = ', Contrib); writeln('Search keys = ', Keys); writeln('File name = ', Fname); end; END; BEGIN Assign(infile,LzhFile); Reset(infile, 1); {Goto start of File} LZHPos := 0; REPEAT { Move to the correct position } SEEK (inFile, LZHpos); {Read Fileheader} BLOCKREAD (inFile, HeadA, SIZEOF (Swagheader), numread); { get the position of the next header } LZHpos := LZHpos + Swaghead.headsize + 2 + Swaghead.Newsize; { check the checksum } i := Mksum; IF Swaghead.headsize <> 0 THEN BEGIN IF i <> Swaghead.headchk THEN BEGIN { ERROR : FORMAT ERROR !! } CLOSE (infile); EXIT; END; ShowView; END; UNTIL (Swaghead.headsize = 0); CLOSE (infile); END; BEGIN SwagView('d:\swag\files\oop.swg'); END.