#ifndef __EXCEPTIONS_H__ #define __EXCEPTIONS_H__ #ifdef __cplusplus #include <stdio.h> #include <unistd.h> #include <stddef.h> #include <string.h> /* * G�re les exceptions du syst�me. Le programme principal devrait tenter * de les r�cup�rer afin de les afficher. * GeneralExecption: exception de base. Construite sur une string. * MemoryException: plus assez de m�moire. Construit une string sur la taille m�moire * qui a fait d�faut. * IOException: erreur de lecture/�criture. Construite sur le nombre d'octets * et sur l'op�ration qui a g�n�r�e l'erreur. * IOGeneral: erreur g�n�rale sur une op�ration IO (erreur � l'ouverture notemment) * IOInternal: erreur interne du programme. En particulier, le programme * a voulu lire ou �crire alors que le Handle n'�tait pas pr�vu pour. * * Nous d�finissons les fonctions xmalloc, xfree et xstrdup. Elles devraient �tre * utilis�es en lieu et place des fonctions malloc, free et strdup. La fonction realloc * �tant d�sapr�ci�e, elle n'est pas surcharg�e. */ // Impossible de surcharger free(void *). Les compilateurs // refuseront de passer un char * par exemple. #ifdef OVER_FREE #define free(p) xfree((void*)p) #else #include <stdlib.h> #endif class MemoryException; char * xstrdup(const char *) throw (MemoryException); void * xmalloc(ssize_t) throw (MemoryException); void xfree(void *&); void * xrealloc(void *, size_t) throw (MemoryException); // On pr�d�finit la classe String, pour �viter // les deadlocks de compilation... class String; class Base { public: char * strdup(const char * s) const { return xstrdup(s); } void * malloc(ssize_t s) const { return xmalloc(s); } void * realloc(void * p, size_t s) const { return xrealloc(p, s); } void * operator new(size_t s) { return xmalloc(s); } void * operator new(size_t s, void * p) { return memset(p, 0, s); } void operator delete(void * p) { xfree(p); } void free(void *& p) const { xfree(p); } void free(char *& p) const { xfree((void *) p); } }; class GeneralException : public Base { public: GeneralException(String); GeneralException(const GeneralException &); ~GeneralException(); char * GetMsg(); protected: GeneralException(); char * msg; static char t[BUFSIZ]; }; class MemoryException : public GeneralException { public: MemoryException(ssize_t); }; enum op_t { IO_WRITE = 1, IO_READ }; class IOGeneral : public GeneralException { public: IOGeneral(String); protected: IOGeneral(); }; class IOException : public IOGeneral { public: IOException(String, op_t, ssize_t); }; class IOAgain : public IOGeneral { public: IOAgain(); }; #else #error This only works with a C++ compiler #endif #endif