diff --git a/applications/idlparser/idlgenpascal.pas b/applications/idlparser/idlgenpascal.pas
index 7694da173..312b8d28c 100644
--- a/applications/idlparser/idlgenpascal.pas
+++ b/applications/idlparser/idlgenpascal.pas
@@ -38,7 +38,7 @@ uses
Classes, SysUtils, strutils,
idlParser;
-procedure GeneratePascalSource(const AnIdlList: TIDLList; const PascalCode: tstrings;TypeConvList, CTypesList: TStrings; AlwaysAddPrefixToParam: boolean);
+procedure GeneratePascalSource(const AnIdlList: TIDLList; const PascalCode: tstrings;TypeConvList, CTypesList: TStrings; AlwaysAddPrefixToParam: boolean; AForwardDeclList: TStrings = nil);
implementation
@@ -91,12 +91,14 @@ begin
case lowercase(AName) of
'type': result := 'a'+AName;
'end' : result := 'an'+AName;
+ 'implementation' : result := 'an'+AName;
+ 'set' : result := 'a'+AName;
else
result := AName;
end;
end;
-procedure GeneratePascalSource(const AnIdlList: TIDLList; const PascalCode: tstrings;TypeConvList, CTypesList: TStrings; AlwaysAddPrefixToParam: boolean);
+procedure GeneratePascalSource(const AnIdlList: TIDLList; const PascalCode: tstrings;TypeConvList, CTypesList: TStrings; AlwaysAddPrefixToParam: boolean; AForwardDeclList: TStrings = nil);
var
i,l,m: integer;
@@ -183,7 +185,15 @@ begin
s := LineEnding + s + LineEnding+' end;' + LineEnding
else
s := s + ';';
- PascalCode.Add(s);
+
+ if assigned(AForwardDeclList) and (anIDL.InterfaceType='') then
+ begin
+ if AForwardDeclList.Count=0 then
+ AForwardDeclList.Add('type');
+ AForwardDeclList.Add(s);
+ end
+ else
+ PascalCode.Add(s);
if consts<>'' then
begin
diff --git a/applications/idlparser/idltopas.lpi b/applications/idlparser/idltopas.lpi
index 292a50f32..c4f081901 100644
--- a/applications/idlparser/idltopas.lpi
+++ b/applications/idlparser/idltopas.lpi
@@ -29,7 +29,7 @@
-
+
diff --git a/applications/idlparser/idltopas.pp b/applications/idlparser/idltopas.pp
index 84ccc709b..2aae94fb5 100644
--- a/applications/idlparser/idltopas.pp
+++ b/applications/idlparser/idltopas.pp
@@ -24,7 +24,7 @@ type
{ TIDLToPascal }
-procedure HandleIDLFile(AFilename: string; AnOutput: TStrings; TypeConvList, CTypesList: TStrings; AlwaysAddPrefixToParam: boolean);
+procedure HandleIDLFile(AFilename: string; AnOutput, ForwardOutput: TStrings; TypeConvList, CTypesList: TStrings; AlwaysAddPrefixToParam: boolean);
var
AnIDLList: TIDLList;
AnInput: TStrings;
@@ -35,7 +35,7 @@ begin
AnIDLList := TIDLList.create;
try
ParseFile(AnIDLList, AnInput);
- GeneratePascalSource(AnIDLList,AnOutput,TypeConvList, CTypesList, AlwaysAddPrefixToParam);
+ GeneratePascalSource(AnIDLList,AnOutput,TypeConvList, CTypesList, AlwaysAddPrefixToParam, ForwardOutput);
finally
AnIDLList.Free;
end;
@@ -49,7 +49,7 @@ var
ErrorMsg: String;
i: integer;
filenames: TStrings;
- output: TStrings;
+ output, forwardoutput: TStringList;
OutputToFile: boolean;
OutputFilename: string;
CTypes, TypeMapList: TStrings;
@@ -61,7 +61,7 @@ begin
TypeMapList := TStringList.Create;
try
// quick check parameters
- ErrorMsg:=CheckOptions('hpo::c:m:',nil,nil,filenames);
+ ErrorMsg:=CheckOptions('hpo::c:m:f:',nil,nil,filenames);
if ErrorMsg<>'' then
begin
ShowException(Exception.Create(ErrorMsg));
@@ -87,10 +87,21 @@ begin
TypeMapList.LoadFromFile(GetOptionValue('m'));
end;
+
OutputToFile := HasOption('o');
OutputFilename := GetOptionValue('o');
AlwaysAddPrefixToParam := HasOption('p');
+ if HasOption('f') then
+ begin
+ forwardoutput := TStringList.Create;
+ forwardoutput.CaseSensitive:=false;
+ forwardoutput.Sorted:=true;
+ forwardoutput.Duplicates:=dupIgnore;
+ end
+ else
+ forwardoutput := nil;
+
output := TStringList.Create;
try
for i := 0 to filenames.Count-1 do
@@ -98,7 +109,7 @@ begin
if OutputToFile and (OutputFilename='') then
Output.Clear;
- HandleIDLFile(filenames.Strings[i], output, TypeMapList, CTypes, AlwaysAddPrefixToParam);
+ HandleIDLFile(filenames.Strings[i], output, forwardoutput, TypeMapList, CTypes, AlwaysAddPrefixToParam);
if OutputToFile and (OutputFilename='') then
output.SaveToFile(LowerCase(ExtractFileName(ChangeFileExt(filenames.Strings[i],'.inc'))));
@@ -108,8 +119,12 @@ begin
else if OutputFilename<>'' then
output.SaveToFile(OutputFilename);
+ if assigned(forwardoutput) and (forwardoutput.Count<>0) then
+ forwardoutput.SaveToFile(GetOptionValue('f'));
+
finally
output.Free;
+ forwardoutput.Free;
end;
finally
@@ -150,6 +165,8 @@ begin
writeln(' prefixed with ''c'' or ''cu'' (as used in the ctypes unit)');
writeln(' -m filename Read ''filename'' for a list of mappings between idl-type names');
writeln(' and their Pascal counterpart');
+ writeln(' -f filename Place all forward declarations into one file called ''filename''');
+
end;
var