/* $Header: pd:zvmrcs/callback.c,v 1.1 1993/04/07 18:47:36 rvillari Exp $ */
#include <stdlib.h>

#include "callback_proto.h"

/* EXPORTS */
struct CallBack initCallBack; /* this is just an initialization */

void deleteCallBack(struct CallBack* cb) {
  cb->numCallBacks--;
}

void addCallBack(struct CallBack* cb, ULONG match, enum ReturnStatus (*function)(void)) {
  int count = cb->numCallBacks;
  /* need some safety here */
  if (count == 5) exit(20);
  

  cb->signalMatch[count] = match;
  cb->functionPtr[count] = function;

  cb->numCallBacks++;
}

enum ReturnStatus processCallBack(struct CallBack* cb, ULONG signalsReceived) {
  int i;
  enum ReturnStatus status;

  for (i = 0; i < cb->numCallBacks; i++) {
    if (signalsReceived & cb->signalMatch[i]) {
      SetSignal(0L, cb->signalMatch[i]);
      status = cb->functionPtr[i]();
      if (status != Normal) return status;
    }
  }
  return Normal;
}

ULONG callBackSignals(struct CallBack* cb) {
  ULONG signals = 0L;
  int i;

  for (i = 0; i < cb->numCallBacks; i++)
    signals |= cb->signalMatch[i];

  return signals;
}

