package Ġhe li os . parser Ċ Ċ /** Ċ Ġ* ĠTrait Ġused Ġwhen Ġthe Ġdata Ġto Ġbe Ġparsed Ġis Ġin ĠUTF - 1 6 . Ċ Ġ* Ċ Ġ* ĠThis Ġparser Ġprovides Ġparse String (). ĠLike ĠByte Based Parser Ġit Ġhas Ċ Ġ* Ġfast / slow Ġpaths Ġfor Ġstring Ġparsing Ġdepending Ġon Ġwhether Ġany Ġescap es Ċ Ġ* Ġare Ġpresent . Ċ Ġ* Ċ Ġ* ĠIt Ġis Ġsimpler Ġthan ĠByte Based Parser . Ċ Ġ*/ Ċ interface ĠChar Based Parser < J > Ġ: ĠParser < J > Ġ{ ĊĊĠ Ġfun Ġchar Builder (): ĠChar Builder ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠSee Ġif Ġthe Ġstring Ġhas Ġany Ġescape Ġsequences . ĠIf Ġnot , Ġreturn Ġthe ĊĠĠ Ġ* Ġend Ġof Ġthe Ġstring . ĠIf Ġso , Ġbail Ġout Ġand Ġreturn Ġ- 1 . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠThis Ġmethod Ġexpects Ġthe Ġdata Ġto Ġbe Ġin ĠUTF - 1 6 Ġand Ġaccesses Ġit Ġas ĊĠĠ Ġ* Ġchars . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġparse String Simple ( i : ĠInt , Ġctxt : ĠF Context < J >): ĠInt Ġ{ ĊĠĠĠ Ġvar Ġj Ġ= Ġi ĊĠĠĠ Ġvar Ġc Ġ= Ġat ( j ) ĊĠĠĠ Ġwhile Ġ( c Ġ!= Ġ'" ') Ġ{ ĊĠĠĠĠĠ Ġif Ġ( c Ġ< Ġ' Ġ') Ġdie ( j , Ġ" control Ġchar Ġ(${ c . toInt () }) Ġin Ġstring ") ĊĠĠĠĠĠ Ġif Ġ( c Ġ== Ġ'\\ ') Ġreturn Ġ- 1 ĊĠĠĠĠĠ Ġj Ġ+= Ġ 1 ĊĠĠĠĠĠ Ġc Ġ= Ġat ( j ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġj Ġ+ Ġ 1 ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠParse Ġa Ġstring Ġthat Ġis Ġknown Ġto Ġhave Ġescape Ġsequences . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġparse String Complex ( i : ĠInt , Ġctxt : ĠF Context < J >): ĠInt Ġ{ ĊĠĠĠ Ġvar Ġj Ġ= Ġi Ġ+ Ġ 1 ĊĠĠĠ Ġval Ġsb Ġ= Ġchar Builder (). reset () ĊĊĠĠĠ Ġvar Ġc Ġ= Ġat ( j ) ĊĠĠĠ Ġwhile Ġ( c Ġ!= Ġ'" ') Ġ{ ĊĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġc Ġ< Ġ' Ġ' ĠĠ Ġ-> Ġdie ( j , Ġ" control Ġchar Ġ(${ c . toInt () }) Ġin Ġstring ") ĊĠĠĠĠĠĠĠ Ġc Ġ== Ġ'\\ ' Ġ-> Ġwhen Ġ( at ( j Ġ+ Ġ 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ' b ' Ġ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ('\ b '); Ġj Ġ+= Ġ 2 ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ' f ' Ġ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ('\ u 0 0 0 C '); Ġj Ġ+= Ġ 2 ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ' n ' Ġ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ('\ n '); Ġj Ġ+= Ġ 2 ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ' r ' Ġ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ('\ r '); Ġj Ġ+= Ġ 2 ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ' t ' Ġ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ('\ t '); Ġj Ġ+= Ġ 2 ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġ'"' Ġ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ('" '); Ġj Ġ+= Ġ 2 ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ'/' Ġ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ('/'); Ġj Ġ+= Ġ 2 ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ'\\ ' Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ('\\ '); Ġj Ġ+= Ġ 2 ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġthere 's Ġa Ġproblem Ġthen Ġdesc ape Ġwill Ġexplode ĊĠĠĠĠĠĠĠĠĠ Ġ' u ' Ġ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( desc ape ( at ( j Ġ+ Ġ 2 , Ġj Ġ+ Ġ 6 ))); Ġj Ġ+= Ġ 6 ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġc ĠĠĠ Ġ-> Ġdie ( j , Ġ" il legal Ġescape Ġsequence Ġ( \\ $ c )") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġcase Ġis Ġfor Ġ" normal " Ġcode Ġpoints Ġthat Ġare Ġjust Ġone ĠChar . ĊĠĠĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġdon 't Ġhave Ġto Ġworry Ġabout Ġsur rogate Ġpairs , Ġsince Ġthose ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġwill Ġall Ġbe Ġin Ġthe Ġranges ĠD 8 0 0 âĢĵ DB FF Ġ( high Ġsur rog ates ) Ġor ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠDC 0 0 âĢĵ D FFF Ġ( low Ġsur rog ates ). ĊĠĠĠĠĠĠĠĠĠ Ġsb . append ( c ) ĊĠĠĠĠĠĠĠĠĠ Ġj Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġj Ġ= Ġreset ( j ) ĊĠĠĠĠĠ Ġc Ġ= Ġat ( j ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġctxt . add ( sb . make String ()) ĊĠĠĠ Ġreturn Ġj Ġ+ Ġ 1 ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠParse Ġthe Ġstring Ġaccording Ġto ĠJSON Ġrules , Ġand Ġadd Ġto Ġthe Ġgiven ĊĠĠ Ġ* Ġcontext . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠThis Ġmethod Ġexpects Ġthe Ġdata Ġto Ġbe Ġin ĠUTF - 1 6 , Ġand Ġaccess Ġit Ġas ĊĠĠ Ġ* ĠChar . ĠIt Ġperforms Ġthe Ġcorrect Ġchecks Ġto Ġmake Ġsure Ġthat Ġwe Ġdon 't ĊĠĠ Ġ* Ġinterpret Ġa Ġmulti - char Ġcode Ġpoint Ġincorrectly . ĊĠĠ Ġ*/ ĊĠ Ġoverride Ġfun Ġparse String ( i : ĠInt , Ġctxt : ĠF Context < J >): ĠInt Ġ{ ĊĠĠĠ Ġval Ġk Ġ= Ġparse String Simple ( i Ġ+ Ġ 1 , Ġctxt ) ĊĠĠĠ Ġreturn Ġif Ġ( k Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠ Ġctxt . add ( at ( i Ġ+ Ġ 1 , Ġk Ġ- Ġ 1 )) ĊĠĠĠĠĠ Ġk ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġparse String Complex ( i , Ġctxt ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ