12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091open!Stduneletquote_lengths=letn=ref0inletlen=String.lengthsinfori=0tolen-1don:=!n+matchString.unsafe_getsiwith|'\"'|'\\'|'\n'|'\t'|'\r'|'\b'->2|'%'->ifi+1<len&&s.[i+1]='{'then2else1|' '..'~'->1|_->4done;!nletescape_tos~dst:s'~ofs=letn=refofsinletlen=String.lengthsinfori=0tolen-1do(matchString.unsafe_getsiwith|('\"'|'\\')asc->Bytes.unsafe_sets'!n'\\';incrn;Bytes.unsafe_sets'!nc|'\n'->Bytes.unsafe_sets'!n'\\';incrn;Bytes.unsafe_sets'!n'n'|'\t'->Bytes.unsafe_sets'!n'\\';incrn;Bytes.unsafe_sets'!n't'|'\r'->Bytes.unsafe_sets'!n'\\';incrn;Bytes.unsafe_sets'!n'r'|'\b'->Bytes.unsafe_sets'!n'\\';incrn;Bytes.unsafe_sets'!n'b'|'%'wheni+1<len&&s.[i+1]='{'->Bytes.unsafe_sets'!n'\\';incrn;Bytes.unsafe_sets'!n'%'|' '..'~'asc->Bytes.unsafe_sets'!nc|c->leta=Char.codecinBytes.unsafe_sets'!n'\\';incrn;Bytes.unsafe_sets'!n(Char.unsafe_chr(48+(a/100)));incrn;Bytes.unsafe_sets'!n(Char.unsafe_chr(48+(a/10mod10)));incrn;Bytes.unsafe_sets'!n(Char.unsafe_chr(48+(amod10))));incrndone(* Escape [s] if needed. *)letescapeds=letn=quote_lengthsinifn=0||n>String.lengthsthen(lets'=Bytes.createninescape_tos~dst:s'~ofs:0;Bytes.unsafe_to_strings')elses(* Surround [s] with quotes, escaping it if necessary. *)letquoteds=letlen=String.lengthsinletn=quote_lengthsinlets'=Bytes.create(n+2)inBytes.unsafe_sets'0'"';iflen=0||n>lenthenescape_tos~dst:s'~ofs:1elseBytes.blit_string~src:s~src_pos:0~dst:s'~dst_pos:1~len;Bytes.unsafe_sets'(n+1)'"';Bytes.unsafe_to_strings'