* Added command-line version of parser: idltopas

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@2343 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
loesje_
2012-03-15 11:59:33 +00:00
parent 56cdbd977f
commit d1b1ffc8b1
2 changed files with 245 additions and 0 deletions

View File

@ -0,0 +1,82 @@
<?xml version="1.0"?>
<CONFIG>
<ProjectOptions>
<Version Value="9"/>
<General>
<Flags>
<MainUnitHasCreateFormStatements Value="False"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<MainUnit Value="0"/>
<Title Value="IDL to Pascal parser"/>
<UseAppBundle Value="False"/>
<ResourceType Value="res"/>
</General>
<i18n>
<EnableI18N LFM="False"/>
</i18n>
<VersionInfo>
<StringTable ProductVersion=""/>
</VersionInfo>
<BuildModes Count="1">
<Item1 Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
<IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
<ExcludeFileFilter Value="*.(bak|ppu|o|so);*~;backup"/>
</PublishOptions>
<RunParams>
<local>
<FormatVersion Value="1"/>
<CommandLineParams Value="/home/CNOC/joost/svn/geckoport/xulrunner-sdk-10/idl/nsIPrompt.idl"/>
</local>
</RunParams>
<Units Count="3">
<Unit0>
<Filename Value="idltopas.pp"/>
<IsPartOfProject Value="True"/>
<UnitName Value="idltopas"/>
</Unit0>
<Unit1>
<Filename Value="idlparser.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="idlParser"/>
</Unit1>
<Unit2>
<Filename Value="idlgenpascal.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="idlGenPascal"/>
</Unit2>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<Target>
<Filename Value="idltopas"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Other>
<CompilerMessages>
<MsgFileName Value=""/>
</CompilerMessages>
<CompilerPath Value="$(CompPath)"/>
</Other>
</CompilerOptions>
<Debugging>
<Exceptions Count="3">
<Item1>
<Name Value="EAbort"/>
</Item1>
<Item2>
<Name Value="ECodetoolError"/>
</Item2>
<Item3>
<Name Value="EFOpenError"/>
</Item3>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -0,0 +1,163 @@
program idltopas;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, SysUtils, CustApp,
idlParser, idlGenPascal;
type
{ TIDLToPascal }
TIDLToPascal = class(TCustomApplication)
protected
procedure DoRun; override;
public
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
procedure WriteHelp; virtual;
end;
{ TIDLToPascal }
procedure HandleIDLFile(AFilename: string; AnOutput: TStrings; TypeConvList, CTypesList: TStrings; AlwaysAddPrefixToParam: boolean);
var
AnIDLList: TIDLList;
AnInput: TStrings;
begin
AnInput := TStringList.Create;
AnInput.LoadFromFile(AFilename);
try
AnIDLList := TIDLList.create;
try
ParseFile(AnIDLList, AnInput);
GeneratePascalSource(AnIDLList,AnOutput,TypeConvList, CTypesList, AlwaysAddPrefixToParam);
finally
AnIDLList.Free;
end;
finally
AnInput.Free;
end;
end;
procedure TIDLToPascal.DoRun;
var
ErrorMsg: String;
i: integer;
filenames: TStrings;
output: TStrings;
OutputToFile: boolean;
OutputFilename: string;
CTypes, TypeMapList: TStrings;
AlwaysAddPrefixToParam: boolean;
begin
filenames := TStringList.Create;
CTypes := TStringList.Create;
TypeMapList := TStringList.Create;
try
// quick check parameters
ErrorMsg:=CheckOptions('hpo::c:m:',nil,nil,filenames);
if ErrorMsg<>'' then
begin
ShowException(Exception.Create(ErrorMsg));
Terminate;
Exit;
end;
// parse parameters
if (HasOption('h','help')) or (filenames.Count=0) then
begin
WriteHelp;
Terminate;
Exit;
end;
if HasOption('c') then
begin
CTypes.LoadFromFile(GetOptionValue('c'));
end;
if HasOption('m') then
begin
TypeMapList.LoadFromFile(GetOptionValue('m'));
end;
OutputToFile := HasOption('o');
OutputFilename := GetOptionValue('o');
AlwaysAddPrefixToParam := HasOption('p');
output := TStringList.Create;
try
for i := 0 to filenames.Count-1 do
begin
if OutputToFile and (OutputFilename='') then
Output.Clear;
HandleIDLFile(filenames.Strings[i], output, TypeMapList, CTypes, AlwaysAddPrefixToParam);
if OutputToFile and (OutputFilename='') then
output.SaveToFile(LowerCase(ExtractFileName(ChangeFileExt(filenames.Strings[i],'.inc'))));
end;
if not OutputToFile then
writeln(output.Text)
else if OutputFilename<>'' then
output.SaveToFile(OutputFilename);
finally
output.Free;
end;
finally
filenames.Free;
CTypes.Free;
TypeMapList.Free;
end;
// stop program loop
Terminate;
end;
constructor TIDLToPascal.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
StopOnException:=True;
end;
destructor TIDLToPascal.Destroy;
begin
inherited Destroy;
end;
procedure TIDLToPascal.WriteHelp;
begin
{ add your help code here }
writeln('Usage: ',ApplicationName,' [OPTION] SOURCEFILES');
writeln('Convert idl-SOURCEFILES to Pascal include files');
writeln('');
writeln(' -h Shows this help message');
writeln(' -p Always add the ''a'' or ''an'' prefix to method-parameters names');
writeln(' -o Write the output to file(s). The file(s) are written to the current');
writeln(' directory with the same filenames name as the input files but with');
writeln(' the ''.inc'' extension');
writeln(' -o filename Write the output to one file called ''filename''');
writeln(' -c filename Read ''filename'' to get a list of typenames that have to be');
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');
end;
var
Application: TIDLToPascal;
begin
Application:=TIDLToPascal.Create(nil);
Application.Title:='IDL to Pascal parser';
Application.Run;
Application.Free;
end.