/* * * Gestionnaire d'exceptions * */ #include #include #include #ifdef HAVE_CONFIG_H #include "config.h" #else #define _(x) x #endif #include "exceptions.h" char *contexts[128]; int clevel = 0; char *Estrdup(char *o) { char *r; if (o) { if (!(r = strdup(o))) { exception(1, _("Out of memory.")); } } else { return NULL; } return r; } void *Emalloc(size_t s) { void *r; if (s) { if (!(r = malloc(s))) { exception(1, _("Out of memory.")); } } else { return NULL; } return r; } void pushcontext(char *c) { if (clevel == 128) { exception(1, _("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(1, _("Error context empty, but popcontext() called.")); } free(contexts[--clevel]); } void flushcontext(void) { while (clevel) { popcontext(); } } void exception(int level, char *msg) { int i; fprintf(stderr, "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); exit(level); }