(* * $Id: wc.ocaml,v 1.7 2001/05/25 22:33:22 doug Exp $ * http://www.bagley.org/~doug/shootout/ * based on code by Cuihtlauac ALVARADO and Markus Mottl *) let nl = ref 0 let nw = ref 0 let nc = ref 0 let max = 4096 let buf = String.create max let readblock scanfun = let nread = input stdin buf 0 max in if nread = 0 then () else begin nc := !nc + nread; scanfun 0 nread end let rec scan_out_of_word i n = if i < n then match buf.[i] with | '\n' -> incr nl; scan_out_of_word (i+1) n | ' '|'\t' -> scan_out_of_word (i+1) n | _ -> incr nw; scan_in_word (i+1) n else readblock scan_out_of_word and scan_in_word i n = if i < n then match buf.[i] with | '\n' -> incr nl; scan_out_of_word (i+1) n | ' '|'\t' -> scan_out_of_word (i+1) n | _ -> scan_in_word (i+1) n else readblock scan_in_word let _ = scan_out_of_word 0 0; Printf.printf "%d %d %d\n" !nl !nw !nc