/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠToast ĠInc . Ċ Ġ* Ċ Ġ* Ġ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 . toast tab . proto kt . codegen . descriptor Ċ Ċ import Ġcom . google . protobuf . Descriptor Protos . FileDescriptor Proto Ċ Ċ // ĠFor Ġthe ĠJava Ġimplementation Ġof Ġdescriptor Ġencoding , Ġsee : Ċ // Ġhttps :// github . com / protocol buffers / protobuf / blob / 5 e 8 4 a 6 1 6 9 cf 0 f 9 7 1 6 c 9 2 8 5 c 9 5 c 8 6 0 bcb 3 5 5 db dc 1 / src / google / protobuf / compiler / java / java _ shared _ code _ generator . cc # L 1 1 9 Ċ // Ġand Ċ // Ġhttps :// github . com / protocol buffers / protobuf / blob / 5 e 8 4 a 6 1 6 9 cf 0 f 9 7 1 6 c 9 2 8 5 c 9 5 c 8 6 0 bcb 3 5 5 db dc 1 / src / google / protobuf / stubs / str util . cc # L 5 9 5 Ċ Ċ // ĠLimit Ġthe Ġnumber Ġof Ġbytes Ġper Ġline . Ċ private Ġconst Ġval ĠBY TES _ PER _ LINE Ġ= Ġ 4 0 Ċ Ċ // ĠLimit Ġthe Ġnumber Ġof Ġlines Ġper Ġstring Ġpart . Ċ private Ġconst Ġval ĠLIN ES _ PER _ PART Ġ= Ġ 4 0 0 Ċ Ċ // ĠEvery Ġblock Ġof Ġbytes , Ġstart Ġa Ġnew Ġstring Ġliteral , Ġin Ġorder Ġto Ġavoid Ġthe Ċ // Ġ 6 4 k Ġlength Ġlimit . ĠNote Ġthat Ġthis Ġvalue Ġneeds Ġto Ġbe Ġ< 6 4 k . Ċ private Ġconst Ġval ĠBY TES _ PER _ PART Ġ= ĠBY TES _ PER _ LINE Ġ* ĠLIN ES _ PER _ PART Ċ Ċ // ĠNotes Ġfrom Ġthe ĠJava Ġversion : Ċ // ĠEmbed Ġthe Ġdescriptor . Ġ ĠWe Ġsimply Ġserialize Ġthe Ġentire ĠFile Descriptor Proto Ċ // Ġand Ġembed Ġit Ġas Ġa Ġstring Ġliteral , Ġwhich Ġis Ġparsed Ġand Ġbuilt Ġinto Ġreal Ċ // Ġdescriptors Ġat Ġinitialization Ġtime . Ġ ĠWe Ġunfortunately Ġhave Ġto Ġput Ġit Ġin Ċ // Ġa Ġstring Ġliteral , Ġnot Ġa Ġbyte Ġarray , Ġbecause Ġapparently Ġusing Ġa Ġliteral Ċ // Ġbyte Ġarray Ġcauses Ġthe ĠJava Ġcompiler Ġto Ġgenerate Ġ* instructions * Ġto Ċ // Ġinitialize Ġeach Ġand Ġevery Ġbyte Ġof Ġthe Ġarray , Ġe . g . Ġas Ġif Ġyou Ġtyped : Ċ // ĠĠ Ġb [ 0 ] Ġ= Ġ 1 2 3 ; Ġb [ 1 ] Ġ= Ġ 4 5 6 ; Ġb [ 2 ] Ġ= Ġ 7 8 9 ; Ċ // ĠThis Ġmakes Ġhuge Ġbytecode Ġfiles Ġand Ġcan Ġeasily Ġhit Ġthe Ġcompiler 's Ġinternal Ċ // Ġcode Ġsize Ġlimits Ġ( error Ġ" code Ġto Ġlarge "). Ġ ĠString Ġliterals Ġare Ġapparently Ċ // Ġembedded Ġraw , Ġwhich Ġis Ġwhat Ġwe Ġwant . Ċ fun Ġencode FileDescriptor ( file Descriptor Proto : ĠFile Descriptor Proto ): ĠList < List < String >> Ġ{ ĊĠĠĠ Ġval Ġparts Ġ= Ġmutable ListOf < Mutable List < String >>() ĊĠĠĠ Ġval Ġbytes Ġ= ĠfileDescriptor Proto . toByteArray () ĊĠĠĠ Ġfor Ġ( i Ġin Ġbytes . indices Ġstep ĠBY TES _ PER _ LINE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( i Ġ% ĠBY TES _ PER _ PART Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparts . add ( mutable ListOf ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġparts . last (). add ( escape ( bytes . as Sequence (). drop ( i ). take ( BYTES _ PER _ LINE ))) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġparts Ċ } Ċ Ċ private Ġfun Ġescape ( bytes : ĠSequence < Byte >) Ġ= ĊĠĠĠ Ġbytes . join ToString ("") Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġc Ġ= Ġit . to Char ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'\ n ' Ġ-> Ġ"\\ n " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'\ r ' Ġ-> Ġ"\\ r " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'\ t ' Ġ-> Ġ"\\ t " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'\" ' Ġ-> Ġ"\\ \"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'\'' Ġ-> Ġ"\\ '" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'\\ ' Ġ-> Ġ"\\ \ \" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'\ b ' Ġ-> Ġ"\\ b " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'$ ' Ġ-> Ġ"\\ \ $" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAll Ġother Ġcharacters Ġare Ġrepresent able Ġdirectly Ġin ĠKotlin Ġsource . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġc . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ