1 | % (c) 2009-2022 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, | |
2 | % Heinrich Heine Universitaet Duesseldorf | |
3 | % This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) | |
4 | ||
5 | :- module(user_interrupts,[interruptable_call/1, interruptable_call/2, | |
6 | catch_interrupt_assertion_call/1, | |
7 | process_interrupted_error_message/0]). | |
8 | ||
9 | :- use_module(module_information). | |
10 | ||
11 | :- module_info(group,infrastructure). | |
12 | :- module_info(description,'This module allows to call predicates which can be interrupted by cntrl-c.'). | |
13 | ||
14 | :- use_module(error_manager). | |
15 | ||
16 | %:- use_module(extension('user_signal/user_signal'), [get_user_signal_ref/1]). | |
17 | :- meta_predicate catch_interrupt_assertion_call(0). | |
18 | catch_interrupt_assertion_call(Call) :- | |
19 | catch(Call, | |
20 | error(forced_interrupt_error('User has interrupted the current execution'),_), | |
21 | (process_interrupted_error_message,fail)). | |
22 | ||
23 | process_interrupted_error_message :- | |
24 | add_error(probcli,'User has interrupted current execution.'). | |
25 | ||
26 | ||
27 | :- use_module(extension('user_signal/user_signal'), [user_interruptable_call_det/2]). | |
28 | :- meta_predicate interruptable_call(0). | |
29 | interruptable_call(Call) :- | |
30 | user_interruptable_call_det(catch_interrupt_assertion_call(Call),InterruptResult), | |
31 | (InterruptResult=interrupted -> print(' **KeyboardInterrupt**'),nl,fail ; true). | |
32 | ||
33 | :- meta_predicate interruptable_call(0,-). | |
34 | interruptable_call(Call,InterruptResult) :- | |
35 | user_interruptable_call_det(catch_interrupt_assertion_call(Call),InterruptResult), | |
36 | (InterruptResult=interrupted -> print(' **KeyboardInterrupt**'),nl ; true), | |
37 | print(interruptable_call(Call,InterruptResult)),nl. | |
38 |