/* * Copyright (C) 2018 Tomasz Kramkowski * SPDX-License-Identifier: MIT */ #include #include "loadgl.h" #define LGL_FUNC(name, glname) \ name##_func *name; \ static const char *name##_gln = #glname; FUNCS()dnl static void *load_func(const char *name, lgl_loadfunc *load, jmp_buf env) { void *ret; ret = load(name); if (ret == NULL) longjmp(env, LGL_MISSING); return ret; } enum lgl_status lgl_load(lgl_loadfunc *load) { enum lgl_status status; jmp_buf env; status = setjmp(env); if (status != 0) return status; #define LGL_LOAD(name) name = (name##_func *)load_func(name##_gln, load, env); LOADS()dnl return LGL_OK; } const char *lgl_strerror(enum lgl_status status) { switch (status) { case LGL_OK: return "Success"; case LGL_MISSING: return "Missing function"; } return "Unknown"; } const char *gl_strerror(GLenum error) { switch (error) { case GL_NO_ERROR: return "No error"; case GL_INVALID_ENUM: return "Invalid enumeration"; case GL_INVALID_VALUE: return "Invalid value"; case GL_INVALID_OPERATION: return "Invalid operation"; case GL_STACK_OVERFLOW: return "Stack overflow"; case GL_STACK_UNDERFLOW: return "Stack underflow"; case GL_OUT_OF_MEMORY: return "Out of memory"; case GL_INVALID_FRAMEBUFFER_OPERATION: return "Invalid framebuffer operation"; case GL_CONTEXT_LOST: return "Context lost"; } return "Unknown"; }