You've already forked lazarus-ccr
chelper: initial check in
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1270 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
89
components/chelper/cconvconfig.pas
Normal file
89
components/chelper/cconvconfig.pas
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
{ The unit is part of Lazarus Chelper package
|
||||||
|
|
||||||
|
Copyright (C) 2010 Dmitry Boyarintsev skalogryz dot lists at gmail.com
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU Library General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public License
|
||||||
|
along with this library; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
}
|
||||||
|
unit cconvconfig;
|
||||||
|
|
||||||
|
{$mode delphi}
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
Classes, SysUtils, ctopasconvert, IniFiles;
|
||||||
|
|
||||||
|
procedure LoadFromFile(const FileName: AnsiString; cfg: TConvertSettings);
|
||||||
|
procedure SaveToFile(const FileName: AnsiString; cfg: TConvertSettings);
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
procedure LoadFromFile(const FileName: AnsiString; cfg: TConvertSettings);
|
||||||
|
var
|
||||||
|
ini : TIniFile;
|
||||||
|
begin
|
||||||
|
if not Assigned(cfg) then Exit;
|
||||||
|
try
|
||||||
|
ini:=TIniFile.Create(FileName);
|
||||||
|
try
|
||||||
|
// C to Pas Types
|
||||||
|
ini.ReadSectionValues('Types', cfg.CtoPasTypes);
|
||||||
|
cfg.RecordsArePacked:=ini.ReadBool('Main','RecordsArePacked', cfg.RecordsArePacked);
|
||||||
|
cfg.FuncsAreExternal:=ini.ReadBool('Main','FuncsAreExternal', cfg.FuncsAreExternal);
|
||||||
|
cfg.EnumsAsConst:=ini.ReadBool('Main','EnumAsConst', cfg.EnumsAsConst);
|
||||||
|
|
||||||
|
cfg.TypeNamePrefix:=ini.ReadString('Main','TypeNamePrefix',cfg.TypeNamePrefix);
|
||||||
|
cfg.RefTypeNamePrefix:=ini.ReadString('Main','RefTypeNamePrefix',cfg.RefTypeNamePrefix);
|
||||||
|
cfg.FuncConv:=ini.ReadString('Main','FuncConv',cfg.FuncConv);
|
||||||
|
cfg.FuncDeclPostfix:=ini.ReadString('Main','FuncDeclPostfix',cfg.FuncDeclPostfix);
|
||||||
|
cfg.ParamPrefix:=ini.ReadString('Main','ParamPrefix',cfg.ParamPrefix);
|
||||||
|
finally
|
||||||
|
ini.Free;
|
||||||
|
end;
|
||||||
|
except
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure SaveToFile(const FileName: AnsiString; cfg: TConvertSettings);
|
||||||
|
var
|
||||||
|
ini : TIniFile;
|
||||||
|
i : Integer;
|
||||||
|
begin
|
||||||
|
if not Assigned(cfg) then Exit;
|
||||||
|
try
|
||||||
|
ini:=TIniFile.Create(FileName);
|
||||||
|
try
|
||||||
|
|
||||||
|
// C to Pas Types
|
||||||
|
for i:=0 to cfg.CtoPasTypes.Count-1 do
|
||||||
|
ini.WriteString('Types', cfg.CtoPasTypes.Names[i], cfg.CtoPasTypes.ValueFromIndex[i]);
|
||||||
|
ini.WriteBool('Main','RecordsArePacked', cfg.RecordsArePacked);
|
||||||
|
ini.WriteBool('Main','FuncsAreExternal', cfg.FuncsAreExternal);
|
||||||
|
ini.WriteBool('Main','EnumAsConst', cfg.EnumsAsConst);
|
||||||
|
|
||||||
|
ini.WriteString('Main','TypeNamePrefix',cfg.TypeNamePrefix);
|
||||||
|
ini.WriteString('Main','RefTypeNamePrefix',cfg.RefTypeNamePrefix);
|
||||||
|
ini.WriteString('Main','FuncConv',cfg.FuncConv);
|
||||||
|
ini.WriteString('Main','FuncDeclPostfix',cfg.FuncDeclPostfix);
|
||||||
|
ini.WriteString('Main','ParamPrefix',cfg.ParamPrefix);
|
||||||
|
finally
|
||||||
|
ini.Free;
|
||||||
|
end;
|
||||||
|
except
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
|
|
92
components/chelper/cconvert.lpi
Normal file
92
components/chelper/cconvert.lpi
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<CONFIG>
|
||||||
|
<ProjectOptions>
|
||||||
|
<Version Value="9"/>
|
||||||
|
<General>
|
||||||
|
<Flags>
|
||||||
|
<MainUnitHasCreateFormStatements Value="False"/>
|
||||||
|
<MainUnitHasTitleStatement Value="False"/>
|
||||||
|
</Flags>
|
||||||
|
<SessionStorage Value="InProjectDir"/>
|
||||||
|
<UseAppBundle Value="False"/>
|
||||||
|
<ResourceType Value="res"/>
|
||||||
|
</General>
|
||||||
|
<i18n>
|
||||||
|
<EnableI18N LFM="False"/>
|
||||||
|
</i18n>
|
||||||
|
<VersionInfo>
|
||||||
|
<Language Value=""/>
|
||||||
|
<CharSet Value=""/>
|
||||||
|
<StringTable ProductVersion=""/>
|
||||||
|
</VersionInfo>
|
||||||
|
<PublishOptions>
|
||||||
|
<Version Value="2"/>
|
||||||
|
<IgnoreBinaries Value="False"/>
|
||||||
|
<IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
|
||||||
|
<ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/>
|
||||||
|
</PublishOptions>
|
||||||
|
<RunParams>
|
||||||
|
<local>
|
||||||
|
<FormatVersion Value="1"/>
|
||||||
|
<LaunchingApplication PathPlusParams="/usr/X11/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
|
||||||
|
</local>
|
||||||
|
</RunParams>
|
||||||
|
<Units Count="1">
|
||||||
|
<Unit0>
|
||||||
|
<Filename Value="cconvert.lpr"/>
|
||||||
|
<IsPartOfProject Value="True"/>
|
||||||
|
<UnitName Value="cconvert"/>
|
||||||
|
</Unit0>
|
||||||
|
</Units>
|
||||||
|
</ProjectOptions>
|
||||||
|
<CompilerOptions>
|
||||||
|
<Version Value="9"/>
|
||||||
|
<Target>
|
||||||
|
<Filename Value="cconvert"/>
|
||||||
|
</Target>
|
||||||
|
<SearchPaths>
|
||||||
|
<IncludeFiles Value="$(ProjOutDir)/"/>
|
||||||
|
<UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
|
||||||
|
</SearchPaths>
|
||||||
|
<Parsing>
|
||||||
|
<SyntaxOptions>
|
||||||
|
<SyntaxMode Value="Delphi"/>
|
||||||
|
<CStyleOperator Value="False"/>
|
||||||
|
<IncludeAssertionCode Value="True"/>
|
||||||
|
<CPPInline Value="False"/>
|
||||||
|
</SyntaxOptions>
|
||||||
|
</Parsing>
|
||||||
|
<Linking>
|
||||||
|
<Debugging>
|
||||||
|
<GenerateDebugInfo Value="True"/>
|
||||||
|
</Debugging>
|
||||||
|
<Options>
|
||||||
|
<LinkerOptions Value="-macosx_version_min 10.4 "/>
|
||||||
|
<Win32>
|
||||||
|
<GraphicApplication Value="True"/>
|
||||||
|
</Win32>
|
||||||
|
</Options>
|
||||||
|
</Linking>
|
||||||
|
<Other>
|
||||||
|
<CompilerMessages>
|
||||||
|
<IgnoredMessages idx3018="True" idx3031="True" idx3189="True" idx4035="True" idx4036="True" idx4055="True" idx4079="True" idx4080="True" idx4081="True" idx5024="True" idx5057="True" idx5058="True" idx5060="True"/>
|
||||||
|
<UseMsgFile Value="True"/>
|
||||||
|
<MsgFileName Value="/Users/dmitry/FPC_Laz/fpc/compiler/msg/errore.msg"/>
|
||||||
|
</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>
|
113
components/chelper/cconvert.lpr
Normal file
113
components/chelper/cconvert.lpr
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
{ C-to-Pas converter command-line utility part of Lazarus Chelper package
|
||||||
|
|
||||||
|
Copyright (C) 2010 Dmitry Boyarintsev skalogryz dot lists at gmail.com
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU Library General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public License
|
||||||
|
along with this library; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
}
|
||||||
|
program cconvert;
|
||||||
|
|
||||||
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
uses
|
||||||
|
SysUtils,Classes,
|
||||||
|
ctopasconvert,cparserutils,cconvconfig;
|
||||||
|
|
||||||
|
var
|
||||||
|
ConfigFile : AnsiString = '';
|
||||||
|
OutputFile : AnsiString = '';
|
||||||
|
ConfigFileRO : Boolean = false;
|
||||||
|
|
||||||
|
function StringFromFile(const FileName: AnsiString): AnsiString;
|
||||||
|
var
|
||||||
|
fs : TFileStream;
|
||||||
|
begin
|
||||||
|
Result:='';
|
||||||
|
if not FileExists(FileName) then Exit;
|
||||||
|
try
|
||||||
|
fs:=TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
|
||||||
|
try
|
||||||
|
SetLength(Result, fs.Size);
|
||||||
|
fs.Read(Result[1], fs.Size);
|
||||||
|
finally
|
||||||
|
fs.Free;
|
||||||
|
end;
|
||||||
|
except
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure InitSettings(cfg: TConvertSettings);
|
||||||
|
var
|
||||||
|
i : Integer;
|
||||||
|
p : AnsiString;
|
||||||
|
fn : AnsiString;
|
||||||
|
begin
|
||||||
|
i:=1;
|
||||||
|
while i<=Paramcount do begin
|
||||||
|
p:=AnsiLowerCase(ParamStr(i));
|
||||||
|
if p='-cfg' then begin
|
||||||
|
inc(i);
|
||||||
|
fn:=Trim(Paramstr(i));
|
||||||
|
ConfigFile:=fn;
|
||||||
|
if FileExists(fn) then cconvconfig.LoadFromFile(fn, cfg);
|
||||||
|
end else if p='-ro' then
|
||||||
|
ConfigFileRO:=True
|
||||||
|
else if p='-defines' then begin
|
||||||
|
inc(i);
|
||||||
|
cfg.CustomDefines:=cfg.CustomDefines+' ' + StringFromFile(ParamStr(i));
|
||||||
|
end else if p='-o' then begin
|
||||||
|
inc(i);
|
||||||
|
OutputFile:=ParamStr(i);
|
||||||
|
end;
|
||||||
|
inc(i);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
inps, outs : TStringList;
|
||||||
|
i : Integer;
|
||||||
|
p : TPoint;
|
||||||
|
cfg : TConvertSettings;
|
||||||
|
begin
|
||||||
|
inps := TStringList.Create;
|
||||||
|
outs := TStringList.Create;
|
||||||
|
|
||||||
|
cfg:=TConvertSettings.Create;
|
||||||
|
try
|
||||||
|
InitSettings(cfg);
|
||||||
|
|
||||||
|
inps.LoadFromFile(ParamStr(ParamCount));
|
||||||
|
outs.Text:=ConvertCode(inps.Text, p, cfg);
|
||||||
|
if OutputFile<>'' then begin
|
||||||
|
outs.Insert(0, Format('%d %d', [p.Y,p.X]));
|
||||||
|
outs.SaveToFile(OutputFile)
|
||||||
|
end else begin
|
||||||
|
writeln(p.Y,' ',p.X);
|
||||||
|
for i:=0 to outs.Count-1 do
|
||||||
|
writeln(outs[i]);
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
if not ConfigFileRO and (ConfigFile<>'') then begin
|
||||||
|
ForceDirectories(ExtractFilePath(ConfigFile));
|
||||||
|
try
|
||||||
|
cconvconfig.SaveToFile(ConfigFile, cfg);
|
||||||
|
except
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
cfg.Free;
|
||||||
|
inps.Free;
|
||||||
|
outs.Free;
|
||||||
|
end;
|
||||||
|
end.
|
||||||
|
|
66
components/chelper/chelper.lpk
Normal file
66
components/chelper/chelper.lpk
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<CONFIG>
|
||||||
|
<Package Version="3">
|
||||||
|
<Name Value="chelper"/>
|
||||||
|
<Author Value="Dmitry 'skalogrz' Boyarintsev"/>
|
||||||
|
<CompilerOptions>
|
||||||
|
<Version Value="9"/>
|
||||||
|
<SearchPaths>
|
||||||
|
<UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
|
||||||
|
</SearchPaths>
|
||||||
|
<Other>
|
||||||
|
<CompilerPath Value="$(CompPath)"/>
|
||||||
|
</Other>
|
||||||
|
</CompilerOptions>
|
||||||
|
<Description Value="The IDE extension usefull for C headers convertion"/>
|
||||||
|
<License Value="LGPL"/>
|
||||||
|
<Version Minor="8"/>
|
||||||
|
<Files Count="6">
|
||||||
|
<Item1>
|
||||||
|
<Filename Value="tosourceeditor.pas"/>
|
||||||
|
<HasRegisterProc Value="True"/>
|
||||||
|
<UnitName Value="toSourceEditor"/>
|
||||||
|
</Item1>
|
||||||
|
<Item2>
|
||||||
|
<Filename Value="ctopasconvert.pas"/>
|
||||||
|
<UnitName Value="ctopasconvert"/>
|
||||||
|
</Item2>
|
||||||
|
<Item3>
|
||||||
|
<Filename Value="extconvdialog.pas"/>
|
||||||
|
<UnitName Value="extconvdialog"/>
|
||||||
|
</Item3>
|
||||||
|
<Item4>
|
||||||
|
<Filename Value="cconvconfig.pas"/>
|
||||||
|
<UnitName Value="cconvconfig"/>
|
||||||
|
</Item4>
|
||||||
|
<Item5>
|
||||||
|
<Filename Value="converteridesettings.pas"/>
|
||||||
|
<UnitName Value="converteridesettings"/>
|
||||||
|
</Item5>
|
||||||
|
<Item6>
|
||||||
|
<Filename Value="extconvdialog.lfm"/>
|
||||||
|
<Type Value="LFM"/>
|
||||||
|
</Item6>
|
||||||
|
</Files>
|
||||||
|
<Type Value="RunAndDesignTime"/>
|
||||||
|
<RequiredPkgs Count="3">
|
||||||
|
<Item1>
|
||||||
|
<PackageName Value="IDEIntf"/>
|
||||||
|
</Item1>
|
||||||
|
<Item2>
|
||||||
|
<PackageName Value="LCL"/>
|
||||||
|
</Item2>
|
||||||
|
<Item3>
|
||||||
|
<PackageName Value="FCL"/>
|
||||||
|
<MinVersion Major="1" Valid="True"/>
|
||||||
|
</Item3>
|
||||||
|
</RequiredPkgs>
|
||||||
|
<UsageOptions>
|
||||||
|
<UnitPath Value="$(PkgOutDir)/"/>
|
||||||
|
</UsageOptions>
|
||||||
|
<PublishOptions>
|
||||||
|
<Version Value="2"/>
|
||||||
|
<IgnoreBinaries Value="False"/>
|
||||||
|
</PublishOptions>
|
||||||
|
</Package>
|
||||||
|
</CONFIG>
|
22
components/chelper/chelper.pas
Normal file
22
components/chelper/chelper.pas
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
{ This file was automatically created by Lazarus. Do not edit!
|
||||||
|
This source is only used to compile and install the package.
|
||||||
|
}
|
||||||
|
|
||||||
|
unit chelper;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
toSourceEditor, ctopasconvert, extconvdialog, cconvconfig,
|
||||||
|
converteridesettings, LazarusPackageIntf;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
procedure Register;
|
||||||
|
begin
|
||||||
|
RegisterUnit('toSourceEditor',@toSourceEditor.Register);
|
||||||
|
end;
|
||||||
|
|
||||||
|
initialization
|
||||||
|
RegisterPackage('chelper',@Register);
|
||||||
|
end.
|
108
components/chelper/codewriter.pas
Normal file
108
components/chelper/codewriter.pas
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
unit codewriter;
|
||||||
|
|
||||||
|
{$mode delphi}
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
Classes, SysUtils;
|
||||||
|
|
||||||
|
type
|
||||||
|
|
||||||
|
{ TCodeWriter }
|
||||||
|
|
||||||
|
TCodeWriter = class(TObject)
|
||||||
|
private
|
||||||
|
fnewline:Boolean;
|
||||||
|
fText : AnsiString;
|
||||||
|
fIdent : AnsiString;
|
||||||
|
fIdDelta : AnsiString;
|
||||||
|
newline : Boolean;
|
||||||
|
|
||||||
|
fCurLine : AnsiString;
|
||||||
|
fSection : AnsiString;
|
||||||
|
|
||||||
|
fMaxLen : Integer;
|
||||||
|
fCheckLineLen : Boolean;
|
||||||
|
public
|
||||||
|
constructor Create;
|
||||||
|
procedure IncIdent;
|
||||||
|
procedure DecIdent;
|
||||||
|
procedure W(const s: AnsiString='');
|
||||||
|
procedure Wln(const s: AnsiString='');
|
||||||
|
procedure StartNewLine;
|
||||||
|
property Section: AnsiString read fSection write fSection;
|
||||||
|
property Text: AnsiString read fText write fText;
|
||||||
|
property LineStarts: Boolean read fnewline;
|
||||||
|
|
||||||
|
property MaxLineLen: Integer read fMaxLen write fMaxLen;
|
||||||
|
property CheckLineLen: Boolean read fCheckLineLen write fCheckLineLen;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure SetPasSection(wr: TCodeWriter; const SectionName: AnsiString; DoIdent: Boolean=true);
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
procedure SetPasSection(wr: TCodeWriter; const SectionName: AnsiString; DoIdent: Boolean);
|
||||||
|
begin
|
||||||
|
if wr.Section=SectionName then Exit;
|
||||||
|
|
||||||
|
if (wr.Section<>'') and DoIdent then wr.DecIdent;
|
||||||
|
if SectionName<>'' then wr.Wln(SectionName);
|
||||||
|
wr.Section:=SectionName;
|
||||||
|
if (wr.Section<>'') and DoIdent then wr.IncIdent;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TCodeWriter }
|
||||||
|
|
||||||
|
constructor TCodeWriter.Create;
|
||||||
|
begin
|
||||||
|
fIdDelta:=' ';
|
||||||
|
newline:=True;
|
||||||
|
fMaxLen:=80;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCodeWriter.IncIdent;
|
||||||
|
begin
|
||||||
|
fIdent:=fIdent+fIdDelta;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCodeWriter.DecIdent;
|
||||||
|
begin
|
||||||
|
fIdent:=Copy(fIdent, 1, length(fIdent)-length(fIdDelta));
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCodeWriter.W(const s:String);
|
||||||
|
var
|
||||||
|
AutoBreak: Boolean;
|
||||||
|
begin
|
||||||
|
//todo: check eoln symbols in s
|
||||||
|
if s ='' then Exit;
|
||||||
|
|
||||||
|
AutoBreak:=CheckLineLen and (fCurLine<>'') and ( length(fCurLine+fIdent)+length(s) > fMaxLen);
|
||||||
|
if AutoBreak then begin
|
||||||
|
fText:=fText+LineEnding;
|
||||||
|
fCurLine:='';
|
||||||
|
fText:=fText+fIdent+fIdDelta;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if newline then fText:=fText+fIdent;
|
||||||
|
fText:=fText+s;
|
||||||
|
fCurLine:=fCurLine+s;
|
||||||
|
newline:=False;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCodeWriter.Wln(const s:String);
|
||||||
|
begin
|
||||||
|
W(s+LineEnding);
|
||||||
|
newline:=True;
|
||||||
|
fCurLine:='';
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCodeWriter.StartNewLine;
|
||||||
|
begin
|
||||||
|
if not newline then Wln;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
|
|
110
components/chelper/converteridesettings.pas
Normal file
110
components/chelper/converteridesettings.pas
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
{ The unit is part of Lazarus Chelper package
|
||||||
|
|
||||||
|
Copyright (C) 2010 Dmitry Boyarintsev skalogryz dot lists at gmail.com
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU Library General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public License
|
||||||
|
along with this library; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
}
|
||||||
|
unit converteridesettings;
|
||||||
|
|
||||||
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
Classes, SysUtils, ctopasconvert, IniFiles;
|
||||||
|
|
||||||
|
var
|
||||||
|
ConvSettings : TConvertSettings=nil;
|
||||||
|
ExtTool : AnsiString='';
|
||||||
|
UseExtTool : Boolean=True;
|
||||||
|
ExtTimeOut : LongWord = 5000;
|
||||||
|
ConvFile : AnsiString='';
|
||||||
|
DefineFile : AnsiString='';
|
||||||
|
|
||||||
|
procedure StringToFile(const Str, DstFileName: AnsiString);
|
||||||
|
function StringFromFile(const SrcFileName: AnsiString): AnsiString;
|
||||||
|
|
||||||
|
procedure WriteIDESettings(const FileName: AnsiString);
|
||||||
|
procedure ReadIDESettings(const FileName: AnsiString);
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
procedure StringToFile(const Str, DstFileName: AnsiString);
|
||||||
|
var
|
||||||
|
fs: TFileStream;
|
||||||
|
begin
|
||||||
|
fs:=TFileStream.Create(DstFileName, fmCreate);
|
||||||
|
if Str<>'' then fs.Write(Str[1], length(Str));
|
||||||
|
fs.Free;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function StringFromFile(const SrcFileName: AnsiString): AnsiString;
|
||||||
|
var
|
||||||
|
fs : TFileStream;
|
||||||
|
begin
|
||||||
|
Result:='';
|
||||||
|
try
|
||||||
|
if not FileExists(SrcFileName) then Exit;
|
||||||
|
fs:=TFileStream.Create(SrcFileName, fmOpenRead or fmShareDenyNone);
|
||||||
|
try
|
||||||
|
SetLength(Result, fs.Size);
|
||||||
|
if fs.Size>0 then fs.Read(Result[1], fs.Size);
|
||||||
|
finally
|
||||||
|
fs.Free;
|
||||||
|
end;
|
||||||
|
except
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure WriteIDESettings(const FileName:AnsiString);
|
||||||
|
var
|
||||||
|
ini : TIniFile;
|
||||||
|
begin
|
||||||
|
try
|
||||||
|
ini:=TIniFile.Create(FileName);
|
||||||
|
try
|
||||||
|
ini.WriteString('Tool', 'Exe', ExtTool);
|
||||||
|
ini.WriteString('Tool', 'DefineFile', DefineFile);
|
||||||
|
finally
|
||||||
|
ini.Free;
|
||||||
|
end;
|
||||||
|
except
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure ReadIDESettings(const FileName:AnsiString);
|
||||||
|
var
|
||||||
|
ini : TIniFile;
|
||||||
|
begin
|
||||||
|
try
|
||||||
|
ini:=TIniFile.Create(FileName);
|
||||||
|
try
|
||||||
|
ExtTool:=ini.ReadString('Tool', 'Exe', ExtTool);
|
||||||
|
DefineFile:=ini.ReadString('Tool', 'DefineFile',DefineFile);
|
||||||
|
finally
|
||||||
|
ini.Free;
|
||||||
|
end;
|
||||||
|
except
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
initialization
|
||||||
|
ConvSettings := TConvertSettings.Create;
|
||||||
|
|
||||||
|
finalization
|
||||||
|
ConvSettings.Free;
|
||||||
|
|
||||||
|
end.
|
||||||
|
|
1944
components/chelper/cparsertypes.pas
Executable file
1944
components/chelper/cparsertypes.pas
Executable file
File diff suppressed because it is too large
Load Diff
240
components/chelper/cparserutils.pas
Normal file
240
components/chelper/cparserutils.pas
Normal file
@ -0,0 +1,240 @@
|
|||||||
|
{ The unit is part of Lazarus Chelper package
|
||||||
|
|
||||||
|
Copyright (C) 2010 Dmitry Boyarintsev skalogryz dot lists at gmail.com
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU Library General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public License
|
||||||
|
along with this library; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
}
|
||||||
|
unit cparserutils;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
cparsertypes;
|
||||||
|
|
||||||
|
// is function declared, i.e. int f()
|
||||||
|
function isFunc(name: TNamePart): Boolean;
|
||||||
|
|
||||||
|
|
||||||
|
// probably an untyped function: fn ().
|
||||||
|
// the name of the function has been consumed by TYPE parsing, so ommited!
|
||||||
|
// so TNamepart doesn't contain any children
|
||||||
|
function isUnnamedFunc(name: TNamepart): Boolean;
|
||||||
|
|
||||||
|
// is pointer to a function declared, i.e. int (*f)()
|
||||||
|
function isPtrToFunc(name: TNamePart): Boolean;
|
||||||
|
|
||||||
|
// is function declared, returning a pointer to a function, i.e. int (* (f)(int i) )()
|
||||||
|
// pascal variant of this case:
|
||||||
|
// type
|
||||||
|
// TRetFunc = function : Integer;
|
||||||
|
// function f(i: Integer): TRetFunc; // body or extern modifier must be present!!!
|
||||||
|
function isFuncRetFuncPtr(name: TNamePart): Boolean;
|
||||||
|
|
||||||
|
// is pointer to a function declared, returning a pointer to a function, i.e.: int (*(*f)(int i))()
|
||||||
|
// pascal variant of this case:
|
||||||
|
// type
|
||||||
|
// TRetFunc = function : Integer;
|
||||||
|
// var
|
||||||
|
// f : function (i: Integer): TRetFunc;
|
||||||
|
function isPtrToFuncRetFuncPtr(name: TNamePart): Boolean;
|
||||||
|
|
||||||
|
function GetFuncParam(name: TNamePart): TNamePart;
|
||||||
|
|
||||||
|
// is array variable:
|
||||||
|
// int a[10], *a[10] (array of 10 integers, or array of 10 pointers to integer)
|
||||||
|
function isArray(name: TNamePart): Boolean;
|
||||||
|
|
||||||
|
function GetArrayPart(name: TNamePart): TNamePart;
|
||||||
|
|
||||||
|
// returns the variable/function name from the struct
|
||||||
|
function GetIdFromPart(name: TNamePart): AnsiString;
|
||||||
|
|
||||||
|
function GetIdPart(name: TNamePart): TNamePart;
|
||||||
|
|
||||||
|
function isNamePartPtrToFunc(part: TNamePart): Boolean; inline;
|
||||||
|
|
||||||
|
|
||||||
|
type
|
||||||
|
|
||||||
|
{ TLineBreaker }
|
||||||
|
|
||||||
|
TLineInfo = record
|
||||||
|
linestart : Integer;
|
||||||
|
lineend : Integer;
|
||||||
|
end;
|
||||||
|
|
||||||
|
TLineBreaker = class(TObject)
|
||||||
|
private
|
||||||
|
fLines : array of TLineInfo;
|
||||||
|
flineCount : Integer;
|
||||||
|
procedure AddLine(const linestart, lineend: Integer);
|
||||||
|
public
|
||||||
|
procedure SetText(const AText: AnsiString);
|
||||||
|
function LineNumber(Offset: Integer): Integer;
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
function isNamePartPtrToFunc(part: TNamePart): Boolean; inline;
|
||||||
|
begin
|
||||||
|
Result:=Assigned(part) and (part.Kind=nk_Ref) and Assigned(part.owner) and (part.owner.kind=nk_Func);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function isPtrToFunc(name: TNamePart): Boolean;
|
||||||
|
begin
|
||||||
|
Result := Assigned(name) and (name.Kind=nk_Func) and Assigned(name.child) and
|
||||||
|
(name.child.Kind=nk_Ref) and Assigned(name.child.child) and
|
||||||
|
(name.child.child.Kind=nk_Ident);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function SkipRefPart(name: TNamePart): TNamePart;
|
||||||
|
begin
|
||||||
|
if Assigned(name) then begin
|
||||||
|
if name.Kind=nk_Ref then Result:=name.child
|
||||||
|
else Result:=name;
|
||||||
|
end else
|
||||||
|
Result:=nil;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function isFunc(name: TNamePart): Boolean;
|
||||||
|
begin
|
||||||
|
name:=SkipRefPart(name);
|
||||||
|
Result:=Assigned(name) and (name.Kind=nk_Func) and Assigned(name.child) and (name.child.Kind=nk_Ident)
|
||||||
|
end;
|
||||||
|
|
||||||
|
function isUnnamedFunc(name: TNamepart): Boolean;
|
||||||
|
begin
|
||||||
|
Result:=Assigned(name) and not Assigned(name.child) and (name.Kind=nk_Func);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function isRetFuncPtr(name: TNamePart): Boolean;
|
||||||
|
begin
|
||||||
|
Result:=Assigned(name) and Assigned(name.child) and
|
||||||
|
(name.Kind=nk_Func) and (name.child.Kind=nk_Ref);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function GetFuncParam(name:TNamePart):TNamePart;
|
||||||
|
begin
|
||||||
|
while Assigned(name) and (name.Kind<>nk_Func) do name:=name.child;
|
||||||
|
Result:=name;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function isArray(name: TNamePart): Boolean;
|
||||||
|
begin
|
||||||
|
Result:=(name.Kind=nk_Array)
|
||||||
|
or (Assigned(name.child)
|
||||||
|
and (name.child.Kind=nk_Array)
|
||||||
|
and (name.Kind=nk_Ref));
|
||||||
|
end;
|
||||||
|
|
||||||
|
function isFuncRetFuncPtr(name: TNamePart): Boolean;
|
||||||
|
var
|
||||||
|
p : TNamePart;
|
||||||
|
begin
|
||||||
|
Result:=isRetFuncPtr(name);
|
||||||
|
if Result then begin
|
||||||
|
p:=name.child.child;
|
||||||
|
Result:=Assigned(p) and Assigned(p.child)
|
||||||
|
and (p.Kind=nk_Func)
|
||||||
|
and (p.child.Kind=nk_Ident)
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function isPtrToFuncRetFuncPtr(name: TNamePart): Boolean;
|
||||||
|
var
|
||||||
|
p : TNamePart;
|
||||||
|
begin
|
||||||
|
Result:=isRetFuncPtr(name);
|
||||||
|
if Result then begin
|
||||||
|
p:=name.child.child;
|
||||||
|
Result:=Assigned(p) and Assigned(p.child) and Assigned(p.child.child)
|
||||||
|
and (p.Kind=nk_Func) and (p.child.Kind=nk_Ref)
|
||||||
|
and (p.child.child.Kind=nk_Ident);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function GetArrayPart(name:TNamePart):TNamePart;
|
||||||
|
begin
|
||||||
|
if name.Kind=nk_Array then
|
||||||
|
Result:=name
|
||||||
|
else if (name.Kind=nk_Ref) and (Assigned(name.child)) and (name.child.Kind=nk_array) then
|
||||||
|
Result:=name.child
|
||||||
|
else
|
||||||
|
Result:=nil;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function GetIdFromPart(name: TNamePart): AnsiString;
|
||||||
|
begin
|
||||||
|
while Assigned(name) and (name.Kind<>nk_Ident) do
|
||||||
|
name:=name.child;
|
||||||
|
if Assigned(name) then Result:=name.Id
|
||||||
|
else Result:='';
|
||||||
|
end;
|
||||||
|
|
||||||
|
function GetIdPart(name: TNamePart): TNamePart;
|
||||||
|
begin
|
||||||
|
Result:=nil;
|
||||||
|
while Assigned(name) and (name.Kind<>nk_Ident) do
|
||||||
|
name:=name.child;
|
||||||
|
Result:=name;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TLineBreaker }
|
||||||
|
|
||||||
|
procedure TLineBreaker.AddLine(const linestart,lineend:Integer);
|
||||||
|
begin
|
||||||
|
if flineCount=length(fLines) then begin
|
||||||
|
if fLineCount=0 then SetLength(fLines, 4)
|
||||||
|
else SetLength(fLines, fLineCount*2)
|
||||||
|
end;
|
||||||
|
fLines[fLineCount].linestart:=linestart;
|
||||||
|
fLines[fLineCount].lineend:=lineend;
|
||||||
|
inc(fLineCount);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TLineBreaker.SetText(const AText: AnsiString);
|
||||||
|
var
|
||||||
|
i : Integer;
|
||||||
|
j : Integer;
|
||||||
|
begin
|
||||||
|
flineCount:=0;
|
||||||
|
i:=1;
|
||||||
|
j:=1;
|
||||||
|
while i<=length(AText) do begin
|
||||||
|
if (AText[i] in [#10, #13]) then begin
|
||||||
|
inc(i);
|
||||||
|
if (i<=length(AText)) and (AText[i] in [#10, #13]) and (AText[i-1]<>Atext[i]) then
|
||||||
|
inc(i);
|
||||||
|
AddLine(j, i-1);
|
||||||
|
j:=i;
|
||||||
|
end else
|
||||||
|
inc(i);
|
||||||
|
end;
|
||||||
|
if j<>i-1 then AddLine(j, i-1);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TLineBreaker.LineNumber(Offset:Integer):Integer;
|
||||||
|
var
|
||||||
|
i : Integer;
|
||||||
|
begin
|
||||||
|
for i:=0 to flineCount-1 do
|
||||||
|
if (Offset>=fLines[i].linestart) and (Offset<=flines[i].lineend) then begin
|
||||||
|
Result:=i;
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
Result:=-1;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
1213
components/chelper/ctopasconvert.pas
Normal file
1213
components/chelper/ctopasconvert.pas
Normal file
File diff suppressed because it is too large
Load Diff
20
components/chelper/ctopasexp.pas
Normal file
20
components/chelper/ctopasexp.pas
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
unit CToPasExp;
|
||||||
|
|
||||||
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
Classes, SysUtils, prsExpression;
|
||||||
|
|
||||||
|
function PascalizeCExp(CExp: TExpEntity; PascalExps : TList): Boolean;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
function PascalizeCExp(CExp: TExpEntity; PascalExps : TList): Boolean;
|
||||||
|
begin
|
||||||
|
Result:=False;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
|
|
217
components/chelper/extconvdialog.lfm
Normal file
217
components/chelper/extconvdialog.lfm
Normal file
@ -0,0 +1,217 @@
|
|||||||
|
object CtoPasConfig: TCtoPasConfig
|
||||||
|
Left = 336
|
||||||
|
Height = 446
|
||||||
|
Top = 231
|
||||||
|
Width = 655
|
||||||
|
Caption = 'C to Pascal settings'
|
||||||
|
ClientHeight = 446
|
||||||
|
ClientWidth = 655
|
||||||
|
OnClose = FormClose
|
||||||
|
OnResize = FormResize
|
||||||
|
LCLVersion = '0.9.29'
|
||||||
|
object Notebook1: TNotebook
|
||||||
|
Left = 16
|
||||||
|
Height = 421
|
||||||
|
Top = 8
|
||||||
|
Width = 622
|
||||||
|
Anchors = [akTop, akLeft, akRight, akBottom]
|
||||||
|
PageIndex = 0
|
||||||
|
TabOrder = 0
|
||||||
|
object pageMain: TPage
|
||||||
|
Caption = 'Main'
|
||||||
|
ClientWidth = 616
|
||||||
|
ClientHeight = 382
|
||||||
|
object Panel1: TPanel
|
||||||
|
Left = 0
|
||||||
|
Height = 172
|
||||||
|
Top = 0
|
||||||
|
Width = 616
|
||||||
|
Align = alTop
|
||||||
|
BevelOuter = bvNone
|
||||||
|
ClientHeight = 172
|
||||||
|
ClientWidth = 616
|
||||||
|
TabOrder = 0
|
||||||
|
object Label1: TLabel
|
||||||
|
Left = 6
|
||||||
|
Height = 18
|
||||||
|
Top = 5
|
||||||
|
Width = 150
|
||||||
|
Caption = 'Pascal code generation:'
|
||||||
|
ParentColor = False
|
||||||
|
end
|
||||||
|
object chkRecordsPacked: TCheckBox
|
||||||
|
Left = 6
|
||||||
|
Height = 18
|
||||||
|
Top = 36
|
||||||
|
Width = 144
|
||||||
|
Caption = 'Records are packed'
|
||||||
|
TabOrder = 0
|
||||||
|
end
|
||||||
|
object chkFuncAreExt: TCheckBox
|
||||||
|
Left = 6
|
||||||
|
Height = 18
|
||||||
|
Top = 70
|
||||||
|
Width = 161
|
||||||
|
Caption = 'Functions are external'
|
||||||
|
TabOrder = 1
|
||||||
|
end
|
||||||
|
object chkEnums: TCheckBox
|
||||||
|
Left = 6
|
||||||
|
Height = 18
|
||||||
|
Top = 107
|
||||||
|
Width = 244
|
||||||
|
Caption = 'Enumerations are Integer constants'
|
||||||
|
TabOrder = 2
|
||||||
|
end
|
||||||
|
object Label3: TLabel
|
||||||
|
Left = 197
|
||||||
|
Height = 18
|
||||||
|
Top = 70
|
||||||
|
Width = 115
|
||||||
|
Caption = 'Calling convention'
|
||||||
|
ParentColor = False
|
||||||
|
end
|
||||||
|
object cmbCallConv: TComboBox
|
||||||
|
Left = 325
|
||||||
|
Height = 21
|
||||||
|
Top = 67
|
||||||
|
Width = 160
|
||||||
|
ItemHeight = 0
|
||||||
|
ItemIndex = 0
|
||||||
|
Items.Strings = (
|
||||||
|
'cdecl'
|
||||||
|
'stdcall'
|
||||||
|
'mwpascal'
|
||||||
|
'fastcall'
|
||||||
|
)
|
||||||
|
TabOrder = 3
|
||||||
|
Text = 'cdecl'
|
||||||
|
end
|
||||||
|
object lblDefines: TLabel
|
||||||
|
Left = 11
|
||||||
|
Height = 18
|
||||||
|
Top = 136
|
||||||
|
Width = 51
|
||||||
|
Caption = 'Defines:'
|
||||||
|
ParentColor = False
|
||||||
|
end
|
||||||
|
object edtDefines: TEdit
|
||||||
|
AnchorSideLeft.Control = lblDefines
|
||||||
|
AnchorSideLeft.Side = asrBottom
|
||||||
|
AnchorSideRight.Control = btnSelect
|
||||||
|
Left = 68
|
||||||
|
Height = 22
|
||||||
|
Top = 136
|
||||||
|
Width = 376
|
||||||
|
Anchors = [akTop, akLeft, akRight]
|
||||||
|
BorderSpacing.Left = 6
|
||||||
|
BorderSpacing.Right = 6
|
||||||
|
TabOrder = 4
|
||||||
|
end
|
||||||
|
object btnSelect: TButton
|
||||||
|
AnchorSideRight.Control = btnEdit
|
||||||
|
Left = 450
|
||||||
|
Height = 20
|
||||||
|
Top = 136
|
||||||
|
Width = 70
|
||||||
|
Anchors = [akTop, akRight]
|
||||||
|
AutoSize = True
|
||||||
|
BorderSpacing.Right = 20
|
||||||
|
Caption = 'Select'
|
||||||
|
OnClick = btnSelectClick
|
||||||
|
TabOrder = 5
|
||||||
|
end
|
||||||
|
object btnEdit: TButton
|
||||||
|
Left = 540
|
||||||
|
Height = 20
|
||||||
|
Top = 136
|
||||||
|
Width = 70
|
||||||
|
Anchors = [akTop, akRight]
|
||||||
|
Caption = 'Edit'
|
||||||
|
OnClick = btnEditClick
|
||||||
|
TabOrder = 6
|
||||||
|
end
|
||||||
|
end
|
||||||
|
object Panel2: TPanel
|
||||||
|
Left = 0
|
||||||
|
Height = 210
|
||||||
|
Top = 172
|
||||||
|
Width = 616
|
||||||
|
Align = alClient
|
||||||
|
Alignment = taLeftJustify
|
||||||
|
BevelOuter = bvNone
|
||||||
|
ClientHeight = 210
|
||||||
|
ClientWidth = 616
|
||||||
|
TabOrder = 1
|
||||||
|
object Splitter1: TSplitter
|
||||||
|
Cursor = crVSplit
|
||||||
|
Left = 0
|
||||||
|
Height = 5
|
||||||
|
Top = 0
|
||||||
|
Width = 616
|
||||||
|
Align = alTop
|
||||||
|
ResizeAnchor = akTop
|
||||||
|
end
|
||||||
|
object Label2: TLabel
|
||||||
|
Left = 6
|
||||||
|
Height = 18
|
||||||
|
Top = 14
|
||||||
|
Width = 181
|
||||||
|
Caption = 'C to Pascal types convertion'
|
||||||
|
ParentColor = False
|
||||||
|
end
|
||||||
|
object Memo1: TMemo
|
||||||
|
Left = 6
|
||||||
|
Height = 160
|
||||||
|
Top = 44
|
||||||
|
Width = 604
|
||||||
|
Align = alBottom
|
||||||
|
Anchors = [akTop, akLeft, akRight, akBottom]
|
||||||
|
BorderSpacing.Left = 6
|
||||||
|
BorderSpacing.Right = 6
|
||||||
|
BorderSpacing.Bottom = 6
|
||||||
|
ScrollBars = ssVertical
|
||||||
|
TabOrder = 1
|
||||||
|
end
|
||||||
|
object Button2: TButton
|
||||||
|
Left = 476
|
||||||
|
Height = 20
|
||||||
|
Top = 14
|
||||||
|
Width = 134
|
||||||
|
Anchors = [akTop, akLeft, akRight]
|
||||||
|
AutoSize = True
|
||||||
|
Caption = 'Reset to defaults'
|
||||||
|
OnClick = Button2Click
|
||||||
|
TabOrder = 2
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
object pageConverter: TPage
|
||||||
|
Caption = 'Converter'
|
||||||
|
ClientWidth = 616
|
||||||
|
ClientHeight = 382
|
||||||
|
object edtExtTool: TEdit
|
||||||
|
Left = 13
|
||||||
|
Height = 22
|
||||||
|
Top = 6
|
||||||
|
Width = 511
|
||||||
|
Anchors = [akTop, akLeft, akRight]
|
||||||
|
TabOrder = 0
|
||||||
|
end
|
||||||
|
object Button1: TButton
|
||||||
|
Left = 538
|
||||||
|
Height = 20
|
||||||
|
Top = 6
|
||||||
|
Width = 70
|
||||||
|
Anchors = [akTop, akRight]
|
||||||
|
Caption = 'Select'
|
||||||
|
OnClick = Button1Click
|
||||||
|
TabOrder = 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
object OpenDialog1: TOpenDialog
|
||||||
|
left = 304
|
||||||
|
top = 168
|
||||||
|
end
|
||||||
|
end
|
151
components/chelper/extconvdialog.pas
Normal file
151
components/chelper/extconvdialog.pas
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
unit extconvdialog;
|
||||||
|
|
||||||
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
Classes,SysUtils,FileUtil,Forms,Controls,Graphics,Dialogs,StdCtrls,ExtCtrls,
|
||||||
|
converteridesettings, ctopasconvert, LazIDEIntf;
|
||||||
|
|
||||||
|
type
|
||||||
|
|
||||||
|
{ TCtoPasConfig }
|
||||||
|
|
||||||
|
TCtoPasConfig = class(TForm)
|
||||||
|
Button1: TButton;
|
||||||
|
btnSelect:TButton;
|
||||||
|
btnEdit:TButton;
|
||||||
|
Button2:TButton;
|
||||||
|
chkRecordsPacked:TCheckBox;
|
||||||
|
chkFuncAreExt:TCheckBox;
|
||||||
|
chkEnums:TCheckBox;
|
||||||
|
cmbCallConv:TComboBox;
|
||||||
|
edtDefines:TEdit;
|
||||||
|
edtExtTool: TEdit;
|
||||||
|
Label1:TLabel;
|
||||||
|
Label2:TLabel;
|
||||||
|
Label3:TLabel;
|
||||||
|
lblDefines:TLabel;
|
||||||
|
Memo1:TMemo;
|
||||||
|
Notebook1:TNotebook;
|
||||||
|
OpenDialog1: TOpenDialog;
|
||||||
|
pageMain:TPage;
|
||||||
|
pageConverter:TPage;
|
||||||
|
Panel1:TPanel;
|
||||||
|
Panel2:TPanel;
|
||||||
|
Splitter1:TSplitter;
|
||||||
|
procedure btnEditClick(Sender:TObject);
|
||||||
|
procedure btnSelectClick(Sender:TObject);
|
||||||
|
procedure Button1Click(Sender: TObject);
|
||||||
|
procedure Button2Click(Sender:TObject);
|
||||||
|
procedure FormClose(Sender:TObject;var CloseAction:TCloseAction);
|
||||||
|
procedure FormResize(Sender: TObject);
|
||||||
|
private
|
||||||
|
{ private declarations }
|
||||||
|
public
|
||||||
|
{ public declarations }
|
||||||
|
procedure SettingsToUI;
|
||||||
|
procedure UIToSettings;
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
CtoPasConfig: TCtoPasConfig;
|
||||||
|
|
||||||
|
function ShowConfigDialog: TCtoPasConfig;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
{$R *.lfm}
|
||||||
|
|
||||||
|
function ShowConfigDialog: TCtoPasConfig;
|
||||||
|
begin
|
||||||
|
if not Assigned(CtoPasConfig) then begin
|
||||||
|
CtoPasConfig := TCtoPasConfig.Create(nil);
|
||||||
|
CtoPasConfig.SettingsToUI;
|
||||||
|
end;
|
||||||
|
CtoPasConfig.Show;
|
||||||
|
CtoPasConfig.BringToFront;
|
||||||
|
Result:=CtoPasConfig;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TCtoPasConfig }
|
||||||
|
|
||||||
|
procedure TCtoPasConfig.Button1Click(Sender: TObject);
|
||||||
|
begin
|
||||||
|
if OpenDialog1.Execute then
|
||||||
|
edtExtTool.Text := OpenDialog1.FileName;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCtoPasConfig.Button2Click(Sender:TObject);
|
||||||
|
var
|
||||||
|
cfg : TConvertSettings;
|
||||||
|
begin
|
||||||
|
if MessageDlg('Reset types',
|
||||||
|
'Reset c-to-pascal types converting to defaults?',
|
||||||
|
mtConfirmation, mbYesNo, 0)<>mrYes then Exit;
|
||||||
|
cfg := TConvertSettings.Create;
|
||||||
|
try
|
||||||
|
Memo1.Lines.Assign(cfg.CtoPasTypes);
|
||||||
|
finally
|
||||||
|
cfg.Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCtoPasConfig.btnSelectClick(Sender:TObject);
|
||||||
|
begin
|
||||||
|
if OpenDialog1.Execute then
|
||||||
|
edtDefines.Text:=OpenDialog1.FileName;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCtoPasConfig.btnEditClick(Sender:TObject);
|
||||||
|
var
|
||||||
|
fs : TFileStream;
|
||||||
|
begin
|
||||||
|
if edtDefines.Text='' then Exit;
|
||||||
|
if not FileExistsUTF8(edtDefines.Text) then begin
|
||||||
|
ForceDirectoriesUTF8( ExtractFileDir(edtDefines.Text));
|
||||||
|
try
|
||||||
|
fs:=TFileStream.Create(edtDefines.Text, fmCreate);
|
||||||
|
fs.Free;
|
||||||
|
except
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
LazarusIDE.DoOpenEditorFile(edtDefines.Text, 0, 0, [ofQuiet, ofRegularFile, ofDoNotLoadResource, ofDoLoadResource]);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCtoPasConfig.FormClose(Sender:TObject;var CloseAction:TCloseAction);
|
||||||
|
begin
|
||||||
|
// don't free the form on close.
|
||||||
|
UIToSettings;
|
||||||
|
CloseAction:=caHide;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCtoPasConfig.FormResize(Sender: TObject);
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCtoPasConfig.SettingsToUI;
|
||||||
|
begin
|
||||||
|
chkRecordsPacked.Checked:=ConvSettings.RecordsArePacked;
|
||||||
|
chkFuncAreExt.Checked:=ConvSettings.FuncsAreExternal;
|
||||||
|
chkEnums.Checked:=ConvSettings.EnumsAsConst;
|
||||||
|
cmbCallConv.Text:=ConvSettings.FuncConv;
|
||||||
|
Memo1.Lines.Assign(ConvSettings.CtoPasTypes);
|
||||||
|
edtDefines.Text:=DefineFile;
|
||||||
|
edtExtTool.Text:=ExtTool;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCtoPasConfig.UIToSettings;
|
||||||
|
begin
|
||||||
|
ConvSettings.RecordsArePacked:=chkRecordsPacked.Checked;
|
||||||
|
ConvSettings.FuncsAreExternal:=chkFuncAreExt.Checked;
|
||||||
|
ConvSettings.EnumsAsConst:=chkEnums.Checked;
|
||||||
|
ConvSettings.FuncConv:=cmbCallConv.Text;
|
||||||
|
ConvSettings.CtoPasTypes.Assign(Memo1.Lines);
|
||||||
|
DefineFile:=edtDefines.Text;
|
||||||
|
ExtTool:=edtExtTool.Text;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
|
|
151
components/chelper/textparsingutils.pas
Normal file
151
components/chelper/textparsingutils.pas
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
{ The unit is part of Lazarus Chelper package
|
||||||
|
|
||||||
|
Copyright (C) 2010 Dmitry Boyarintsev skalogryz dot lists at gmail.com
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU Library General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public License
|
||||||
|
along with this library; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
}
|
||||||
|
unit TextParsingUtils;
|
||||||
|
|
||||||
|
{$ifdef fpc}{$mode delphi}{$h+}{$endif}
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
type
|
||||||
|
TCharSet = set of Char;
|
||||||
|
|
||||||
|
const
|
||||||
|
EoLnChars = [#10,#13];
|
||||||
|
SpaceChars = [#32,#9];
|
||||||
|
InvsChars = SpaceChars;
|
||||||
|
WhiteSpaceChars = SpaceChars;
|
||||||
|
SpaceEolnChars = EoLnChars+SpaceChars;
|
||||||
|
NumericChars = ['0'..'9'];
|
||||||
|
AlphabetChars = ['a'..'z','A'..'Z'];
|
||||||
|
AlphaNumChars = AlphabetChars+NumericChars;
|
||||||
|
|
||||||
|
function ScanWhile(const s: AnsiString; var index: Integer; const ch: TCharSet): AnsiString;
|
||||||
|
function ScanTo(const s: AnsiString; var index: Integer; const ch: TCharSet): AnsiString;
|
||||||
|
function SkipToEoln(const s: AnsiString; var index: Integer): AnsiString;
|
||||||
|
|
||||||
|
// returns #10, #13, #10#13 or #13#10, if s[index] is end-of-line sequence
|
||||||
|
// otherwise returns empty string
|
||||||
|
function EolnStr(const s: AnsiString; index: Integer): String;
|
||||||
|
|
||||||
|
function IsSubStr(const sbs, s: AnsiString; index: Integer): Boolean;
|
||||||
|
|
||||||
|
// todo: not used?
|
||||||
|
function SkipCommentBlock(const s: AnsiString; var index: Integer; const closecmt: AnsiString): AnsiString;
|
||||||
|
|
||||||
|
function SkipLine(const s: AnsiString; var index: Integer): AnsiString;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
function ScanWhile(const s: AnsiString; var index: Integer; const ch: TCharSet): AnsiString;
|
||||||
|
var
|
||||||
|
i : Integer;
|
||||||
|
begin
|
||||||
|
Result := '';
|
||||||
|
if (index <= 0) or (index > length(s)) then Exit;
|
||||||
|
for i := index to length(s) do
|
||||||
|
if not (s[i] in ch) then begin
|
||||||
|
if i = index then Result := ''
|
||||||
|
else Result := Copy(s, index, i - index);
|
||||||
|
index := i;
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
Result := Copy(s, index, length(s) - index + 1);
|
||||||
|
index := length(s) + 1;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ScanTo(const s: AnsiString; var index: Integer; const ch: TCharSet): AnsiString;
|
||||||
|
var
|
||||||
|
i : Integer;
|
||||||
|
begin
|
||||||
|
Result := '';
|
||||||
|
if (index <= 0) or (index > length(s)) then Exit;
|
||||||
|
for i := index to length(s) do
|
||||||
|
if (s[i] in ch) then begin
|
||||||
|
if i = index then Result := ''
|
||||||
|
else Result := Copy(s, index, i - index);
|
||||||
|
index := i;
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
Result := Copy(s, index, length(s) - index + 1);
|
||||||
|
index := length(s) + 1;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function EolnStr(const s: AnsiString; index: Integer): String;
|
||||||
|
begin
|
||||||
|
if (index<=0) or (index>length(s)) or (not (s[index] in EoLnChars)) then
|
||||||
|
Result:=''
|
||||||
|
else begin
|
||||||
|
if (index<length(s)) and (s[index+1] in EolnChars) and (s[index]<>s[index+1]) then
|
||||||
|
Result:=Copy(s, index, 2)
|
||||||
|
else
|
||||||
|
Result:=s[index];
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function SkipToEoln(const s: AnsiString; var index: Integer): AnsiString;
|
||||||
|
begin
|
||||||
|
Result := ScanTo(s, index, EoLnChars);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function IsSubStr(const sbs, s: AnsiString; index: Integer): Boolean;
|
||||||
|
var
|
||||||
|
i : Integer;
|
||||||
|
j : Integer;
|
||||||
|
begin
|
||||||
|
Result := false;
|
||||||
|
if (sbs = '') or (length(sbs) > length(s) - index) then Exit;
|
||||||
|
j := index;
|
||||||
|
for i := 1 to length(sbs) do begin
|
||||||
|
if sbs[i] <> s[j] then Exit;
|
||||||
|
inc(j);
|
||||||
|
end;
|
||||||
|
Result := true;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function SkipCommentBlock(const s: AnsiString; var index: Integer; const closecmt: AnsiString): AnsiString;
|
||||||
|
begin
|
||||||
|
Result := '';
|
||||||
|
if closecmt = '' then begin
|
||||||
|
index := length(s) + 1;
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
while index <= length(s) do begin
|
||||||
|
Result := Result + ScanTo(s, index, [closecmt[1]]+EoLnChars);
|
||||||
|
//if (index<=length(s)) and (s in EoLnChars(
|
||||||
|
|
||||||
|
if IsSubStr(closecmt, s, index) then begin
|
||||||
|
inc(index, length(closecmt));
|
||||||
|
Exit;
|
||||||
|
end else begin
|
||||||
|
Result := Result + s[index];
|
||||||
|
inc(index);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function SkipLine(const s: AnsiString; var index: Integer): AnsiString;
|
||||||
|
begin
|
||||||
|
Result:=ScanTo(s, index, EoLnChars);
|
||||||
|
if (index<length(s)) and (s[index+1] in EoLnChars) and (s[index]<>s[index+1]) then
|
||||||
|
inc(index);
|
||||||
|
inc(index);
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
|
|
217
components/chelper/tosourceeditor.pas
Normal file
217
components/chelper/tosourceeditor.pas
Normal file
@ -0,0 +1,217 @@
|
|||||||
|
{ The unit is part of Lazarus Chelper package
|
||||||
|
|
||||||
|
Copyright (C) 2010 Dmitry Boyarintsev skalogryz dot lists at gmail.com
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU Library General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public License
|
||||||
|
along with this library; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
}
|
||||||
|
unit toSourceEditor;
|
||||||
|
|
||||||
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
Classes, SysUtils, Dialogs, LCLType, LCLIntf, Forms,
|
||||||
|
Menus, MenuIntf, SrcEditorIntf, process, LazIDEIntf,
|
||||||
|
extconvdialog, converteridesettings, cconvconfig;
|
||||||
|
|
||||||
|
procedure Register;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
function DoExtConvert(const t: AnsiString; var EndPos: TPoint): AnsiString;
|
||||||
|
var
|
||||||
|
p : TProcess;
|
||||||
|
d : AnsiString;
|
||||||
|
inp : AnsiString;
|
||||||
|
outp : AnsiString;
|
||||||
|
i, err : Integer;
|
||||||
|
fs : TFileStream;
|
||||||
|
st : TStringList;
|
||||||
|
cmd : AnsiString;
|
||||||
|
tm : LongWord;
|
||||||
|
begin
|
||||||
|
if t='' then begin
|
||||||
|
Result:='';
|
||||||
|
EndPos.X:=0;
|
||||||
|
EndPos.Y:=0;
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
EndPos.X:=-1;
|
||||||
|
EndPos.Y:=-1;
|
||||||
|
|
||||||
|
try
|
||||||
|
d:=GetTempDir;
|
||||||
|
ForceDirectories(d);
|
||||||
|
inp:=IncludeTrailingPathDelimiter(d)+'input.txt';
|
||||||
|
outp:=IncludeTrailingPathDelimiter(d)+'output.txt';
|
||||||
|
try
|
||||||
|
fs:=TFileStream.Create(inp, fmCreate or fmShareDenyNone);
|
||||||
|
try
|
||||||
|
fs.Write(t[1], length(t));
|
||||||
|
finally
|
||||||
|
fs.Free;
|
||||||
|
end;
|
||||||
|
except
|
||||||
|
Result:='can''t write input';
|
||||||
|
end;
|
||||||
|
|
||||||
|
p:=TProcess.Create(nil);
|
||||||
|
try
|
||||||
|
cmd:=ExtTool+' ';
|
||||||
|
|
||||||
|
cconvconfig.SaveToFile(ConvFile, converteridesettings.ConvSettings);
|
||||||
|
cmd:=cmd+' -cfg "'+ ConvFile +'"';
|
||||||
|
|
||||||
|
if (DefineFile<>'') and FileExists(DefineFile) then
|
||||||
|
cmd:=cmd+' -defines "'+DefineFile+'" ';
|
||||||
|
cmd:=cmd+' -o "'+outp+'" ';
|
||||||
|
cmd:=cmd+'"'+inp+'"';
|
||||||
|
|
||||||
|
p.CommandLine:=cmd;
|
||||||
|
d:=p.CommandLine;
|
||||||
|
p.Execute;
|
||||||
|
|
||||||
|
tm:=GetTickCount;
|
||||||
|
while p.Active and (GetTickCount-tm<ExtTimeOut) do begin
|
||||||
|
Application.ProcessMessages;
|
||||||
|
end;
|
||||||
|
if p.Active then begin
|
||||||
|
p.Terminate(1);
|
||||||
|
Result:='timeout';
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
finally
|
||||||
|
p.Free;
|
||||||
|
end;
|
||||||
|
|
||||||
|
try
|
||||||
|
st:=TStringList.Create;
|
||||||
|
try
|
||||||
|
st.LoadFromFile(outp);
|
||||||
|
if st.Count=0 then Exit;
|
||||||
|
d:=st[0];
|
||||||
|
if d='' then Exit;
|
||||||
|
i:=Pos(' ', d);
|
||||||
|
if i>=1 then begin
|
||||||
|
Val( copy(d, 1, i-1), EndPos.Y, err);
|
||||||
|
Val( copy(d, i+1, length(d)), EndPos.X, err);
|
||||||
|
end;
|
||||||
|
st.Delete(0);
|
||||||
|
Result:=st.Text;
|
||||||
|
finally
|
||||||
|
st.Free;
|
||||||
|
end;
|
||||||
|
except
|
||||||
|
Result:='can''t read output file';
|
||||||
|
end;
|
||||||
|
|
||||||
|
except
|
||||||
|
on E:Exception do
|
||||||
|
Result:=e.Message;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function DoConvertCode(const t: AnsiString; var EndPoint: TPoint; var txt: AnsiString): Boolean;
|
||||||
|
begin
|
||||||
|
Result:=False;
|
||||||
|
if UseExtTool then begin
|
||||||
|
if not FileExists(ExtTool) then begin
|
||||||
|
ShowMessage('No convertor binary specified');
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
cconvconfig.SaveToFile(ConvFile, ConvSettings);
|
||||||
|
txt:=DoExtConvert(t, EndPoint);
|
||||||
|
Result:=(EndPoint.X>=0) and (EndPoint.Y>=0);
|
||||||
|
|
||||||
|
if Result then cconvconfig.LoadFromFile(ConvFile, ConvSettings)
|
||||||
|
else ShowMessage('Error: '+ txt);
|
||||||
|
|
||||||
|
end else
|
||||||
|
txt:='';
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TryParse;
|
||||||
|
var
|
||||||
|
editor : TSourceEditorInterface;
|
||||||
|
i : Integer;
|
||||||
|
txt : AnsiString;
|
||||||
|
s : AnsiString;
|
||||||
|
p : TPoint;
|
||||||
|
st : TPoint;
|
||||||
|
begin
|
||||||
|
if not Assigned(SourceEditorManagerIntf) or not Assigned(SourceEditorManagerIntf.ActiveEditor) then Exit;
|
||||||
|
editor:=SourceEditorManagerIntf.ActiveEditor;
|
||||||
|
|
||||||
|
if Assigned(CtoPasConfig) then CtoPasConfig.UIToSettings;
|
||||||
|
|
||||||
|
i:=editor.CursorTextXY.Y;
|
||||||
|
dec(i);
|
||||||
|
if i<0 then i:=0;
|
||||||
|
txt:='';
|
||||||
|
for i:=i to editor.Lines.Count-1 do
|
||||||
|
txt:=txt+editor.Lines[i]+#10;
|
||||||
|
|
||||||
|
if DoConvertCode(txt, p, s) then
|
||||||
|
begin
|
||||||
|
inc(p.Y, editor.CursorTextXY.Y-1);
|
||||||
|
st:=editor.CursorTextXY;
|
||||||
|
st.X:=1;
|
||||||
|
editor.ReplaceText(st, p, s);
|
||||||
|
if Assigned(CtoPasConfig) then
|
||||||
|
CtoPasConfig.SettingsToUI;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure OnCtoPasClick(Sender: TObject);
|
||||||
|
begin
|
||||||
|
TryParse;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure OnCtoPasOptionsClick(Sender: TObject);
|
||||||
|
begin
|
||||||
|
ShowConfigDialog;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure InitPackage;
|
||||||
|
var
|
||||||
|
cmd : TIDEMenuCommand;
|
||||||
|
begin
|
||||||
|
cmd:=RegisterIDEMenuCommand(itmSecondaryTools, 'CtoPas', 'C to Pascal', nil, @OnCtoPasClick);
|
||||||
|
RegisterIDEMenuCommand(itmSecondaryTools, 'CtoPas', 'C to Pascal Options', nil, @OnCtoPasOptionsClick);
|
||||||
|
if Assigned(cmd) and Assigned(cmd.MenuItem) then cmd.MenuItem.ShortCut:=ShortCut(VK_B, [ssCtrl]);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure Register;
|
||||||
|
var
|
||||||
|
pth : AnsiString;
|
||||||
|
begin
|
||||||
|
InitPackage;
|
||||||
|
pth:=IncludeTrailingPathDelimiter(LazIDEIntf.LazarusIDE.GetPrimaryConfigPath);
|
||||||
|
ConvFile := pth+'cconv.ini';
|
||||||
|
LoadFromFile(ConvFile, ConvSettings);
|
||||||
|
ReadIDESettings(ConvFile);
|
||||||
|
if DefineFile='' then DefineFile:=pth+'cconvdefines.h';
|
||||||
|
end;
|
||||||
|
|
||||||
|
initialization
|
||||||
|
|
||||||
|
finalization
|
||||||
|
SaveToFile(ConvFile, ConvSettings);
|
||||||
|
WriteIDESettings(ConvFile);
|
||||||
|
|
||||||
|
end.
|
||||||
|
|
Reference in New Issue
Block a user