%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% File : LOGICSERVER %% Created by : Joakim Eriksson & Niclas Finne %% Created date : 01-11-30 %% %% $Author: joakime $ %% $Date: 2001/12/10 17:26:35 $ %% $Revision: 1.4 $ %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Description: %% %% Methods: %% :- module(logicserver, [start/0]). :- use_module(library(charsio), []). :- use_module('../../core/server', []). :- server:add_service(logicserver). :- dynamic active_port/1. %% --------------------------------------------------------- %% Service API %% --------------------------------------------------------- start_service :- server:open_port(P, logicserver), format("Please telnet to ~w~n", [P]), assert(active_port(P)). stop_service :- retract(active_port(P)), !, server:close_port(P, logicserver). stop_service. %% --------------------------------------------------------- %% Server Port API %% --------------------------------------------------------- %% A new connection connection(_Client, Stream) :- server:new_stream(Stream, logicserver), format(Stream, "Welcome to SICStus logicserver (single lines only)~n| ?- ", []), flush_output(Stream). %% Data from the server data_received(end_of_file, Stream) :- !, server:close_stream(Stream). data_received(Data, Stream) :- charsio:open_chars_stream(Data, DataStream), catch(read_term(DataStream, Term, [variable_names(Vars)]), Error, (format(Stream, "~p~n| ?-", [Error]), flush_output(Stream), fail)),!, close(DataStream), call_robust(Term, Vars, Stream), flush_output(Stream). %% Call the Term and write the result to the stream call_robust(end_of_file, _Vars, Stream) :- !, format(Stream, "| ?- ",[]). call_robust(Term, Vars, Stream) :- catch(charsio:with_output_to_chars(Term, Str), Error, (format(Stream, "~p~n", [Error]), fail)), !, format(Stream, "~s~n", [Str]), print_result(Vars, Stream). call_robust(_Term, _Vars, Stream) :- format(Stream, "no~n| ?- ",[]). print_result([], Stream) :- format(Stream, "yes~n| ?- ",[]). print_result([Name=Var | Rest], Stream) :- format(Stream, "~w = ~w~n",[Name, Var]), print_result(Rest, Stream). %% Starts the logicserver start :- server:init, server:run.