%%% -*- mode: erlang -*-
%%% $Id: wc.erlang,v 1.5 2001/06/26 05:09:25 doug Exp $
%%% http://www.bagley.org/~doug/shootout/
-module(wc).
-export([main/0, main/1]).
% TBD - this program should not assume lines are less than 10000 characters long
main() -> main(['1']).
main(Args) ->
Port = open_port({fd, 0, 1}, [eof, {line, 10000}]),
wc(Port, 0, 0, 0),
halt(0).
wc(Port, NL, NW, NC) ->
receive
{Port, {_, {_, Line}}} ->
wc(Port, NL + 1, NW + cw(Line, out, 0), NC + length(Line) + 1);
{Port, eof} ->
io:format("~w ~w ~w~n", [NL, NW, NC])
end.
% count words in a line (list)
cw([], _, Count) -> Count;
cw([$\ |T], _, Count) -> cw(T, out, Count);
cw([$\t|T], _, Count) -> cw(T, out, Count);
cw([_|T], out, Count) -> cw(T, in, 1 + Count);
cw([_|T], in, Count) -> cw(T, in, Count).