#include "./SDL_internal.h"
#include "SDL_error.h"
#include "SDL_error_c.h"
int
SDL_SetError(SDL_PRINTF_FORMAT_STRING const char *fmt, ...)
{
if (fmt != NULL) {
va_list ap;
int result;
SDL_error *error = SDL_GetErrBuf();
error->error = 1;
va_start(ap, fmt);
result = SDL_vsnprintf(error->str, error->len, fmt, ap);
va_end(ap);
if (result >= 0 && (size_t)result >= error->len && error->realloc_func) {
size_t len = (size_t)result + 1;
char *str = (char *)error->realloc_func(error->str, len);
if (str) {
error->str = str;
error->len = len;
va_start(ap, fmt);
SDL_vsnprintf(error->str, error->len, fmt, ap);
va_end(ap);
}
}
if (SDL_LogGetPriority(SDL_LOG_CATEGORY_ERROR) <= SDL_LOG_PRIORITY_DEBUG) {
SDL_LogDebug(SDL_LOG_CATEGORY_ERROR, "%s", error->str);
}
}
return -1;
}
const char *
SDL_GetError(void)
{
const SDL_error *error = SDL_GetErrBuf();
return error->error ? error->str : "";
}
void
SDL_ClearError(void)
{
SDL_GetErrBuf()->error = 0;
}
int
SDL_Error(SDL_errorcode code)
{
switch (code) {
case SDL_ENOMEM:
return SDL_SetError("Out of memory");
case SDL_EFREAD:
return SDL_SetError("Error reading from datastream");
case SDL_EFWRITE:
return SDL_SetError("Error writing to datastream");
case SDL_EFSEEK:
return SDL_SetError("Error seeking in datastream");
case SDL_UNSUPPORTED:
return SDL_SetError("That operation is not supported");
default:
return SDL_SetError("Unknown SDL error");
}
}
#ifdef TEST_ERROR
int
main(int argc, char *argv[])
{
char buffer[BUFSIZ + 1];
SDL_SetError("Hi there!");
printf("Error 1: %s\n", SDL_GetError());
SDL_ClearError();
SDL_memset(buffer, '1', BUFSIZ);
buffer[BUFSIZ] = 0;
SDL_SetError("This is the error: %s (%f)", buffer, 1.0);
printf("Error 2: %s\n", SDL_GetError());
exit(0);
}
#endif
char *
SDL_GetErrorMsg(char *errstr, int maxlen)
{
const SDL_error *error = SDL_GetErrBuf();
if (error->error) {
SDL_strlcpy(errstr, error->str, maxlen);
} else {
*errstr = '\0';
}
return errstr;
}