34
35:- module(nitrace, [nitrace_file/3,
36 nitrace/1,
37 nitrace/3]). 38
39:- use_module(library(context_values)). 40:- use_module(library(ontrace)). 41:- use_module(library(prolog_clause), []). 42
43:- meta_predicate nitrace_file(0,+,+). 44nitrace_file(Goal, Alias, OptL) :-
45 absolute_file_name(Alias, File),
46 setup_call_cleanup(
47 open(File, write, Stream),
48 nitrace(Goal, Stream, OptL),
49 close(Stream)).
50
51:- meta_predicate nitrace(0,+,+). 52nitrace(Goal, Stream, OptL) :-
53 ontrace(Goal, nitrace_port(Stream), OptL).
54
55:- meta_predicate nitrace(0). 56nitrace(Goal) :-
57 nitrace(Goal, user_output, []).
58
59frame_pi(Frame, PI) :-
60 prolog_frame_attribute(Frame, predicate_indicator, PI).
61
62nitrace_port(Stream, Port, Frame, PC, ParentL, SubLoc, continue) :-
63 ( maplist(frame_pi, ParentL, CS),
64 with_context_values(
65 print_message(stream, frame(Frame, Port, PC, CS)),
66 [stream, location], [Stream, SubLoc]),
67 fail
68 ; true
69 ).
70
71:- multifile
72 user:message_property/2,
73 prolog:message//1. 74
75user:message_property(stream, stream(Stream)) :-
76 !,
77 get_context_value(stream, Stream).
78user:message_property(stream, prefix(F-A)) :-
79 !,
80 get_context_value(location, Loc),
81 '$messages':swi_location(Loc, [F1-A], []),
82 atomic_list_concat(['~N', F1, '\t'], F).
83
84prolog:message(frame(Frame, redo(Redo), PC, CS)) --> !,
85 '$messages':translate_message(frame(Frame, redo, PC, CS)),
86 [' - redo(~w)'-[Redo]].
87prolog:message(frame(Frame, exitcl, PC, CS)) --> !,
88 '$messages':translate_message(frame(Frame, exit, PC, CS)),
89 [' - clause'].
90prolog:message(frame(Frame, exception(Ex), PC, CS)) --> !,
91 '$messages':translate_message(frame(Frame, exception, PC, CS)),
92 [nl],
93 '$messages':translate_message(Ex).
94prolog:message(frame(Frame, Port, PC, CS)) -->
95 '$messages':translate_message(frame(Frame, Port, PC)),
96 ( {CS = []}
97 ->[]
98 ; [' (caller: ~q)'-[CS]]
99 )