//
// K&R, 2nd edition, page 20
//

//
// Translated into ATS by Hongwei Xi (hwxi AT cs DOT bu DOT edu)
//

(*

#include <stdio.h>

#define IN  1 /* inside a word */
#define OUT 0 /* outside a word */

/* count lines, words, and chars in input */
int main () {
  int c, nl, nw, nc, state ;
  state = OUT ;
  nl = nw = nc = 0 ;
  while ((c = getchar()) != EOF) {
    ++nc ;
    if (c == '\n') ++nl ;
    if (c == ' ' || c == '\n' || c == '\t')
      state = OUT ;
    else if (state == OUT) {
      state = IN ; ++nw ;
    }
  } // end of [while]
  printf ("%d %d %d\n", nl, nw, nc) ;
} /* end of [main] */

*)

staload "libc/SATS/stdio.sats"

#define IN 0; #define OUT 1

implement main () = let
  fun loop (nl: &int, nw: &int, nc: &int, state: &int): void = let
    val c = getchar ()
  in
    if (c <> EOF) then let
      val () = nc := nc + 1
      val c = char_of_int (c)
      val () = if (c = '\n') then (nl := nl + 1)
      val () = case+ c of
        | ' ' => state := OUT
        | '\n' => state := OUT
        | '\t' => state := OUT
        | _ => begin
            if (state = OUT) then (state := IN; nw := nw + 1)
          end
    in
      loop (nl, nw, nc, state)
    end else begin
      // loop exits
    end // end of [if]
  end // end of [loop]
  var nl: int = 0 and nw: int = 0 and nc: int = 0 and state: int = OUT
  val () = loop (nl, nw, nc, state)
in
  printf ("%d %d %d\n", @(nl, nw, nc))
end // end of [main]

(* ****** ****** *)

(* end of [wc.dats] *)