#include #include #include #include #include #include "config.h" #include "String.h" #include "Exceptions.h" char GeneralException::t[BUFSIZ]; char * Base::strdup(const char * s) const { return xstrdup(s); } void * Base::malloc(ssize_t s) const { return xmalloc(s); } void * Base::operator new(size_t s) { return memset(xmalloc(s), 0, s); } void * Base::operator new(size_t s, void * p) { memset(p, 0, s); return p; } GeneralException::GeneralException(String emsg) : msg(emsg.strdup()) { } GeneralException::GeneralException() : msg(0) { } GeneralException::GeneralException(const GeneralException & e) : msg(strdup(e.msg)) { } GeneralException::~GeneralException() { free(msg); } char * GeneralException::GetMsg() { return msg; } MemoryException::MemoryException(ssize_t s) { sprintf(t, _("Failed allocating %lld bytes."), s); msg = strdup(t); } IOException::IOException(String fn, op_t op, ssize_t s) { sprintf(t, _("An error has occured while %s %lld bytes from %s: %s"), op == IO_WRITE ? _("writing") : _("reading"), s, fn.to_charp(), strerror(errno)); msg = strdup(t); } IOInternal::IOInternal(String fn, op_t op) { sprintf(t, _("Internal error: has occured while %s from %s: open for %s."), op == IO_WRITE ? _("writing") : _("reading"), fn.to_charp(), op == IO_WRITE ? _("reading") : _("writing")); msg = strdup(t); } IOGeneral::IOGeneral(String fn) : GeneralException(fn) { } char * xstrdup(const char * s) throw (MemoryException) { char * r; if (!(r = ::strdup(s))) { throw MemoryException(strlen(s + 1)); } return r; } void * xmalloc(ssize_t s) throw (MemoryException) { void * r; if (!(r = ::malloc(s))) { throw MemoryException(s); } return r; } #undef free void xfree(void *& p) { if (p) { ::free(p); p = 0; } }