/**
 * Warranty & Liability
 * To the extent permitted by applicable law and unless explicitly
 * otherwise agreed upon, XLOG Technologies AG makes no warranties
 * regarding the provided information. XLOG Technologies AG assumes
 * no liability that any problems might be solved with the information
 * provided by XLOG Technologies AG.
 *
 * Rights & License
 * All industrial property rights regarding the information - copyright
 * and patent rights in particular - are the sole property of XLOG
 * Technologies AG. If the company was not the originator of some
 * excerpts, XLOG Technologies AG has at least obtained the right to
 * reproduce, change and translate the information.
 *
 * Reproduction is restricted to the whole unaltered document. Reproduction
 * of the information is only allowed for non-commercial uses. Selling,
 * giving away or letting of the execution of the library is prohibited.
 * The library can be distributed as part of your applications and libraries
 * for execution provided this comment remains unchanged.
 *
 * Restrictions
 * Only to be distributed with programs that add significant and primary
 * functionality to the library. Not to be distributed with additional
 * software intended to replace any components of the library.
 *
 * Trademarks
 * Jekejeke is a registered trademark of XLOG Technologies AG.
 */

% close_output_atom_stream(+Stream, -Atom)
close_output_atom_stream(X, Y) :-
   flush_output(X),
   sys_output_atom_stream_get(X, Y).

/**
 * term_atom(T, A):
 * term_atom(T, A, O):
 * The build-in succeeds in writing the term T into a new
 * atom A. The ternary predicate accepts write options O.
 */
% term_atom(+Term, -Atom)
term_atom(Term, Atom) :-
   term_atom(Term, Atom, []).

% term_atom(+Term, -Atom, +List)
term_atom(Term, Atom, Opts) :- var(Atom), !,
   open_output_atom_stream(Stream),
   write_term(Stream, Term, [quoted(true)|Opts]),
   close_output_atom_stream(Stream, Atom).
term_atom(Term, Atom, Opts) :-
   open_input_atom_stream(Atom, Stream),
   read_term(Stream, Term, [end_of_file(true)|Opts]).

/*********************************************************************/
/* Time Format                                                       */
/*********************************************************************/

/**
 * atom_time(A, F, T):
 * atom_time(A, F, T, L):
 * If A is a variable, the built-in succeeds in A with the millisecond
 * time T formatted by the pattern F. Otherwise the built-in succeeds
 * in T with the millisecond time parsed from A by the pattern F. The
 * quaternary predicate allows specifying time options.
 */
% atom_time(+-Atom, +Atom, -+Integer)
atom_time(A, F, T) :-
   sys_atom_time(A, F, 0, T).

% atom_time(+-Atom, +Atom, -+Integer, +List)
atom_time(A, F, T, L) :-
   sys_time_opts(L, 0, O),
   sys_atom_time(A, F, O, T).

% sys_time_opts(+List, +Integer, -Integer)
sys_time_opts(V, _, _) :- var(V),
   throw(error(instantiation_error,_)).
sys_time_opts([X|L], F, G) :- !,
   sys_time_opt(X, F, H),
   sys_time_opts(L, H, G).
sys_time_opts([], F, F) :- !.
sys_time_opts(L, _, _) :-
   throw(error(type_error(list,L),_)).

% sys_time_opt(+Term, +Integer, -Integer)
sys_time_opt(V, _, _) :- var(V),
   throw(error(instantiation_error,_)).
sys_time_opt(face(F), _, G) :- !,
   sys_check_face(F, G).
sys_time_opt(O, _, _) :-
   throw(error(domain_error(time_option,O),_)).

% sys_check_face(+Boolean, -Integer)
sys_check_face(V, _) :- var(V),
   throw(error(instantiation_error,_)).
sys_check_face(local, 0) :- !.
sys_check_face(utc, 1) :- !.
sys_check_face(B, _) :-
   throw(error(domain_error(face,B),_)).

/*******************************************************************/
/* Format Message                                                  */
/*******************************************************************/

/**
 * put_message(S, T):
 * put_message(S, T, L):
 * The built-in succeeds in writing the message T formatted
 * according an output stream S. The ternary predicate allows
 * specifying a locale.
 */
% put_message(+Stream, +Term)
put_message(Stream, Message) :-
   current_prolog_flag(sys_locale, Locale),
   put_message(Stream, Message, Locale).

% put_message(+Stream, +Term, +Locale)
put_message(Stream, Message, Locale) :- var(Message), !,
   put_message(Stream, exception(template, Message), Locale).
put_message(Stream, Message, Locale) :-
   get_message(Message, Locale, Template, Args), !,
   format(Stream, Template, Args).
put_message(Stream, Message, Locale) :-
   put_message(Stream, exception(template, Message), Locale).

/****************************************************************/
/* Error Texts                                                  */
/****************************************************************/

% strings(+Atom, +Atom, -Atom)
:- multifile(strings/3).
strings('domain_error.time_option', de, 'Zeitoption erwartet, gefunden ~q.').
strings('domain_error.face', de, 'Face erwartet, gefunden ~q.').

strings('domain_error.time_option', '', 'Time option expected, found ~q.').
strings('domain_error.face', '', 'Face expected, found ~q.').

/*******************************************************************/
/* Foreign Predicates                                              */
/*******************************************************************/

% open_input_atom_stream(X, Y):
% defined in foreign(text/auxlib)

% open_output_atom_stream(X):
% defined in foreign(text/auxlib)

% sys_output_atom_stream_get(X, Y):
% defined in foreign(text/auxlib)

:- ensure_loaded(foreign(text/auxlib)).