(************************************************************ cmp.ml Created : Wed Dec 27 12:55:53 2006 Last modified: Wed Dec 27 21:21:45 2006 Compile: ocamlopt cmp.ml -o cmp # FTP Directory: sources/ocaml # ************************************************************) (** @author Takashi Masuyama *) type t = Same | Differ of int * int let compare in1 in2 = let rec iter charnum linenum = match (Stream.peek in1), (Stream.peek in2) with (Some b1), (Some b2) -> if b1 = b2 then begin Stream.junk in1; Stream.junk in2; iter (charnum+1) (if b1 = '\n' then (linenum+1) else linenum) end else Differ (charnum, linenum) | None, None -> Same | _ -> Differ (charnum, linenum) in iter 1 1 let _ = if Array.length Sys.argv <> 3 then begin prerr_endline "cmp FILE1 FILE2"; exit 2 end; let file1 = Sys.argv.(1) in let file2 = Sys.argv.(2) in let in_channel1 = open_in file1 in let in_channel2 = open_in file2 in let in_stream1 = Stream.of_channel in_channel1 in let in_stream2 = Stream.of_channel in_channel2 in let result = compare in_stream1 in_stream2 in close_in in_channel1; close_in in_channel2; match result with Same -> exit 0 | Differ (charnum, linenum) -> begin Printf.fprintf stderr "%s %s differ: char %d, line %d\n" file1 file2 charnum linenum; exit 1 end (* * Local Variables: * namazu-default-dir:"/home/tak/.indexes/ocaml" * End: *)