Skip to content

Commit 1e28f09

Browse files
committed
task_overlay - less memory allocations
1 parent 23c27c6 commit 1e28f09

1 file changed

Lines changed: 49 additions & 67 deletions

File tree

tasks/task_overlay.c

Lines changed: 49 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -256,24 +256,19 @@ static bool task_overlay_load_desc(
256256
char overlay_desc_key[32];
257257
char overlay_key[64];
258258
char overlay[256];
259-
char *tok, *save = NULL;
260-
unsigned list_size = 0;
261-
char *elems[6] = {NULL, NULL, NULL, NULL, NULL, NULL};
262-
char *overlay_cpy = NULL;
263-
float tmp_float = 0.0f;
264-
bool tmp_bool = false;
265-
bool ret = true;
266-
bool by_pixel = false;
267-
const char *key = NULL;
268-
const char *x = NULL;
269-
const char *y = NULL;
270-
const char *box = NULL;
271-
config_file_t *conf = loader->conf;
272-
273-
overlay_desc_key[0] =
274-
overlay_key[0] =
275-
conf_key[0] =
276-
overlay[0] = '\0';
259+
unsigned list_size = 0;
260+
char *elems[6] = {NULL, NULL, NULL, NULL, NULL, NULL};
261+
char *tok, *save = NULL;
262+
float tmp_float = 0.0f;
263+
bool tmp_bool = false;
264+
bool by_pixel = false;
265+
const char *box = NULL;
266+
config_file_t *conf = loader->conf;
267+
268+
overlay_desc_key[0] =
269+
overlay_key[0] =
270+
conf_key[0] =
271+
overlay[0] = '\0';
277272

278273
snprintf(overlay_desc_key, sizeof(overlay_desc_key),
279274
"overlay%u_desc%u", ol_idx, desc_idx);
@@ -297,53 +292,50 @@ static bool task_overlay_load_desc(
297292
return false;
298293
}
299294

300-
overlay_cpy = strdup(overlay);
301-
if (!overlay_cpy)
302-
return false;
303-
304-
/* Tokenize into elems array - pointers into
305-
* overlay_cpy, no extra allocs */
306-
for (tok = strtok_r(overlay_cpy, ", ", &save);
295+
/* Tokenize in-place — overlay[] is a local buffer,
296+
* no heap allocation needed */
297+
for (tok = strtok_r(overlay, ", ", &save);
307298
tok && list_size < 6;
308299
tok = strtok_r(NULL, ", ", &save))
309300
elems[list_size++] = tok;
310301

311302
if (list_size < 6)
312303
{
313304
RARCH_ERR("[Overlay] Overlay desc is invalid. Requires at least 6 tokens.\n");
314-
free(overlay_cpy);
315305
return false;
316306
}
317307

318-
key = elems[0];
319-
x = elems[1];
320-
y = elems[2];
308+
/* elems[0] (key) will be mutated by the button-parsing
309+
* strtok_r below, so read x/y/box from their own pointers
310+
* before that happens. They are separate tokens in the
311+
* buffer and won't be touched. */
321312
box = elems[3];
322313

323314
desc->retro_key_idx = 0;
324315
BIT256_CLEAR_ALL(desc->button_mask);
325316

326-
if (string_is_equal(key, "analog_left"))
317+
if (string_is_equal(elems[0], "analog_left"))
327318
desc->type = OVERLAY_TYPE_ANALOG_LEFT;
328-
else if (string_is_equal(key, "analog_right"))
319+
else if (string_is_equal(elems[0], "analog_right"))
329320
desc->type = OVERLAY_TYPE_ANALOG_RIGHT;
330-
else if (string_is_equal(key, "dpad_area"))
321+
else if (string_is_equal(elems[0], "dpad_area"))
331322
desc->type = OVERLAY_TYPE_DPAD_AREA;
332-
else if (string_is_equal(key, "abxy_area"))
323+
else if (string_is_equal(elems[0], "abxy_area"))
333324
desc->type = OVERLAY_TYPE_ABXY_AREA;
334-
else if (strstr(key, "retrok_") == key)
325+
else if (strstr(elems[0], "retrok_") == elems[0])
335326
{
336327
desc->type = OVERLAY_TYPE_KEYBOARD;
337-
desc->retro_key_idx = input_config_translate_str_to_rk(key + 7, strlen(key + 7));
328+
desc->retro_key_idx = input_config_translate_str_to_rk(
329+
elems[0] + 7, strlen(elems[0] + 7));
338330
}
339331
else
340332
{
341-
char *save = NULL;
342-
const char *tmp = strtok_r((char*)key, "|", &save);
333+
char *save2 = NULL;
334+
const char *tmp = strtok_r(elems[0], "|", &save2);
343335

344336
desc->type = OVERLAY_TYPE_BUTTONS;
345337

346-
for (; tmp; tmp = strtok_r(NULL, "|", &save))
338+
for (; tmp; tmp = strtok_r(NULL, "|", &save2))
347339
{
348340
if (!string_is_equal(tmp, "nul"))
349341
{
@@ -385,8 +377,8 @@ static bool task_overlay_load_desc(
385377
height_mod /= height;
386378
}
387379

388-
desc->x = (float)strtod(x, NULL) * width_mod;
389-
desc->y = (float)strtod(y, NULL) * height_mod;
380+
desc->x = (float)strtod(elems[1], NULL) * width_mod;
381+
desc->y = (float)strtod(elems[2], NULL) * height_mod;
390382
desc->x_shift = desc->x;
391383
desc->y_shift = desc->y;
392384

@@ -397,7 +389,6 @@ static bool task_overlay_load_desc(
397389
else
398390
{
399391
RARCH_ERR("[Overlay] Hitbox type (%s) is invalid. Use \"radial\" or \"rect\".\n", box);
400-
free(overlay_cpy);
401392
return false;
402393
}
403394

@@ -408,7 +399,6 @@ static bool task_overlay_load_desc(
408399
if (desc->hitbox != OVERLAY_HITBOX_RADIAL)
409400
{
410401
RARCH_ERR("[Overlay] Analog hitbox type must be \"radial\".\n");
411-
free(overlay_cpy);
412402
return false;
413403
}
414404

@@ -432,9 +422,6 @@ static bool task_overlay_load_desc(
432422
desc->range_x = (float)strtod(elems[4], NULL) * width_mod;
433423
desc->range_y = (float)strtod(elems[5], NULL) * height_mod;
434424

435-
/* Done with tokenized string */
436-
free(overlay_cpy);
437-
438425
_len = strlcpy(conf_key, overlay_desc_key, sizeof(conf_key));
439426

440427
strlcpy(conf_key + _len, "_reach_x", sizeof(conf_key) - _len);
@@ -828,32 +815,30 @@ static void task_overlay_deferred_load(retro_task_t *task)
828815
if (config_get_array(conf, overlay->config.rect.key,
829816
overlay->config.rect.array, sizeof(overlay->config.rect.array)))
830817
{
831-
char *tok, *save = NULL;
818+
char cfg_rect_buf[256];
832819
char *elems[4] = {NULL, NULL, NULL, NULL};
833820
unsigned list_size = 0;
834-
char *cfg_rect_array_cpy = strdup(overlay->config.rect.array);
821+
char *tok, *save = NULL;
835822

836-
if (cfg_rect_array_cpy)
837-
{
838-
for (tok = strtok_r(cfg_rect_array_cpy, ", ", &save);
839-
tok && list_size < 4;
840-
tok = strtok_r(NULL, ", ", &save))
841-
elems[list_size++] = tok;
842-
}
823+
strlcpy(cfg_rect_buf, overlay->config.rect.array,
824+
sizeof(cfg_rect_buf));
825+
826+
for (tok = strtok_r(cfg_rect_buf, ", ", &save);
827+
tok && list_size < 4;
828+
tok = strtok_r(NULL, ", ", &save))
829+
elems[list_size++] = tok;
843830

844831
if (list_size < 4)
845832
{
846833
RARCH_ERR("[Overlay] Failed to split rect \"%s\" into at least four tokens.\n",
847834
overlay->config.rect.array);
848-
free(cfg_rect_array_cpy);
849835
goto error;
850836
}
851837

852838
overlay->x = (float)strtod(elems[0], NULL);
853839
overlay->y = (float)strtod(elems[1], NULL);
854840
overlay->w = (float)strtod(elems[2], NULL);
855841
overlay->h = (float)strtod(elems[3], NULL);
856-
free(cfg_rect_array_cpy);
857842
}
858843

859844
/* Assume for now that scaling center is in the middle.
@@ -867,19 +852,18 @@ static void task_overlay_deferred_load(retro_task_t *task)
867852
RARCH_LOG("[Overlay] Checking for viewport key: %s\n", conf_key);
868853
if (config_get_array(conf, conf_key, tmp_str, sizeof(tmp_str)))
869854
{
870-
char *tok, *save = NULL;
855+
char cfg_vp_buf[256];
871856
char *elems[4] = {NULL, NULL, NULL, NULL};
872857
unsigned list_size = 0;
873-
char *cfg_vp_cpy = strdup(tmp_str);
858+
char *tok, *save = NULL;
874859
RARCH_LOG("[Overlay] Found viewport value: %s\n", tmp_str);
875860

876-
if (cfg_vp_cpy)
877-
{
878-
for (tok = strtok_r(cfg_vp_cpy, ", ", &save);
879-
tok && list_size < 4;
880-
tok = strtok_r(NULL, ", ", &save))
881-
elems[list_size++] = tok;
882-
}
861+
strlcpy(cfg_vp_buf, tmp_str, sizeof(cfg_vp_buf));
862+
863+
for (tok = strtok_r(cfg_vp_buf, ", ", &save);
864+
tok && list_size < 4;
865+
tok = strtok_r(NULL, ", ", &save))
866+
elems[list_size++] = tok;
883867

884868
if (list_size >= 4)
885869
{
@@ -894,8 +878,6 @@ static void task_overlay_deferred_load(retro_task_t *task)
894878
}
895879
else
896880
RARCH_WARN("[Overlay] viewport \"%s\" requires four tokens.\n", tmp_str);
897-
898-
free(cfg_vp_cpy);
899881
}
900882

901883
/* Parse viewport_fill option (optional, default false) */

0 commit comments

Comments
 (0)