Listing 4 A callback function

void *stack[STACK_SIZE];
void **sp = stack;

void gc_cb(excCallbackTag tag,
         void *cb_data,
         void **try_data)
{
  switch (tag) {
  case excBeginCallback:
    *try_data = sp;
    break;
  
  case excEndCallback:
  case excThrowCallback:
    if (try_data) sp =
       (void **) *try_data;
    else sp = stack;
    break;
  
  default:
    break;
  }
}

exc_install_callback(excBeginCallback
       | excEndCallback
    | excThrowCallback, gc_cb, NULL);

/* End of File */