/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 2 - 2 0 1 7 ĠThe ĠAN TLR ĠProject . ĠAll Ġrights Ġreserved . Ċ Ġ* ĠUse Ġof Ġthis Ġfile Ġis Ġgoverned Ġby Ġthe ĠBSD Ġ 3 - clause Ġlicense Ġthat Ċ Ġ* Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE . txt Ġfile Ġin Ġthe Ġproject Ġroot . Ċ Ġ*/ Ċ Ċ package Ġorg . antlr . v 4 . kotlin runtime Ċ Ċ // import ĠInterval Ċ // Ċ // import Ġjava . io . IOException Ċ // import Ġjava . io . InputStream Ċ // import Ġjava . io . InputStream Reader Ċ // import Ġjava . io . Reader Ċ // import Ġjava . nio . charset . Charset Ċ // import Ġjava . nio . charset . StandardCharsets Ċ // import Ġjava . util . Arrays Ċ // Ċ // /** ĠDo Ġnot Ġbuffer Ġup Ġthe Ġentire Ġchar Ġstream . ĠIt Ġdoes Ġkeep Ġa Ġsmall Ġbuffer Ċ // Ġ* Ġfor Ġefficiency Ġand Ġalso Ġbuffers Ġwhile Ġa Ġmark Ġexists Ġ( set Ġby Ġthe Ċ // Ġ* Ġlook ahead Ġprediction Ġin Ġparser ). Ġ" Un buffered " Ġhere Ġrefers Ġto Ġfact Ċ // Ġ* Ġthat Ġit Ġdoesn 't Ġbuffer Ġall Ġdata , Ġnot Ġthat 's Ġit 's Ġon Ġdemand Ġloading Ġof Ġchar . Ċ // Ġ* Ċ // Ġ* ĠBefore Ġ 4 . 7 , Ġthis Ġclass Ġused Ġthe Ġdefault Ġenvironment Ġencoding Ġto Ġconvert Ċ // Ġ* Ġbytes Ġto ĠUTF - 1 6 , Ġand Ġheld Ġthe ĠUTF - 1 6 Ġbytes Ġin Ġthe Ġbuffer Ġas Ġchars . Ċ // Ġ* Ċ // Ġ* ĠAs Ġof Ġ 4 . 7 , Ġthe Ġclass Ġuses ĠUTF - 8 Ġby Ġdefault , Ġand Ġthe Ġbuffer Ġholds ĠUnicode Ċ // Ġ* Ġcode Ġpoints Ġin Ġthe Ġbuffer Ġas Ġints . Ċ // Ġ*/ Ċ // class ĠUn buffered CharStream Ċ // /** ĠUseful Ġfor Ġsubclasses Ġthat Ġpull Ġchar Ġfrom Ġother Ġthan Ġthis . input . Ġ Ġ*/ Ċ // constructor ( buffer Size : ĠInt Ġ= Ġ 2 5 6 ) Ġ: ĠChar Stream Ġ{ Ċ // ĠĠĠ Ġ/** Ċ // ĠĠĠĠ Ġ* ĠA Ġmoving Ġwindow Ġbuffer Ġof Ġthe Ġdata Ġbeing Ġscanned . ĠWhile Ġthere 's Ġa Ġmarker , Ċ // ĠĠĠĠ Ġ* Ġwe Ġkeep Ġadding Ġto Ġbuffer . ĠOtherwise , Ġ[ consume () ][. consume ] Ġresets Ġso Ċ // ĠĠĠĠ Ġ* Ġwe Ġstart Ġfilling Ġat Ġindex Ġ 0 Ġagain . Ċ // ĠĠĠĠ Ġ*/ Ċ // ĠĠĠ Ġprotected Ġvar Ġdata : ĠInt Array Ċ // Ċ // ĠĠĠ Ġ/** Ċ // ĠĠĠĠ Ġ* ĠThe Ġnumber Ġof Ġcharacters Ġcurrently Ġin Ġ[ data ][. data ]. Ċ // ĠĠĠĠ Ġ* Ċ // ĠĠĠĠ Ġ* Ċ // ĠĠĠĠ Ġ* ĠThis Ġis Ġnot Ġthe Ġbuffer Ġcapacity , Ġthat 's Ġ` data . length `. Ċ // ĠĠĠĠ Ġ*/ Ċ // ĠĠĠ Ġprotected Ġvar Ġn : ĠInt Ġ= Ġ 0 Ċ // Ċ // ĠĠĠ Ġ/** Ċ // ĠĠĠĠ Ġ* Ġ 0 .. n - 1 Ġindex Ġinto Ġ[ data ][. data ] Ġof Ġnext Ġcharacter . Ċ // ĠĠĠĠ Ġ* Ċ // ĠĠĠĠ Ġ* Ċ // ĠĠĠĠ Ġ* ĠThe Ġ` LA ( 1 )` Ġcharacter Ġis Ġ` data [ p ] `. ĠIf Ġ` p Ġ== Ġn `, Ġwe Ġare Ċ // ĠĠĠĠ Ġ* Ġout Ġof Ġbuffered Ġcharacters . Ċ // ĠĠĠĠ Ġ*/ Ċ // ĠĠĠ Ġprotected Ġvar Ġp Ġ= Ġ 0 Ċ // Ċ // ĠĠĠ Ġ/** Ċ // ĠĠĠĠ Ġ* ĠCount Ġup Ġwith Ġ[ mark () ][. mark ] Ġand Ġdown Ġwith Ċ // ĠĠĠĠ Ġ* Ġ[ release () ][. release ]. ĠWhen Ġwe Ġ` release ()` Ġthe Ġlast Ġmark , Ċ // ĠĠĠĠ Ġ* Ġ` num Markers ` Ġreaches Ġ 0 Ġand Ġwe Ġreset Ġthe Ġbuffer . ĠCopy Ċ // ĠĠĠĠ Ġ* Ġ` data [ p ] .. data [ n - 1 ]` Ġto Ġ` data [ 0 ] .. data [( n - 1 )- p ] `. Ċ // ĠĠĠĠ Ġ*/ Ċ // ĠĠĠ Ġprotected Ġvar Ġnum Markers Ġ= Ġ 0 Ċ // Ċ // ĠĠĠ Ġ/** Ċ // ĠĠĠĠ Ġ* ĠThis Ġis Ġthe Ġ` LA (- 1 )` Ġcharacter Ġfor Ġthe Ġcurrent Ġposition . Ċ // ĠĠĠĠ Ġ*/ Ċ // ĠĠĠ Ġprotected Ġvar Ġlast Char Ġ= Ġ- 1 Ċ // Ċ // ĠĠĠ Ġ/** Ċ // ĠĠĠĠ Ġ* ĠWhen Ġ` num Markers Ġ> Ġ 0 `, Ġthis Ġis Ġthe Ġ` LA (- 1 )` Ġcharacter Ġfor Ġthe Ċ // ĠĠĠĠ Ġ* Ġfirst Ġcharacter Ġin Ġ[ data ][. data ]. ĠOtherwise , Ġthis Ġis Ġunspecified . Ċ // ĠĠĠĠ Ġ*/ Ċ // ĠĠĠ Ġprotected Ġvar Ġlast Char Buffer Start : ĠInt Ġ= Ġ 0 Ċ // Ċ // ĠĠĠ Ġ/** Ċ // ĠĠĠĠ Ġ* ĠAbsolute Ġcharacter Ġindex . ĠIt 's Ġthe Ġindex Ġof Ġthe Ġcharacter Ġabout Ġto Ġbe Ċ // ĠĠĠĠ Ġ* Ġread Ġvia Ġ` LA ( 1 )`. ĠGo es Ġfrom Ġ 0 Ġto Ġthe Ġnumber Ġof Ġcharacters Ġin Ġthe Ċ // ĠĠĠĠ Ġ* Ġentire Ġstream , Ġalthough Ġthe Ġstream Ġsize Ġis Ġunknown Ġbefore Ġthe Ġend Ġis Ċ // ĠĠĠĠ Ġ* Ġreached . Ċ // ĠĠĠĠ Ġ*/ Ċ // ĠĠĠ Ġprotected Ġvar Ġcurrent Char Index Ġ= Ġ 0 Ċ // Ċ // ĠĠĠ Ġprotected Ġvar Ġinput : ĠReader Ċ // Ċ // ĠĠĠ Ġ/** ĠThe Ġname Ġor Ġsource Ġof Ġthis Ġchar Ġstream . Ġ Ġ*/ Ċ // ĠĠĠ Ġvar Ġname : ĠString ? Ġ= Ġnull Ċ // Ċ // ĠĠĠ Ġoverride Ġval Ġsource Name : ĠString Ċ // ĠĠĠĠĠĠĠ Ġget () Ġ= Ġif Ġ( name Ġ== Ġnull Ġ|| Ġname !!. isEmpty ()) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠInt Stream . UNKNOWN _ SOURCE _ NAME Ċ // ĠĠĠĠĠĠĠ Ġ} Ġelse Ġname Ċ // Ċ // ĠĠĠ Ġprotected Ġval Ġbuffer StartIndex : ĠInt Ċ // ĠĠĠĠĠĠĠ Ġget () Ġ= Ġcurrent Char Index Ġ- Ġp Ċ // Ċ // ĠĠĠ Ġinit Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġn Ġ= Ġ 0 Ċ // ĠĠĠĠĠĠĠ Ġdata Ġ= ĠInt Array ( buffer Size ) Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġ@ Jvm Over loads Ġconstructor ( input : ĠInputStream , ĠbufferSize : ĠInt Ġ= Ġ 2 5 6 , Ġcharset : ĠCharset Ġ= ĠStandard Charsets . UTF _ 8 ) Ġ: Ġthis ( buffer Size ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġthis . input Ġ= ĠInputStreamReader ( input , Ġcharset ) Ċ // ĠĠĠĠĠĠĠ Ġfill ( 1 ) Ġ// Ġprime Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġ@ Jvm Over loads Ġconstructor ( input : ĠReader , ĠbufferSize : ĠInt Ġ= Ġ 2 5 6 ) Ġ: Ġthis ( buffer Size ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġthis . input Ġ= Ġinput Ċ // ĠĠĠĠĠĠĠ Ġfill ( 1 ) Ġ// Ġprime Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġoverride Ġfun Ġconsume () Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( LA ( 1 ) Ġ== ĠInt Stream . EOF ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" cannot Ġconsume ĠEOF ") Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// Ġbuf Ġalways Ġhas Ġat Ġleast Ġdata [ p == 0 ] Ġin Ġthis Ġmethod Ġdue Ġto Ġctor Ċ // ĠĠĠĠĠĠĠ Ġlast Char Ġ= Ġdata [ p ] ĠĠ Ġ// Ġtrack Ġlast Ġchar Ġfor ĠLA (- 1 ) Ċ // Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( p Ġ== Ġn Ġ- Ġ 1 Ġ&& Ġnum Markers Ġ== Ġ 0 ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġn Ġ= Ġ 0 Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġp Ġ= Ġ- 1 Ġ// Ġp ++ Ġwill Ġleave Ġthis Ġat Ġ 0 Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġlast Char Buffer Start Ġ= Ġlast Char Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠ Ġp ++ Ċ // ĠĠĠĠĠĠĠ Ġcurrent Char Index ++ Ċ // ĠĠĠĠĠĠĠ Ġsync ( 1 ) Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġ/** Ċ // ĠĠĠĠ Ġ* ĠMake Ġsure Ġwe Ġhave Ġ' need ' Ġelements Ġfrom Ġcurrent Ġposition Ġ[ p ][. p ]. Ċ // ĠĠĠĠ Ġ* ĠLast Ġvalid Ġ` p ` Ġindex Ġis Ġ` data . length - 1 `. Ġ` p + need - 1 ` Ġis Ċ // ĠĠĠĠ Ġ* Ġthe Ġchar Ġindex Ġ' need ' Ġelements Ġahead . ĠIf Ġwe Ġneed Ġ 1 Ġelement , Ċ // ĠĠĠĠ Ġ* Ġ`( p + 1 - 1 )== p ` Ġmust Ġbe Ġless Ġthan Ġ` data . length `. Ċ // ĠĠĠĠ Ġ*/ Ċ // ĠĠĠ Ġprotected Ġfun Ġsync ( want : ĠInt ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġval Ġneed Ġ= Ġp Ġ+ Ġwant Ġ- Ġ 1 Ġ- Ġn Ġ+ Ġ 1 Ġ// Ġhow Ġmany Ġmore Ġelements Ġwe Ġneed ? Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( need Ġ> Ġ 0 ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġfill ( need ) Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġ/** Ċ // ĠĠĠĠ Ġ* ĠAdd Ġ` n ` Ġcharacters Ġto Ġthe Ġbuffer . ĠReturns Ġthe Ġnumber Ġof Ġcharacters Ċ // ĠĠĠĠ Ġ* Ġactually Ġadded Ġto Ġthe Ġbuffer . ĠIf Ġthe Ġreturn Ġvalue Ġis Ġless Ġthan Ġ` n `, Ċ // ĠĠĠĠ Ġ* Ġthen ĠEOF Ġwas Ġreached Ġbefore Ġ` n ` Ġcharacters Ġcould Ġbe Ġadded . Ċ // ĠĠĠĠ Ġ*/ Ċ // ĠĠĠ Ġprotected Ġfun Ġfill ( n : ĠInt ): ĠInt Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġn ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . n Ġ> Ġ 0 Ġ&& Ġdata [ this . n Ġ- Ġ 1 ] Ġ== ĠInt Stream . EOF ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġi Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġnext Char () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ> ĠCharacter . MAX _ VALUE . toInt () Ġ|| Ġc Ġ== ĠInt Stream . EOF ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( c ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġch Ġ= Ġc . to Char () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Character . is Low Sur rogate ( ch )) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Invalid ĠUTF - 1 6 Ġ( low Ġsur rogate Ġwith Ġno Ġpreceding Ġhigh Ġsur rogate )") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( Character . is High Sur rogate ( ch )) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlow Sur rogate Ġ= Ġnext Char () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( low Sur rogate Ġ> ĠCharacter . MAX _ VALUE . toInt ()) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Invalid ĠUTF - 1 6 Ġ( high Ġsur rogate Ġfollowed Ġby Ġcode Ġpoint Ġ> ĠU + FFFF ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( low Sur rogate Ġ== ĠInt Stream . EOF ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Invalid ĠUTF - 1 6 Ġ( d angling Ġhigh Ġsur rogate Ġat Ġend Ġof Ġfile )") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlow Sur rogate Char Ġ= Ġlow Sur rogate . to Char () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Character . is Low Sur rogate ( low Sur rogate Char )) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Character . to Code Point ( ch , Ġlow Sur rogate Char )) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Invalid ĠUTF - 1 6 Ġ( d angling Ġhigh Ġsur rogate ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( c ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( io e : ĠIOException ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( io e ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġn Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġ/** Ċ // ĠĠĠĠ Ġ* ĠOverride Ġto Ġprovide Ġdifferent Ġsource Ġof Ġcharacters Ġthan Ċ // ĠĠĠĠ Ġ* Ġ[ input ][. input ]. Ċ // ĠĠĠĠ Ġ*/ Ċ // ĠĠĠ Ġ@ Throws ( IOException :: class ) Ċ // ĠĠĠ Ġprotected Ġfun Ġnext Char (): ĠInt Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġinput . read () Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġprotected Ġfun Ġadd ( c : ĠInt ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( n Ġ>= Ġdata . size ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= ĠArrays . copyOf ( data , Ġdata . size Ġ* Ġ 2 ) Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġdata [ n ++] Ġ= Ġc Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġoverride Ġfun ĠLA ( i : ĠInt ): ĠInt Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġ- 1 ) Ġreturn Ġlast Char Ġ// Ġspecial Ġcase Ċ // ĠĠĠĠĠĠĠ Ġsync ( i ) Ċ // ĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġp Ġ+ Ġi Ġ- Ġ 1 Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( index Ġ< Ġ 0 ) Ġthrow ĠIndex OutOfBoundsException () Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( index Ġ>= Ġn ) ĠInt Stream . EOF Ġelse Ġdata [ index ] Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġ/** Ċ // ĠĠĠĠ Ġ* ĠReturn Ġa Ġmarker Ġthat Ġwe Ġcan Ġrelease Ġlater . Ċ // ĠĠĠĠ Ġ* Ċ // ĠĠĠĠ Ġ* Ċ // ĠĠĠĠ Ġ* ĠThe Ġspecific Ġmarker Ġvalue Ġused Ġfor Ġthis Ġclass Ġallows Ġfor Ġsome Ġlevel Ġof Ċ // ĠĠĠĠ Ġ* Ġprotection Ġagainst Ġmis use Ġwhere Ġ` seek ()` Ġis Ġcalled Ġon Ġa Ġmark Ġor Ċ // ĠĠĠĠ Ġ* Ġ` release ()` Ġis Ġcalled Ġin Ġthe Ġwrong Ġorder . Ċ // ĠĠĠĠ Ġ*/ Ċ // ĠĠĠ Ġoverride Ġfun Ġmark (): ĠInt Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( num Markers Ġ== Ġ 0 ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġlast Char Buffer Start Ġ= Ġlast Char Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠ Ġval Ġmark Ġ= Ġ- num Markers Ġ- Ġ 1 Ċ // ĠĠĠĠĠĠĠ Ġnum Markers ++ Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġmark Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġ/** ĠDec rement Ġnumber Ġof Ġmarkers , Ġreset ting Ġbuffer Ġif Ġwe Ġhit Ġ 0 . Ċ // ĠĠĠĠ Ġ* Ġ@ param Ġmarker Ċ // ĠĠĠĠ Ġ*/ Ċ // ĠĠĠ Ġoverride Ġfun Ġrelease ( marker : ĠInt ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġval Ġexpected Mark Ġ= Ġ- num Markers Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( marker Ġ!= Ġexpected Mark ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" release () Ġcalled Ġwith Ġan Ġinvalid Ġmarker .") Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠ Ġnum Markers -- Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( num Markers Ġ== Ġ 0 Ġ&& Ġp Ġ> Ġ 0 ) Ġ{ Ġ// Ġrelease Ġbuffer Ġwhen Ġwe Ġcan , Ġbut Ġdon 't Ġdo Ġunnecessary Ġwork Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCopy Ġdata [ p ] .. data [ n - 1 ] Ġto Ġdata [ 0 ] .. data [( n - 1 )- p ], Ġreset Ġptr s Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġp Ġis Ġlast Ġvalid Ġchar ; Ġmove Ġnothing Ġif Ġp == n Ġas Ġwe Ġhave Ġno Ġvalid Ġchar Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . arraycopy ( data , Ġp , Ġdata , Ġ 0 , Ġn Ġ- Ġp ) Ġ// Ġshift Ġn - p Ġchar Ġfrom Ġp Ġto Ġ 0 Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġn Ġ= Ġn Ġ- Ġp Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġp Ġ= Ġ 0 Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġlast Char Buffer Start Ġ= Ġlast Char Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġoverride Ġfun Ġindex (): ĠInt Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġcurrent Char Index Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġ/** ĠSeek Ġto Ġabsolute Ġcharacter Ġindex , Ġwhich Ġmight Ġnot Ġbe Ġin Ġthe Ġcurrent Ċ // ĠĠĠĠ Ġ* Ġsl iding Ġwindow . Ġ ĠMove Ġ` p ` Ġto Ġ` index - buffer StartIndex `. Ċ // ĠĠĠĠ Ġ*/ Ċ // ĠĠĠ Ġoverride Ġfun Ġseek ( index : ĠInt ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġindex Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġcurrent Char Index ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( index Ġ> Ġcurrent Char Index ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġsync ( index Ġ- Ġcurrent Char Index ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= ĠMath . min ( index , Ġbuffer StartIndex Ġ+ Ġn Ġ- Ġ 1 ) Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// Ġindex Ġ== Ġto Ġbuffer StartIndex Ġshould Ġset Ġp Ġto Ġ 0 Ċ // ĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġindex Ġ- Ġbuffer StartIndex Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( i Ġ< Ġ 0 ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" cannot Ġseek Ġto Ġnegative Ġindex Ġ" Ġ+ Ġindex ) Ċ // ĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( i Ġ>= Ġn ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException (" seek Ġto Ġindex Ġoutside Ġbuffer : Ġ" Ġ+ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ+ Ġ" Ġnot Ġin Ġ" Ġ+ Ġbuffer StartIndex Ġ+ Ġ".. " Ġ+ Ġ( buffer StartIndex Ġ+ Ġn )) Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠ Ġp Ġ= Ġi Ċ // ĠĠĠĠĠĠĠ Ġcurrent Char Index Ġ= Ġindex Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( p Ġ== Ġ 0 ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġlast Char Ġ= Ġlast Char Buffer Start Ċ // ĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġlast Char Ġ= Ġdata [ p Ġ- Ġ 1 ] Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġoverride Ġfun Ġsize (): ĠInt Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException (" Un buffered Ġstream Ġcannot Ġknow Ġits Ġsize ") Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġoverride Ġfun ĠgetText ( interval : ĠInterval ): ĠString Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( interval . a Ġ< Ġ 0 Ġ|| Ġinterval . b Ġ< Ġinterval . a Ġ- Ġ 1 ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" invalid Ġinterval ") Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠ Ġval Ġbuffer StartIndex Ġ= Ġbuffer StartIndex Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( n Ġ> Ġ 0 Ġ&& Ġdata [ n Ġ- Ġ 1 ] Ġ== ĠCharacter . MAX _ VALUE . toInt ()) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( interval . a Ġ+ Ġinterval . length () Ġ> Ġbuffer StartIndex Ġ+ Ġn ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" the Ġinterval Ġextends Ġpast Ġthe Ġend Ġof Ġthe Ġstream ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( interval . a Ġ< Ġbuffer StartIndex Ġ|| Ġinterval . b Ġ>= Ġbuffer StartIndex Ġ+ Ġn ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException (" interval Ġ" Ġ+ Ġinterval Ġ+ Ġ" Ġoutside Ġbuffer : Ġ" Ġ+ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer StartIndex Ġ+ Ġ".. " Ġ+ Ġ( buffer StartIndex Ġ+ Ġn Ġ- Ġ 1 )) Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ// Ġconvert Ġfrom Ġabsolute Ġto Ġlocal Ġindex Ċ // ĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġinterval . a Ġ- Ġbuffer StartIndex Ċ // ĠĠĠĠĠĠĠ Ġreturn ĠString ( data , Ġi , Ġinterval . length ()) Ċ // ĠĠĠ Ġ} Ċ //} Ċ // /** ĠUseful Ġfor Ġsubclasses Ġthat Ġpull Ġchar Ġfrom Ġother Ġthan Ġthis . input . Ġ Ġ*/ Ċ