Changing Prolog's Control Flow from C

If the application has a toplevel, the function QP_action() can be called from C to alter Prolog's flow of control. This function allows the user to make Prolog abort, exit, suspend execution, turn on debugging, or prompt for the desired action. To use it, use #include <quintus/quintus.h> in your C source code. This file should be installed in a central place; if not, there should be a copy of it in the embed directory (refer to int-dir for location). quintus.h defines the following constants:


QP_ABORT
*Abort to the current break level
QP_REALLY_ABORT
*Abort to top level
QP_STOP
Stop (suspend) process
QP_IGNORE
Do nothing
QP_EXIT
Exit Prolog immediately
QP_MENU
Present action menu
QP_TRACE
Turn on trace mode
QP_DEBUG
Turn on debugging

To change Prolog's control flow in a given instance, call QP_action() with one of these constants; for example,

     #include <quintus/quintus.h>
     void abort_execution(){
         QP_action(QP_ABORT);
     }
     

Some calls to QP_action() do not normally return, for example when the QP_ABORT constant is specified. However, calls to QP_action() from an interrupt handler must be viewed as requests. They are requests that will definitely be honored, but not always at the time of the call to QP_action(). Therefore calls to QP_action() should be prepared for the function to return.

It is currently not possible to call Prolog from an interrupt handler.

For systems that do not have a toplevel, the actions marked with an asterisk will have no effect other than to make QP_action() return QP_ERROR.

What does it mean to have a toplevel? If the application is calling the function QP_toplevel(), then the application has a toplevel. The development system and runtime systems both call QP_toplevel(). An exit from either of these environments is effectively a return from QP_toplevel(). An embedded application may or may not call QP_toplevel(). One of the things QP_toplevel() does is establish signal handlers. Another thing it does is establish a place for QP_action() to jump to, the actions marked with an asterik are essentially a jump to the toplevel, and will not work in systems without a toplevel. For more about QP_toplevel(), see cfu-ref-toplevel.