An expression evaluation that may requested as:
status = x1f4_link_expression(expression, output);
See x1f4_link_expression.
may be sequenced as:
/* the sequenced evaluation context */
void *slip;
/* create the sequenced evaluation context */
status = x1f4_head_expression(expression, &slip);
if (status) {
} else {
int excess, slipping;
while (1) {
struct x1f4_transfer_type transfer;
/* evaluate expression until error, function call or completion */
/*
* the 4th argument is supposed to indicate the number of function
* calls for which the evaluation is _not_ to be sequenced
*/
status = x1f4_slip_expression
(expression, slip, 0, &slipping, output, &transfer);
if (status) {
/*
* the error case, interrupt
*/
break;
} else {
/* _slipping_ selects function call or completion */
if (slipping) {
/*
* function call - need to evaluate function
*/
/*
* _transfer_ records all the information for the
* sequenced function call: the function itself, the input,
* output, and the eventual function specific execution
* context
*/
if (transfer.function_data->flags & X1f4_E4_TEXT_LINK) {
status = transfer.function_data->function
(transfer.context, transfer.output,
transfer.input);
} else {
status = transfer.function_data->function
(NULL, transfer.output, transfer.input);
}
if (status) {
break;
}
} else {
/*
* expression evaluation completed, output is in _output_
*/
break;
}
}
}
/* destroy the sequenced evaluation context */
excess = x1f4_tail_expression(expression, &slip);
if (excess) {
if (status) {
} else {
status = excess;
}
}
}
See Per Function Execution Context.
See Function Flags.
See x1f4_head_expression.
See x1f4_slip_expression.
See x1f4_tail_expression.