1
(***********************************************************************)
5
(* Pierre Weis, projet Cristal, INRIA Rocquencourt *)
7
(* Copyright 2001 Institut National de Recherche en Informatique et *)
8
(* en Automatique. All rights reserved. This file is distributed *)
9
(* only by permission. *)
11
(***********************************************************************)
13
- Records must be defined in Caml.
14
Field contents cannot be modified unless the field has been declared mutable.
16
- If r is a record with field f then r.f denotes the contents of field f.
18
- If r is a record with mutable field f then r.f <- v writes v in field f of r.
26
let wc_count = {chars = 0; lines = 0; words = 0}
27
and wc_count_total = {chars = 0; lines = 0; words = 0};;
29
let reset_wc_count () =
30
wc_count.chars <- 0; wc_count.lines <- 0; wc_count.words <- 0;;
32
let cumulate_wc_count () =
33
wc_count_total.chars <- wc_count_total.chars + wc_count.chars;
34
wc_count_total.lines <- wc_count_total.lines + wc_count.lines;
35
wc_count_total.words <- wc_count_total.words + wc_count.words;;
37
let rec counter ic iw =
38
let c = input_char ic in
39
wc_count.chars <- wc_count.chars + 1;
42
wc_count.lines <- wc_count.lines + 1;
47
if not iw then wc_count.words <- wc_count.words + 1 else ();
50
let count_channel ic =
52
try counter ic false with
53
| End_of_file -> cumulate_wc_count (); close_in ic;;
56
- The Printf.printf function is analoguous to the C printf function.
58
let print_wc l w c f =
59
Printf.printf "%10d%10d%10d %s\n" l w c f;;
62
print_wc wc_count.lines wc_count.words wc_count.chars f
65
let print_wc_total () =
67
wc_count_total.lines wc_count_total.words wc_count_total.chars "total"
70
let count_file file_name =
72
count_channel (open_in file_name);
73
print_wc_file file_name
74
with Sys_error s -> print_string s; print_newline (); exit 2
78
let args = Sys.argv in
79
let nb_files = Array.length args - 1 in
80
for i = 1 to nb_files do
83
if nb_files > 1 then print_wc_total ();
86
if !Sys.interactive then () else main ();;