package Ġkotlinx . io . char sets Ċ Ċ import Ġkotlinx . io . core .* Ċ Ċ expect Ġabstract Ġclass ĠCharset Ġ{ ĊĠĠĠ Ġabstract Ġfun Ġnew Encoder (): ĠCharset Encoder ĊĠĠĠ Ġabstract Ġfun Ġnew Decoder (): ĠCharset Decoder ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġfor Name ( name : ĠString ): ĠCharset ĊĠĠĠ Ġ} Ċ } Ċ Ċ expect Ġval ĠCharset . name : ĠString Ċ Ċ // Ġ---------------- ------------- ĠEN CODER Ġ---------------------------------------------------------------- --------------- Ċ expect Ġabstract Ġclass ĠCharset Encoder Ċ Ċ expect Ġval ĠCharset Encoder . charset : ĠCharset Ċ Ċ fun ĠCharset Encoder . encode ( input : ĠCharSequence , Ġfrom Index : ĠInt , Ġto Index : ĠInt , Ġdst : ĠOutput ) Ġ{ ĊĠĠĠ Ġvar Ġstart Ġ= Ġfrom Index ĊĊĠĠĠ Ġif Ġ( start Ġ>= Ġto Index ) Ġreturn ĊĠĠĠ Ġdst . write While Size ( 1 ) Ġ{ Ġview : ĠIo Buffer Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġrc Ġ= Ġencode Impl ( input , Ġstart , Ġto Index , Ġview ) ĊĠĠĠĠĠĠĠ Ġcheck ( rc Ġ>= Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġstart Ġ+= Ġrc ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ>= Ġto Index Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrc Ġ== Ġ 0 Ġ-> Ġ 8 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġencode Complete Impl ( dst ) Ċ } Ċ Ċ private Ġval ĠEmpty ByteArray Ġ= ĠByteArray ( 0 ) Ċ Ċ expect Ġfun ĠCharset Encoder . encode To ByteArray ( input : ĠCharSequence , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Index : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Index : ĠInt Ġ= Ġinput . length ): ĠByteArray Ċ Ċ @ Suppress (" Don 't Ġuse Ġit ") Ċ fun ĠCharset Encoder . encode To ByteArray Impl ( input : ĠCharSequence , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Index : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Index : ĠInt Ġ= Ġinput . length ): ĠByteArray Ġ{ ĊĠĠĠ Ġvar Ġstart Ġ= Ġfrom Index ĊĠĠĠ Ġif Ġ( start Ġ>= Ġto Index ) Ġreturn ĠEmpty ByteArray ĊĠĠĠ Ġval Ġsingle Ġ= ĠIo Buffer . Pool . borrow () ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ ĠIo Buffer . No Pool ĊĠĠĠĠĠĠĠ Ġval Ġrc Ġ= Ġencode Impl ( input , Ġstart , Ġto Index , Ġsingle ) ĊĠĠĠĠĠĠĠ Ġstart Ġ+= Ġrc ĊĠĠĠĠĠĠĠ Ġif Ġ( start Ġ== Ġto Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠByteArray ( single . read Remaining ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsingle . read Fully ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠByte Packet Builder ( 0 , ĠIo Buffer . Pool ) ĊĠĠĠĠĠĠĠ Ġbuilder . last ( single . make View ()) ĊĠĠĠĠĠĠĠ Ġencode ( input , Ġstart , Ġto Index , Ġbuilder ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . build (). read Bytes () ĊĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠ Ġsingle . release ( Io Buffer . Pool ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ expect Ġfun ĠCharset Encoder . encode UTF 8 ( input : ĠByte Read Packet , Ġdst : ĠOutput ) Ċ Ċ private Ġfun ĠCharset Encoder . encode Complete Impl ( dst : ĠOutput ) Ġ{ ĊĠĠĠ Ġvar Ġsize Ġ= Ġ 1 ĊĠĠĠ Ġdst . write While Ġ{ Ġview Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( encode Complete ( view )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsize Ġ> Ġ 0 ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠCharset Encoder . encode ( input : ĠCharSequence , Ġfrom Index : ĠInt Ġ= Ġ 0 , Ġto Index : ĠInt Ġ= Ġinput . length ) Ġ= Ġbuild Packet Ġ{ ĊĠĠĠ Ġencode ( input , Ġfrom Index , Ġto Index , Ġthis ) Ċ } Ċ Ċ fun ĠCharset Encoder . encode UTF 8 ( input : ĠByte Read Packet ) Ġ= Ġbuild Packet Ġ{ ĊĠĠĠ Ġencode UTF 8 ( input , Ġthis ) Ċ } Ċ Ċ internal Ġexpect Ġfun ĠCharset Encoder . encode Impl ( input : ĠCharSequence , Ġfrom Index : ĠInt , Ġto Index : ĠInt , Ġdst : ĠIo Buffer ): ĠInt Ċ internal Ġexpect Ġfun ĠCharset Encoder . encode Complete ( dst : ĠIo Buffer ): ĠBoolean Ċ Ċ // Ġ---------------- ------------- ĠDE CODER Ġ---------------------------------------------------------------- --------------- Ċ Ċ expect Ġabstract Ġclass ĠCharset Decoder Ċ expect Ġval ĠCharset Decoder . charset : ĠCharset Ċ Ċ fun ĠCharset Decoder . decode ( input : ĠInput , Ġmax : ĠInt Ġ= ĠInt . MAX _ VALUE ): ĠString Ġ= Ġbuild String ( min Of ( max . to Long (), Ġinput . size Estimate ()). toInt ()) Ġ{ ĊĠĠĠ Ġdecode ( input , Ġthis , Ġmax ) Ċ } Ċ Ċ internal Ġfun ĠInput . size Estimate (): ĠLong Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ Ġis ĠByte Read Packet Ġ-> Ġremaining ĊĠĠĠ Ġis ĠByte Read Packet Base Ġ-> Ġmax Of ( remaining , Ġ 1 6 ) ĊĠĠĠ Ġelse Ġ-> Ġ 1 6 Ċ } Ċ Ċ expect Ġfun ĠCharset Decoder . decode ( input : ĠInput , Ġdst : ĠAppend able , Ġmax : ĠInt ): ĠInt Ċ Ċ expect Ġfun ĠCharset Decoder . decode Exact Bytes ( input : ĠInput , Ġinput Length : ĠInt ): ĠString Ċ Ċ // Ġ---------------- ------------- ĠREG ISTR Y Ġ---------------------------------------------------------------- -------------- Ċ expect Ġobject ĠChar sets Ġ{ ĊĠĠĠ Ġval ĠUTF _ 8 : ĠCharset Ċ } Ċ Ċ expect Ġclass ĠMal formed Input Exception ( message : ĠString ) Ġ: ĠThrowable ĊĊ