77 lines
3.5 KiB
C
77 lines
3.5 KiB
C
#ifndef __CUT_C_H__
|
|
#define __CUT_C_H__
|
|
|
|
/* Some definitions */
|
|
#define Choice_Point_Type void *
|
|
|
|
/* necessary for not redefine NULL*/
|
|
#ifndef NULL
|
|
#define NULL nil
|
|
#endif
|
|
|
|
typedef struct cut_c_str *cut_c_str_ptr;
|
|
struct cut_c_str {
|
|
cut_c_str_ptr before;
|
|
void *try_userc_cut_yamop;
|
|
};
|
|
|
|
#define CUT_C_STR_SIZE ((sizeof(struct cut_c_str)) / (sizeof(CELL)))
|
|
|
|
#define EXTRA_CBACK_CUT_ARG(Type, Offset) EXTRA_CBACK_ARG(PP->ArityOfPE, Offset)
|
|
|
|
#define CBACK_CUT_ARG(Offset) B->cp_args[(Offset)-1]
|
|
|
|
#define CUT_C_PUSH(YAMOP, S_YREG) \
|
|
{ \
|
|
if ((YAMOP)->y_u.OtapFs.f) { \
|
|
S_YREG = S_YREG - CUT_C_STR_SIZE; \
|
|
cut_c_str_ptr new_top = (cut_c_str_ptr)S_YREG; \
|
|
new_top->try_userc_cut_yamop = YAMOP; \
|
|
cut_c_push(new_top); \
|
|
} \
|
|
}
|
|
|
|
#define POP_CHOICE_POINT(cp) \
|
|
(((CELL *)Yap_REGS.CUT_C_TOP != (CELL *)LOCAL_LocalBase) && \
|
|
((CELL *)(cp) > (CELL *)Yap_REGS.CUT_C_TOP))
|
|
|
|
#define POP_EXECUTE() \
|
|
cut_c_str_ptr TOP = Yap_REGS.CUT_C_TOP; \
|
|
CPredicate func = \
|
|
(CPredicate)((yamop *)TOP->try_userc_cut_yamop)->y_u.OtapFs.f; \
|
|
PredEntry *pred = \
|
|
(PredEntry *)((yamop *)TOP->try_userc_cut_yamop)->y_u.OtapFs.p; \
|
|
YAP_ExecuteOnCut(pred, func, TOP); \
|
|
cut_c_pop();
|
|
|
|
#define POP_FAIL(handler) \
|
|
if (handler) { yamop *oap = handler->cp_ap; \
|
|
handler->cp_ap = NOCODE; \
|
|
P = (yamop *)FAILCODE; \
|
|
choiceptr olB = B; B = handler; \
|
|
HR = handler->cp_h; \
|
|
/* DBTerm *ref = Yap_RefToException(); */ \
|
|
Yap_exec_absmi(true, false); \
|
|
B = olB; handler->cp_ap = oap; }
|
|
|
|
#define POP_FAIL_EXECUTE(handler) \
|
|
POP_FAIL(handler); \
|
|
cut_c_str_ptr TOP = Yap_REGS.CUT_C_TOP; \
|
|
CPredicate func = \
|
|
(CPredicate)((yamop *)TOP->try_userc_cut_yamop)->y_u.OtapFs.f; \
|
|
PredEntry *pred = \
|
|
(PredEntry *)((yamop *)TOP->try_userc_cut_yamop)->y_u.OtapFs.p; \
|
|
YAP_ExecuteOnCut(pred, func, TOP); \
|
|
cut_c_pop();
|
|
|
|
/*Initializes CUT_C_TOP*/
|
|
void cut_c_initialize(int wid);
|
|
|
|
/*Removes a choice_point from the stack*/
|
|
void cut_c_pop(void);
|
|
|
|
/*Insert a choice_point in the stack*/
|
|
void cut_c_push(cut_c_str_ptr);
|
|
|
|
#endif /*_CUT_C_H__*/
|