diff options
author | Graeme Geldenhuys <graemeg@gmail.com> | 2009-10-24 20:43:49 +0200 |
---|---|---|
committer | Graeme Geldenhuys <graemeg@gmail.com> | 2009-10-24 20:43:49 +0200 |
commit | ea47a74bfd558041c3f156610782efbfaaebb627 (patch) | |
tree | 92120dd7a355a11ab5c27eb16e2f6741b1c8daa0 | |
parent | c30ac74b22fa6ef396aeb0164b43eb9e1795ce51 (diff) | |
download | fpGUI-ea47a74bfd558041c3f156610782efbfaaebb627.tar.xz |
Add processing of external file entries.
Also added some unit level comments.
Signed-off-by: Graeme Geldenhuys <graemeg@gmail.com>
-rw-r--r-- | src/docdump/docdump.lpi | 11 | ||||
-rw-r--r-- | src/docdump/docdump.lpr | 7 | ||||
-rw-r--r-- | src/docdump/readextfiles.pas | 53 | ||||
-rw-r--r-- | src/docdump/readheader.pas | 14 |
4 files changed, 78 insertions, 7 deletions
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 @@ <LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/> </local> </RunParams> - <Units Count="5"> + <Units Count="7"> <Unit0> <Filename Value="docdump.lpr"/> <IsPartOfProject Value="True"/> @@ -49,6 +49,15 @@ <IsPartOfProject Value="True"/> <UnitName Value="filestreamhelper"/> </Unit4> + <Unit5> + <Filename Value="readextfiles.pas"/> + <IsPartOfProject Value="True"/> + <UnitName Value="readextfiles"/> + </Unit5> + <Unit6> + <Filename Value="../../docs/inf04.txt"/> + <IsPartOfProject Value="True"/> + </Unit6> </Units> </ProjectOptions> <CompilerOptions> 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; |