#ifndef G__EXCEPTION_H
#define G__EXCEPTION_H

//namespace std {

class exception;
class bad_exception;
typedef void (*unexpected_handler)();
unexpected_handler set_unexpected(unexpected_handler f) /* throw() */ ;
void unexpected();
typedef void (*terminate_handler)();
terminate_handler set_terminate(terminate_handler f) /* throw() */ ;
void terminate();
bool uncaught_exception();

/////////////////////////////////////////////////////////////////////////
class exception {
 public:
  exception() /* throw() */ { msg=0; }
  exception(const exception& x) /* throw() */ {
    if(x.msg) {
      msg = new char[strlen(x.msg)+1];
      strcpy(msg,x.msg);
    }
    else msg = 0;
  }
  exception& operator=(const exception& x) /* throw() */ {
    delete[] msg;
    if(x.msg) {
      msg = new char[strlen(x.msg)+1];
      strcpy(msg,x.msg);
    }
    else msg = 0;
  }
  virtual ~exception() /* throw() */ { delete[] msg; }
  virtual const char* what() const /* throw() */{return(msg);}

  exception(const char* msgin) { 
    msg = new char[strlen(msgin)+1];
    strcpy(msg,msgin);
  }
 private:
  char* msg;
};

/////////////////////////////////////////////////////////////////////////
class bad_exception : public exception {
 public:
  bad_exception() /* throw() */ {}
  bad_exception(const bad_exception&) /* throw() */ {}
  bad_exception& operator=(const bad_exception&) /* throw() */ {}
  virtual ~bad_exception() /* throw() */ {}
  virtual const char* what() const /* throw() */ {return("Unknown bad_exception");} 
};

#ifdef __MAKECINT__

#pragma link off class exception;
#pragma link off class bad_exception;
#pragma link off function set_unexpected;
#pragma link off function unexpected;
#pragma link off function set_terminate;
#pragma link off function terminate;
#pragma link off function uncaught_exception;
#pragma link off typedef bool;

#endif

//}

#endif
