From df3d508d1d5ed30f267590a1c709f8691d15d2f9 Mon Sep 17 00:00:00 2001 From: AlekXL Date: Sat, 13 Apr 2019 14:18:08 +0300 Subject: [PATCH] Worker thread --- AG.PascalTokenizer.pas | 862 ++++++++++++++----------- DelphiTests/MainTest.pas | 19 + DelphiTests/Tests.dproj | 1162 +++++++++++++++++----------------- Demo/Demo.dpr | 74 +++ Demo/Demo.dproj | 653 +++++++++++++++++++ Demo/Demo.lpi | 73 +++ Demo/Demo.lps | 123 ++++ FPCTests/fpcunitproject1.lpi | 9 +- FPCTests/fpcunitproject1.lps | 352 +++++----- 9 files changed, 2194 insertions(+), 1133 deletions(-) create mode 100644 Demo/Demo.dpr create mode 100644 Demo/Demo.dproj create mode 100644 Demo/Demo.lpi create mode 100644 Demo/Demo.lps diff --git a/AG.PascalTokenizer.pas b/AG.PascalTokenizer.pas index 8571017..432276e 100644 --- a/AG.PascalTokenizer.pas +++ b/AG.PascalTokenizer.pas @@ -1,419 +1,549 @@ unit AG.PascalTokenizer; +{$IFDEF FPC} +{$MODE Delphi} +{$ENDIF} interface -uses - {$IFDEF FPC} - SysUtils,Classes - {$ELSE} - System.Generics.Collections,System.SysUtils,System.Classes - {$ENDIF}; + uses + SysUtils, Classes, IniFiles, SyncObjs, Generics.Collections; -{$IFDEF FPC} - {$mode Delphi} -{$ENDIF} -type - TAGTokenizerPos = record - x, y: integer; - end; + type + TAGTokenizerPos = record + x, y: integer; + end; - TAGToken = record - Text: string; - &begin, &end: TAGTokenizerPos; - ended: boolean; - {$IFNDEF FPC}constructor Create(Text: string; &begin, &end: TAGTokenizerPos;ended:boolean);{$ENDIF} - end; + TAGToken = record + Text:string; + &begin, &end: TAGTokenizerPos; + ended: boolean; + procedure Make(const Text:string;&begin, &end: TAGTokenizerPos;ended: boolean); + end; - TAGPasTokenizer = class - strict protected - s: TStrings; - y: integer; - x: integer; - function DoReadable():boolean; - function IsReadable():boolean; - function NextReadable():boolean; - procedure SkipSpaces(); - function GetPos():TAGTokenizerPos; - procedure SetPos(pos:TAGTokenizerPos); - public - ended: boolean; - function GetNext(): TAGToken; - // procedure read_next(); - constructor Create(input:TStrings); - property Pos:TAGTokenizerPos read GetPos write SetPos; - end; + TAGPasTokenizer = class + strict protected + FStrings: TStrings; + FLineIx: integer; + x: integer; + function DoReadable(): boolean; + function IsReadable(): boolean; + function NextReadable(): boolean; + procedure SkipSpaces(); + function GetPos(): TAGTokenizerPos; + procedure SetPos(pos: TAGTokenizerPos); + public + ended: boolean; + function GetNext(): TAGToken; + // procedure read_next(); + constructor Create(input: TStrings); + property pos: TAGTokenizerPos read GetPos write SetPos; + end; - {$IFNDEF FPC} - TAGPasTokenizerStack=class - strict protected - type - GetCall=reference to function(Tokenizer:TAGPasTokenizer):TAGToken; - var - Stack:TStack; - Tokenizer:TAGPasTokenizer; - Get:GetCall; - function GetLast():TAGToken; - function IsEnded():Boolean; - public - constructor Create(input:TStrings;GetComments:boolean=True); - procedure Push(t:TAGToken); - function Pop():TAGToken; - property Last:TAGToken read GetLast write Push; - property Ended:Boolean read IsEnded; - end; + TAGPasTokenizerStack = class + strict protected + type + GetCall = function(Tokenizer: TAGPasTokenizer): TAGToken of object; - {TAGPasTokenizerParallelStack=class(TAGPasTokenizerStack) - strict protected - var - Stack:TStack; - Tokenizer:TAGPasTokenizer; - Get:GetCall; - function GetLast():TAGToken; - function IsEnded():Boolean; - public - constructor Create(input:TStrings;GetComments:boolean=True); - procedure Push(t:TAGToken); - function Pop():TAGToken; - end; } - {$ENDIF} + var + Stack: TQueue; + Tokenizer: TAGPasTokenizer; + Get: GetCall; + IsEnd: boolean; + function GetLast(): TAGToken;virtual; + function GetWithComments(Tokenizer: TAGPasTokenizer): TAGToken; + function GetWithoutComments(Tokenizer: TAGPasTokenizer): TAGToken; + destructor Destroy;override; + protected + function GetCachedCount: integer;inline; + public + constructor Create(input: TStrings;GetComments: boolean = True); + procedure Push(const t: TAGToken);virtual; + function Pop(): TAGToken;virtual; + property Last: TAGToken read GetLast write Push; + property ended: boolean read IsEnd; + end; -function IsComment(s: string): boolean; -function IsName(s: string): boolean; -function IsString(s: string): boolean; + TAGPasTokenizerParallelStack = class(TAGPasTokenizerStack) + strict protected + type + TWorkerThread = class(TThread) + strict protected + FStack: TAGPasTokenizerParallelStack; + procedure Execute;override; + public + Idling: boolean; + constructor Create(const Stack: TAGPasTokenizerParallelStack); + end; + + var + FWorker: TWorkerThread; + FStackLock: TCriticalSection; + function AddTokenToStack: boolean; + function GetLast(): TAGToken;override; + procedure EnsureThreadDone(); + destructor Destroy;override; + protected + FStackHalfMax: integer; + FSignal: TEvent; + procedure Push(const t: TAGToken);override; + public + constructor Create(const input: TStrings;GetComments: boolean = True; + stackMax: integer = 1000); + function Pop(): TAGToken;override; + end; + + function IsComment(s:string): boolean; + function IsName(s:string): boolean; + function IsString(const s:string): boolean; implementation -{$IFNDEF FPC} -constructor TAGToken.Create(Text: string; &begin, &end: TAGTokenizerPos; - ended: boolean); -begin - Self.Text := Text; - Self.&begin := &begin; - Self.&end := &end; - Self.ended := ended; -end; -{$ENDIF} - -const - SYMS1 = '()[]/|\@#=><:;,.$+-*^'; - SPACES = #12#10#13#9#11' '; - NO_NAME_SYMS = SYMS1 + SPACES + '{}'; - CHARS_ID0 = '&abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_'; - CHARS_ID = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_'; - fix = {$IFDEF NEXTGEN}-1{$ELSE}0{$ENDIF}; - -var - SYMS2:{$IFDEF FPC}TStringList{$ELSE}TList{$ENDIF}; // array[0..8]of string=(); - -function IsComment(s:string):boolean; -begin - Result:=(s.startswith('{') or s.startswith('(*') or s.startswith('//')); -end; - -function IsName(s:string):boolean; -var - i: integer; -begin - if length(s) <= 0 then - Exit(False); - if s = '&' then - Exit(False); - if not CHARS_ID0.Contains(s[1 + fix]) then - Exit(False); - for i := 1 to length(s) do + procedure TAGToken.Make(const Text:string;&begin, &end: TAGTokenizerPos;ended: + boolean); begin - if not CHARS_ID.Contains(s[i]) then + Self.Text := Text; + Self.&begin := &begin; + Self.&end := &end; + Self.ended := ended; + end; + + const + SYMS1 = '()[]/|\@#=><:;,.$+-*^'; + SPACES = #12#10#13#9#11' '; + NO_NAME_SYMS = SYMS1 + SPACES + '{}'; + CHARS_ID0 = '&abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_'; + CHARS_ID = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_'; + fix = {$IFDEF NEXTGEN}-1{$ELSE}0{$ENDIF}; + + var + SYMS2: THashedStringList; + + function IsComment(s:string): boolean; + begin + Result :=(s.startswith('{')or s.startswith('(*')or s.startswith('//')); + end; + + function IsName(s:string): boolean; + var + i: integer; + begin + if length(s)<= 0 then + Exit(False); + if s = '&' then + Exit(False); + if not CHARS_ID0.Contains(s[1 + fix])then + Exit(False); + for i := 1 to length(s)do + begin + if not CHARS_ID.Contains(s[i])then + Exit(False); + end; + Result := True; + end; + + function IsString(const s:string): boolean; + begin + Result := s.startswith(#39); + end; + + function TAGPasTokenizer.DoReadable(): boolean; + begin + if not IsReadable()then + begin + if(FLineIx + 1 = FStrings.Count)then + ended := True + else + begin + inc(FLineIx); + x := 1 + fix; + while FStrings[FLineIx]<= '' do + begin + if FLineIx + 1 = FStrings.Count then + begin + ended := True; + break; + end; + inc(FLineIx); + end; + end; + Exit(True); + end + else Exit(False); end; - Result:=True; -end; -function IsString(s: string):boolean; -begin - Result:=s.StartsWith(#39); -end; - -function TAGPasTokenizer.DoReadable(): boolean; -begin - if not IsReadable() then + function TAGPasTokenizer.IsReadable(): boolean; begin - if (y + 1 = s.Count) then - ended := True - else - begin - inc(y); - x := 1+Fix; - while s[y]='' do - begin - if y + 1 = s.Count then - begin - ended := True; - break; - end; - inc(y); - end; - end; - Exit(True); - end - else - Exit(False); -end; - -function TAGPasTokenizer.IsReadable(): boolean; -begin - Exit(length(s[y])+1+Fix > x); -end; - -function TAGPasTokenizer.NextReadable(): boolean; -begin - inc(x); - Result := DoReadable(); -end; - -procedure TAGPasTokenizer.SkipSpaces(); -begin - DoReadable(); - if not ended then - begin - while SPACES.Contains(s[y][x]) do - NextReadable(); + Result := x <= length(FStrings[FLineIx])+ fix; end; -end; -function TAGPasTokenizer.GetPos(): TAGTokenizerPos; -begin - Result.x := x; - Result.y := y; -end; - -procedure TAGPasTokenizer.SetPos(pos:TAGTokenizerPos); -begin - y:=Pos.x; - x:=Pos.y; - ended:=False; - DoReadable(); -end; - -function TAGPasTokenizer.GetNext(): TAGToken; -var - l,i,last_i0:integer; - ml,ss,line:string; - now_sym,next_sym:char; - f{$IFDEF FPC},ff{$ENDIF}:boolean; - begin_pos:TAGTokenizerPos; -begin - ml:=''; - ss:=''; - f:=True; - begin_pos:=GetPos(); - while f and not ended do + function TAGPasTokenizer.NextReadable(): boolean; begin - line:=s[y]; - now_sym:=line[x]; - l:=length(line); - if x<>l+Fix then - next_sym:=line[x+1] - else - next_sym:=#0; - if ml='' then + inc(x); + Result := DoReadable(); + end; + + procedure TAGPasTokenizer.SkipSpaces(); + begin + DoReadable(); + if not ended then begin - if now_sym='/' then + while SPACES.Contains(FStrings[FLineIx][x])do + NextReadable(); + end; + end; + + function TAGPasTokenizer.GetPos(): TAGTokenizerPos; + begin + Result.x := x; + Result.y := FLineIx; + end; + + procedure TAGPasTokenizer.SetPos(pos: TAGTokenizerPos); + begin + FLineIx := pos.x; + x := pos.y; + ended := False; + DoReadable(); + end; + + function TAGPasTokenizer.GetNext(): TAGToken; + var + l, last_i0: integer; + ml, ss, line:string; + now_sym, next_sym: char; + f: boolean; + begin_pos: TAGTokenizerPos; + begin + ml := ''; + ss := ''; + f := True; + begin_pos := GetPos(); + while f and not ended do + begin + line := FStrings[FLineIx]; + now_sym := line[x]; + l := length(line); + if x < l + fix then + next_sym := line[x + 1] + else + next_sym := #0; + + if ml = '' then begin - if next_sym='/' then + if now_sym = '/' then begin - for i:=x to l+Fix do - ss:=ss+line[i]; - x:=l+Fix; - break; - end; - end - else if now_sym='{' then - begin - ml:='}'; - ss:=now_sym; - last_i0:=y; - end - else if now_sym='(' then - begin - if next_sym='*' then + if next_sym = '/' then + begin + ss := Copy(line, x, l); + x := l + 1 + fix; + break; + end; + end + else if now_sym = '{' then begin - ml:=')'; - inc(x); - last_i0:=y; - ss:=now_sym+next_sym; + ml := '}'; + ss := now_sym; + last_i0 := FLineIx; + end + else if now_sym = '(' then + begin + if next_sym = '*' then + begin + ml := ')'; + inc(x); + last_i0 := FLineIx; + ss := now_sym + next_sym; + end + else + begin + ss := '('; + inc(x); + break; + end; end else begin - ss:='('; - inc(x); - break; + if SYMS1.Contains(now_sym)then + begin + ss := now_sym; + inc(x); + if SYMS2.IndexOf(now_sym + next_sym)<>-1 then begin + inc(x); + ss := ss + next_sym; + end; + break; + end + else if now_sym = #39 then + begin + ss := #39; + inc(x); + if next_sym <> '' then + begin + ss := ss + next_sym; + while line[x]<> #39 do + begin + inc(x); + if not IsReadable()then + begin + dec(x); + break; + end; + ss := ss + line[x]; + end; + inc(x); + end; + break; + end + else + begin + while not NO_NAME_SYMS.Contains(line[x])do + begin + ss := ss + line[x]; + inc(x); + if not IsReadable()then + break; + end; + break; + end; end; end else begin - if SYMS1.Contains(now_sym)then + while last_i0 <> FLineIx do begin - ss:=now_sym; - inc(x); - if SYMS2. - {$IFDEF FPC} - IndexOf(now_sym+next_sym)<>-1 - {$ELSE} - Contains(now_sym+next_sym) - {$ENDIF}then - begin - inc(x); - ss:=ss+next_sym; - end; - break; - end - else if now_sym=#39 then - begin - ss:=#39; - inc(x); - if next_sym<>'' then - begin - ss:=ss+next_sym; - while line[x] <> #39 do - begin - inc(x); - if not IsReadable() then - begin - dec(x); - break; - end; - ss:=ss+line[x]; - end; - inc(x); - end; - break; - end - else - begin - while not NO_NAME_SYMS.Contains(line[x]) do - begin - ss:=ss+line[x]; - inc(x); - if not IsReadable() then - break; - end; - break; + ss := ss + #10; + inc(last_i0); end; + ss := ss + now_sym; + if now_sym = ml then + if ml = '}' then + begin + inc(x); + break; + end + else if(x <> 0)and(line[x - 1]= '*')then + begin + inc(x); + break; + end; end; - end + NextReadable(); + end; + Result.Make(ss, begin_pos, GetPos, ended); + SkipSpaces; + end; + + constructor TAGPasTokenizer.Create(input: TStrings); + begin + FStrings := input; + FLineIx := 0; + x := 1 + fix; + ended := False; + SkipSpaces; + end; + + { TAGPasTokenizerStack } + + destructor TAGPasTokenizerStack.Destroy; + begin + FreeAndNil(Stack); + FreeAndNil(Tokenizer); + inherited; + end; + + function TAGPasTokenizerStack.GetCachedCount: integer; + begin + Result := Stack.Count + end; + + function TAGPasTokenizerStack.GetLast(): TAGToken; + begin + if Stack.Count <> 0 then + Result := Stack.Peek else begin - while last_i0<>y do - begin - ss:=ss+#10; - inc(last_i0); - end; - ss:=ss+now_sym; - if now_sym=ml then - if ml='}' then - begin - inc(x); - break; - end - else if(x<>0)and(line[x-1]='*')then - begin - inc(x); - break; - end; + Result := Get(Tokenizer); + Stack.Enqueue(Result); end; - NextReadable(); end; - {$IFDEF FPC} - Result.Text:=ss; - Result.&begin:=begin_pos; - Result.&end:=GetPos; - Result.ended:=ended; - {$ELSE} - Result:=TAGToken.Create(ss,begin_pos,GetPos,ended); - {$ENDIF} - SkipSpaces; -end; -constructor TAGPasTokenizer.Create(input:TStrings); -begin - s:=input; - y:=0; - x:=1+fix; - ended:=False; - SkipSpaces; -end; + function TAGPasTokenizerStack.GetWithComments( + Tokenizer: TAGPasTokenizer): TAGToken; + begin + Result := Tokenizer.GetNext; + end; -{$IFNDEF FPC} -{TAGPasTokenizerStack} + function TAGPasTokenizerStack.GetWithoutComments( + Tokenizer: TAGPasTokenizer): TAGToken; + var done: boolean; + begin + repeat + Result := Tokenizer.GetNext; + until Result.ended or not IsComment(Result.Text); + IsEnd := Result.ended; + end; -function TAGPasTokenizerStack.GetLast():TAGToken; -begin -if Stack.Count<>0 then - Result:=Stack.Peek -else -begin - Result:=Get(Tokenizer); - Stack.Push(Result); -end; -end; + constructor TAGPasTokenizerStack.Create(input: TStrings; + GetComments: boolean = True); + begin + Stack := TQueue.Create(); + Tokenizer := TAGPasTokenizer.Create(input); -function TAGPasTokenizerStack.IsEnded():Boolean; -begin + if GetComments then + Get := GetWithComments + else + Get := GetWithoutComments; + end; -end; + procedure TAGPasTokenizerStack.Push(const t: TAGToken); + begin + Stack.Enqueue(t); + end; -constructor TAGPasTokenizerStack.Create(input:TStrings;GetComments:boolean=True); -begin -Stack:=TStack.Create(); -Tokenizer:=TAGPasTokenizer.Create(input); -if GetComments then - Get:=function(Tokenizer:TAGPasTokenizer):TAGToken - begin - Result:=Tokenizer.GetNext; - end -else - Get:=function(Tokenizer:TAGPasTokenizer):TAGToken - begin - while True do - begin - Result:=Tokenizer.GetNext; - if Result.ended or not IsComment(Result.Text) then - break; - end; + function TAGPasTokenizerStack.Pop(): TAGToken; + begin + if Stack.Count > 0 then + Result := Stack.Dequeue + else + Result := Get(Tokenizer); + IsEnd := Result.ended; + end; + + { TAGPasTokenizerParallelStack } + + function TAGPasTokenizerParallelStack.AddTokenToStack(): boolean; + var tkn: TAGToken; + begin + FStackLock.Enter; + tkn := Get(Tokenizer); + Result := tkn.ended; + Stack.Enqueue(tkn); + FStackLock.Leave; + end; + + constructor TAGPasTokenizerParallelStack.Create(const input: TStrings; + GetComments: + boolean = True;stackMax: integer = 1000); + begin + inherited Create(input, GetComments); + FStackHalfMax := stackMax shr 1; + FStackLock := TCriticalSection.Create(); + FSignal := TEvent.Create(nil, False, True, 'ag_tkn_work_signal'); + FWorker := TWorkerThread.Create(Self); + end; + + destructor TAGPasTokenizerParallelStack.Destroy; + begin + EnsureThreadDone(); + FreeAndNil(FStackLock); + inherited; + end; + + procedure TAGPasTokenizerParallelStack.EnsureThreadDone; + begin + if not FWorker.Terminated then begin + FWorker.Terminate; + FSignal.SetEvent();// stop idling + FWorker.WaitFor(); end; -end; + FreeAndNil(FWorker); + FreeAndNil(FSignal); + end; -procedure TAGPasTokenizerStack.Push(t:TAGToken); -begin -Stack.Push(t); -end; + function TAGPasTokenizerParallelStack.GetLast: TAGToken; + begin + FStackLock.Enter; + try + Result := inherited GetLast(); + finally + FStackLock.Leave; + end; + end; -function TAGPasTokenizerStack.Pop():TAGToken; -begin -if Stack.Count<>0 then - Result:=Stack.Pop -else - Result:=Get(Tokenizer); -end; + function TAGPasTokenizerParallelStack.Pop: TAGToken; + var + doReplentishStack, wasRead: boolean; + begin -{$ENDIF} + FStackLock.Enter; + + wasRead := Stack.Count > 0; + if wasRead then + Result := Stack.Dequeue + else + Result := Get(Tokenizer); + + doReplentishStack := FWorker.Idling and(Stack.Count < FStackHalfMax); + FStackLock.Leave; + + IsEnd := Result.ended; + if doReplentishStack then + FSignal.SetEvent; + + end; + + procedure TAGPasTokenizerParallelStack.Push(const t: TAGToken); + begin + FStackLock.Enter; + try + inherited Push(t); + finally + FStackLock.Leave; + end; + end; + + { TAGPasTokenizerParallelStack.TWorkerThread } + + constructor TAGPasTokenizerParallelStack.TWorkerThread.Create(const Stack: + TAGPasTokenizerParallelStack); + begin + FStack := Stack; + inherited Create(False, 4 * 4096); + end; + + procedure TAGPasTokenizerParallelStack.TWorkerThread.Execute; + var Count: integer; + isDone: boolean; + max: integer; + begin + Count := FStack.GetCachedCount; + max := FStack.FStackHalfMax * 2; + repeat + isDone := FStack.AddTokenToStack(); + inc(Count); + while not Terminated and(Count >= max)do begin + Count := FStack.GetCachedCount();// fetch real count + if Count < max then + break; + Idling := True; + FStack.FSignal.WaitFor(1000); + Count := FStack.GetCachedCount(); + end; + Idling := False; + until Terminated or isDone or FStack.ended; + end; initialization -SYMS2 := {$IFDEF FPC}TStringList{$ELSE}TList{$ENDIF}.Create(); -SYMS2.Add('>='); -SYMS2.Add('<='); -SYMS2.Add('<>'); -SYMS2.Add(':='); -SYMS2.Add('..'); -SYMS2.Add('-='); -SYMS2.Add('+='); -SYMS2.Add('/='); -SYMS2.Add('*='); -SYMS2.Add('**'); -SYMS2.Add('><'); -SYMS2.Add('(.'); -SYMS2.Add('.)'); -SYMS2.Add('<<'); -SYMS2.Add('>>'); + + SYMS2 := THashedStringList.Create(); + SYMS2.Add('>='); + SYMS2.Add('<='); + SYMS2.Add('<>'); + SYMS2.Add(':='); + SYMS2.Add('..'); + SYMS2.Add('-='); + SYMS2.Add('+='); + SYMS2.Add('/='); + SYMS2.Add('*='); + SYMS2.Add('**'); + SYMS2.Add('><'); + SYMS2.Add('(.'); + SYMS2.Add('.)'); + SYMS2.Add('<<'); + SYMS2.Add('>>'); + finalization + FreeAndNil(SYMS2); + end. diff --git a/DelphiTests/MainTest.pas b/DelphiTests/MainTest.pas index 8c2b93d..6f602be 100644 --- a/DelphiTests/MainTest.pas +++ b/DelphiTests/MainTest.pas @@ -23,6 +23,8 @@ type [Test] procedure Test4; [Test] + procedure TestParallel; + [Test] procedure Test5; // Test with TestCase Atribute to supply parameters. end; @@ -107,6 +109,23 @@ begin end; end; +procedure TMyTestObject.TestParallel; +var + input:TStrings; + tokenizer:TAGPasTokenizerStack; + token:TAGToken; + begin + input:= TStringList.Create(); + input.LoadFromFile('..\..\MainTest.pas'); + tokenizer:=TAGPasTokenizerParallelStack.Create(input); + token.ended:=False; + while not token.ended do + begin + token:=tokenizer.Pop; + TDUnitX.CurrentRunner.Log(TLogLevel.Information, token.Text); + end; +end; + initialization TDUnitX.RegisterTestFixture(TMyTestObject); end. diff --git a/DelphiTests/Tests.dproj b/DelphiTests/Tests.dproj index acb173d..7008501 100644 --- a/DelphiTests/Tests.dproj +++ b/DelphiTests/Tests.dproj @@ -1,589 +1,573 @@ - - - {D45A1419-D0B2-4C03-89FD-530EF21B4F7D} - 18.4 - Tests.dpr - True - Debug - Win32 - 1 - Console - None - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - $(DUnitX);$(DCC_UnitSearchPath) - $(BDS)\bin\delphi_PROJECTICON.ico - System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) - $(BDS)\bin\delphi_PROJECTICNS.icns - true - Tests - .\$(Platform)\$(Config) - .\$(Platform)\$(Config) - false - false - false - false - false - - - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png - true - true - true - true - true - true - true - true - true - true - - - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1024.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x768.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2048.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1536.png - - - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1024.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x768.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2048.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1536.png - - - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1024.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x768.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2048.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1536.png - - - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - 1033 - CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) - FireDACTDataDriver;FireDACSqliteDriver;FireDACDSDriver;frxTee22;DBXSqliteDriver;FireDACPgDriver;fmx;IndySystem;TeeDB;tethering;vclib;DBXInterBaseDriver;DataSnapClient;DataSnapCommon;DataSnapServer;DataSnapProviderClient;DBXSybaseASEDriver;frxe22;DbxCommonDriver;vclimg;dbxcds;DatasnapConnectorsFreePascal;appanalytics;DOSCommandDR;vcldb;vcldsnap;fmxFireDAC;DBXDb2Driver;DBXOracleDriver;CustomIPTransport;vclribbon;dsnap;IndyIPServer;fmxase;vcl;IndyCore;DBXMSSQLDriver;CloudService;IndyIPCommon;FmxTeeUI;FireDACIBDriver;CodeSiteExpressPkg;DataSnapFireDAC;FireDACDBXDriver;soapserver;inetdbxpress;OmniThreadLibraryRuntime;dsnapxml;FireDACInfxDriver;FireDACDb2Driver;adortl;FireDACASADriver;frx22;bindcompfmx;FireDACODBCDriver;RESTBackendComponents;emsclientfiredac;rtl;dbrtl;DbxClientDriver;FireDACCommon;bindcomp;inetdb;Tee;DBXOdbcDriver;ibmonitor;vclFireDAC;xmlrtl;DataSnapNativeClient;ibxpress;svnui;IndyProtocols;DBXMySQLDriver;FireDACCommonDriver;bindcompdbx;bindengine;vclactnband;FMXTee;soaprtl;TeeUI;bindcompvcl;vclie;frxDB22;FireDACADSDriver;vcltouch;emsclient;VCLRESTComponents;FireDAC;DBXInformixDriver;FireDACMSSQLDriver;Intraweb;VclSmp;DataSnapConnectors;DataSnapServerMidas;DBXFirebirdDriver;dsnapcon;inet;fmxobj;FireDACMySQLDriver;soapmidas;vclx;svn;DBXSybaseASADriver;FireDACOracleDriver;fmxdae;RESTComponents;dbexpress;FireDACMSAccDriver;DataSnapIndy10ServerTransport;IndyIPClient;$(DCC_UsePackage) - - - FireDACTDataDriver;FireDACSqliteDriver;FireDACDSDriver;DBXSqliteDriver;FireDACPgDriver;fmx;IndySystem;TeeDB;tethering;vclib;DBXInterBaseDriver;DataSnapClient;DataSnapCommon;DataSnapServer;DataSnapProviderClient;DBXSybaseASEDriver;DbxCommonDriver;vclimg;dbxcds;DatasnapConnectorsFreePascal;appanalytics;DOSCommandDR;vcldb;vcldsnap;fmxFireDAC;DBXDb2Driver;DBXOracleDriver;CustomIPTransport;vclribbon;dsnap;IndyIPServer;fmxase;vcl;IndyCore;DBXMSSQLDriver;CloudService;IndyIPCommon;FmxTeeUI;FireDACIBDriver;DataSnapFireDAC;FireDACDBXDriver;soapserver;inetdbxpress;OmniThreadLibraryRuntime;dsnapxml;FireDACInfxDriver;FireDACDb2Driver;adortl;FireDACASADriver;bindcompfmx;FireDACODBCDriver;RESTBackendComponents;emsclientfiredac;rtl;dbrtl;DbxClientDriver;FireDACCommon;bindcomp;inetdb;Tee;DBXOdbcDriver;ibmonitor;vclFireDAC;xmlrtl;DataSnapNativeClient;ibxpress;IndyProtocols;DBXMySQLDriver;FireDACCommonDriver;bindcompdbx;bindengine;vclactnband;FMXTee;soaprtl;TeeUI;bindcompvcl;vclie;FireDACADSDriver;vcltouch;emsclient;VCLRESTComponents;FireDAC;DBXInformixDriver;FireDACMSSQLDriver;Intraweb;VclSmp;DataSnapConnectors;DataSnapServerMidas;DBXFirebirdDriver;dsnapcon;inet;fmxobj;FireDACMySQLDriver;soapmidas;vclx;DBXSybaseASADriver;FireDACOracleDriver;fmxdae;RESTComponents;dbexpress;FireDACMSAccDriver;DataSnapIndy10ServerTransport;IndyIPClient;$(DCC_UsePackage) - - - DEBUG;$(DCC_Define) - true - false - true - true - true - - - false - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - - MainSource - - - - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - - - - Delphi.Personality.12 - Console - - - - Tests.dpr - - - - - - - true - - - - - true - - - - - true - - - - - true - - - - - 1 - - - Contents\MacOS - 0 - - - - - classes - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\armeabi - 1 - - - - - library\lib\mips - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - res\drawable - 1 - - - - - res\values - 1 - - - - - res\drawable - 1 - - - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-ldpi - 1 - - - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - - - res\drawable-small - 1 - - - - - res\drawable-normal - 1 - - - - - res\drawable-large - 1 - - - - - res\drawable-xlarge - 1 - - - - - 1 - - - 1 - - - 0 - - - - - 1 - .framework - - - 0 - - - - - 1 - .dylib - - - 0 - .dll;.bpl - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 0 - .bpl - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - - - - 1 - - - 1 - - - 1 - - - - - - - Contents\Resources - 1 - - - - - library\lib\armeabi-v7a - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 0 - - - - - 1 - - - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - - - - - - - - - False - False - False - False - False - False - True - False - - - 12 - - - - - + + + {D45A1419-D0B2-4C03-89FD-530EF21B4F7D} + 18.6 + Tests.dpr + True + Debug + Win32 + 1 + Console + None + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + $(DUnitX);$(DCC_UnitSearchPath) + $(BDS)\bin\delphi_PROJECTICON.ico + System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + $(BDS)\bin\delphi_PROJECTICNS.icns + true + Tests + .\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + + + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png + true + true + true + true + true + true + true + true + true + true + android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services-ads-7.0.0.dex.jar;google-play-services-analytics-7.0.0.dex.jar;google-play-services-base-7.0.0.dex.jar;google-play-services-gcm-7.0.0.dex.jar;google-play-services-identity-7.0.0.dex.jar;google-play-services-maps-7.0.0.dex.jar;google-play-services-panorama-7.0.0.dex.jar;google-play-services-plus-7.0.0.dex.jar;google-play-services-wallet-7.0.0.dex.jar + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + 1033 + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + FireDACTDataDriver;FireDACSqliteDriver;FireDACDSDriver;frxTee22;DBXSqliteDriver;FireDACPgDriver;fmx;IndySystem;TeeDB;tethering;vclib;DBXInterBaseDriver;DataSnapClient;DataSnapCommon;DataSnapServer;DataSnapProviderClient;DBXSybaseASEDriver;frxe22;DbxCommonDriver;vclimg;dbxcds;DatasnapConnectorsFreePascal;appanalytics;DOSCommandDR;vcldb;vcldsnap;fmxFireDAC;DBXDb2Driver;DBXOracleDriver;CustomIPTransport;vclribbon;dsnap;IndyIPServer;fmxase;vcl;IndyCore;DBXMSSQLDriver;CloudService;IndyIPCommon;FmxTeeUI;FireDACIBDriver;CodeSiteExpressPkg;DataSnapFireDAC;FireDACDBXDriver;soapserver;inetdbxpress;OmniThreadLibraryRuntime;dsnapxml;FireDACInfxDriver;FireDACDb2Driver;adortl;FireDACASADriver;frx22;bindcompfmx;FireDACODBCDriver;RESTBackendComponents;emsclientfiredac;rtl;dbrtl;DbxClientDriver;FireDACCommon;bindcomp;inetdb;Tee;DBXOdbcDriver;ibmonitor;vclFireDAC;xmlrtl;DataSnapNativeClient;ibxpress;svnui;IndyProtocols;DBXMySQLDriver;FireDACCommonDriver;bindcompdbx;bindengine;vclactnband;FMXTee;soaprtl;TeeUI;bindcompvcl;vclie;frxDB22;FireDACADSDriver;vcltouch;emsclient;VCLRESTComponents;FireDAC;DBXInformixDriver;FireDACMSSQLDriver;Intraweb;VclSmp;DataSnapConnectors;DataSnapServerMidas;DBXFirebirdDriver;dsnapcon;inet;fmxobj;FireDACMySQLDriver;soapmidas;vclx;svn;DBXSybaseASADriver;FireDACOracleDriver;fmxdae;RESTComponents;dbexpress;FireDACMSAccDriver;DataSnapIndy10ServerTransport;IndyIPClient;$(DCC_UsePackage) + + + FireDACTDataDriver;FireDACSqliteDriver;FireDACDSDriver;DBXSqliteDriver;FireDACPgDriver;fmx;IndySystem;TeeDB;tethering;vclib;DBXInterBaseDriver;DataSnapClient;DataSnapCommon;DataSnapServer;DataSnapProviderClient;DBXSybaseASEDriver;DbxCommonDriver;vclimg;dbxcds;DatasnapConnectorsFreePascal;appanalytics;DOSCommandDR;vcldb;vcldsnap;fmxFireDAC;DBXDb2Driver;DBXOracleDriver;CustomIPTransport;vclribbon;dsnap;IndyIPServer;fmxase;vcl;IndyCore;DBXMSSQLDriver;CloudService;IndyIPCommon;FmxTeeUI;FireDACIBDriver;DataSnapFireDAC;FireDACDBXDriver;soapserver;inetdbxpress;OmniThreadLibraryRuntime;dsnapxml;FireDACInfxDriver;FireDACDb2Driver;adortl;FireDACASADriver;bindcompfmx;FireDACODBCDriver;RESTBackendComponents;emsclientfiredac;rtl;dbrtl;DbxClientDriver;FireDACCommon;bindcomp;inetdb;Tee;DBXOdbcDriver;ibmonitor;vclFireDAC;xmlrtl;DataSnapNativeClient;ibxpress;IndyProtocols;DBXMySQLDriver;FireDACCommonDriver;bindcompdbx;bindengine;vclactnband;FMXTee;soaprtl;TeeUI;bindcompvcl;vclie;FireDACADSDriver;vcltouch;emsclient;VCLRESTComponents;FireDAC;DBXInformixDriver;FireDACMSSQLDriver;Intraweb;VclSmp;DataSnapConnectors;DataSnapServerMidas;DBXFirebirdDriver;dsnapcon;inet;fmxobj;FireDACMySQLDriver;soapmidas;vclx;DBXSybaseASADriver;FireDACOracleDriver;fmxdae;RESTComponents;dbexpress;FireDACMSAccDriver;DataSnapIndy10ServerTransport;IndyIPClient;$(DCC_UsePackage) + + + DEBUG;$(DCC_Define) + true + false + true + true + true + + + false + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + + MainSource + + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + Console + + + + Tests.dpr + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + true + + + + + true + + + + + 1 + + + 0 + + + + + classes + 1 + + + + + res\xml + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + + + res\values + 1 + + + + + res\values-v21 + 1 + + + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + + + 1 + + + 1 + + + 0 + + + + + 1 + .framework + + + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + + + + 1 + + + 1 + + + 1 + + + + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 0 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + + False + True + False + + + 12 + + + + + diff --git a/Demo/Demo.dpr b/Demo/Demo.dpr new file mode 100644 index 0000000..191fb10 --- /dev/null +++ b/Demo/Demo.dpr @@ -0,0 +1,74 @@ +program Demo; + +{$IFDEF FPC} +{$MODE Delphi} +{$ENDIF} + +{$APPTYPE CONSOLE} + +{$R *.res} + + +uses + {$IF not defined(FPC)} + FastMM4, + {$endif} + SysUtils, + Classes, + AG.PascalTokenizer in '../AG.PascalTokenizer.pas'; + +procedure Test(sList:TStrings; toStream:TStream; sync: boolean); +var tokenStack: TAGPasTokenizerStack; + s:UnicodeString; +begin + + tokenStack := nil; + try + if sync then + tokenStack := TAGPasTokenizerStack.Create(sList) + else + tokenStack:= TAGPasTokenizerParallelStack.Create(sList); + + while not tokenStack.ended do begin + s := tokenStack.Pop.Text+#10; + toStream.Write(Pointer(s)^, Length(s)*2); + end; + finally + FreeAndNil(tokenStack); + end; +end; + +var start: Cardinal; + sList: TStringList; + sw:TFileStream; +begin + TObject.Create();//óòå÷êà + try + sList := TStringList.Create(); + try + sList.LoadFromFile('c:\prosoft\RIO\source\rtl\common\System.Classes.pas'); + sw:=TFileStream.Create('tokens1.txt', fmCreate or fmOpenWrite); + + start := TThread.GetTickCount; + Test(sList,sw, true); + + start := TThread.GetTickCount - start; + Writeln('Sync Done in ', start, ' ms'); + sw.Free; + sw:=TFileStream.Create('tokens2.txt', fmCreate or fmOpenWrite); + start := TThread.GetTickCount; + Test(sList,sw, false); + + start := TThread.GetTickCount - start; + sw.Free; + Writeln('Sync Done in ', start, ' ms'); + + finally + sList.Free; + end; + except + on E: Exception do + Writeln(E.ClassName, ': ', E.Message); + end; + +end. diff --git a/Demo/Demo.dproj b/Demo/Demo.dproj new file mode 100644 index 0000000..42b58fb --- /dev/null +++ b/Demo/Demo.dproj @@ -0,0 +1,653 @@ + + + {94826175-AD0E-484E-AC0F-26CA7E737527} + 18.6 + None + Demo.dpr + True + Debug + Win32 + 1 + Console + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + .\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + Demo + + + DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;DataSnapFireDAC;tethering;bindcompfmx;FmxTeeUI;FireDACIBDriver;fmx;FireDACDBXDriver;dbexpress;IndyCore;dsnap;DataSnapCommon;emsclient;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;bindcompdbx;IndyIPCommon;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FMXTee;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage) + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png + android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services-ads-7.0.0.dex.jar;google-play-services-analytics-7.0.0.dex.jar;google-play-services-base-7.0.0.dex.jar;google-play-services-gcm-7.0.0.dex.jar;google-play-services-identity-7.0.0.dex.jar;google-play-services-maps-7.0.0.dex.jar;google-play-services-panorama-7.0.0.dex.jar;google-play-services-plus-7.0.0.dex.jar;google-play-services-wallet-7.0.0.dex.jar + + + DBXSqliteDriver;RESTComponents;DataSnapServerMidas;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;emsclientfiredac;DataSnapFireDAC;svnui;tethering;JvGlobus;FireDACADSDriver;JvPluginSystem;DBXMSSQLDriver;JvMM;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;JvBands;vcldb;bindcompfmx;svn;JvJans;DBXOracleDriver;JvNet;inetdb;JvAppFrm;VirtualTreesDR;FmxTeeUI;emsedge;JvDotNetCtrls;FireDACIBDriver;fmx;fmxdae;JvWizards;FireDACDBXDriver;dbexpress;IndyCore;vclx;JvPageComps;dsnap;DataSnapCommon;emsclient;FireDACCommon;JvDB;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;JclDeveloperTools;vclie;bindengine;DBXMySQLDriver;FireDACOracleDriver;CloudService;FireDACMySQLDriver;DBXFirebirdDriver;JvCmp;JvHMI;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;OverbyteIcsD103Run;bindcompdbx;IndyIPCommon;JvCustom;vcl;DBXSybaseASEDriver;IndyIPServer;JvXPCtrls;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;TeeDB;FireDAC;GrtPanelPackage;Jcl;JvCore;emshosting;JvCrypt;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;JvDlgs;JvRuntimeDesign;JvManagedThreads;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;JvTimeFramework;DBXSybaseASADriver;CustomIPTransport;vcldsnap;JvSystem;JvStdCtrls;FrameViewerXE9;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;SynEdit_R;TeeUI;JvDocking;dbxcds;VclSmp;JvPascalInterpreter;adortl;FireDACODBCDriver;JclVcl;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;inetdbxpress;FireDACMongoDBDriver;IndyProtocols;JvControls;JvPrintPreview;JclContainers;fmxase;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + DBXSqliteDriver;RESTComponents;DataSnapServerMidas;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;emsclientfiredac;DataSnapFireDAC;tethering;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;DBXOracleDriver;inetdb;VirtualTreesDR;FmxTeeUI;emsedge;FireDACIBDriver;fmx;fmxdae;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;DataSnapCommon;emsclient;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;FireDACOracleDriver;CloudService;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;OverbyteIcsD103Run;bindcompdbx;IndyIPCommon;vcl;DBXSybaseASEDriver;IndyIPServer;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;SynEdit_R;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;inetdbxpress;FireDACMongoDBDriver;IndyProtocols;fmxase;$(DCC_UsePackage) + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + DEBUG;$(DCC_Define) + true + false + true + true + true + + + false + DetailedSegments + 3 + 1033 + (None) + FullDebugModeWhenDLLAvailable;$(DCC_Define) + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + + MainSource + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + Application + + + + Demo.dpr + + + Embarcadero C++Builder Office 2000 Servers Package + Embarcadero C++Builder Office XP Servers Package + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + Demo.exe + true + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + classes + 1 + + + + + res\xml + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + + + res\values + 1 + + + + + res\values-v21 + 1 + + + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + 1 + + + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + + False + True + False + + + 12 + + + + + diff --git a/Demo/Demo.lpi b/Demo/Demo.lpi new file mode 100644 index 0000000..b2993b7 --- /dev/null +++ b/Demo/Demo.lpi @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + <UseAppBundle Value="False"/> + <ResourceType Value="res"/> + </General> + <BuildModes Count="1"> + <Item1 Name="Default" Default="True"/> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + <UseFileFilters Value="True"/> + </PublishOptions> + <RunParams> + <FormatVersion Value="2"/> + <Modes Count="0"/> + </RunParams> + <RequiredPackages Count="1"> + <Item1> + <PackageName Value="LCL"/> + </Item1> + </RequiredPackages> + <Units Count="2"> + <Unit0> + <Filename Value="Demo.dpr"/> + <IsPartOfProject Value="True"/> + </Unit0> + <Unit1> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <IsPartOfProject Value="True"/> + </Unit1> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <SearchPaths> + <IncludeFiles Value=".."/> + <OtherUnitFiles Value=".."/> + <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + <Parsing> + <SyntaxOptions> + <SyntaxMode Value="delphi"/> + </SyntaxOptions> + </Parsing> + </CompilerOptions> + <Debugging> + <Exceptions Count="3"> + <Item1> + <Name Value="EAbort"/> + </Item1> + <Item2> + <Name Value="ECodetoolError"/> + </Item2> + <Item3> + <Name Value="EFOpenError"/> + </Item3> + </Exceptions> + </Debugging> +</CONFIG> diff --git a/Demo/Demo.lps b/Demo/Demo.lps new file mode 100644 index 0000000..6da86e3 --- /dev/null +++ b/Demo/Demo.lps @@ -0,0 +1,123 @@ +<?xml version="1.0" encoding="UTF-8"?> +<CONFIG> + <ProjectSession> + <PathDelim Value="\"/> + <Version Value="11"/> + <BuildModes Active="Default"/> + <Units Count="5"> + <Unit0> + <Filename Value="Demo.dpr"/> + <IsPartOfProject Value="True"/> + <IsVisibleTab Value="True"/> + <CursorPos X="11" Y="13"/> + <UsageCount Value="20"/> + <Loaded Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit0> + <Unit1> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <IsPartOfProject Value="True"/> + <EditorIndex Value="2"/> + <CursorPos X="7" Y="23"/> + <UsageCount Value="20"/> + <Loaded Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit1> + <Unit2> + <Filename Value="..\..\..\..\pro\fpcsrc\packages\fcl-base\src\syncobjs.pp"/> + <EditorIndex Value="3"/> + <TopLine Value="124"/> + <CursorPos X="25" Y="137"/> + <UsageCount Value="10"/> + <Loaded Value="True"/> + </Unit2> + <Unit3> + <Filename Value="..\..\..\..\pro\fpcsrc\rtl\objpas\classes\classesh.inc"/> + <EditorIndex Value="1"/> + <TopLine Value="964"/> + <CursorPos X="57" Y="977"/> + <UsageCount Value="10"/> + <Loaded Value="True"/> + </Unit3> + <Unit4> + <Filename Value="..\FPCTests\fpcunitproject1.lpr"/> + <EditorIndex Value="-1"/> + <WindowIndex Value="-1"/> + <TopLine Value="-1"/> + <CursorPos X="-1" Y="-1"/> + <UsageCount Value="20"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit4> + </Units> + <JumpHistory Count="13" HistoryIndex="12"> + <Position1> + <Filename Value="Demo.dpr"/> + <Caret Line="13" Column="3"/> + </Position1> + <Position2> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="27" Column="11" TopLine="5"/> + </Position2> + <Position3> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="55" Column="16" TopLine="42"/> + </Position3> + <Position4> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="8" Column="6"/> + </Position4> + <Position5> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="68" Column="30" TopLine="56"/> + </Position5> + <Position6> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="88" Column="30" TopLine="78"/> + </Position6> + <Position7> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="410" Column="45" TopLine="398"/> + </Position7> + <Position8> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="453" Column="5" TopLine="441"/> + </Position8> + <Position9> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="6" Column="41"/> + </Position9> + <Position10> + <Filename Value="Demo.dpr"/> + <Caret Line="46" Column="26" TopLine="35"/> + </Position10> + <Position11> + <Filename Value="Demo.dpr"/> + <Caret Line="30" Column="29" TopLine="8"/> + </Position11> + <Position12> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="23" Column="7"/> + </Position12> + <Position13> + <Filename Value="Demo.dpr"/> + <Caret Line="13" Column="8"/> + </Position13> + </JumpHistory> + <RunParams> + <FormatVersion Value="2"/> + <Modes Count="0" ActiveMode=""/> + </RunParams> + </ProjectSession> + <SkipCheckLCLInterfaces Value="True"/> + <Debugging> + <BreakPoints Count="1"> + <Item1> + <Kind Value="bpkSource"/> + <WatchScope Value="wpsLocal"/> + <WatchKind Value="wpkWrite"/> + <Source Value="Demo.dpr"/> + <Line Value="73"/> + </Item1> + </BreakPoints> + </Debugging> +</CONFIG> diff --git a/FPCTests/fpcunitproject1.lpi b/FPCTests/fpcunitproject1.lpi index 0b7ee95..38f5f3e 100644 --- a/FPCTests/fpcunitproject1.lpi +++ b/FPCTests/fpcunitproject1.lpi @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <CONFIG> <ProjectOptions> - <Version Value="10"/> + <Version Value="11"/> <PathDelim Value="\"/> <General> <SessionStorage Value="InProjectDir"/> @@ -17,9 +17,10 @@ <Version Value="2"/> </PublishOptions> <RunParams> - <local> - <FormatVersion Value="1"/> - </local> + <FormatVersion Value="2"/> + <Modes Count="1"> + <Mode0 Name="default"/> + </Modes> </RunParams> <RequiredPackages Count="3"> <Item1> diff --git a/FPCTests/fpcunitproject1.lps b/FPCTests/fpcunitproject1.lps index 689244d..2552e7c 100644 --- a/FPCTests/fpcunitproject1.lps +++ b/FPCTests/fpcunitproject1.lps @@ -1,174 +1,178 @@ -<?xml version="1.0" encoding="UTF-8"?> -<CONFIG> - <ProjectSession> - <PathDelim Value="\"/> - <Version Value="10"/> - <BuildModes Active="Default"/> - <Units Count="5"> - <Unit0> - <Filename Value="fpcunitproject1.lpr"/> - <IsPartOfProject Value="True"/> - <CursorPos X="60" Y="13"/> - <UsageCount Value="20"/> - <Loaded Value="True"/> - </Unit0> - <Unit1> - <Filename Value="testcase1.pas"/> - <IsPartOfProject Value="True"/> - <UnitName Value="TestCase1"/> - <EditorIndex Value="1"/> - <TopLine Value="13"/> - <CursorPos X="23" Y="31"/> - <UsageCount Value="20"/> - <Loaded Value="True"/> - </Unit1> - <Unit2> - <Filename Value="..\AG.PascalTokenizer.pas"/> - <IsPartOfProject Value="True"/> - <IsVisibleTab Value="True"/> - <EditorIndex Value="2"/> - <TopLine Value="232"/> - <CursorPos X="13" Y="242"/> - <UsageCount Value="20"/> - <Loaded Value="True"/> - </Unit2> - <Unit3> - <Filename Value="C:\lazarus\components\fpcunit\guitestrunner.pas"/> - <UnitName Value="GuiTestRunner"/> - <EditorIndex Value="-1"/> - <TopLine Value="44"/> - <CursorPos X="12" Y="54"/> - <UsageCount Value="10"/> - </Unit3> - <Unit4> - <Filename Value="C:\lazarus\fpc\3.0.4\source\rtl\objpas\classes\classesh.inc"/> - <EditorIndex Value="-1"/> - <TopLine Value="715"/> - <CursorPos X="47" Y="732"/> - <UsageCount Value="10"/> - </Unit4> - </Units> - <JumpHistory Count="30" HistoryIndex="29"> - <Position1> - <Filename Value="..\AG.PascalTokenizer.pas"/> - <Caret Line="191" TopLine="171"/> - </Position1> - <Position2> - <Filename Value="..\AG.PascalTokenizer.pas"/> - <Caret Line="192" TopLine="171"/> - </Position2> - <Position3> - <Filename Value="..\AG.PascalTokenizer.pas"/> - <Caret Line="193" TopLine="171"/> - </Position3> - <Position4> - <Filename Value="..\AG.PascalTokenizer.pas"/> - <Caret Line="196" TopLine="171"/> - </Position4> - <Position5> - <Filename Value="..\AG.PascalTokenizer.pas"/> - <Caret Line="295" TopLine="278"/> - </Position5> - <Position6> - <Filename Value="..\AG.PascalTokenizer.pas"/> - <Caret Line="300" TopLine="278"/> - </Position6> - <Position7> - <Filename Value="..\AG.PascalTokenizer.pas"/> - <Caret Line="312" TopLine="284"/> - </Position7> - <Position8> - <Filename Value="..\AG.PascalTokenizer.pas"/> - <Caret Line="189" TopLine="171"/> - </Position8> - <Position9> - <Filename Value="..\AG.PascalTokenizer.pas"/> - <Caret Line="190" TopLine="171"/> - </Position9> - <Position10> - <Filename Value="..\AG.PascalTokenizer.pas"/> - <Caret Line="191" TopLine="171"/> - </Position10> - <Position11> - <Filename Value="..\AG.PascalTokenizer.pas"/> - <Caret Line="192" TopLine="171"/> - </Position11> - <Position12> - <Filename Value="..\AG.PascalTokenizer.pas"/> - <Caret Line="193" TopLine="171"/> - </Position12> - <Position13> - <Filename Value="..\AG.PascalTokenizer.pas"/> - <Caret Line="196" TopLine="171"/> - </Position13> - <Position14> - <Filename Value="..\AG.PascalTokenizer.pas"/> - <Caret Line="295" TopLine="278"/> - </Position14> - <Position15> - <Filename Value="..\AG.PascalTokenizer.pas"/> - <Caret Line="300" TopLine="278"/> - </Position15> - <Position16> - <Filename Value="..\AG.PascalTokenizer.pas"/> - <Caret Line="312" TopLine="284"/> - </Position16> - <Position17> - <Filename Value="..\AG.PascalTokenizer.pas"/> - <Caret Line="189" TopLine="171"/> - </Position17> - <Position18> - <Filename Value="..\AG.PascalTokenizer.pas"/> - <Caret Line="190" TopLine="171"/> - </Position18> - <Position19> - <Filename Value="..\AG.PascalTokenizer.pas"/> - <Caret Line="191" TopLine="171"/> - </Position19> - <Position20> - <Filename Value="..\AG.PascalTokenizer.pas"/> - <Caret Line="192" TopLine="171"/> - </Position20> - <Position21> - <Filename Value="..\AG.PascalTokenizer.pas"/> - <Caret Line="193" TopLine="171"/> - </Position21> - <Position22> - <Filename Value="..\AG.PascalTokenizer.pas"/> - <Caret Line="196" TopLine="171"/> - </Position22> - <Position23> - <Filename Value="..\AG.PascalTokenizer.pas"/> - <Caret Line="295" Column="7" TopLine="278"/> - </Position23> - <Position24> - <Filename Value="testcase1.pas"/> - <Caret Line="28" Column="11" TopLine="4"/> - </Position24> - <Position25> - <Filename Value="testcase1.pas"/> - <Caret Line="29" Column="15" TopLine="4"/> - </Position25> - <Position26> - <Filename Value="..\AG.PascalTokenizer.pas"/> - <Caret Line="295" Column="9"/> - </Position26> - <Position27> - <Filename Value="..\AG.PascalTokenizer.pas"/> - <Caret Line="313" Column="20" TopLine="299"/> - </Position27> - <Position28> - <Filename Value="testcase1.pas"/> - <Caret Line="23" Column="12" TopLine="8"/> - </Position28> - <Position29> - <Filename Value="..\AG.PascalTokenizer.pas"/> - <Caret Line="110" Column="34" TopLine="106"/> - </Position29> - <Position30> - <Filename Value="..\AG.PascalTokenizer.pas"/> - <Caret Line="86" Column="32" TopLine="72"/> - </Position30> - </JumpHistory> - </ProjectSession> -</CONFIG> +<?xml version="1.0" encoding="UTF-8"?> +<CONFIG> + <ProjectSession> + <PathDelim Value="\"/> + <Version Value="11"/> + <BuildModes Active="Default"/> + <Units Count="5"> + <Unit0> + <Filename Value="fpcunitproject1.lpr"/> + <IsPartOfProject Value="True"/> + <CursorPos X="60" Y="13"/> + <UsageCount Value="20"/> + <Loaded Value="True"/> + </Unit0> + <Unit1> + <Filename Value="testcase1.pas"/> + <IsPartOfProject Value="True"/> + <UnitName Value="TestCase1"/> + <EditorIndex Value="1"/> + <TopLine Value="13"/> + <CursorPos X="23" Y="31"/> + <UsageCount Value="20"/> + <Loaded Value="True"/> + </Unit1> + <Unit2> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <IsPartOfProject Value="True"/> + <IsVisibleTab Value="True"/> + <EditorIndex Value="2"/> + <TopLine Value="200"/> + <CursorPos X="6" Y="216"/> + <UsageCount Value="20"/> + <Loaded Value="True"/> + </Unit2> + <Unit3> + <Filename Value="C:\lazarus\components\fpcunit\guitestrunner.pas"/> + <UnitName Value="GuiTestRunner"/> + <EditorIndex Value="-1"/> + <TopLine Value="44"/> + <CursorPos X="12" Y="54"/> + <UsageCount Value="10"/> + </Unit3> + <Unit4> + <Filename Value="C:\lazarus\fpc\3.0.4\source\rtl\objpas\classes\classesh.inc"/> + <EditorIndex Value="-1"/> + <TopLine Value="715"/> + <CursorPos X="47" Y="732"/> + <UsageCount Value="10"/> + </Unit4> + </Units> + <JumpHistory Count="30" HistoryIndex="29"> + <Position1> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="189" TopLine="171"/> + </Position1> + <Position2> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="190" TopLine="171"/> + </Position2> + <Position3> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="191" TopLine="171"/> + </Position3> + <Position4> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="192" TopLine="171"/> + </Position4> + <Position5> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="193" TopLine="171"/> + </Position5> + <Position6> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="196" TopLine="171"/> + </Position6> + <Position7> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="295" TopLine="278"/> + </Position7> + <Position8> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="300" TopLine="278"/> + </Position8> + <Position9> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="312" TopLine="284"/> + </Position9> + <Position10> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="189" TopLine="171"/> + </Position10> + <Position11> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="190" TopLine="171"/> + </Position11> + <Position12> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="191" TopLine="171"/> + </Position12> + <Position13> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="192" TopLine="171"/> + </Position13> + <Position14> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="193" TopLine="171"/> + </Position14> + <Position15> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="196" TopLine="171"/> + </Position15> + <Position16> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="295" Column="7" TopLine="278"/> + </Position16> + <Position17> + <Filename Value="testcase1.pas"/> + <Caret Line="28" Column="11" TopLine="4"/> + </Position17> + <Position18> + <Filename Value="testcase1.pas"/> + <Caret Line="29" Column="15" TopLine="4"/> + </Position18> + <Position19> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="295" Column="9"/> + </Position19> + <Position20> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="313" Column="20" TopLine="299"/> + </Position20> + <Position21> + <Filename Value="testcase1.pas"/> + <Caret Line="23" Column="12" TopLine="8"/> + </Position21> + <Position22> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="110" Column="34" TopLine="106"/> + </Position22> + <Position23> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="86" Column="32" TopLine="72"/> + </Position23> + <Position24> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="218" Column="37" TopLine="150"/> + </Position24> + <Position25> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="21" Column="7" TopLine="8"/> + </Position25> + <Position26> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="9" Column="2"/> + </Position26> + <Position27> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="21" Column="40" TopLine="5"/> + </Position27> + <Position28> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="20" Column="7" TopLine="8"/> + </Position28> + <Position29> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="21" Column="7" TopLine="8"/> + </Position29> + <Position30> + <Filename Value="..\AG.PascalTokenizer.pas"/> + <Caret Line="5" Column="13"/> + </Position30> + </JumpHistory> + <RunParams> + <FormatVersion Value="2"/> + <Modes Count="0" ActiveMode="default"/> + </RunParams> + </ProjectSession> +</CONFIG>