libui/common/init.c

82 lines
1.9 KiB
C

// 19 april 2019
// TODO get rid of the need for this (it temporarily silences noise so I can find actual build issues)
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include "ui.h"
#include "uipriv.h"
static int initialized = 0;
#define errAlreadyInitialized "libui already initialized"
#define errOptionsMustBeNULL "options parameter to uiInit() must be NULL"
static const char *commonInitErrors[] = {
errAlreadyInitialized,
errOptionsMustBeNULL,
NULL,
};
static int checkInitErrorLengths(uiInitError *err, const char *initErrors[])
{
const char **p;
if (initErrors == NULL)
return 1;
for (p = initErrors; *p != NULL; p++)
if (strlen(*p) > 255) {
strcpy(err->Message, "[INTERNAL] uiInit() error too long: ");
strncat(err->Message, *p, 32);
strcat(err->Message, "...");
return 0;
}
return 1;
}
int uiprivInitCheckParams(void *options, uiInitError *err, const char *initErrors[])
{
if (err == NULL)
return 0;
if (err->Size != sizeof (uiInitError))
return 0;
if (!checkInitErrorLengths(err, commonInitErrors))
return 0;
if (!checkInitErrorLengths(err, initErrors))
return 0;
if (initialized)
return uiprivInitReturnError(err, errAlreadyInitialized);
if (options != NULL)
return uiprivInitReturnError(err, errOptionsMustBeNULL);
return 1;
}
int uiprivInitReturnError(uiInitError *err, const char *msg)
{
// checkInitErrorLengths() above ensures that err->Message[255] will always be '\0'
strncpy(err->Message, msg, 256);
return 0;
}
int uiprivInitReturnErrorf(uiInitError *err, const char *msg, ...)
{
va_list ap;
// checkInitErrorLengths() above ensures that err->Message[255] will always be '\0' assuming the formatted string in msg passed to checkInitErrorLengths() is valid
va_start(ap, msg);
vsnprintf(err->Message, 256, msg, ap);
va_end(ap);
return 0;
}
void uiprivMarkInitialized(void)
{
initialized = 1;
}