ref: 09c15f206edac18bd2158c189c821b9ba85d3939
parent: adf2a098298f1aa73aca2c816174d5e63ff45a32
author: Ben Harris <bjh21@bjh21.me.uk>
date: Wed Mar 22 12:06:18 EDT 2023
New shared function, getenv_bool() This provides a standard way to get a boolean from an environment variable. It treats the variable as true iff its value begins with 'y' or 'Y', like most of the current implementations. The function takes a default value which it returns if the environment variable is undefined. This replaces the various ad-hoc tests of environment variable scattered around and mostly doesn't change their behaviour. The exceptions are TOWERS_2D in Towers and DEBUG_PUZZLES in the Windows front end. Both of those were treated as true if they were defined at all, but now follow the same rules as other boolean environment variables.
--- a/emcc.c
+++ b/emcc.c
@@ -987,7 +987,6 @@
*/
{
struct preset_menu *menu = midend_get_presets(me, &npresets);
- char *env;
bool may_configure = false;
presets = snewn(npresets, game_params *);
for (i = 0; i < npresets; i++)
@@ -999,10 +998,7 @@
* Crude hack to allow the "Custom..." item to be hidden on
* KaiOS, where dialogs don't yet work.
*/
- env = getenv("PUZZLES_ALLOW_CUSTOM");
-
- if (thegame.can_configure &&
- (!env || env[0] == 'y' || env[0] == 'Y'))
+ if (thegame.can_configure && getenv_bool("PUZZLES_ALLOW_CUSTOM", true))
may_configure = true;
if (may_configure)
js_add_preset(0, "Custom...", -1);
--- a/fifteen.c
+++ b/fifteen.c
@@ -714,10 +714,8 @@
return NULL; /* out of bounds */
} else if (IS_CURSOR_MOVE(button)) {
static int invert_cursor = -1;
- if (invert_cursor == -1) {
- char *env = getenv("FIFTEEN_INVERT_CURSOR");
- invert_cursor = (env && (env[0] == 'y' || env[0] == 'Y'));
- }
+ if (invert_cursor == -1)
+ invert_cursor = getenv_bool("FIFTEEN_INVERT_CURSOR", false);
button = flip_cursor(button); /* the default */
if (invert_cursor)
button = flip_cursor(button); /* undoes the first flip */
--- a/lightup.c
+++ b/lightup.c
@@ -2168,11 +2168,8 @@
lcol, COL_BLACK);
} else if ((ds_flags & DF_IMPOSSIBLE)) {
static int draw_blobs_when_lit = -1;
- if (draw_blobs_when_lit < 0) {
- char *env = getenv("LIGHTUP_LIT_BLOBS");
- draw_blobs_when_lit = (!env || (env[0] == 'y' ||
- env[0] == 'Y'));
- }
+ if (draw_blobs_when_lit < 0)
+ draw_blobs_when_lit = getenv_bool("LIGHTUP_LIT_BLOBS", true);
if (!(ds_flags & DF_LIT) || draw_blobs_when_lit) {
int rlen = TILE_SIZE / 4;
draw_rect(dr, dx + TILE_SIZE/2 - rlen/2,
--- a/loopy.c
+++ b/loopy.c
@@ -3292,11 +3292,8 @@
if (line_colour == COL_FAINT) {
static int draw_faint_lines = -1;
- if (draw_faint_lines < 0) {
- char *env = getenv("LOOPY_FAINT_LINES");
- draw_faint_lines = (!env || (env[0] == 'y' ||
- env[0] == 'Y'));
- }
+ if (draw_faint_lines < 0)
+ draw_faint_lines = getenv_bool("LOOPY_FAINT_LINES", true);
if (draw_faint_lines)
draw_line(dr, x1, y1, x2, y2, line_colour);
} else {
--- a/misc.c
+++ b/misc.c
@@ -198,6 +198,14 @@
return ret;
}
+bool getenv_bool(const char *name, bool dflt)
+{
+ char *env = getenv(name);
+ if (env == NULL) return dflt;
+ if (env[0] == 'y' || env[0] == 'Y') return true;
+ return false;
+}
+
/* Utility functions for colour manipulation. */
static float colour_distance(const float a[3], const float b[3])
--- a/pearl.c
+++ b/pearl.c
@@ -1929,8 +1929,7 @@
static int gui_style = -1;
if (gui_style == -1) {
- char *env = getenv("PEARL_GUI_LOOPY");
- if (env && (env[0] == 'y' || env[0] == 'Y'))
+ if (getenv_bool("PEARL_GUI_LOOPY", false))
gui_style = GUI_LOOPY;
else
gui_style = GUI_MASYU;
--- a/puzzles.h
+++ b/puzzles.h
@@ -377,6 +377,8 @@
char *bin2hex(const unsigned char *in, int inlen);
unsigned char *hex2bin(const char *in, int outlen);
+bool getenv_bool(const char *name, bool dflt);
+
/* Mixes two colours in specified proportions. */
void colour_mix(const float src1[3], const float src2[3], float p,
float dst[3]);
--- a/range.c
+++ b/range.c
@@ -1324,10 +1324,8 @@
*/
{
static int swap_buttons = -1;
- if (swap_buttons < 0) {
- char *env = getenv("RANGE_SWAP_BUTTONS");
- swap_buttons = (env && (env[0] == 'y' || env[0] == 'Y'));
- }
+ if (swap_buttons < 0)
+ swap_buttons = getenv_bool("RANGE_SWAP_BUTTONS", false);
if (swap_buttons) {
if (button == LEFT_BUTTON)
button = RIGHT_BUTTON;
--- a/signpost.c
+++ b/signpost.c
@@ -2161,10 +2161,8 @@
* yourself which is more brain-twisting :-)
*/
static int gear_mode = -1;
- if (gear_mode < 0) {
- char *env = getenv("SIGNPOST_GEARS");
- gear_mode = (env && (env[0] == 'y' || env[0] == 'Y'));
- }
+ if (gear_mode < 0)
+ gear_mode = getenv_bool("SIGNPOST_GEARS", false);
if (gear_mode)
sign = 1 - 2 * ((x ^ y) & 1);
else
--- a/slant.c
+++ b/slant.c
@@ -1681,10 +1681,8 @@
*/
{
static int swap_buttons = -1;
- if (swap_buttons < 0) {
- char *env = getenv("SLANT_SWAP_BUTTONS");
- swap_buttons = (env && (env[0] == 'y' || env[0] == 'Y'));
- }
+ if (swap_buttons < 0)
+ swap_buttons = getenv_bool("SLANT_SWAP_BUTTONS", false);
if (swap_buttons) {
if (button == LEFT_BUTTON)
button = RIGHT_BUTTON;
--- a/towers.c
+++ b/towers.c
@@ -1636,7 +1636,7 @@
int i;
ds->tilesize = 0;
- ds->three_d = !getenv("TOWERS_2D");
+ ds->three_d = !getenv_bool("TOWERS_2D", false);
ds->tiles = snewn((w+2)*(w+2), long);
ds->drawn = snewn((w+2)*(w+2)*4, long);
for (i = 0; i < (w+2)*(w+2)*4; i++)
--- a/windows.c
+++ b/windows.c
@@ -104,7 +104,7 @@
static int debugging = -1;
if (debugging == -1)
- debugging = getenv("DEBUG_PUZZLES") ? 1 : 0;
+ debugging = getenv_bool("DEBUG_PUZZLES", false);
if (debugging) {
va_start(ap, fmt);