// ĠCopyright Ġ 2 0 1 9 ĠGoogle ĠInc . Ġ ĠAll Ġrights Ġreserved . Ċ // Ġhttps :// developers . google . com / protocol - buffers / Ċ // Ċ // ĠRedistribution Ġand Ġuse Ġin Ġsource Ġand Ġbinary Ġforms , Ġwith Ġor Ġwithout Ċ // Ġmodification , Ġare Ġpermitted Ġprovided Ġthat Ġthe Ġfollowing Ġconditions Ġare Ċ // Ġmet : Ċ // Ċ // ĠĠĠĠ Ġ* ĠRedistributions Ġof Ġsource Ġcode Ġmust Ġretain Ġthe Ġabove Ġcopyright Ċ // Ġnotice , Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer . Ċ // ĠĠĠĠ Ġ* ĠRedistributions Ġin Ġbinary Ġform Ġmust Ġreproduce Ġthe Ġabove Ċ // Ġcopyright Ġnotice , Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer Ċ // Ġin Ġthe Ġdocumentation Ġand / or Ġother Ġmaterials Ġprovided Ġwith Ġthe Ċ // Ġdistribution . Ċ // ĠĠĠĠ Ġ* ĠNeither Ġthe Ġname Ġof ĠGoogle ĠInc . Ġnor Ġthe Ġnames Ġof Ġits Ċ // Ġcontributors Ġmay Ġbe Ġused Ġto Ġendorse Ġor Ġpromote Ġproducts Ġderived Ġfrom Ċ // Ġthis Ġsoftware Ġwithout Ġspecific Ġprior Ġwritten Ġpermission . Ċ // Ċ // ĠTHIS ĠSOFTWARE ĠIS ĠPROVIDED ĠBY ĠTHE ĠCOPYRIGHT ĠHOLDERS ĠAND ĠCONTRIBUTORS Ċ // Ġ" AS ĠIS " ĠAND ĠANY ĠEXPRESS ĠOR ĠIMPLIED ĠWARRANTIES , ĠINCLUDING , ĠBUT ĠNOT Ċ // ĠLIMITED ĠTO , ĠTHE ĠIMPLIED ĠWARRANTIES ĠOF ĠMERCHANTABILITY ĠAND ĠFITNESS ĠFOR Ċ // ĠA ĠPARTICULAR ĠPURPOSE ĠARE ĠDISCLAIMED . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠCOPYRIGHT Ċ // ĠOWNER ĠOR ĠCONTRIBUTORS ĠBE ĠLIABLE ĠFOR ĠANY ĠDIRECT , ĠINDIRECT , ĠINCIDENTAL , Ċ // ĠSPECIAL , ĠEXEMPLARY , ĠOR ĠCONSEQUENTIAL ĠDAMAGES Ġ( INCLUDING , ĠBUT ĠNOT Ċ // ĠLIMITED ĠTO , ĠPROCUREMENT ĠOF ĠSUBSTITUTE ĠGOODS ĠOR ĠSERVICES ; ĠLOSS ĠOF ĠUSE , Ċ // ĠDATA , ĠOR ĠPROFITS ; ĠOR ĠBUSINESS ĠINTERRUPTION ) ĠHOWEVER ĠCAUSED ĠAND ĠON ĠANY Ċ // ĠTHEORY ĠOF ĠLIABILITY , ĠWHETHER ĠIN ĠCONTRACT , ĠSTRICT ĠLIABILITY , ĠOR ĠTORT Ċ // Ġ( INCLUDING ĠNEGLIGENCE ĠOR ĠOTHERWISE ) ĠARISING ĠIN ĠANY ĠWAY ĠOUT ĠOF ĠTHE ĠUSE Ċ // ĠOF ĠTHIS ĠSOFTWARE , ĠEVEN ĠIF ĠADVISED ĠOF ĠTHE ĠPOSSIBILITY ĠOF ĠSUCH ĠDAMAGE . Ċ Ċ package Ġpb and k . con formance Ċ Ċ import Ġplatform . posix .* Ċ import Ġkotlinx . c interop . cstr Ċ import Ġkotlinx . c interop . use Pin ned Ċ import Ġkotlinx . c interop . address Of Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġpb and k . Message Ċ import Ġpb and k . decode From ByteArray Ċ import Ġpb and k . encode To ByteArray Ċ Ċ internal Ġclass ĠPos ix Exception ( val Ġerrno : ĠInt ) Ġ: ĠRuntimeException ( ĊĠĠĠ Ġstrerror ( errno )?. toString () Ġ?: Ġ" Error Ġwith Ġunknown Ġerrno : Ġ$ errno " Ċ ) Ċ Ċ actual Ġobject ĠPlatform Ġ{ ĊĠĠĠ Ġactual Ġfun Ġstderr Println ( str : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstr n Ġ= Ġstr Ġ+ Ġ"\ n " ĊĠĠĠĠĠĠĠ Ġval Ġc str Ġ= Ġstr n . cstr ĊĠĠĠĠĠĠĠ Ġwrite ( 2 , Ġc str , Ġc str . size . to UL ong ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġstdin ReadInt LE () Ġ= Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠ ĠByteArray ( 4 ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( read Bytes ( 0 , Ġit ) Ġ!= Ġ 4 ) Ġnull Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . fold Right ( 0 ) Ġ{ Ġbyte , Ġacc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( acc Ġshl Ġ 8 ) Ġor Ġ( byte . toInt () Ġand Ġ 0 xff ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Bytes ( fd : ĠInt , Ġarr : ĠByteArray ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġarr . use Pin ned Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Read Ġ= Ġread ( fd , Ġit . address Of ( 0 ), Ġarr . size . to UL ong ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bytes Read Ġ== Ġ- 1 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠPos ix Exception ( posix _ errno ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbytes Read . toInt () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġstdin Read Full ( size : ĠInt ) Ġ= Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠ ĠByteArray ( size ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( read Bytes ( 0 , Ġit ) Ġ== Ġit . size ) Ġ{ Ġ" Unable Ġto Ġread Ġfull Ġbyte Ġarray "} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġsuspend Ġfun Ġ< T Ġ: ĠMessage > Ġstdin Read Length Delimited Message ( comp anion : ĠMessage . Companion < T >): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġstdin ReadInt LE () Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġdebug Ġ{ Ġ" Reading Ġ$ size Ġbytes " Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcompanion . decode From ByteArray ( stdin Read Full ( size )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstdout Write Int LE ( v : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstdout Write Full Ġ( ByteArray ( 4 ) Ġ{ Ġ( v Ġshr Ġ( 8 Ġ* Ġit )). to Byte () Ġ}) ĊĊĠĠĠ Ġprivate Ġfun Ġstdout Write Full ( arr : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġarr . use Pin ned Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Written Ġ= Ġwrite ( 1 , Ġit . address Of ( 0 ), Ġarr . size . to UL ong ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bytes Written . toInt () Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġerrno ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠPos ix Exception ( posix _ errno ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( bytes Written Ġ< Ġarr . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Tri ed Ġto Ġwrite Ġ${ arr . size } Ġbytes Ġbut Ġonly Ġwrote Ġ$ bytes Written Ġbytes ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġ< T Ġ: ĠMessage > Ġstdout Write Length Delimited Message ( message : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmessage . encode To ByteArray (). also Ġ{ Ġbytes Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstdout Write Int LE ( bytes . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstdout Write Full ( bytes ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġinline Ġfun Ġ< T > Ġdo Try ( fn : Ġ() Ġ-> ĠT , Ġerr Fn : Ġ( Any ) Ġ-> ĠT ) Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġfn () ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġerr Fn ( e ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġrun Blocking Main ( block : Ġsuspend ĠCor outine Scope . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking ( block Ġ= Ġblock ) ĊĠĠĠ Ġ} Ċ }