DEFINITION MODULE EXCEPTIONS;

 (*
  *  Provides facilities for raising user exceptions
  *  and for making enquiries concerning the current execution state.
  *)

  TYPE ExceptionSource;		(* values of this type are used within
				   library modules to identify the source
				   of raised exceptions			*)
  ExceptionNumber = CARDINAL;


  PROCEDURE AllocateSource(VAR newSource : ExceptionSource);
    (* Allocates a unique value of type ExceptionSource *)

  PROCEDURE RAISE(source : ExceptionSource; number : ExceptionNumber;
		  message : ARRAY OF CHAR);
    (* Associates the given values of source, number and message with
     * the current context and raises an exception	*)

  PROCEDURE CurrentNumber(source : ExceptionSource) : ExceptionNumber;
    (* If the current coroutine is in the exceptional execution state *
     * because of the raising of an exception from source, return the *
     * corresponding number, and otherwise raises an exception        *)

  PROCEDURE GetMessage(VAR text : ARRAY OF CHAR);
    (* If the current coroutine is in the exceptional execution state *
     * returns the possibly truncated string associated with the      *
     * current context, otherwise in normal execution state returns   *
     * the empty string						      *)

  PROCEDURE IsCurrentSource(source : ExceptionSource) : BOOLEAN;
    (* If the current coroutine is in the exceptional execution state *
     * because of the raising of an exception from source,            *
     * returns TRUE, and otherwise returns FALSE		      *)

  PROCEDURE IsExceptionalExecution() : BOOLEAN;
    (* If the current coroutine is in the exceptional execution state *
     * because of the raising of an exception, returns TRUE and       *
     * otherwise returns FALSE					      *)

END EXCEPTIONS.
