/* * * Gestionnaire d'exceptions * */ #include #include #include #ifdef HAVE_CONFIG_H #include "config.h" #else #define _(x) x #endif #include "exceptions.h" #include "pile.h" #include "terminal.h" char *contexts[128]; int clevel = 0; int global_error = 0; /* Les fonctions strdup et malloc sont réécrites ici afin de simplifier la vie en cas d'erreur. */ char *Estrdup(char *o) { char *r; if (o) { if (!(r = strdup(o))) { exception(2, _("Out of memory.")); } } else { return NULL; } return r; } void *Emalloc(size_t s) { void *r; if (s) { if (!(r = malloc(s))) { exception(2, _("Out of memory.")); } } else { return NULL; } return r; } /* Les routines de manipulation de la pile de contexte d'erreurs */ void pushcontext(char *c) { if (clevel == 128) { exception(2, _("Too much error contexts during pushcontext().")); } contexts[clevel++] = Estrdup(c); #ifdef DEBUG fprintf(stderr, "%s\n", c); #endif } void popcontext(void) { if (clevel == 0) { exception(2, _("Error context empty, but popcontext() called.")); } free(contexts[--clevel]); } void flushcontext(void) { while (clevel) { popcontext(); } } /* exception avec level=1 pour une erreur non fatale avec vidage de la pile sinon pour toutre valeur de level erreur avec terminaison du programme */ void exception(int level, char *msg) { int i; switch (level) { case 1: fprintf(stderr, _("Non-fatal error detected. Showing context.\n")); for (i = 0; i < clevel; i++) { fprintf(stderr, " (%i) - %s\n", i, contexts[i]); } fprintf(stderr, _(" Error description: %s\n"), msg); flush_pile(); global_error = 1; break; default: fprintf(stderr, _("Fatal error detected. Showing context.\n")); for (i = 0; i < clevel; i++) { fprintf(stderr, " (%i) - %s\n", i, contexts[i]); } fprintf(stderr, _(" Error description: %s\n"), msg); clearterm(); exit(1); break; } }