%%% BEGIN pibfi_input.erl %%%
%%%
%%% pibfi - Platonic Ideal Brainf*ck Interpreter
%%% Copyright (c)2003 Cat's Eye Technologies. All rights reserved.
%%%
%%% Redistribution and use in source and binary forms, with or without
%%% modification, are permitted provided that the following conditions
%%% are met:
%%%
%%% Redistributions of source code must retain the above copyright
%%% notice, this list of conditions and the following disclaimer.
%%%
%%% Redistributions in binary form must reproduce the above copyright
%%% notice, this list of conditions and the following disclaimer in
%%% the documentation and/or other materials provided with the
%%% distribution.
%%%
%%% Neither the name of Cat's Eye Technologies nor the names of its
%%% contributors may be used to endorse or promote products derived
%%% from this software without specific prior written permission.
%%%
%%% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
%%% CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
%%% INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
%%% MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
%%% DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
%%% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
%%% OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
%%% PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
%%% OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
%%% ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
%%% OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
%%% OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
%%% POSSIBILITY OF SUCH DAMAGE.
%% @doc Input subsystem of the Platonic Ideal Brainf*ck Interpreter.
%%
%% @end
-module(pibfi_input).
-vsn('2003.0427').
-copyright('Copyright (c)2003 Cat`s Eye Technologies. All rights reserved.').
-export([start/6, server/5]).
%% @spec start(Supervisor::pid(), IoPid::pid(), Dest::pid(),
%% Interactive::boolean(),
%% Device, EOF) -> pid()
%% @doc Creates and spawns a new input subsystem.
start(Supervisor, IoPid, Dest, Interactive, Device, EOF) ->
pibfi_supervisor:spawn_link(Supervisor, "input", noncritical,
?MODULE, server, [IoPid, Dest, Interactive, Device, EOF]).
server(IoPid, Dest, Interactive, Device, EOF) ->
% note that this is synchronous - we are essentially a send-only server.
% we can't react to messages until the user enters input - so we won't.
case io:get_chars(Device, '', 1) of
[10] ->
% we will always get 10 for an interactive incoming EOL, no matter
% what the operating system above us thinks
case Interactive of
false ->
pibfi_xlat:send(Dest, 10);
true ->
% so we actually have to simulate the action of the OS here
lists:foreach(fun(EOLChar) ->
pibfi_xlat:send(Dest, EOLChar)
end, pibfi:os_eol())
end,
server(IoPid, Dest, Interactive, Device, EOF);
[Char] ->
pibfi_xlat:send(Dest, Char),
server(IoPid, Dest, Interactive, Device, EOF);
eof ->
% ce_log:write("~p", [eof]),
case EOF of
halt ->
exit(halted_due_to_eof);
stop ->
pibfi_xlat:notify(Dest, stop);
nop ->
pibfi_xlat:notify(Dest, nop);
_ ->
pibfi_xlat:notify(Dest, EOF)
end,
exit(normal);
{error, terminated} ->
% IoPid ! {self(), direct, stop},
exit(normal);
Else ->
exit({halted_due_to_input_error, Else})
end.
%%% END of pibfi_input.erl %%%