summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGraeme Geldenhuys <graemeg@gmail.com>2009-10-24 20:43:49 +0200
committerGraeme Geldenhuys <graemeg@gmail.com>2009-10-24 20:43:49 +0200
commitea47a74bfd558041c3f156610782efbfaaebb627 (patch)
tree92120dd7a355a11ab5c27eb16e2f6741b1c8daa0
parentc30ac74b22fa6ef396aeb0164b43eb9e1795ce51 (diff)
downloadfpGUI-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.lpi11
-rw-r--r--src/docdump/docdump.lpr7
-rw-r--r--src/docdump/readextfiles.pas53
-rw-r--r--src/docdump/readheader.pas14
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;