%%% -*- mode: erlang -*-
%%% $Id: spellcheck.erlang,v 1.1 2001/05/26 05:05:04 doug Exp $
%%% http://www.bagley.org/~doug/shootout/
-module(spellcheck).
-export([main/0, main/1]).
main() -> main(['1']).
main(Args) ->
% load dictionary into hash table (erlang ets table)
Dict = load_dict(),
% read words from stin and print those not in dictionary
spell(Dict),
halt(0).
load_dict() ->
Dict = ets:new(i_am_a_carrot, [set]),
{ok, In} = file:open("Usr.Dict.Words", [raw]),
% I'm just guessing that the file opened above has fd=3
% this is a total hack, but I could find nothing in the Erlang
% documention on how to do this.
Port = open_port({fd, 3, 1}, [eof, {line, 64}]),
read_dict(Port, Dict),
file:close(In),
Dict.
load_dict_1() ->
Dict = ets:new(i_am_a_carrot, [set]),
%{ok, In} = file:open("Usr.Dict.Words", [read]),
%Port = open_port({fd, ????, 1}, [eof, {line, 64}]),
Port = open_port({spawn, "cat Usr.Dict.Words"}, [eof, {line, 64}]),
read_dict(Port, Dict),
%file:close(In),
Dict.
read_dict(Port, Dict) ->
receive
{Port, {_, {_, Word}}} ->
Atom = list_to_atom(Word),
ets:insert(Dict, { Atom, 1 }),
read_dict(Port, Dict);
{Port, eof} -> ok
end.
spell(Dict) ->
Port = open_port({fd, 0, 1}, [eof, {line, 64}]),
spell(Port, Dict).
spell(Port, Dict) ->
receive
{Port, {_, {_, Word}}} ->
Atom = list_to_atom(Word),
case ets:lookup(Dict, Atom) of
[] -> io:format("~w~n",[Atom]);
_ -> ok
end,
spell(Port, Dict);
{Port, eof} -> ok
end.