Changed uiprivProgrammerError() to use format strings directly, so errors can be more easily caught. We'll make things even more robust when I change the programmer error macros to be functions.
This commit is contained in:
parent
671c2031bf
commit
623575f25a
|
@ -22,33 +22,6 @@ void uiprivInternalError(const char *fmt, ...)
|
||||||
uiprivReportError(internalErrorPrefix, buf, internalErrorSuffix, true);
|
uiprivReportError(internalErrorPrefix, buf, internalErrorSuffix, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *messages[uiprivNumProgrammerErrors] = {
|
|
||||||
[uiprivProgrammerErrorNotInitialized] = "attempt to call %s() before uiInit()",
|
|
||||||
[uiprivProgrammerErrorWrongThread] = "attempt to call %s() on a thread other than the GUI thread",
|
|
||||||
[uiprivProgrammerErrorWrongStructSize] = "wrong size %" uiprivSizetPrintf " for %s",
|
|
||||||
[uiprivProgrammerErrorIndexOutOfRange] = "index %d out of range in %s()",
|
|
||||||
[uiprivProgrammerErrorNullPointer] = "invalid null pointer for %s passed into %s()",
|
|
||||||
[uiprivProgrammerErrorIntIDNotFound] = "%s identifier %d not found in %s()",
|
|
||||||
[uiprivProgrammerErrorBadSenderForEvent] = "attempt to use a %s sender with a %s event in %s()",
|
|
||||||
[uiprivProgrammerErrorChangingEventDuringFire] = "attempt to change a uiEvent with %s() while it is firing",
|
|
||||||
[uiprivProgrammerErrorRecursiveEventFire] = "attempt to fire a uiEvent while it is already being fired",
|
|
||||||
};
|
|
||||||
|
|
||||||
static void prepareProgrammerError(char *buf, int size, unsigned int which, va_list ap)
|
|
||||||
{
|
|
||||||
int n;
|
|
||||||
|
|
||||||
if (which >= uiprivNumProgrammerErrors)
|
|
||||||
uiprivInternalError("bad programmer error value %u", which);
|
|
||||||
if (messages[which] == NULL)
|
|
||||||
uiprivInternalError("programmer error %u has no message", which);
|
|
||||||
n = uiprivVsnprintf(buf, size, messages[which], ap);
|
|
||||||
if (n < 0)
|
|
||||||
uiprivInternalError("programmer error string for %u has encoding error", which);
|
|
||||||
if (n >= size)
|
|
||||||
uiprivInternalError("programmer error string for %u too long (%d)", which, n);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define programmerErrorPrefix "libui programmer error"
|
#define programmerErrorPrefix "libui programmer error"
|
||||||
// TODO add debugging advice?
|
// TODO add debugging advice?
|
||||||
#define programmerErrorSuffix "This likely means you are using libui incorrectly. Check your source code and try again. If you have received this warning in error, contact the libui authors."
|
#define programmerErrorSuffix "This likely means you are using libui incorrectly. Check your source code and try again. If you have received this warning in error, contact the libui authors."
|
||||||
|
@ -62,13 +35,18 @@ void uiprivTestHookReportProgrammerError(uiprivTestHookReportProgrammerErrorFunc
|
||||||
reportProgrammerErrorTestHook = f;
|
reportProgrammerErrorTestHook = f;
|
||||||
}
|
}
|
||||||
|
|
||||||
void uiprivProgrammerError(unsigned int which, ...)
|
void uiprivProgrammerError(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
int n;
|
||||||
char buf[256];
|
char buf[256];
|
||||||
|
|
||||||
va_start(ap, which);
|
va_start(ap, fmt);
|
||||||
prepareProgrammerError(buf, 256, which, ap);
|
n = uiprivVsnprintf(buf, 256, fmt, ap);
|
||||||
|
if (n < 0)
|
||||||
|
uiprivInternalError("programmer error has encoding error");
|
||||||
|
if (n >= 256)
|
||||||
|
uiprivInternalError("programmer error string too long (%d)", n);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
(*reportProgrammerErrorTestHook)(programmerErrorPrefix, buf, programmerErrorSuffix, false);
|
(*reportProgrammerErrorTestHook)(programmerErrorPrefix, buf, programmerErrorSuffix, false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,21 +60,20 @@ extern bool uiprivSysCheckThread(void);
|
||||||
uiprivPrintfFunc(
|
uiprivPrintfFunc(
|
||||||
extern void uiprivInternalError(const char *fmt, ...),
|
extern void uiprivInternalError(const char *fmt, ...),
|
||||||
1, 2);
|
1, 2);
|
||||||
enum {
|
// TODO turn each of these into function-like macros
|
||||||
uiprivProgrammerErrorNotInitialized, // arguments: uiprivFunc
|
#define uiprivProgrammerErrorNotInitialized "attempt to call %s() before uiInit()" // arguments: uiprivFunc
|
||||||
uiprivProgrammerErrorWrongThread, // arguments: uiprivFunc
|
#define uiprivProgrammerErrorWrongThread "attempt to call %s() on a thread other than the GUI thread" // arguments: uiprivFunc
|
||||||
uiprivProgrammerErrorWrongStructSize, // arguments: size_t badSize, const char *structName
|
#define uiprivProgrammerErrorWrongStructSize "wrong size %" uiprivSizetPrintf " for %s" // arguments: size_t badSize, const char *structName
|
||||||
uiprivProgrammerErrorIndexOutOfRange, // arguments: int badIndex, uiprivFunc
|
#define uiprivProgrammerErrorIndexOutOfRange "index %d out of range in %s()" // arguments: int badIndex, uiprivFunc
|
||||||
uiprivProgrammerErrorNullPointer, // arguments: const char *paramDesc, uiprivFunc
|
#define uiprivProgrammerErrorNullPointer "invalid null pointer for %s passed into %s()" // arguments: const char *paramDesc, uiprivFunc
|
||||||
uiprivProgrammerErrorIntIDNotFound, // arguments: const char *idDesc, int badID, uiprivFunc
|
#define uiprivProgrammerErrorIntIDNotFound "%s identifier %d not found in %s()" // arguments: const char *idDesc, int badID, uiprivFunc
|
||||||
// TODO type mismatch
|
// TODO type mismatch
|
||||||
uiprivProgrammerErrorBadSenderForEvent, // arguments: const char *senderDesc, const char *eventDesc, uiprivFunc
|
#define uiprivProgrammerErrorBadSenderForEvent "attempt to use a %s sender with a %s event in %s()" // arguments: const char *senderDesc, const char *eventDesc, uiprivFunc
|
||||||
uiprivProgrammerErrorChangingEventDuringFire, // arguments: uiprivFunc
|
#define uiprivProgrammerErrorChangingEventDuringFire "attempt to change a uiEvent with %s() while it is firing" // arguments: uiprivFunc
|
||||||
uiprivProgrammerErrorRecursiveEventFire, // no arguments
|
#define uiprivProgrammerErrorRecursiveEventFire "attempt to fire a uiEvent while it is already being fired" // no arguments
|
||||||
uiprivNumProgrammerErrors,
|
uiprivPrintfFunc(
|
||||||
};
|
extern void uiprivProgrammerError(const char *fmt, ...),
|
||||||
// TODO drop the enum and make the above all format strings
|
1, 2);
|
||||||
extern void uiprivProgrammerError(unsigned int which, ...);
|
|
||||||
extern void uiprivReportError(const char *prefix, const char *msg, const char *suffix, bool internal);
|
extern void uiprivReportError(const char *prefix, const char *msg, const char *suffix, bool internal);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
Loading…
Reference in New Issue