From e30dfa934af7acdac7486cafde2c3e98ce47f1e1 Mon Sep 17 00:00:00 2001 From: mattias Date: Sat, 28 Feb 2015 11:15:34 +0000 Subject: [PATCH] IDE: fpc msg parser, use console or system codepage depending on compiler version, bug #26623 git-svn-id: trunk@48038 - --- components/codetools/definetemplates.pas | 29 ++++++++++++++++-------- ide/etfpcmsgparser.pas | 17 ++++++++++++-- 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/components/codetools/definetemplates.pas b/components/codetools/definetemplates.pas index 13ac2e6056..f00e0481cb 100644 --- a/components/codetools/definetemplates.pas +++ b/components/codetools/definetemplates.pas @@ -971,6 +971,7 @@ function GetDefaultSrcOS2ForTargetOS(const TargetOS: string): string; function GetDefaultSrcCPUForTargetCPU(const TargetCPU: string): string; procedure SplitLazarusCPUOSWidgetCombo(const Combination: string; var CPU, OS, WidgetSet: string); +function GetCompiledFPCVersion: integer; function GetCompiledTargetOS: string; function GetCompiledTargetCPU: string; function GetDefaultCompilerFilename(const TargetCPU: string = ''; Cross: boolean = false): string; @@ -1013,6 +1014,7 @@ function RunFPCInfo(const CompilerFilename: string; InfoTypes: TFPCInfoTypes; const Options: string =''): string; function ExtractFPCFrontEndParameters(const CmdLineParams: string; const Kinds: TFPCFrontEndParams = AllFPCFrontEndParams): string; +function FPCVersionToNumber(const FPCVersionString: string): integer; function SplitFPCVersion(const FPCVersionString: string; out FPCVersion, FPCRelease, FPCPatch: integer): boolean; function ParseFPCVerbose(List: TStrings; // fpc -va output @@ -1471,6 +1473,16 @@ begin Add('V',ParamV); end; +function FPCVersionToNumber(const FPCVersionString: string): integer; +var + FPCVersion, FPCRelease, FPCPatch: integer; +begin + if SplitFPCVersion(FPCVersionString,FPCVersion,FPCRelease,FPCPatch) then + Result:=FPCVersion*10000+FPCRelease*100+FPCPatch + else + Result:=0; +end; + function SplitFPCVersion(const FPCVersionString: string; out FPCVersion, FPCRelease, FPCPatch: integer): boolean; // for example 2.5.1 @@ -2786,6 +2798,11 @@ begin WidgetSet:=copy(Combination,StartPos,EndPos-StartPos); end; +function GetCompiledFPCVersion: integer; +begin + Result:=FPCVersionToNumber({$I %FPCVERSION%}); +end; + function GetCompiledTargetOS: string; begin Result:=lowerCase({$I %FPCTARGETOS%}); @@ -7976,21 +7993,13 @@ begin end; function TFPCTargetConfigCache.GetFPC_FULLVERSION: integer; -var - v: String; - FPCVersion: integer; - FPCRelease: integer; - FPCPatch: integer; begin if Defines<>nil then Result:=StrToIntDef(Defines['FPC_FULLVERSION'],0) else Result:=0; - if Result=0 then begin - v:={$I %FPCVERSION%}; - SplitFPCVersion(v,FPCVersion,FPCRelease,FPCPatch); - Result:=(FPCVersion*100+FPCRelease)*100+FPCPatch; - end; + if Result=0 then + Result:=GetCompiledFPCVersion; end; function TFPCTargetConfigCache.IndexOfUsedCfgFile: integer; diff --git a/ide/etfpcmsgparser.pas b/ide/etfpcmsgparser.pas index e45fa05241..219f0788b3 100644 --- a/ide/etfpcmsgparser.pas +++ b/ide/etfpcmsgparser.pas @@ -204,10 +204,11 @@ type TranslationFilename: string; // e.g. /path/to/fpcsrc/compiler/msg/errord.msg TranslationFile: TFPCMsgFilePoolItem; InstantFPCCache: string; // with trailing pathdelim + FPC_FullVersion: cardinal; constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure Init; override; // called after macros resolved, before starting thread (main thread) - procedure InitReading; override; // called if process started, before first line (worker thread) + procedure InitReading; override; // called when process started, before first line (worker thread) procedure Done; override; // called after process stopped (worker thread) procedure ReadLine(Line: string; OutputIndex: integer; var Handled: boolean); override; procedure AddMsgLine(MsgLine: TMessageLine); override; @@ -1066,9 +1067,17 @@ var p: PChar; aTargetOS: String; aTargetCPU: String; + FPCVersion: integer; + FPCRelease: integer; + FPCPatch: integer; begin inherited Init; + // get FPC version + CodeToolBoss.GetFPCVersionForDirectory(Tool.WorkerDirectory, FPCVersion, + FPCRelease, FPCPatch); + FPC_FullVersion:=FPCVersion*10000+FPCRelease*100+FPCPatch; + if FPCMsgFilePool<>nil then begin aTargetOS:=''; aTargetCPU:=''; @@ -2255,6 +2264,7 @@ begin FFilesToIgnoreUnitNotUsed:=TStringList.Create; HideHintsSenderNotUsed:=true; HideHintsUnitNotUsedInMainSource:=true; + FPC_FullVersion:=GetCompiledFPCVersion; end; function TIDEFPCParser.FileExists(const Filename: string; aSynchronized: boolean @@ -2524,7 +2534,10 @@ var p: PChar; begin if Line='' then exit; - Line:=LazUTF8.SysToUTF8(Line); + if FPC_FullVersion>=20701 then + Line:=LazUTF8.ConsoleToUTF8(Line) + else + Line:=LazUTF8.SysToUTF8(Line); p:=PChar(Line); fOutputIndex:=OutputIndex; fMsgID:=0;