#ifndef _fail_
#define _fail_


#include <setjmp.h>
#include "misc.h"
#include "mlvalues.h"

#define OUT_OF_MEMORY_EXN 0     /* "exc","Out_of_memory",1 */
#define SYS_ERROR_EXN 1         /* "sys","Sys_error",1 */
#define FAILURE_EXN 2           /* "exc","Failure",3 */
#define INVALID_EXN 3           /* "exc","Invalid_argument",2 */
#define END_OF_FILE_EXN 4       /* "io","End_of_file",1 */
#define ZERO_DIVIDE_EXN 5       /* "int","Division_by_zero",1 */
#define BREAK_EXN 6             /* "sys","Break",2 */
#define NOT_FOUND_EXN 7         /* "exc","Not_found",4 */
#define UNIX_ERROR_EXN 8        /* "unix","Unix_error",1 */
#define GRAPHIC_FAILURE_EXN 9   /* "graphics","Graphic_failure",1 */
#define PARSE_FAILURE_EXN 10    /* "stream","Parse_failure",1 */

/* Additional predefined exceptions for Moscow ML */

#define SMLEXN_EXCEPTION 11     /* "general","Exception",1 */
#define SMLEXN_BIND      12     /* "general","Bind",2 */
#define SMLEXN_CHR       13     /* "general","Chr",3 */
#define SMLEXN_DIV       14     /* "general","Div",4 */
#define SMLEXN_DOMAIN    15     /* "general","Domain",5 */
#define SMLEXN_MATCH     16     /* "general","Match",6 */
#define SMLEXN_ORD       17     /* "general","Ord",7 */
#define SMLEXN_OVF       18     /* "general","Overflow",8 */

/* End of Moscow ML exceptions */

struct longjmp_buffer {
  jmp_buf buf;
};

extern struct longjmp_buffer * external_raise;
extern value exn_bucket;

Noreturn mlraise P((value));
Noreturn raise_with_arg P((tag_t tag, value arg));
Noreturn raise_with_string P((tag_t tag, char * msg));
Noreturn failwith P((char *));
extern volatile unsigned char float_exn;
Noreturn invalid_argument P((char *));
Noreturn raise_out_of_memory P((void));
extern double maxdouble;

#endif /* _fail_ */
