isle-portable/mortar/src/mortar.cpp
2026-02-09 18:33:47 +01:00

101 lines
2.2 KiB
C++

#include "mortar/mortar.h"
#include "mortar/mortar_main.h"
#include "sdl3/sdl3_public.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static MORTAR_Backend mortar_backend = MORTAR_BACKEND_ANY;
// Define the default mortar backend here.
#define DEFAULT_MORTAR_BACKEND MORTAR_BACKEND_SDL3
MORTAR_Backend MORTAR_GetBackend()
{
return mortar_backend;
}
bool MORTAR_SetBackend(MORTAR_Backend backend)
{
if (mortar_backend != MORTAR_BACKEND_ANY && mortar_backend != backend) {
return false;
}
mortar_backend = backend;
return true;
}
bool MORTAR_ParseBackendName(const char* name, MORTAR_Backend* backend)
{
if (strcmp(name, "sdl3") == 0 || strcmp(name, "SDL3") == 0) {
*backend = MORTAR_BACKEND_SDL3;
return true;
}
return false;
}
static bool parse_mortar_arguments(int argc, char* argv[])
{
for (int i = 1; i < argc;) {
int consumed = 1;
if (strcmp(argv[i], "--platform") == 0) {
if (i + 1 >= argc || argv[i + 1][0] == '-') {
fprintf(stderr, "--platform requires an argument\n");
return false;
}
if (mortar_backend != MORTAR_BACKEND_ANY) {
fprintf(stderr, "--platform can only be used once\n");
return false;
}
if (MORTAR_ParseBackendName(argv[i + 1], &mortar_backend)) {
consumed = 2;
}
else {
fprintf(stderr, "Invalid mortar platform: %s\n", argv[i + 1]);
return false;
}
}
i += consumed;
}
return true;
}
bool MORTAR_InitializeBackend(void)
{
if (mortar_backend == MORTAR_BACKEND_ANY) {
mortar_backend = MORTAR_BACKEND_SDL3;
}
switch (mortar_backend) {
case MORTAR_BACKEND_SDL3:
return MORTAR_SDL3_Initialize();
default:
fprintf(stderr, "** INTERNAL ERROR: Unknown platform **\n");
return false;
}
}
int MORTAR_main(
int argc,
char* argv[],
MORTAR_AppInit_cbfn* init,
MORTAR_AppIterate_cbfn* iterate,
MORTAR_AppEvent_cbfn* event,
MORTAR_AppQuit_cbfn* quit
)
{
if (!parse_mortar_arguments(argc, argv)) {
return 1;
}
if (!MORTAR_InitializeBackend()) {
return 1;
}
switch (mortar_backend) {
case MORTAR_BACKEND_SDL3:
return MORTAR_SDL3_main(argc, argv, init, iterate, event, quit);
default:
fprintf(stderr, "** INTERNAL ERROR: Unknown platform **\n");
return 1;
}
}