/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . android . utils Ċ Ċ import Ġcom . android . Sdk Constants Ċ import Ġcom . android . Sdk Constants . PLATFORM _ WINDOWS Ċ import Ġcom . google . common . annotations . Visible ForTesting Ċ import Ġjava . lang . Character . is Whitespace Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . min Ċ Ċ const Ġval ĠZERO _ ALLOC _ TOKEN IZER _ END _ OF _ TOKEN Ġ= ĠInt . MAX _ VALUE Ċ const Ġval ĠZERO _ ALLOC _ TOKEN IZER _ END _ OF _ COMMAND Ġ= ĠInt . MIN _ VALUE Ċ Ċ /** Ċ Ġ* ĠParse Ġa ĠWindows Ġor ĠPOSIX Ġcommand - line Ġwithout Ġalloc ating Ġper - character Ċ Ġ* Ġmemory . ĠIt Ġdoes Ġthis Ġby Ġam ort izing Ġwith Ġa Ġshared Ġa Ġbuffer Ġfrom Ġparses Ġof Ċ Ġ* Ġother Ġcommand Ġlines . Ċ Ġ* Ċ Ġ* ĠThe Ġfirst Ġelement Ġof Ġthe Ġbuffer Ġis Ġa Ġgeneration Ġcounter . ĠIf Ġthe Ġbuffer Ċ Ġ* Ġis Ġshared Ġbetween Ġmultiple Ġparses Ġeach Ġparse Ġwill Ġincrement Ġthe Ġgeneration . Ċ Ġ* ĠIf Ġa Ġbuffer Ġis Ġused Ġwith Ġan Ġolder Ġ[ Token ized CommandLine ] Ġthen Ġthat 's Ġa Ċ Ġ* Ġbug Ġin Ġthe Ġcalling Ġcode Ġso Ġan Ġexception Ġwill Ġbe Ġthrown . Ċ Ġ* Ċ Ġ* ĠAfter Ġthe Ġfirst Ġelement , Ġthe Ġbuffer Ġconsists Ġof Ġindexes Ġof Ġcharacters Ġwithin Ċ Ġ* Ġthe Ġoriginal Ġ[ command Line ] Ġdelimited Ġby Ġ[ ZERO _ ALLOC _ TOKEN IZER _ END _ OF _ TOKEN ] Ċ Ġ* Ġand Ġterminated Ġby Ġ[ ZERO _ ALLOC _ TOKEN IZER _ END _ OF _ COMMAND ] Ċ Ġ* Ċ Ġ* Ġ@ param Ġcommand Line Ġthe Ġcommand - line Ġto Ġtokenize Ċ Ġ* Ġ@ param Ġraw Ġthen Ġspecial Ġcharacters Ġare Ġsent Ġto Ġthe Ġreceiver . ĠOn ĠWindows , Ċ Ġ* ĠĠĠĠĠĠĠ Ġthat 's Ġdouble - quote (" ), Ġback slash (\ ), Ġand Ġcaret (^ ). ĠOn ĠPOSIX , Ġthat 's Ċ Ġ* ĠĠĠĠĠĠĠ Ġsingle - quote (' ), Ġdouble - quote (" ), Ġand Ġback slash (\ ). Ċ Ġ* Ġ@ param Ġplatform Ġoptional Ġplatform Ġtype . ĠDefault Ġis Ġthe Ġcurrent Ġplatform . Ċ Ġ* Ġ@ param Ġindexes Ġoptional ĠInt Array Ġto Ġhold Ġindexes Ġof Ġcharacters , Ġtoken Ċ Ġ* ĠĠĠĠĠĠĠ Ġde limiters Ġ( ZERO _ ALLOC _ TOKEN IZER _ END _ OF _ TOKEN ), Ġand Ġend Ġof Ġstring Ċ Ġ* ĠĠĠĠĠĠĠ Ġdelimiter Ġ( ZERO _ ALLOC _ TOKEN IZER _ END _ OF _ COMMAND ). Ċ Ġ*/ Ċ class ĠToken ized CommandLine ( ĊĠĠĠ Ġval Ġcommand Line : ĠString , ĊĠĠĠ Ġval Ġraw : ĠBoolean , ĊĠĠĠ Ġval Ġplatform : ĠInt Ġ= ĠS dk Constants . current Platform (), ĊĠĠĠ Ġprivate Ġvar Ġindexes : ĠInt Array Ġ= Ġallocate Token ize CommandLine Buffer ( command Line )) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġgeneration Ġ= Ġ++ indexes [ 0 ] ĊĠĠĠ Ġprivate Ġvar ĠtoString Value Ġ: ĠString ? Ġ= Ġnull ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Generation () ĊĠĠĠĠĠĠĠ Ġif Ġ( platform Ġ== ĠPLATFORM _ WINDOWS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġzero Alloc Token ize Windows ( raw ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġzero Alloc Token ize POSIX ( raw ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemove Ġtokens Ġmatching Ġ[ token ] Ġand Ġalso Ġremove Ġup Ġto Ġ[ extra ] Ġadditional Ġtokens ĊĠĠĠĠ Ġ* Ġfollowing Ġthat . ĠIf Ġ[ match Prefix ] Ġis Ġset Ġto Ġtrue , Ġ[ token ] Ġis Ġtreated Ġas Ġa Ġprefix ĊĠĠĠĠ Ġ* Ġand Ġany Ġtoken Ġstarts Ġwith Ġthis Ġprefix Ġwould Ġbe Ġmatched Ġand Ġremoved . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġupdates Ġ[ indexes ] Ġwithout Ġres izing Ġit Ġor Ġalloc ating Ġmemory . ĠIt ĊĠĠĠĠ Ġ* Ġworks Ġby Ġmaintaining Ġa Ġ' read ' Ġpointer Ġand Ġa Ġ' write ' Ġthat Ġare Ġpointers Ġwithin ĊĠĠĠĠ Ġ* Ġ[ indexes ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIn Ġthe Ġbeginning Ġread Ġand Ġwrite Ġare Ġthe Ġsame . ĠWhen Ġa Ġmatching Ġtoken Ġis Ġfound ĊĠĠĠĠ Ġ* Ġthen Ġthe Ġread Ġpointer Ġis Ġmoved Ġforward Ġpast Ġthe Ġend Ġof Ġthe Ġmatching Ġtoken ĊĠĠĠĠ Ġ* Ġalong Ġwith Ġany Ġ[ extra ] Ġtokens . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠSo Ġfor Ġexample , Ġif Ġremove Token Group ("- c ", Ġ 1 ) Ġis Ġcalled Ġthen Ġthe Ġpointers Ġwill ĊĠĠĠĠ Ġ* Ġlook Ġlike Ġthis Ġafter Ġthe Ġ'- c ' Ġand Ġone Ġextra Ġtoken Ġhave Ġbeen Ġskipped . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv ĊĠĠĠĠ Ġ* ĠĠ Ġclang . exe Ġ- c Ġmy - file . cpp Ġ- o Ġmy - file . o ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ^ ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠWhen Ġthe Ġparameter Ġ[ return First Extra ] Ġis Ġtrue , Ġthis Ġfunction Ġreturns Ġthe Ġfirst Ġstring Ġvalue ĊĠĠĠĠ Ġ* Ġof Ġthe Ġfirst Ġparameter Ġafter Ġ[ token ]; Ġthis Ġrequires Ġan Ġextra Ġstring Ġallocation . ĠWhen ĊĠĠĠĠ Ġ* Ġ[ return First Extra ] Ġis Ġfalse , Ġnull Ġis Ġreturned ; Ġno Ġextra Ġstring Ġallocation Ġis Ġneeded Ġin Ġthis ĊĠĠĠĠ Ġ* Ġcase . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġremove Token Group ( ĊĠĠĠĠĠĠĠ Ġtoken : ĠString , ĊĠĠĠĠĠĠĠ Ġextra : ĠInt , ĊĠĠĠĠĠĠĠ Ġmatch Prefix : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġreturn First Extra : ĠBoolean Ġ= Ġfalse ) Ġ: ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Generation () ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġvar Ġread Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġvar Ġwrite Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġvar Ġfirst Extra Ġ: ĠString ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġin variants : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠ Ġwrite Ġpoint Ġcan 't Ġmove Ġpast Ġread Ġpointer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( read Ġ>= Ġwrite ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠ Ġread Ġpointer Ġalways Ġpoints Ġto Ġthe Ġstart Ġof Ġa Ġtoken ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( is Start Of Token ( read )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠ Ġwrite Ġpointer Ġalways Ġpoints Ġto Ġthe Ġstart Ġof Ġa Ġtoken ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( is Start Of Token ( write )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġtoken Ġmatches Ġthe Ġone Ġpointed Ġto Ġbe Ġread Ġpointer Ġthen Ġskip Ġit Ġand Ġalso ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġskip Ġany Ġextra Ġtokens . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( token Matches ( token , Ġread , Ġmatch Prefix )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( return First Extra ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Extra Ġ= Ġif Ġ( match Prefix ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Starting At ( read Ġ+ Ġtoken . length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Starting At ( nextToken After ( read )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile ( count Ġ!= Ġextra Ġ+ Ġ 1 Ġ&& Ġ! is EndOf Command ( read )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Ġ= Ġnext Token After ( read ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ++ count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSkip Ġboth Ġread Ġand Ġwrite Ġpointers Ġto Ġthe Ġstart Ġof Ġthe Ġnext Ġtoken . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is EndOf Command ( read ) Ġ&& Ġ! is EndOf Command ( write )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindexes [ write ++] Ġ= Ġindexes [ read ++] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ(! is EndOf Token ( read Ġ- Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ(! is EndOf Command ( read )) ĊĠĠĠĠĠĠĠ Ġindexes [ write ] Ġ= ĠZERO _ ALLOC _ TOKEN IZER _ END _ OF _ COMMAND ĊĠĠĠĠĠĠĠ Ġreturn Ġfirst Extra ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtoken Starting At ( start Ġ: ĠInt ) Ġ: ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Generation () ĊĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġfor ( read Ġin Ġstart Ġuntil Ġindexes . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġoffset Ġ= Ġindexes [ read ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠZERO _ ALLOC _ TOKEN IZER _ END _ OF _ COMMAND Ġ-> Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠZERO _ ALLOC _ TOKEN IZER _ END _ OF _ TOKEN Ġ-> Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . append ( command Line [ offset ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtoken . trim (). toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemove Ġand Ġreturn Ġthe Ġn - th Ġtoken Ġand Ġreturn Ġits Ġvalue Ġas Ġa Ġstring . ĊĠĠĠĠ Ġ* ĠWill Ġreturn Ġnull Ġif Ġthe Ġrequested Ġtoken Ġ[ n ] Ġis Ġout Ġof Ġrange . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġoper ates Ġin Ġa Ġmanner Ġsimilar Ġto Ġ[ remove Token Group ] Ġin ĊĠĠĠĠ Ġ* Ġthat Ġit Ġuses Ġa Ġread Ġpointer Ġand Ġwrite Ġpointer Ġto Ġwalk Ġacross Ġthe ĊĠĠĠĠ Ġ* Ġ[ command Line ] Ġand Ġit Ġrelies Ġon Ġthe Ġread Ġpointer Ġbeing Ġthe Ġsame Ġas ĊĠĠĠĠ Ġ* Ġwrite Ġpointer Ġor Ġlarger . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġremove N th ( n : ĠInt ) Ġ: ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Generation () ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġvar Ġtoken Number Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġwrite Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġfor ( read Ġin Ġ 1 Ġuntil Ġindexes . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( token Number Ġ!= Ġn ) Ġindexes [ write ++] Ġ= Ġindexes [ read ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġoffset Ġ= Ġindexes [ read ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠZERO _ ALLOC _ TOKEN IZER _ END _ OF _ COMMAND Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( token . isEmpty ()) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtoken . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠZERO _ ALLOC _ TOKEN IZER _ END _ OF _ TOKEN Ġ-> Ġtoken Number ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġif Ġ( token Number Ġ== Ġn ) Ġtoken . append ( command Line [ offset ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConstruct Ġand Ġreturn Ġa Ġlist Ġof Ġtokens . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġto Token List () Ġ: ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Generation () ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġwhile (! is EndOf Command ( i )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( val Ġc Ġ= Ġchar At ( i )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( token . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( token . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . set Length ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtoken . append ( c ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ++ i ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠToken ize Ġa Ġstring Ġwith ĠWindows Ġrules . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġis Ġthe Ġzero - alloc Ġ( per Ġchar ) Ġpart Ġof Ġthe Ġtokenizer . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġfollows ĠWindows Ġtoken ization Ġtoken ization Ġrules : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġhttps :// msdn . microsoft . com / en - us / library / 1 7 w 5 yk ft . aspx ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ Ġ- ĠA Ġstring Ġsur rounded Ġby Ġdouble Ġquot ation Ġmarks Ġ(" string ") Ġis Ġinterpreted ĊĠĠĠĠ Ġ* ĠĠĠ Ġas Ġa Ġsingle Ġargument , Ġregardless Ġof Ġwhite Ġspace Ġcontained Ġwithin . ĠA ĊĠĠĠĠ Ġ* ĠĠĠ Ġquoted Ġstring Ġcan Ġbe Ġembedded Ġin Ġan Ġargument . ĊĠĠĠĠ Ġ* Ġ Ġ- ĠA Ġdouble Ġquot ation Ġmark Ġprece ded Ġby Ġa Ġback slash Ġ(\ ") Ġis Ġinterpreted Ġas Ġa ĊĠĠĠĠ Ġ* ĠĠĠ Ġliteral Ġdouble Ġquot ation Ġmark Ġcharacter Ġ( "). ĊĠĠĠĠ Ġ* Ġ Ġ- ĠBack sl ashes Ġare Ġinterpreted Ġliter ally , Ġunless Ġthey Ġimmediately Ġprece de Ġa ĊĠĠĠĠ Ġ* ĠĠĠ Ġdouble Ġquot ation Ġmark . ĊĠĠĠĠ Ġ* Ġ Ġ- ĠIf Ġan Ġeven Ġnumber Ġof Ġback sl ashes Ġis Ġfollowed Ġby Ġa Ġdouble Ġquot ation Ġmark , ĊĠĠĠĠ Ġ* ĠĠĠ Ġone Ġback slash Ġis Ġplaced Ġin Ġthe Ġargv Ġarray Ġfor Ġevery Ġpair Ġof Ġback sl ashes , ĊĠĠĠĠ Ġ* ĠĠĠ Ġand Ġthe Ġdouble Ġquot ation Ġmark Ġis Ġinterpreted Ġas Ġa Ġstring Ġdelimiter . ĊĠĠĠĠ Ġ* Ġ Ġ- ĠIf Ġan Ġodd Ġnumber Ġof Ġback sl ashes Ġis Ġfollowed Ġby Ġa Ġdouble Ġquot ation Ġmark , ĊĠĠĠĠ Ġ* ĠĠĠ Ġone Ġback slash Ġis Ġplaced Ġin Ġthe Ġargv Ġarray Ġfor Ġevery Ġpair Ġof Ġback sl ashes , ĊĠĠĠĠ Ġ* ĠĠĠ Ġand Ġthe Ġdouble Ġquot ation Ġmark Ġis Ġ" escaped " Ġby Ġthe Ġremaining Ġback slash . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġraw Ġif Ġtrue , Ġthen Ġspecial Ġcharacters Ġdouble - quote (" ), Ġback slash (\ ), ĊĠĠĠĠ Ġ* ĠĠ Ġand Ġcaret (^ ) Ġare Ġreturned , Ġotherwise Ġthey Ġare Ġnot Ġreturned . ĠReg ard less ĊĠĠĠĠ Ġ* ĠĠ Ġof Ġthis Ġflag , Ġthe ĠWindows Ġcommand Ġline Ġescap ing Ġlogic Ġis Ġapplied Ġand ĊĠĠĠĠ Ġ* ĠĠ Ġun quoted Ġwhitespace Ġis Ġremoved . ĊĠĠĠĠ Ġ* Ġ@ return ĠSame Ġas Ġ[ indexes ] Ġfor Ġthe Ġcase Ġthat Ġthe Ġcaller Ġdidn 't Ġspecify Ġit . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġzero Alloc Token ize Windows ( raw : ĠBoolean ) Ġ: ĠToken ized CommandLine Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Generation () ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġvar Ġqu oting Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġcommand Line . length Ġ// ĠCalculate Ġlength Ġonce ĊĠĠĠĠĠĠĠ Ġvar Ġc : ĠChar ? ĊĠĠĠĠĠĠĠ Ġvar Ġoffset Ġ= Ġ 1 Ġ// ĠOne Ġbecause Ġfirst Ġelement Ġis Ġgeneration ĊĊĠĠĠĠĠĠĠ Ġwhile ( i Ġ< Ġlength Ġ&& Ġis Whitespace ( command Line [ i ])) Ġi ++ ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġlength ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ= Ġcommand Line [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠQuick Ġpath Ġfor Ġnormal Ġcase ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ== Ġ'"' Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġan Ġopening Ġor Ġclosing Ġdouble - quote (" ). ĠWh iche ver Ġit Ġis , Ġmove Ġto Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġopposite Ġqu oting Ġstate Ġfor Ġsubsequent Ġiterations . ĠIf Ġthis Ġis Ġraw Ġmode Ġthen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġdouble - quote (" ) Ġwill Ġalso Ġbe Ġsent . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( raw ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindexes [ offset ++] Ġ= Ġi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ// ĠThe Ġdouble - quote (" ). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqu oting Ġ= Ġ! quot ing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ++ i ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ== Ġ'\\ ' Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCount Ġthe Ġnumber Ġof Ġback slash (\ ) Ġand Ġthen Ġcheck Ġfor Ġdouble - quote (" ) Ġfollowing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthem . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġforward Ġ= Ġi Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġslash Count Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMove Ġposition Ġto Ġend Ġof Ġback sl ashes (\ ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ= Ġcommand Line . get OrNull ( forward ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( c Ġ== Ġ'\\ ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ++ slash Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ= Ġcommand Line . get OrNull ( ++ forward ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġodd Ġ= Ġslash Count Ġ% Ġ 2 Ġ== Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquote Ġ= Ġc Ġ== Ġ'\" ' Ġ// ĠWas Ġthere Ġa Ġdouble - quote (" )? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġdouble - quote (" ), Ġhal ve Ġthe Ġback sl ashes (\ ). ĠIf Ġraw , Ġthen Ġdon 't Ġhal ve . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! raw Ġ&& Ġquote ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġslash Count Ġ/= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEmit Ġthe Ġright Ġnumber Ġof Ġback sl ashes (\ ). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( slash Count ) Ġ{ Ġj Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindexes [ offset ++] Ġ= Ġi Ġ+ Ġj ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġodd Ġback sl ashes (\ ) Ġthen Ġtreat Ġa Ġdouble - quote (" ) Ġas Ġliteral ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( odd Ġ&& Ġquote ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindexes [ offset ++] Ġ= Ġforward ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ= Ġforward ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! quot ing Ġ&& Ġc Ġ== Ġ'^ ' Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġcaret (^ ) Ġis Ġseen Ġoutside Ġof Ġqu oting Ġand Ġthe Ġnext Ġcharacter Ġis Ġa Ġblock Ġof ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcar riage - return (\ r ) Ġand Ġline - feed (\ n ) Ġthen Ġremove Ġthe Ġcaret (^ ) Ġand Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġline - feed (\ n ). ĠIf Ġthis Ġis Ġraw Ġmode Ġthen Ġthe Ġcaret (^ ) Ġis Ġsent Ġbut Ġno ĠCR / LF ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcharacters . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ= Ġcommand Line . get OrNull ( ++ i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġraw Ġor Ġnext Ġcharacter Ġwas Ġend Ġof Ġcommand Ġthen Ġwrite Ġcaret (^ ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( raw Ġ|| Ġc Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindexes [ offset ++] Ġ= Ġi Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcaret (^ ) Ġis Ġescaped Ġby Ġcaret (^ ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== Ġ'^ ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindexes [ offset ++] Ġ= Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMove Ġpast ĠE OL Ġcharacters . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( c Ġ== Ġ'\ r ' Ġ|| Ġc Ġ== Ġ'\ n ') Ġc Ġ= Ġcommand Line . get OrNull ( ++ i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! quot ing Ġ&& Ġis Whitespace ( c ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWh itespace Ġoutside Ġof Ġquotes Ġtermin ates Ġthe Ġtoken . ĠSend Ġa Ġspecial ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInt . MAX _ VALUE Ġto Ġindicate Ġthe Ġtoken Ġis Ġended . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindexes [ offset ++] Ġ= ĠZERO _ ALLOC _ TOKEN IZER _ END _ OF _ TOKEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ= Ġcommand Line . get OrNull ( ++ i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSkip Ġany Ġadditional Ġwhitespace Ġthat Ġfollows Ġthe Ġinitial Ġwhitespace ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( c Ġ!= Ġnull Ġ&& Ġis Whitespace ( c )) Ġc Ġ= Ġcommand Line . get OrNull ( ++ i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġindexes [ offset ++] Ġ= Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! is EndOf Token ( offset Ġ- Ġ 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindexes [ offset ++] Ġ= ĠZERO _ ALLOC _ TOKEN IZER _ END _ OF _ TOKEN ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġindexes [ offset ++] Ġ= ĠZERO _ ALLOC _ TOKEN IZER _ END _ OF _ COMMAND ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠToken ize Ġa Ġstring Ġwith ĠPOSIX Ġrules . ĠThis Ġfunction Ġshould Ġoperate Ġin Ġthe ĊĠĠĠĠ Ġ* Ġsame Ġmanner Ġas Ġthe Ġbash Ġcommand - line . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġis Ġthe Ġzero - alloc Ġ( per Ġchar ) Ġpart Ġof Ġthe Ġtokenizer . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġhttp :// pub s . openg roup . org / online pub s / 0 0 9 6 9 5 3 9 9 / utilities / xc u _ chap 0 2 . html ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ Ġ- ĠA Ġback slash Ġthat Ġis Ġnot Ġquoted Ġshall Ġpreserve Ġthe Ġliteral Ġvalue Ġof Ġthe ĊĠĠĠĠ Ġ* ĠĠĠ Ġfollowing Ġcharacter ĊĠĠĠĠ Ġ* Ġ Ġ- ĠEn closing Ġcharacters Ġin Ġsingle - quotes Ġ( Ġ'' Ġ) Ġshall Ġpreserve Ġthe Ġliteral ĊĠĠĠĠ Ġ* ĠĠĠ Ġvalue Ġof Ġeach Ġcharacter Ġwithin Ġthe Ġsingle - quotes . ĊĠĠĠĠ Ġ* Ġ Ġ- ĠEn closing Ġcharacters Ġin Ġdouble - quotes Ġ( Ġ"" Ġ) Ġshall Ġpreserve Ġthe Ġliteral ĊĠĠĠĠ Ġ* ĠĠĠ Ġvalue Ġof Ġall Ġcharacters Ġwithin Ġthe Ġdouble - quotes , Ġwith Ġthe Ġexception Ġof ĊĠĠĠĠ Ġ* ĠĠĠ Ġthe Ġcharacters Ġdollar Ġsign , Ġback quote , Ġand Ġback slash ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠFor Ġescaped Ġtokens , Ġthis Ġcan Ġbe Ġvalidated Ġwith Ġa Ġscript Ġlike Ġthis : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġecho Ġ 1 =[ /$ 1 ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġecho Ġ 2 =[ /$ 2 ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġecho Ġ 3 =[ /$ 3 ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġraw Ġif Ġtrue , Ġthen Ġspecial Ġcharacters Ġsingle - quote (' ), Ġdouble - quote (" ), Ġand ĊĠĠĠĠ Ġ* ĠĠ Ġback slash (\ ) Ġare Ġreturned , Ġotherwise Ġthey Ġare Ġnot Ġreturned . ĠReg ard less Ġof Ġthis Ġflag , ĊĠĠĠĠ Ġ* ĠĠ Ġthe ĠPOSIX Ġcommand Ġline Ġescap ing Ġlogic Ġis Ġapplied . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġzero Alloc Token ize POSIX ( raw : ĠBoolean ) Ġ: ĠToken ized CommandLine Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Generation () ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġvar Ġqu oting Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġquote Ġ= Ġ'\ u 0 0 0 0 ' Ġ// ĠPOSIX Ġquote Ġcan Ġbe Ġeither Ġ" Ġor Ġ' ĊĠĠĠĠĠĠĠ Ġvar Ġescap ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġskipping Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġc : ĠChar ĊĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġcommand Line . length ĊĠĠĠĠĠĠĠ Ġvar Ġoffset Ġ= Ġ 1 Ġ// ĠOne Ġbecause Ġfirst Ġelement Ġis Ġgeneration ĊĠĠĠĠĠĠĠ Ġwhile ( i Ġ< Ġlength ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ= Ġcommand Line [ i ++] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sk ipping ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskipping Ġ= Ġif Ġ( is Whitespace ( c )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( quot ing Ġ|| Ġ! is Whitespace ( c )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( raw ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindexes [ offset ++] Ġ= Ġi Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( es cap ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġescap ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ!= Ġ'\ n ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! raw ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindexes [ offset ++] Ġ= Ġi Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( c Ġ== Ġ'\\ ' Ġ&& Ġ(! quot ing Ġ|| Ġquote Ġ== Ġ'\" ')) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġescap ing Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! quot ing Ġ&& Ġ( c Ġ== Ġ'"' Ġ|| Ġc Ġ== Ġ'\'' )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqu oting Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquote Ġ= Ġc ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( quot ing Ġ&& Ġc Ġ== Ġquote ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqu oting Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquote Ġ= Ġ'\ u 0 0 0 0 ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! quot ing Ġ&& Ġis Whitespace ( c )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskipping Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindexes [ offset ++] Ġ= ĠZERO _ ALLOC _ TOKEN IZER _ END _ OF _ TOKEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! raw ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindexes [ offset ++] Ġ= Ġi Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! is EndOf Token ( offset Ġ- Ġ 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindexes [ offset ++] Ġ= ĠZERO _ ALLOC _ TOKEN IZER _ END _ OF _ TOKEN ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġindexes [ offset ] Ġ= ĠZERO _ ALLOC _ TOKEN IZER _ END _ OF _ COMMAND ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġtrue Ġif Ġthe Ġtoken Ġat Ġ[ offset ] Ġmatches Ġ[ token ]. ĊĠĠĠĠ Ġ* Ġ[ offset ] Ġis Ġa Ġpointer Ġinto Ġ[ indexes ] Ġso Ġit Ġis Ġone - relative Ġto ĊĠĠĠĠ Ġ* Ġaccount Ġfor Ġthe Ġgeneration Ġcounter . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġfun Ġtoken Matches ( token : ĠString , Ġoffset : ĠInt , Ġmatch Prefix : ĠBoolean ) Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Generation () ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġindexes [ offset ] ĊĠĠĠĠĠĠĠ Ġwhile ( index Ġ!= ĠZERO _ ALLOC _ TOKEN IZER _ END _ OF _ COMMAND ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Of Token Ġ= Ġindex Ġ== ĠZERO _ ALLOC _ TOKEN IZER _ END _ OF _ TOKEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġtoken . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġend Of Token Ġ|| Ġmatch Prefix ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( end Of Token ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( token [ i ] Ġ!= Ġcommand Line [ index ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ++ i ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġindexes [ offset Ġ+ Ġi ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSkip Ġto Ġthe Ġstart Ġof Ġthe Ġnext Ġtoken Ġ[ offset ] Ġis Ġthe Ġone - relative Ġstarting ĊĠĠĠĠ Ġ* Ġpointer . ĠThe Ġreturn Ġvalue Ġis Ġthe Ġoffset Ġto Ġthe Ġstart Ġof Ġthe Ġnext Ġtoken . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġfun Ġnext Token After ( offset : ĠInt ) Ġ: ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Generation () ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġoffset ĊĠĠĠĠĠĠĠ Ġwhile (! is EndOf Token ( result ) Ġ&& Ġ! is EndOf Command ( result )) Ġ++ result ĊĠĠĠĠĠĠĠ Ġreturn Ġresult Ġ+ Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis EndOf Token ( i Ġ: ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ Ġi Ġ< Ġindexes . size Ġ&& Ġindexes [ i ] Ġ== ĠZERO _ ALLOC _ TOKEN IZER _ END _ OF _ TOKEN ĊĊĠĠĠ Ġprivate Ġfun Ġis EndOf Command ( i Ġ: ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ Ġi Ġ>= Ġindexes . size Ġ|| Ġindexes [ i ] Ġ== ĠZERO _ ALLOC _ TOKEN IZER _ END _ OF _ COMMAND ĊĊĠĠĠ Ġprivate Ġfun Ġis Start Of Token ( i Ġ: ĠInt ) Ġ= Ġi Ġ== Ġ 1 Ġ|| Ġis EndOf Token ( i Ġ- Ġ 1 ) ĊĊĠĠĠ Ġprivate Ġfun Ġchar At ( i Ġ: ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( is EndOf Token ( i )) Ġnull Ġelse Ġcommand Line [ indexes [ i ]] ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġis Ġwhat Ġthe Ġlength Ġof Ġthe Ġnormalized Ġcommand - line Ġstring Ġwould Ġbe Ġif Ġit Ġwas Ġcreated . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnormalized CommandLine Length () Ġ: ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is EndOf Command ( 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(! is EndOf Command ( i Ġ+ Ġ 1 )) Ġ++ i ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNot ĠhashCode () Ġto Ġavoid Ġgiving Ġthe Ġimp ression Ġ[ Token ized CommandLine ] Ġcan Ġbe Ġdirectly ĊĠĠĠĠ Ġ* Ġstored Ġin Ġa Ġhas htable . ĊĠĠĠĠ Ġ* ĠIt Ġis Ġ* not * Ġthe Ġsame Ġsame Ġas ĠtoString (). hashCode (), Ġbut Ġit Ġis Ġguaranteed Ġto Ġbe Ġa Ġgood ĊĠĠĠĠ Ġ* Ġhash Ġfunction . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcompute Normalized CommandLine HashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Generation () ĊĠĠĠĠĠĠĠ Ġvar Ġhash Ġ= Ġ 1 4 6 9 5 9 8 1 0 3 9 3 4 6 6 5 6 0 3 ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! is EndOf Command ( i ) Ġ&& Ġ! is EndOf Command ( i Ġ+ Ġ 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Ġ= Ġhash Ġxor Ġ( charAt ( i ) Ġ?: Ġ' Ġ'). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Ġ*= Ġ 1 0 9 9 5 1 1 6 2 8 2 1 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ++ i ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġhash . toInt () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġwhether Ġthe Ġnormalized Ġcommand - line Ġwould Ġequal Ġthe Ġgiven Ġstring Ġif Ġcreated . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnormalized CommandLine Equals ( other : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlength 1 Ġ= Ġnormalized CommandLine Length () ĊĠĠĠĠĠĠĠ Ġval Ġlength 2 Ġ= Ġother . length ĊĠĠĠĠĠĠĠ Ġif Ġ( length 1 Ġ== Ġ 0 Ġ&& Ġlength 2 Ġ== Ġ 0 ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( length 1 Ġ!= Ġlength 2 ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ// ĠIt 's Ġokay Ġfor Ġindexes Ġsize Ġto Ġbe Ġdifferent . ĠWhat Ġmatters ĊĠĠĠĠĠĠĠ Ġ// Ġis Ġthat Ġthey Ġboth Ġhave Ġthe Ġsame Ġvalues Ġup Ġto ĠZERO _ ALLOC _ TOKEN IZER _ END _ OF _ COMMAND ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 Ġuntil Ġlength 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( charAt ( i ) Ġ?: Ġ' Ġ' Ġ!= Ġother [ i Ġ- Ġ 1 ]) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠtoString ( separator : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Generation () ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġif Ġ( is EndOf Command ( i )) Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġwhile (! is EndOf Command ( i Ġ+ Ġ 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( charAt ( i ) Ġ?: Ġseparator ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ++ i ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsb . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġthe Ġnormalize Ġcommand - line Ġstring . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ: ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( toString Value Ġ!= Ġnull ) Ġreturn ĠtoString Value !! ĊĠĠĠĠĠĠĠ ĠtoString Value Ġ= ĠtoString (" Ġ") ĊĠĠĠĠĠĠĠ Ġreturn ĠtoString Value !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinvalidate () Ġ{ ĊĠĠĠĠĠĠĠ ĠtoString Value Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Generation () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( generation Ġ!= Ġabs ( indexes [ 0 ])) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Buffer Ġindexes Ġwas Ġshared Ġwith Ġanother Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Token ized CommandLine Ġafter Ġthis Ġone ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠAllocate Ġa Ġbuffer Ġlarge Ġenough Ġto Ġhold Ġ[ command Line ] Ġindexes . Ċ Ġ* Ċ Ġ* ĠThe Ġ+ 3 Ġis Ġderived Ġas : Ċ Ġ* ĠĠ Ġone Ġelement Ġto Ġhold Ġthe Ġgeneration Ġcounter Ċ Ġ* ĠĠ Ġ+ Ġone Ġelement Ġfor Ġeach Ġcharacter Ġin Ġthe Ġcommand Line Ċ Ġ* ĠĠ Ġ+ Ġone Ġelement Ġto Ġhold Ġthe Ġlast ĠZERO _ ALLOC _ TOKEN IZER _ END _ OF _ TOKEN Ċ Ġ* ĠĠ Ġ+ Ġone Ġelement Ġto Ġhold Ġfinal ĠZERO _ ALLOC _ TOKEN IZER _ END _ OF _ COMMAND Ċ Ġ* Ċ Ġ* ĠThis Ġrelies Ġon Ġthe Ġfact Ġthat ĠWindows Ġand ĠPOSIX Ġparsing Ġcan Ġonly Ġreduce Ġthe Ċ Ġ* Ġnumber Ġof Ġcharacters Ġand Ġnot Ġincrease Ġit . ĠRed uction Ġcomes , Ġfor Ġexample , Ċ Ġ* Ġfrom Ġcombining Ġcontiguous Ġblocks Ġof Ġwhitespace Ġwith Ġa Ġsingle Ċ Ġ* Ġ[ ZERO _ ALLOC _ TOKEN IZER _ END _ OF _ TOKEN ]. Ċ Ġ*/ Ċ fun Ġallocate Token ize CommandLine Buffer ( command Line : ĠString ) Ġ= ĊĠĠĠ ĠInt Array ( minimum SizeOf Token ize CommandLine Buffer ( command Line )) Ċ Ċ fun Ġminimum SizeOf Token ize CommandLine Buffer ( command Line : ĠString ) Ġ= ĊĠĠĠ Ġcommand Line . length Ġ+ Ġ 3 ĊĊ