From ea47a74bfd558041c3f156610782efbfaaebb627 Mon Sep 17 00:00:00 2001 From: Graeme Geldenhuys Date: Sat, 24 Oct 2009 20:43:49 +0200 Subject: Add processing of external file entries. Also added some unit level comments. Signed-off-by: Graeme Geldenhuys --- src/docdump/docdump.lpi | 11 ++++++++- src/docdump/docdump.lpr | 7 +++++- src/docdump/readextfiles.pas | 53 ++++++++++++++++++++++++++++++++++++++++++++ src/docdump/readheader.pas | 14 +++++++----- 4 files changed, 78 insertions(+), 7 deletions(-) create mode 100644 src/docdump/readextfiles.pas diff --git a/src/docdump/docdump.lpi b/src/docdump/docdump.lpi index 182a9da4..9ed376e4 100644 --- a/src/docdump/docdump.lpi +++ b/src/docdump/docdump.lpi @@ -23,7 +23,7 @@ - + @@ -49,6 +49,15 @@ + + + + + + + + + diff --git a/src/docdump/docdump.lpr b/src/docdump/docdump.lpr index 4415a0a8..6596578f 100644 --- a/src/docdump/docdump.lpr +++ b/src/docdump/docdump.lpr @@ -1,3 +1,6 @@ +{ + Dumps the structure of an OS/2 IPF help file +} program docdump; {$mode objfpc}{$H+} @@ -7,7 +10,7 @@ uses cthreads, {$ENDIF}{$ENDIF} Classes, SysUtils, IPFFileFormatUnit, IPFEscapeCodes, CustApp, readheader, - filestreamhelper; + filestreamhelper, readextfiles; type @@ -51,6 +54,7 @@ begin try FOut.WriteLn(Format('File name: %s (%d bytes)', [ExtractFileName(ParamStr(1)), FIn.Size])); ProcessHeader(FIn, FOut); + ProcessExtFiles(FIn, FOut); finally FIn.Free; FOut.Free; @@ -79,6 +83,7 @@ end; var Application: TDocDump; + begin Application:=TDocDump.Create(nil); Application.Run; diff --git a/src/docdump/readextfiles.pas b/src/docdump/readextfiles.pas new file mode 100644 index 00000000..6ea979d9 --- /dev/null +++ b/src/docdump/readextfiles.pas @@ -0,0 +1,53 @@ +{ + Dumps the names of external database (help) files referenced by this file +} +unit readextfiles; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, IPFFileFormatUnit, filestreamhelper; + +procedure ProcessExtFiles(AIn: TFileStream; AOut: TFileTextStream); + + +implementation + +uses + readheader; + +procedure ProcessExtFiles(AIn: TFileStream; AOut: TFileTextStream); +var + count: integer; + name: string; + pData: pointer; + p: pointer; + pLength: pByte; +begin + AOut.WriteLn(''); + AOut.WriteLn('External File References'); + + if eHdr.NumDataBase > 0 then + begin + pData := nil; + AIn.Seek(eHdr.DataBaseOffset, soBeginning); + GetMem(pData, eHdr.DataBaseSize); // allocate temp space for data + AIn.Read(pData^, eHdr.DataBaseSize); // read all data in one shot + p := pData; // p is our incrementing position in the data + for count := 0 to eHdr.NumDataBase-1 do + begin + pLength := p; // length byte, including itself + SetString(name, p+1, pLength^-1); // use length value minus the length byte to get the string length + AOut.WriteLn(Format(' File #%d: %s', [count, name])); + inc(p, pLength^); // skip to next entry using full length (including length byte) + end; + FreeMem(pData, eHdr.DataBaseSize); // free allocated space + end + else + AOut.WriteLn(' No external file references found'); +end; + +end. + diff --git a/src/docdump/readheader.pas b/src/docdump/readheader.pas index 30f090dc..3f220368 100644 --- a/src/docdump/readheader.pas +++ b/src/docdump/readheader.pas @@ -1,3 +1,6 @@ +{ + Dump the INF header & extended header structures to a text file +} unit readheader; {$mode objfpc}{$H+} @@ -5,14 +8,17 @@ unit readheader; interface uses - Classes, SysUtils, filestreamhelper; + Classes, SysUtils, filestreamhelper, IPFFileFormatUnit; procedure ProcessHeader(AIn: TFileStream; AOut: TFileTextStream); +var + hdr: THelpFileHeader; + eHdr: TExtendedHelpFileHeader; + + implementation -uses - IPFFileFormatUnit; type TWord = record @@ -36,8 +42,6 @@ type procedure ProcessHeader(AIn: TFileStream; AOut: TFileTextStream); var - hdr: THelpFileHeader; - eHdr: TExtendedHelpFileHeader; bytes: integer; s: string; w: TWord; -- cgit v1.2.3-70-g09d2