add portable wrappers around getenv/setenv and friends
This commit is contained in:
parent
c460b45b28
commit
af7c4bbb4f
19 changed files with 175 additions and 48 deletions
|
@ -1,3 +1,13 @@
|
|||
/*
|
||||
* This software is licensed under the terms of the MIT-License
|
||||
* See COPYING for further information.
|
||||
* ---
|
||||
* Copyright (c) 2011-2018, Lukas Weber <laochailan@web.de>.
|
||||
* Copyright (c) 2012-2018, Andrei Alexeyev <akari@alienslab.net>.
|
||||
*/
|
||||
|
||||
#include "taisei.h"
|
||||
|
||||
LAYER(PLAYER_SHOT)
|
||||
LAYER(PARTICLE_LOW)
|
||||
LAYER(ITEM)
|
||||
|
|
58
src/env.c
Normal file
58
src/env.c
Normal file
|
@ -0,0 +1,58 @@
|
|||
/*
|
||||
* This software is licensed under the terms of the MIT-License
|
||||
* See COPYING for further information.
|
||||
* ---
|
||||
* Copyright (c) 2011-2018, Lukas Weber <laochailan@web.de>.
|
||||
* Copyright (c) 2012-2018, Andrei Alexeyev <akari@alienslab.net>.
|
||||
*/
|
||||
|
||||
#include "taisei.h"
|
||||
|
||||
#include "env.h"
|
||||
#include "util.h"
|
||||
|
||||
const char* env_get_string(const char *var, const char *fallback) {
|
||||
const char* val = SDL_getenv(var);
|
||||
|
||||
if(val == NULL) {
|
||||
return fallback;
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
void env_set_string(const char *var, const char *val, bool override) {
|
||||
SDL_setenv(var, val, override);
|
||||
}
|
||||
|
||||
int64_t env_get_int(const char *var, int64_t fallback) {
|
||||
const char* val = SDL_getenv(var);
|
||||
|
||||
if(val == NULL) {
|
||||
return fallback;
|
||||
}
|
||||
|
||||
return strtoll(val, NULL, 10);
|
||||
}
|
||||
|
||||
void env_set_int(const char *var, int64_t val, bool override) {
|
||||
char buf[21];
|
||||
snprintf(buf, sizeof(buf), "%"PRIi64, val);
|
||||
env_set_string(var, buf, override);
|
||||
}
|
||||
|
||||
double env_get_double(const char *var, double fallback) {
|
||||
const char* val = SDL_getenv(var);
|
||||
|
||||
if(val == NULL) {
|
||||
return fallback;
|
||||
}
|
||||
|
||||
return strtod(val, NULL);
|
||||
}
|
||||
|
||||
void env_set_double(const char *var, double val, bool override) {
|
||||
char buf[24];
|
||||
snprintf(buf, sizeof(buf), "%.14g", val);
|
||||
env_set_string(var, buf, override);
|
||||
}
|
60
src/env.h
Normal file
60
src/env.h
Normal file
|
@ -0,0 +1,60 @@
|
|||
/*
|
||||
* This software is licensed under the terms of the MIT-License
|
||||
* See COPYING for further information.
|
||||
* ---
|
||||
* Copyright (c) 2011-2018, Lukas Weber <laochailan@web.de>.
|
||||
* Copyright (c) 2012-2018, Andrei Alexeyev <akari@alienslab.net>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include "taisei.h"
|
||||
|
||||
const char* env_get_string(const char *var, const char *fallback)
|
||||
attr_nonnull(1);
|
||||
|
||||
void env_set_string(const char *var, const char *val, bool override)
|
||||
attr_nonnull(1, 2);
|
||||
|
||||
int64_t env_get_int(const char *var, int64_t fallback)
|
||||
attr_nonnull(1);
|
||||
|
||||
void env_set_int(const char *var, int64_t val, bool override)
|
||||
attr_nonnull(1);
|
||||
|
||||
double env_get_double(const char *var, double fallback)
|
||||
attr_nonnull(1);
|
||||
|
||||
void env_set_double(const char *var, double val, bool override)
|
||||
attr_nonnull(1);
|
||||
|
||||
#define env_get(var, fallback) (_Generic((fallback), \
|
||||
const char* : env_get_string, \
|
||||
char* : env_get_string, \
|
||||
void* : env_get_string, \
|
||||
int8_t : env_get_int, \
|
||||
uint8_t : env_get_int, \
|
||||
int16_t : env_get_int, \
|
||||
uint16_t : env_get_int, \
|
||||
int32_t : env_get_int, \
|
||||
uint32_t : env_get_int, \
|
||||
int64_t : env_get_int, \
|
||||
uint64_t : env_get_int, \
|
||||
double : env_get_double, \
|
||||
float : env_get_double \
|
||||
)(var, fallback))
|
||||
|
||||
#define env_set(var, val, override) (_Generic((val), \
|
||||
const char* : env_set_string, \
|
||||
char* : env_set_string, \
|
||||
void* : env_set_string, \
|
||||
int8_t : env_set_int, \
|
||||
uint8_t : env_set_int, \
|
||||
int16_t : env_set_int, \
|
||||
uint16_t : env_set_int, \
|
||||
int32_t : env_set_int, \
|
||||
uint32_t : env_set_int, \
|
||||
int64_t : env_set_int, \
|
||||
uint64_t : env_set_int, \
|
||||
double : env_set_double, \
|
||||
float : env_set_double \
|
||||
)(var, val, override))
|
|
@ -65,10 +65,10 @@ void loop_at_fps(LogicFrameFunc logic_frame, RenderFrameFunc render_frame, void
|
|||
FrameAction rframe_action = RFRAME_SWAP;
|
||||
FrameAction lframe_action = LFRAME_WAIT;
|
||||
|
||||
int32_t delay = getenvint("TAISEI_FRAMELIMITER_SLEEP", 0);
|
||||
bool exact_delay = getenvint("TAISEI_FRAMELIMITER_SLEEP_EXACT", 1);
|
||||
bool compensate = getenvint("TAISEI_FRAMELIMITER_COMPENSATE", 1);
|
||||
bool uncapped_rendering_env = getenvint("TAISEI_FRAMELIMITER_LOGIC_ONLY", 0);
|
||||
int32_t delay = env_get("TAISEI_FRAMELIMITER_SLEEP", 0);
|
||||
bool exact_delay = env_get("TAISEI_FRAMELIMITER_SLEEP_EXACT", 1);
|
||||
bool compensate = env_get("TAISEI_FRAMELIMITER_COMPENSATE", 1);
|
||||
bool uncapped_rendering_env = env_get("TAISEI_FRAMELIMITER_LOGIC_ONLY", 0);
|
||||
bool late_swap = config_get_int(CONFIG_VID_LATE_SWAP);
|
||||
|
||||
uint32_t frame_num = 0;
|
||||
|
|
|
@ -51,7 +51,7 @@ static void time_update(void) {
|
|||
}
|
||||
|
||||
void time_init(void) {
|
||||
use_hires = getenvint("TAISEI_HIRES_TIMER", 1);
|
||||
use_hires = env_get("TAISEI_HIRES_TIMER", 1);
|
||||
|
||||
if(use_hires) {
|
||||
if(!(paranoia = SDL_CreateMutex())) {
|
||||
|
|
10
src/main.c
10
src/main.c
|
@ -54,10 +54,10 @@ static void taisei_shutdown(void) {
|
|||
}
|
||||
|
||||
static void init_log(void) {
|
||||
LogLevel lvls_console = log_parse_levels(LOG_DEFAULT_LEVELS_CONSOLE, getenv("TAISEI_LOGLVLS_CONSOLE"));
|
||||
LogLevel lvls_stdout = lvls_console & log_parse_levels(LOG_DEFAULT_LEVELS_STDOUT, getenv("TAISEI_LOGLVLS_STDOUT"));
|
||||
LogLevel lvls_stderr = lvls_console & log_parse_levels(LOG_DEFAULT_LEVELS_STDERR, getenv("TAISEI_LOGLVLS_STDERR"));
|
||||
LogLevel lvls_backtrace = log_parse_levels(LOG_DEFAULT_LEVELS_BACKTRACE, getenv("TAISEI_LOGLVLS_BACKTRACE"));
|
||||
LogLevel lvls_console = log_parse_levels(LOG_DEFAULT_LEVELS_CONSOLE, env_get("TAISEI_LOGLVLS_CONSOLE", NULL));
|
||||
LogLevel lvls_stdout = lvls_console & log_parse_levels(LOG_DEFAULT_LEVELS_STDOUT, env_get("TAISEI_LOGLVLS_STDOUT", NULL));
|
||||
LogLevel lvls_stderr = lvls_console & log_parse_levels(LOG_DEFAULT_LEVELS_STDERR, env_get("TAISEI_LOGLVLS_STDERR", NULL));
|
||||
LogLevel lvls_backtrace = log_parse_levels(LOG_DEFAULT_LEVELS_BACKTRACE, env_get("TAISEI_LOGLVLS_BACKTRACE", NULL));
|
||||
|
||||
log_init(LOG_DEFAULT_LEVELS, lvls_backtrace);
|
||||
log_add_output(lvls_stdout, SDL_RWFromFP(stdout, false));
|
||||
|
@ -65,7 +65,7 @@ static void init_log(void) {
|
|||
}
|
||||
|
||||
static void init_log_file(void) {
|
||||
LogLevel lvls_file = log_parse_levels(LOG_DEFAULT_LEVELS_FILE, getenv("TAISEI_LOGLVLS_FILE"));
|
||||
LogLevel lvls_file = log_parse_levels(LOG_DEFAULT_LEVELS_FILE, env_get("TAISEI_LOGLVLS_FILE", NULL));
|
||||
log_add_output(lvls_file, vfs_open("storage/log.txt", VFS_MODE_WRITE));
|
||||
}
|
||||
|
||||
|
|
|
@ -70,6 +70,7 @@ taisei_src = files(
|
|||
'ending.c',
|
||||
'enemy.c',
|
||||
'entity.c',
|
||||
'env.c',
|
||||
'events.c',
|
||||
'fbo.c',
|
||||
'framerate.c',
|
||||
|
|
|
@ -45,9 +45,9 @@ void _r_backend_init(void) {
|
|||
return;
|
||||
}
|
||||
|
||||
const char *backend = getenv("TAISEI_RENDERER");
|
||||
const char *backend = env_get("TAISEI_RENDERER", "");
|
||||
|
||||
if(!backend || !*backend) {
|
||||
if(!*backend) {
|
||||
backend = TAISEI_BUILDCONF_RENDERER_DEFAULT;
|
||||
}
|
||||
|
||||
|
|
|
@ -88,5 +88,5 @@ void glcommon_debug_object_label(GLenum identifier, GLuint name, const char *lab
|
|||
}
|
||||
|
||||
bool glcommon_debug_requested(void) {
|
||||
return getenvint("TAISEI_GL_DEBUG", DEBUG_GL_DEFAULT);
|
||||
return env_get("TAISEI_GL_DEBUG", DEBUG_GL_DEFAULT);
|
||||
}
|
||||
|
|
|
@ -89,10 +89,10 @@ static void glcommon_gl_version(char *major, char *minor) {
|
|||
}
|
||||
|
||||
ext_flag_t glcommon_check_extension(const char *ext) {
|
||||
const char *overrides = getenv("TAISEI_GL_EXT_OVERRIDES");
|
||||
const char *overrides = env_get("TAISEI_GL_EXT_OVERRIDES", "");
|
||||
ext_flag_t flag = glcommon_ext_flag(ext);
|
||||
|
||||
if(overrides) {
|
||||
if(*overrides) {
|
||||
char buf[strlen(overrides)+1], *save, *arg, *e;
|
||||
strcpy(buf, overrides);
|
||||
arg = buf;
|
||||
|
@ -120,7 +120,7 @@ ext_flag_t glcommon_require_extension(const char *ext) {
|
|||
ext_flag_t val = glcommon_check_extension(ext);
|
||||
|
||||
if(!val) {
|
||||
if(getenvint("TAISEI_GL_REQUIRE_EXTENSION_FATAL", 0)) {
|
||||
if(env_get("TAISEI_GL_REQUIRE_EXTENSION_FATAL", 0)) {
|
||||
log_fatal("Required extension %s is not available", ext);
|
||||
}
|
||||
|
||||
|
@ -386,9 +386,9 @@ void glcommon_check_extensions(void) {
|
|||
|
||||
void glcommon_load_library(void) {
|
||||
#ifndef LINK_TO_LIBGL
|
||||
char *lib = getenv("TAISEI_LIBGL");
|
||||
const char *lib = env_get("TAISEI_LIBGL", "");
|
||||
|
||||
if(lib && !*lib) {
|
||||
if(!*lib) {
|
||||
lib = NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -84,7 +84,7 @@ Resource* insert_resource(ResourceType type, const char *name, void *data, Resou
|
|||
Resource *oldres = hashtable_get_string(handler->mapping, name);
|
||||
Resource *res = malloc(sizeof(Resource));
|
||||
|
||||
if(type == RES_MODEL || getenvint("TAISEI_NOUNLOAD", false)) {
|
||||
if(type == RES_MODEL || env_get("TAISEI_NOUNLOAD", false)) {
|
||||
// FIXME: models can't be safely unloaded at runtime
|
||||
flags |= RESF_PERMANENT;
|
||||
}
|
||||
|
@ -320,7 +320,7 @@ Resource* get_resource(ResourceType type, const char *name, ResourceFlags flags)
|
|||
if(!(flags & RESF_PRELOAD)) {
|
||||
log_warn("%s '%s' was not preloaded", type_name(type), name);
|
||||
|
||||
if(getenvint("TAISEI_PRELOAD_REQUIRED", false)) {
|
||||
if(env_get("TAISEI_PRELOAD_REQUIRED", false)) {
|
||||
log_fatal("Aborting due to TAISEI_PRELOAD_REQUIRED");
|
||||
}
|
||||
}
|
||||
|
@ -351,7 +351,7 @@ Hashtable* get_resource_table(ResourceType type) {
|
|||
}
|
||||
|
||||
void preload_resource(ResourceType type, const char *name, ResourceFlags flags) {
|
||||
if(getenvint("TAISEI_NOPRELOAD", false))
|
||||
if(env_get("TAISEI_NOPRELOAD", false))
|
||||
return;
|
||||
|
||||
ResourceHandler *handler = get_handler(type);
|
||||
|
@ -361,7 +361,7 @@ void preload_resource(ResourceType type, const char *name, ResourceFlags flags)
|
|||
return;
|
||||
}
|
||||
|
||||
load_resource(handler, NULL, name, flags | RESF_PRELOAD, !getenvint("TAISEI_NOASYNC", false));
|
||||
load_resource(handler, NULL, name, flags | RESF_PRELOAD, !env_get("TAISEI_NOASYNC", false));
|
||||
}
|
||||
|
||||
void preload_resources(ResourceType type, ResourceFlags flags, const char *firstname, ...) {
|
||||
|
@ -403,7 +403,7 @@ void init_resources(void) {
|
|||
|
||||
main_thread_id = SDL_ThreadID();
|
||||
|
||||
if(!getenvint("TAISEI_NOASYNC", 0)) {
|
||||
if(!env_get("TAISEI_NOASYNC", 0)) {
|
||||
EventHandler h = {
|
||||
.proc = resource_asyncload_handler,
|
||||
.priority = EPRIO_SYSTEM,
|
||||
|
@ -453,7 +453,7 @@ static void* preload_shaders(const char *path, void *arg) {
|
|||
void load_resources(void) {
|
||||
menu_preload();
|
||||
|
||||
if(getenvint("TAISEI_PRELOAD_SHADERS", 0)) {
|
||||
if(env_get("TAISEI_PRELOAD_SHADERS", 0)) {
|
||||
log_warn("Loading all shaders now due to TAISEI_PRELOAD_SHADERS");
|
||||
vfs_dir_walk(SHPROG_PATH_PREFIX, preload_shaders, NULL);
|
||||
}
|
||||
|
@ -499,7 +499,7 @@ void free_resources(bool all) {
|
|||
delete_fbo_pair(&resources.fbo_pairs.fg);
|
||||
delete_fbo_pair(&resources.fbo_pairs.rgba);
|
||||
|
||||
if(!getenvint("TAISEI_NOASYNC", 0)) {
|
||||
if(!env_get("TAISEI_NOASYNC", 0)) {
|
||||
events_unregister_handler(resource_asyncload_handler);
|
||||
}
|
||||
|
||||
|
|
|
@ -73,8 +73,8 @@ void stage_draw_preload(void) {
|
|||
r_uniform_ptr(stagedraw.hud_text.u_colorBbot, 1, (float[]){ 0.80, 0.80, 0.80, 0.80 });
|
||||
r_uniform_ptr(stagedraw.hud_text.u_colortint, 1, (float[]){ 1.00, 1.00, 1.00, 1.00 });
|
||||
|
||||
stagedraw.framerate_graphs = getenvint("TAISEI_FRAMERATE_GRAPHS", GRAPHS_DEFAULT);
|
||||
stagedraw.objpool_stats = getenvint("TAISEI_OBJPOOL_STATS", OBJPOOLSTATS_DEFAULT);
|
||||
stagedraw.framerate_graphs = env_get("TAISEI_FRAMERATE_GRAPHS", GRAPHS_DEFAULT);
|
||||
stagedraw.objpool_stats = env_get("TAISEI_OBJPOOL_STATS", OBJPOOLSTATS_DEFAULT);
|
||||
|
||||
if(stagedraw.framerate_graphs) {
|
||||
preload_resources(RES_SHADER_PROGRAM, RESF_PERMANENT,
|
||||
|
|
|
@ -1371,7 +1371,7 @@ void stage3_events(void) {
|
|||
|
||||
AT(0) {
|
||||
stage_start_bgm("stage3");
|
||||
stage3_skip(getenvint("STAGE3_TEST", 0));
|
||||
// stage3_skip(env_get("STAGE3_TEST", 0));
|
||||
}
|
||||
|
||||
FROM_TO(160, 300, 10) {
|
||||
|
|
|
@ -1426,7 +1426,7 @@ void stage4_events(void) {
|
|||
|
||||
AT(0) {
|
||||
stage_start_bgm("stage4");
|
||||
stage4_skip(getenvint("STAGE4_TEST", 0));
|
||||
// stage4_skip(env_get("STAGE4_TEST", 0));
|
||||
}
|
||||
|
||||
AT(70) {
|
||||
|
|
|
@ -1133,7 +1133,7 @@ void stage5_events(void) {
|
|||
|
||||
AT(0) {
|
||||
stage_start_bgm("stage5");
|
||||
stage5_skip(getenvint("STAGE5_TEST", 0));
|
||||
// stage5_skip(env_get("STAGE5_TEST", 0));
|
||||
}
|
||||
|
||||
FROM_TO(60, 150, 15) {
|
||||
|
|
10
src/util.c
10
src/util.c
|
@ -685,16 +685,6 @@ void* memdup(const void *src, size_t size) {
|
|||
return data;
|
||||
}
|
||||
|
||||
int getenvint(const char *v, int defaultval) {
|
||||
char *e = getenv(v);
|
||||
|
||||
if(e && *e) {
|
||||
return atoi(e);
|
||||
}
|
||||
|
||||
return defaultval;
|
||||
}
|
||||
|
||||
noreturn static void png_error_handler(png_structp png_ptr, png_const_charp error_msg) {
|
||||
log_warn("PNG error: %s", error_msg);
|
||||
png_longjmp(png_ptr, 1);
|
||||
|
|
10
src/util.h
10
src/util.h
|
@ -21,6 +21,7 @@
|
|||
#include "compat.h"
|
||||
#include "hirestime.h"
|
||||
#include "assert.h"
|
||||
#include "env.h"
|
||||
|
||||
//
|
||||
// string utils
|
||||
|
@ -172,7 +173,6 @@ char* try_path(const char *prefix, const char *name, const char *ext);
|
|||
//
|
||||
|
||||
void* memdup(const void *src, size_t size);
|
||||
int getenvint(const char *v, int defaultval) attr_pure;
|
||||
void png_setup_error_handlers(png_structp png);
|
||||
uint32_t crc32str(uint32_t crc, const char *str) attr_hot attr_pure;
|
||||
|
||||
|
@ -246,4 +246,12 @@ char* strtok();
|
|||
attr_deprecated("Use snprintf or strfmt instead")
|
||||
int sprintf(char *, const char*, ...);
|
||||
|
||||
#undef getenv
|
||||
attr_deprecated("Use env_get instead")
|
||||
char* getenv();
|
||||
|
||||
#undef setenv
|
||||
attr_deprecated("Use env_set instead")
|
||||
int setenv();
|
||||
|
||||
PRAGMA(GCC diagnostic pop)
|
||||
|
|
|
@ -26,13 +26,13 @@ static char* get_default_res_path(void) {
|
|||
}
|
||||
|
||||
static void get_core_paths(char **res, char **storage) {
|
||||
if((*res = getenv("TAISEI_RES_PATH")) && **res) {
|
||||
if(*(*res = (char*)env_get("TAISEI_RES_PATH", ""))) {
|
||||
*res = strdup(*res);
|
||||
} else {
|
||||
*res = get_default_res_path();
|
||||
}
|
||||
|
||||
if((*storage = getenv("TAISEI_STORAGE_PATH")) && **storage) {
|
||||
if(*(*storage = (char*)env_get("TAISEI_STORAGE_PATH", ""))) {
|
||||
*storage = strdup(*storage);
|
||||
} else {
|
||||
*storage = SDL_GetPrefPath("", "taisei");
|
||||
|
|
10
src/video.c
10
src/video.c
|
@ -372,13 +372,13 @@ static void video_init_sdl(void) {
|
|||
log_info("%s", (char*)buf);
|
||||
SDL_RWclose(out);
|
||||
|
||||
char *prefer_drivers = getenv("TAISEI_PREFER_SDL_VIDEODRIVERS");
|
||||
char *force_driver = getenv("TAISEI_VIDEO_DRIVER");
|
||||
const char *prefer_drivers = env_get("TAISEI_PREFER_SDL_VIDEODRIVERS", "");
|
||||
const char *force_driver = env_get("TAISEI_VIDEO_DRIVER", "");
|
||||
|
||||
if(force_driver && *force_driver) {
|
||||
if(*force_driver) {
|
||||
log_warn("TAISEI_VIDEO_DRIVER is deprecated and will be removed, use TAISEI_PREFER_SDL_VIDEODRIVERS or SDL_VIDEODRIVER instead");
|
||||
} else {
|
||||
force_driver = getenv("SDL_VIDEODRIVER");
|
||||
force_driver = env_get("SDL_VIDEODRIVER", "");
|
||||
}
|
||||
|
||||
if(!(prefer_drivers && *prefer_drivers)) {
|
||||
|
@ -388,7 +388,7 @@ static void video_init_sdl(void) {
|
|||
prefer_drivers = "wayland,mir,cocoa,windows,x11";
|
||||
}
|
||||
|
||||
if(prefer_drivers && *prefer_drivers && !(force_driver && *force_driver)) {
|
||||
if(prefer_drivers && *prefer_drivers && !*force_driver) {
|
||||
char buf[strlen(prefer_drivers) + 1];
|
||||
char *driver, *bufptr = buf;
|
||||
int drivernum = 0;
|
||||
|
|
Loading…
Reference in a new issue