12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667open!Stduneletquote_lengths~syntax=letn=ref0inletlen=String.lengthsinfori=0tolen-1don:=!n+(matchString.unsafe_getsiwith|'\"'|'\\'|'\n'|'\t'|'\r'|'\b'->2|'%'->ifsyntax=Syntax.Dune&&i+1<len&&s.[i+1]='{'then2else1|' '..'~'->1|_->4)done;!nletescape_tos~dst:s'~ofs~syntax=letn=refofsinletlen=String.lengthsinfori=0tolen-1dobeginmatchString.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'|'%'whensyntax=Syntax.Dune&&i+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/10)mod10));incrn;Bytes.unsafe_sets'!n(Char.unsafe_chr(48+amod10));end;incrndone(* Escape [s] if needed. *)letescapeds~syntax=letn=quote_lengths~syntaxinifn=0||n>String.lengthsthenlets'=Bytes.createninescape_tos~dst:s'~ofs:0~syntax;Bytes.unsafe_to_strings'elses(* Surround [s] with quotes, escaping it if necessary. *)letquoteds~syntax=letlen=String.lengthsinletn=quote_lengths~syntaxinlets'=Bytes.create(n+2)inBytes.unsafe_sets'0'"';iflen=0||n>lenthenescape_tos~dst:s'~ofs:1~syntaxelseBytes.blit_string~src:s~src_pos:0~dst:s'~dst_pos:1~len;Bytes.unsafe_sets'(n+1)'"';Bytes.unsafe_to_strings'