From c9584c15ec64cb289e64094295f423cec1702cfa Mon Sep 17 00:00:00 2001 From: Artem3213212 Date: Sun, 28 Oct 2018 15:27:24 +0200 Subject: [PATCH] Stablize code base (needs improvement, but should work for now) --- .gitignore | 3 +- AG.PascalTokeniser.pas | 305 +++++++++++-------- DelphiTests/MainTest.pas | 19 +- DelphiTests/Tests.dpr | 2 +- DelphiTests/Tests.dproj | 640 +++++++++++++++++++++++---------------- 5 files changed, 584 insertions(+), 385 deletions(-) diff --git a/.gitignore b/.gitignore index 5b1ff05..67df51c 100644 --- a/.gitignore +++ b/.gitignore @@ -81,4 +81,5 @@ FPCTests/*.ico Tests/Win32 !FasmDll/* -!FasmDll/DEMO/* \ No newline at end of file +!FasmDll/DEMO/* +*.xml diff --git a/AG.PascalTokeniser.pas b/AG.PascalTokeniser.pas index 029d4bc..6d72758 100644 --- a/AG.PascalTokeniser.pas +++ b/AG.PascalTokeniser.pas @@ -3,216 +3,245 @@ unit AG.PascalTokeniser; interface uses - System.Generics.Collections, + System.Generics.Collections, System.SysUtils, System.Classes; -function is_comment(s:string); -function is_name(s:string); -function is_string(s:string); - -const - SYMS1 = ['(',')','[',']','/','|','\','@','#','=','>','<',':',';',',','.','$','+','-','*']; - SYMS2 = ['>=','<=','<>',':=','..','-=','+=','/=','*=']; - SPACES = [#12,#10,#13,#9,#11,' ']; - NO_NAME_SYMS = SYMS1 + SPACES + ['{','}']; - CHARS_ID0 = '&abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_'; - CHARS_ID = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_'; - type - PasTokenizer=class - private - s:TStrings; - y:integer; - x:integer; - ended:boolean; - procedure _do_readable(); - procedure _is_readable(); - procedure _next_readable(); - procedure _skip_spaces(); - procedure _get_pos(); - procedure _set_pos(i0:integer; i1:integer); - public - procedure get_next(); - procedure read_next(); - procedure is_ended(); + TTokenizerPos = record + x, y: integer; end; - PasTokenizerStack=class - private - stack:TStack; - // _pop - procedure _get_with_comments(); - procedure _get_without_comments(); - public - procedure push(s:string); - procedure pop(); - procedure read_last(); - procedure is_ended(); + + TToken = record + Text: string; + &begin, &end: TTokenizerPos; + ended: boolean; + constructor Create(Text: string; &begin, &end: TTokenizerPos; + ended: boolean); end; + TPasTokenizer = class + private + s: TStrings; + y: integer; + x: integer; + ended: boolean; + function _do_readable(): boolean; + function _is_readable(): boolean; + function _next_readable(): boolean; + procedure _skip_spaces(); + function _get_pos(): TTokenizerPos; + procedure _set_pos(i0: integer; i1: integer); + public + function get_next(): TToken; + // procedure read_next(); + // procedure is_ended(); + constructor Create(input:TStrings); + end; + + {PasTokenizerStack = class + private + stack: TStack; + // _pop + procedure _get_with_comments(); + procedure _get_without_comments(); + public + procedure push(s: string); + procedure pop(); + procedure read_last(); + procedure is_ended(); + end;} + +function is_comment(s: string): boolean; +function is_name(s: string): boolean; +function is_string(s: string): boolean; + implementation -function is_comment(s:string); +constructor TToken.Create(Text: string; &begin, &end: TTokenizerPos; + ended: boolean); +begin + 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: TList; // array[0..8]of string=(); + +function is_comment(s: string): boolean; begin // TODO end; -function is_name(s:string); +function is_name(s: string): boolean; var - i:integer; + i: integer; begin - if length(s) <= 0 then Exit(False); - if s = '&' then Exit(False); - if not (s[0] in CHARS_ID0) then Exit(False); + 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 (s[i] in CHARS_ID) then + if not CHARS_ID.Contains(s[i]) then Exit(False); end; end; -function is_string(s); +function is_string(s: string): boolean; begin // TODO end; -class function PasTokenizer._do_readable(); +function TPasTokenizer._do_readable(): boolean; begin if not _is_readable() then begin - if (y+1 = Length(s)) then + if (y + 1 = s.Count) then + ended := True + else begin - ended = True; - end - else begin inc(y); - x = 0; - while not s[y] = '' do + x := 1+Fix; + while s[y]='' do begin - if y+1 = length(s) then + if y + 1 = s.Count then begin - ended = True; + ended := True; break; end; inc(y); end; end; Exit(True); - end else Exit(False); + end + else + Exit(False); end; -class function PasTokenizer._is_readable(); +function TPasTokenizer._is_readable(): boolean; begin - Exit(length(s[y]) > x); + Exit(length(s[y])+1+Fix > x); end; -class function PasTokenizer._next_readable(); +function TPasTokenizer._next_readable(): boolean; begin inc(x); - Exit(_do_readable()); + Result := _do_readable(); end; -class function PasTokenizer._skip_spaces(); +procedure TPasTokenizer._skip_spaces(); begin _do_readable(); if not ended then begin - while s[y][x] in SPACES do - _next_readable(); + while SPACES.Contains(s[y][x]) do + _next_readable(); end; end; -class function PasTokenizer._get_pos(); +function TPasTokenizer._get_pos(): TTokenizerPos; begin - Exit(y, x); + Result.x := x; + Result.y := y; end; -class function PasTokenizer._set_pos(i0:integer; i1:integer); +procedure TPasTokenizer._set_pos(i0: integer; i1: integer); begin - y = i0; - x = i1; - ended = False; + y := i0; + x := i1; + ended := False; _do_readable(); end; -class function PasTokenizer.get_next(); +function TPasTokenizer.get_next(): TToken; var - begin_pos:integer; - l:integer; - last_i0:integer; - m1:string = ''; - ss:string = ''; - line:string; - now_sym:char; - next_sym:char; - f:boolean = True; - str_changed:boolean = True; + l,i,last_i0:integer; + ml,ss,line:string; + now_sym,next_sym:char; + f,str_changed:boolean; + begin_pos:TTokenizerPos; begin - begin_pos = _get_pos(); + ml := ''; + ss := ''; + f := True; + str_changed := True; + begin_pos := _get_pos(); while f and not ended do begin - line = s[y]; - now_sym = line[x]; - l = length(line); - if x+1 <> 1 then - begin - next_sym = line[x+1]; - end else begin - next_sym = ''; - end; - if m1 = '' then + 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 begin if now_sym = '/' then begin if next_sym = '/' then begin - ss = line[x]; - x = 1; + for i:=x to l+Fix do + ss:=ss+line[i]; + x := l+Fix; break; end; end else if now_sym = '{' then begin - m1 = '}'; - ss = [now_sym]; - last_i0 = y; + ml := '}'; + ss := now_sym; + last_i0 := y; end else if now_sym = '(' then begin if next_sym = '*' then begin - ml = ')'; + ml := ')'; inc(x); - last_i0 = y; - ss = [now_sym+next_sym]; - end + last_i0 := y; + ss := now_sym + next_sym; + end else begin - ss = '('; + ss := '('; inc(x); break; end; end else begin - if now_sym in SYMS1 then + if SYMS1.Contains(now_sym) then begin - ss = now_sym; + ss := now_sym; inc(x); - if now_sym + next_sym in SYMS2 then + if SYMS2.Contains(now_sym + next_sym) then begin inc(x); - ss = ss + next_sym; + ss := ss + next_sym; end; break; end - else if now_sym = '' {TODO "'"} then + else if now_sym = #39 then begin - ss = '' {TODO "'"}; + ss := #39; inc(x); if next_sym <> '' then begin - ss = ss + next_sym; - while line[x] <> '' {TODO "'"} do + ss := ss + next_sym; + while line[x] <> #39 do begin inc(x); if not _is_readable() then @@ -220,7 +249,7 @@ begin dec(x); break; end; - ss = ss + line[x]; + ss := ss + line[x]; end; inc(x); end; @@ -228,11 +257,12 @@ begin end else begin - while not (line[x] in NO_NAME_SYMS) then + while not NO_NAME_SYMS.Contains(line[x]) do begin - ss = ss + line[x] + ss := ss + line[x]; inc(x); - if not _is_readable() then break; + if not _is_readable() then + break; end; break; end; @@ -242,12 +272,51 @@ begin begin while last_i0 <> y do begin - {TODO ss.append('')} + ss := ss + #10; inc(last_i0); end; - //TODO + if ss[length(ss) + fix] = #10 then + begin + ss[length(ss) + fix] := now_sym; + ss := ss + #10; + end; + 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; - //TODO + _next_readable(); end; + Result := TToken.Create(ss, begin_pos, _get_pos, ended); + _skip_spaces; end; + +constructor TPasTokenizer.Create(input:TStrings); +begin + s:=input; + y:=0; + x:=1+fix; + ended:=False; + _skip_spaces; +end; + +initialization +SYMS2 := TList.Create(); +SYMS2.Add('>='); +SYMS2.Add('<='); +SYMS2.Add('<>'); +SYMS2.Add(':='); +SYMS2.Add('..'); +SYMS2.Add('-='); +SYMS2.Add('+='); +SYMS2.Add('/='); +SYMS2.Add('*='); + end. diff --git a/DelphiTests/MainTest.pas b/DelphiTests/MainTest.pas index 108abe7..2ac7ffa 100644 --- a/DelphiTests/MainTest.pas +++ b/DelphiTests/MainTest.pas @@ -2,7 +2,10 @@ unit MainTest; interface uses - DUnitX.TestFramework; + DUnitX.TestFramework, + System.Classes, + WinAPI.Windows, + AG.PascalTokeniser; type [TestFixture] @@ -18,7 +21,21 @@ type implementation procedure TMyTestObject.Test1; +var + input:TStrings; + tokenizer:TPasTokenizer; + token:TToken; begin + input:= TStringList.Create(); + input.LoadFromFile('..\..\MainTest.pas'); + tokenizer:=TPasTokenizer.Create(input); + token.ended:=False; + while not token.ended do + begin + token:=tokenizer.get_next; + TDUnitX.CurrentRunner.Log(TLogLevel.Information, token.Text); + end; + //sleep(10000); end; initialization diff --git a/DelphiTests/Tests.dpr b/DelphiTests/Tests.dpr index f8ce4d2..a5da060 100644 --- a/DelphiTests/Tests.dpr +++ b/DelphiTests/Tests.dpr @@ -33,7 +33,7 @@ begin runner.UseRTTI := True; //tell the runner how we will log things //Log to the console window - logger := TDUnitXConsoleLogger.Create(true); + logger := TDUnitXConsoleLogger.Create(false); runner.AddLogger(logger); //Generate an NUnit compatible XML File nunitLogger := TDUnitXXMLNUnitFileLogger.Create(TDUnitX.Options.XMLOutputFile); diff --git a/DelphiTests/Tests.dproj b/DelphiTests/Tests.dproj index a63ec25..acb173d 100644 --- a/DelphiTests/Tests.dproj +++ b/DelphiTests/Tests.dproj @@ -1,7 +1,7 @@  {D45A1419-D0B2-4C03-89FD-530EF21B4F7D} - 17.2 + 18.4 Tests.dpr True Debug @@ -13,8 +13,23 @@ true - - true + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true Base true @@ -59,13 +74,73 @@ false false - - FireDACTDataDriver;FireDACSqliteDriver;FireDACDSDriver;DBXSqliteDriver;FireDACPgDriver;fmx;IndySystem;tethering;DBXInterBaseDriver;DataSnapClient;DataSnapCommon;DataSnapServer;DataSnapProviderClient;DbxCommonDriver;dbxcds;fmxFireDAC;DBXOracleDriver;CustomIPTransport;dsnap;IndyIPServer;fmxase;IndyCore;CloudService;IndyIPCommon;FmxTeeUI;FireDACIBDriver;DataSnapFireDAC;FireDACDBXDriver;soapserver;inetdbxpress;dsnapxml;FireDACASADriver;bindcompfmx;FireDACODBCDriver;RESTBackendComponents;emsclientfiredac;rtl;dbrtl;DbxClientDriver;FireDACCommon;bindcomp;inetdb;ibmonitor;xmlrtl;DataSnapNativeClient;ibxpress;IndyProtocols;DBXMySQLDriver;FireDACCommonDriver;bindcompdbx;bindengine;FMXTee;soaprtl;emsclient;FireDAC;DBXInformixDriver;FireDACMSSQLDriver;DataSnapServerMidas;DBXFirebirdDriver;inet;fmxobj;FireDACMySQLDriver;soapmidas;DBXSybaseASADriver;FireDACOracleDriver;fmxdae;RESTComponents;dbexpress;DataSnapIndy10ServerTransport;IndyIPClient;$(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 + 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=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + 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) @@ -115,7 +190,8 @@ Tests.dpr - + + true @@ -126,180 +202,16 @@ true - - - Tests.exe - true - - true - - - 1 - .dylib - - - 0 - .bpl - + - 1 - .dylib + true - - 1 - .dylib - - - 1 - .dylib - - - - - 1 - .dylib - - - 0 - .dll;.bpl - - - - - 1 - - - 1 - - - 1 - - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - res\drawable-normal - 1 - - - - - library\lib\x86 - 1 - - - - - 1 - - - 1 - - - 1 - - - - - - library\lib\armeabi-v7a - 1 - - - - - 1 - - - 1 - - - 1 - - - - - res\drawable-xlarge - 1 - - - - - res\drawable-xhdpi - 1 - - - - - 1 - - - 1 - - - 1 - - - - - res\drawable-xxhdpi - 1 - - - - - library\lib\mips - 1 - - - - - res\drawable - 1 - - - - - 1 - - - 1 - - - 0 - - - - - 1 - .framework - - - 0 - - - - - res\drawable-small - 1 - - - + 1 @@ -315,62 +227,11 @@ 1 - - - - 1 - - - 1 - - - 1 - - - - - res\drawable - 1 - - - - - Contents\Resources - 1 - - - - - - 1 - - - 1 - - - 1 - - - + library\lib\armeabi-v7a 1 - - 1 - - - 0 - - - 1 - - - 1 - - - 1 - @@ -378,46 +239,21 @@ 1 - + - res\drawable-large + library\lib\mips 1 - + - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - 1 - - - 1 - - + library\lib\armeabi-v7a 1 - + - res\drawable-ldpi + res\drawable 1 @@ -427,14 +263,21 @@ 1 - - + + + res\drawable 1 - + + + + res\drawable-xxhdpi 1 - + + + + res\drawable-ldpi 1 @@ -450,20 +293,289 @@ 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