1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495open!Baseopen!Importtypet=Caml.in_channelletequal(t1:t)t2=phys_equalt1t2letseek=Caml.LargeFile.seek_inletpos=Caml.LargeFile.pos_inletlength=Caml.LargeFile.in_channel_lengthletstdin=Caml.stdinletcreate?(binary=true)file=letflags=[Open_rdonly]inletflags=ifbinarythenOpen_binary::flagselseflagsinCaml.open_in_genflags0o000file;;letclose=Caml.close_inletwith_file?binaryfile~f=Exn.protectx(create?binaryfile)~f~finally:closeletmay_eoff=trySome(f())withEnd_of_file->Noneletinputt~buf~pos~len=Caml.inputtbufposlenletreally_inputt~buf~pos~len=may_eof(fun()->Caml.really_inputtbufposlen)letreally_input_exnt~buf~pos~len=Caml.really_inputtbufposlenletinput_bytet=may_eof(fun()->Caml.input_bytet)letinput_chart=may_eof(fun()->Caml.input_chart)letinput_binary_intt=may_eof(fun()->Caml.input_binary_intt)letunsafe_input_valuet=may_eof(fun()->Caml.input_valuet)letinput_buffertbuf~len=may_eof(fun()->Caml.Buffer.add_channelbuftlen)letset_binary_mode=Caml.set_binary_mode_inletinput_allt=(* We use 65536 because that is the size of OCaml's IO buffers. *)letbuf_size=65536inletbuf=Bytes.createbuf_sizeinletbuffer=Buffer.createbuf_sizeinletrecloop()=letlen=inputt~buf~pos:0~len:(Bytes.lengthbuf)iniflen>0thenbeginBuffer.add_subbytesbufferbuf~pos:0~len;loop();endinloop();Buffer.contentsbuffer;;;lettrim~fix_win_eolline=iffix_win_eolthenbeginletlen=String.lengthlineiniflen>0&&Char.equal(String.getline(len-1))'\r'thenString.subline~pos:0~len:(len-1)elselineendelselineletinput_line?(fix_win_eol=true)t=matchmay_eof(fun()->Caml.input_linet)with|None->None|Someline->Some(trim~fix_win_eolline);;letinput_line_exn?(fix_win_eol=true)t=letline=Caml.input_linetintrim~fix_win_eollineletfold_lines?fix_win_eolt~init~f=letrecloopac=matchinput_line?fix_win_eoltwith|None->ac|Someline->loop(facline)inloopinit;;letinput_lines?fix_win_eolt=List.rev(fold_lines?fix_win_eolt~init:[]~f:(funlinesline->line::lines));;letiter_lines?fix_win_eolt~f=fold_lines?fix_win_eolt~init:()~f:(fun()line->fline);;letread_lines?fix_win_eolfname=with_filefname~f:(input_lines?fix_win_eol)letread_allfname=with_filefname~f:input_all