add portable wrappers around getenv/setenv and friends

This commit is contained in:
Andrei Alexeyev 2018-04-18 01:34:41 +03:00
parent c460b45b28
commit af7c4bbb4f
No known key found for this signature in database
GPG key ID: 363707CD4C7FE8A4
19 changed files with 175 additions and 48 deletions

View file

@ -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
View 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
View 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))

View file

@ -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;

View file

@ -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())) {

View file

@ -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));
}

View file

@ -70,6 +70,7 @@ taisei_src = files(
'ending.c',
'enemy.c',
'entity.c',
'env.c',
'events.c',
'fbo.c',
'framerate.c',

View file

@ -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;
}

View file

@ -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);
}

View file

@ -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;
}

View file

@ -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);
}

View file

@ -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,

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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);

View file

@ -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)

View file

@ -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");

View file

@ -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;