|
|
@ -58,124 +58,109 @@ |
|
|
|
// GlobalError::GlobalError - Constructor /*{{{*/
|
|
|
|
GlobalError::GlobalError() : PendingFlag(false) {} |
|
|
|
/*}}}*/ |
|
|
|
// GlobalError::FatalE - Get part of the error string from errno /*{{{*/
|
|
|
|
bool GlobalError::FatalE(const char *Function,const char *Description,...) { |
|
|
|
va_list args; |
|
|
|
va_start(args,Description); |
|
|
|
return InsertErrno(FATAL, Function, Description, args); |
|
|
|
} |
|
|
|
/*}}}*/ |
|
|
|
// GlobalError::Errno - Get part of the error string from errno /*{{{*/
|
|
|
|
bool GlobalError::Errno(const char *Function,const char *Description,...) { |
|
|
|
va_list args; |
|
|
|
va_start(args,Description); |
|
|
|
return InsertErrno(ERROR, Function, Description, args); |
|
|
|
} |
|
|
|
/*}}}*/ |
|
|
|
// GlobalError::WarningE - Get part of the warning string from errno /*{{{*/
|
|
|
|
bool GlobalError::WarningE(const char *Function,const char *Description,...) { |
|
|
|
va_list args; |
|
|
|
va_start(args,Description); |
|
|
|
return InsertErrno(WARNING, Function, Description, args); |
|
|
|
} |
|
|
|
/*}}}*/ |
|
|
|
// GlobalError::NoticeE - Get part of the notice string from errno /*{{{*/
|
|
|
|
bool GlobalError::NoticeE(const char *Function,const char *Description,...) { |
|
|
|
va_list args; |
|
|
|
va_start(args,Description); |
|
|
|
return InsertErrno(NOTICE, Function, Description, args); |
|
|
|
} |
|
|
|
/*}}}*/ |
|
|
|
// GlobalError::DebugE - Get part of the debug string from errno /*{{{*/
|
|
|
|
bool GlobalError::DebugE(const char *Function,const char *Description,...) { |
|
|
|
va_list args; |
|
|
|
va_start(args,Description); |
|
|
|
return InsertErrno(DEBUG, Function, Description, args); |
|
|
|
// GlobalError::FatalE, Errno, WarningE, NoticeE and DebugE - Add to the list/*{{{*/
|
|
|
|
#define GEMessage(NAME, TYPE) \ |
|
|
|
bool GlobalError::NAME (const char *Function, const char *Description,...) { \ |
|
|
|
va_list args; \ |
|
|
|
size_t msgSize = 400; \ |
|
|
|
int const errsv = errno; \ |
|
|
|
while (true) { \ |
|
|
|
va_start(args,Description); \ |
|
|
|
if (InsertErrno(TYPE, Function, Description, args, errsv, msgSize) == false) \ |
|
|
|
break; \ |
|
|
|
va_end(args); \ |
|
|
|
} \ |
|
|
|
return false; \ |
|
|
|
} |
|
|
|
GEMessage(FatalE, FATAL) |
|
|
|
GEMessage(Errno, ERROR) |
|
|
|
GEMessage(WarningE, WARNING) |
|
|
|
GEMessage(NoticeE, NOTICE) |
|
|
|
GEMessage(DebugE, DEBUG) |
|
|
|
#undef GEMessage |
|
|
|
/*}}}*/ |
|
|
|
// GlobalError::InsertErrno - Get part of the errortype string from errno/*{{{*/
|
|
|
|
bool GlobalError::InsertErrno(MsgType const &type, const char *Function, |
|
|
|
const char *Description,...) { |
|
|
|
va_list args; |
|
|
|
va_start(args,Description); |
|
|
|
return InsertErrno(type, Function, Description, args); |
|
|
|
size_t msgSize = 400; |
|
|
|
int const errsv = errno; |
|
|
|
while (true) { |
|
|
|
va_start(args,Description); |
|
|
|
if (InsertErrno(type, Function, Description, args, errsv, msgSize) == false) |
|
|
|
break; |
|
|
|
va_end(args); |
|
|
|
} |
|
|
|
return false; |
|
|
|
} |
|
|
|
/*}}}*/ |
|
|
|
// GlobalError::InsertErrno - formats an error message with the errno /*{{{*/
|
|
|
|
bool GlobalError::InsertErrno(MsgType type, const char* Function, |
|
|
|
const char* Description, va_list &args) { |
|
|
|
int const errsv = errno; |
|
|
|
char* S = (char*) malloc(400); |
|
|
|
size_t const Ssize = snprintf(S, 400, "%s - %s (%i: %s)", Description, |
|
|
|
Function, errsv, strerror(errsv)) + 1; |
|
|
|
|
|
|
|
if (Ssize > 400) { |
|
|
|
free(S); |
|
|
|
S = (char*) malloc(Ssize); |
|
|
|
snprintf(S, Ssize, "%s - %s (%i: %s)", Description, |
|
|
|
Function, errsv, strerror(errsv)); |
|
|
|
const char* Description, va_list &args, |
|
|
|
int const errsv, size_t &msgSize) { |
|
|
|
char* S = (char*) malloc(msgSize); |
|
|
|
int const n = snprintf(S, msgSize, "%s - %s (%i: %s)", Description, |
|
|
|
Function, errsv, strerror(errsv)); |
|
|
|
if (n > -1 && ((unsigned int) n) < msgSize); |
|
|
|
else { |
|
|
|
if (n > -1) |
|
|
|
msgSize = n + 1; |
|
|
|
else |
|
|
|
msgSize *= 2; |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
bool const geins = Insert(type, S, args); |
|
|
|
bool const geins = Insert(type, S, args, msgSize); |
|
|
|
free(S); |
|
|
|
return geins; |
|
|
|
} |
|
|
|
/*}}}*/ |
|
|
|
// GlobalError::Fatal - Add a fatal error to the list /*{{{*/
|
|
|
|
bool GlobalError::Fatal(const char *Description,...) { |
|
|
|
va_list args; |
|
|
|
va_start(args,Description); |
|
|
|
return Insert(FATAL, Description, args); |
|
|
|
} |
|
|
|
/*}}}*/ |
|
|
|
// GlobalError::Error - Add an error to the list /*{{{*/
|
|
|
|
bool GlobalError::Error(const char *Description,...) { |
|
|
|
va_list args; |
|
|
|
va_start(args,Description); |
|
|
|
return Insert(ERROR, Description, args); |
|
|
|
} |
|
|
|
/*}}}*/ |
|
|
|
// GlobalError::Warning - Add a warning to the list /*{{{*/
|
|
|
|
bool GlobalError::Warning(const char *Description,...) { |
|
|
|
va_list args; |
|
|
|
va_start(args,Description); |
|
|
|
return Insert(WARNING, Description, args); |
|
|
|
} |
|
|
|
/*}}}*/ |
|
|
|
// GlobalError::Notice - Add a notice to the list /*{{{*/
|
|
|
|
bool GlobalError::Notice(const char *Description,...) |
|
|
|
{ |
|
|
|
va_list args; |
|
|
|
va_start(args,Description); |
|
|
|
return Insert(NOTICE, Description, args); |
|
|
|
} |
|
|
|
/*}}}*/ |
|
|
|
// GlobalError::Debug - Add a debug to the list /*{{{*/
|
|
|
|
bool GlobalError::Debug(const char *Description,...) |
|
|
|
{ |
|
|
|
va_list args; |
|
|
|
va_start(args,Description); |
|
|
|
return Insert(DEBUG, Description, args); |
|
|
|
// GlobalError::Fatal, Error, Warning, Notice and Debug - Add to the list/*{{{*/
|
|
|
|
#define GEMessage(NAME, TYPE) \ |
|
|
|
bool GlobalError::NAME (const char *Description,...) { \ |
|
|
|
va_list args; \ |
|
|
|
size_t msgSize = 400; \ |
|
|
|
while (true) { \ |
|
|
|
va_start(args,Description); \ |
|
|
|
if (Insert(TYPE, Description, args, msgSize) == false) \ |
|
|
|
break; \ |
|
|
|
va_end(args); \ |
|
|
|
} \ |
|
|
|
return false; \ |
|
|
|
} |
|
|
|
GEMessage(Fatal, FATAL) |
|
|
|
GEMessage(Error, ERROR) |
|
|
|
GEMessage(Warning, WARNING) |
|
|
|
GEMessage(Notice, NOTICE) |
|
|
|
GEMessage(Debug, DEBUG) |
|
|
|
#undef GEMessage |
|
|
|
/*}}}*/ |
|
|
|
// GlobalError::Insert - Add a errotype message to the list /*{{{*/
|
|
|
|
bool GlobalError::Insert(MsgType const &type, const char *Description,...) |
|
|
|
{ |
|
|
|
va_list args; |
|
|
|
va_start(args,Description); |
|
|
|
return Insert(type, Description, args); |
|
|
|
size_t msgSize = 400; |
|
|
|
while (true) { |
|
|
|
va_start(args,Description); |
|
|
|
if (Insert(type, Description, args, msgSize) == false) |
|
|
|
break; |
|
|
|
va_end(args); |
|
|
|
} |
|
|
|
return false; |
|
|
|
} |
|
|
|
/*}}}*/ |
|
|
|
// GlobalError::Insert - Insert a new item at the end /*{{{*/
|
|
|
|
bool GlobalError::Insert(MsgType type, const char* Description, |
|
|
|
va_list &args) { |
|
|
|
char* S = (char*) malloc(400); |
|
|
|
size_t const Ssize = vsnprintf(S, 400, Description, args) + 1; |
|
|
|
|
|
|
|
if (Ssize > 400) { |
|
|
|
free(S); |
|
|
|
S = (char*) malloc(Ssize); |
|
|
|
vsnprintf(S, Ssize, Description, args); |
|
|
|
va_list &args, size_t &msgSize) { |
|
|
|
char* S = (char*) malloc(msgSize); |
|
|
|
int const n = vsnprintf(S, msgSize, Description, args); |
|
|
|
if (n > -1 && ((unsigned int) n) < msgSize); |
|
|
|
else { |
|
|
|
if (n > -1) |
|
|
|
msgSize = n + 1; |
|
|
|
else |
|
|
|
msgSize *= 2; |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
Item const m(S, type); |
|
|
|