12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970(* Js_of_ocaml library
* http://www.ocsigen.org/js_of_ocaml/
* Copyright (C) 2014 Hugo Heuzard
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, with linking exception;
* either version 2.1 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*)open!Js_of_ocaml_compileropen!Js_of_ocaml_compiler.Stdliblettrim_ends=letws=function|' '|'\t'|'\n'|'\r'->true|_->falseinletlen=String.lengthsinletstop=ref(len-1)inwhile!stop>=0&&wss.[!stop]dodecrstopdone;String.subs~pos:0~len:(!stop+1)(* Ensure the source ends with [;;] so the incremental
[Toploop.parse_toplevel_phrase] driven from this refill function (used by
[execute]) does not drop a trailing, unterminated phrase. The [use] paths
parse whole buffers with [parse_use_file] and do not go through here. *)letnormalizecode=letcontent=trim_endcodeinifString.is_emptycontentthencontentelseifString.ends_with~suffix:";;"contentthencontent^"\n"elsecontent^";;\n"letlexbufspppf=lets=normalizesinfunbufferlen->if!p=String.lengthsthen0elseletlen',nl=tryString.index_froms!p'\n'-!p+1,falsewith_->String.lengths-!p,trueinletlen''=minlenlen'inString.blit~src:s~src_pos:!p~dst:buffer~dst_pos:0~len:len'';(matchppfwith|Someppf->Format.fprintfppf"%s"(Bytes.sub_stringbuffer~pos:0~len:len'');(* Only emit the synthetic newline once the whole final (newline-less)
segment has been echoed: when the segment is larger than [len] it
is fed in several chunks, and a newline after a partial chunk would
split a line mid-source. *)ifnl&&len''=len'thenFormat.pp_print_newlineppf();Format.pp_print_flushppf()|None->());p:=!p+len'';len''