1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677typet={start:Lexing.position;stop:Lexing.position}letin_filefn=letpos:Lexing.position={pos_fname=fn;pos_lnum=1;pos_cnum=0;pos_bol=0}in{start=pos;stop=pos}letin_dir=in_fileletnone=in_file"<none>"letof_lexbuflexbuf:t={start=Lexing.lexeme_start_plexbuf;stop=Lexing.lexeme_end_plexbuf}letsexp_of_position_no_file(p:Lexing.position)=letopenSexp.Encoderinrecord["pos_lnum",intp.pos_lnum;"pos_bol",intp.pos_bol;"pos_cnum",intp.pos_cnum]letto_sexpt=letopenSexp.Encoderinrecord(* TODO handle when pos_fname differs *)["pos_fname",stringt.start.pos_fname;"start",sexp_of_position_no_filet.start;"stop",sexp_of_position_no_filet.stop]letequal_position{Lexing.pos_fname=f_a;pos_lnum=l_a;pos_bol=b_a;pos_cnum=c_a}{Lexing.pos_fname=f_b;pos_lnum=l_b;pos_bol=b_b;pos_cnum=c_b}=f_a=f_b&&l_a=l_b&&b_a=b_b&&c_a=c_bletequal{start=start_a;stop=stop_a}{start=start_b;stop=stop_b}=equal_positionstart_astart_b&&equal_positionstop_astop_bletof_pos(fname,lnum,cnum,enum)=letpos:Lexing.position={pos_fname=fname;pos_lnum=lnum;pos_cnum=cnum;pos_bol=0}in{start=pos;stop={poswithpos_cnum=enum}}letto_file_colon_linet=Printf.sprintf"%s:%d"t.start.pos_fnamet.start.pos_lnumletpp_file_colon_lineppft=Format.pp_print_stringppf(to_file_colon_linet)