#include #include #include #include #include #ifdef HAVE_GLIB #include #endif #ifdef DEBUG #include #endif #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "String.h" #include "Exceptions.h" #include "generic.h" #include "gettext.h" char GeneralException::t[BUFSIZ]; GeneralException::GeneralException(String emsg) : msg(emsg.strdup()) { #ifdef DEBUG std::cerr << _("Generating a General Exception error: '") << msg << "'.\n"; #endif } GeneralException::GeneralException() : msg(0) { #ifdef DEBUG std::cerr << _("Generating a General Exception error: '") << msg << "'.\n"; #endif } GeneralException::GeneralException(const GeneralException & e) : msg(strdup(e.msg)) { #ifdef DEBUG std::cerr << _("Generating a General Exception error: '") << msg << "'.\n"; #endif } GeneralException::~GeneralException() { free(msg); } TaskNotFound::TaskNotFound() : GeneralException("Task not found") { } const char * GeneralException::GetMsg() const { return msg; } MemoryException::MemoryException(ssize_t s) { sprintf(t, _("Failed allocating %u bytes."), s); msg = strdup(t); } IOException::IOException(String fn, op_t op, ssize_t s) { sprintf(t, _("An error has occured while %s %u bytes on %s: %s"), op == IO_WRITE ? _("writing") : _("reading"), s, fn.to_charp(), strerror(errno)); msg = strdup(t); } IOGeneral::IOGeneral(String fn) : GeneralException(fn) { } IOGeneral::IOGeneral() { } IOAgain::IOAgain() : IOGeneral(_("No more bytes for reading or writing.")) { #ifdef DEBUG std::cerr << "Generating an IOAgain exception: '" << GetMsg() << "'.\n"; #endif } TaskSwitch::TaskSwitch() : GeneralException(_("Switching task in a non-tasked environnement")) { #ifdef DEBUG std::cerr << "Generating a TaskSwitch exception: '" << GetMsg() << "'.\n"; #endif } Exit::Exit(int a_code) : GeneralException(_("Exitting with code " + a_code)), code(a_code) { #ifdef DEBUG std::cerr << "Generating an Exit exception: '" << GetMsg() << "'.\n"; #endif } int Exit::GetCode() { return code; } char * xstrdup(const char * s) { char * r; r = (char *) xmalloc(strlen(s) + 1); strcpy(r, s); return r; } void * xmalloc(size_t s) throw (GeneralException) { char * r; if (s == 0) { return 0; } if (!(r = (char *) ::malloc(s))) { throw MemoryException(s); } #ifdef DEBUG fprintf(stderr, "Allocating %i bytes of memory, got it at %p\n", s, r); #endif memset(r, 0, s); return (void *)(r); } void * xrealloc(void * ptr, size_t s) { #ifdef DEBUG void * r = realloc(ptr, s); fprintf(stderr, "Reallocating pointer at %p for %i bytes, now at %p\n", ptr, s, r); return r; #else return realloc(ptr, s); #endif } void xfree(unsigned char *& p) { xfree(((char *)p)); } void xfree(void *& p) { xfree(((char *)p)); } void xfree(char *& p) { #ifdef DEBUG fprintf(stderr, "Freeing pointer at %p\n", p); #endif if (p) { ::free(p); p = 0; } } int xpipe(int * p, int flag) throw (GeneralException) { if (pipe(p)) { throw GeneralException(String(_("Error creating pipe: ")) + strerror(errno)); } return p[flag]; } pid_t xfork() throw (GeneralException) { pid_t p; p = fork(); if (p == -1) { throw GeneralException(_("Was not able to fork().\n")); } return p; } void xexit(int status) throw (GeneralException) { throw Exit(status); } char * Base::strdup(const char * s) { return xstrdup(s); } void * Base::malloc(ssize_t s) { return xmalloc(s); } void * Base::realloc(void * p, size_t s) { return xrealloc(p, s); } void * Base::calloc(size_t n, size_t s) { return xmalloc(n * s); } void * Base::operator new(size_t s) { #ifdef DEBUG cerr << "Operator new(s) called. Allocating memory.\n"; #endif return xmalloc(s); } void * Base::operator new(size_t s, void * p) { #ifdef DEBUG printm(M_BARE, "Operator new(s, p) called with p = %p and s = %i. Erasing memory.\n", p, s); #endif return memset(p, 0, s); } void Base::operator delete(void * p) { #ifdef DEBUG printm(M_BARE, "Operator delete(p) called. Freeing memory.\n"); #endif xfree(p); } void Base::free(void *& p) { xfree(p); } void Base::free(char *& p) { xfree(p); } void Base::free(unsigned char *& p) { xfree(p); } int Base::pipe(int * p, int flag) { return xpipe(p, flag); } pid_t Base::fork() { return xfork(); } void Base::exit(int status) { xexit(status); }