From debffac5c019d09b4b7067a10bd45bf7d2bfc569 Mon Sep 17 00:00:00 2001 From: Martin Fouilleul Date: Wed, 24 May 2023 20:36:05 +0200 Subject: [PATCH] [path] use new mem_scratch_begin_next() API in path functions, to handle the case where passed-in result arena is itself a scratch arena --- src/platform/osx_path.m | 28 +++++++++++++++++----------- src/platform/platform_path.c | 17 ++++++++++------- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/src/platform/osx_path.m b/src/platform/osx_path.m index c400c47..6973d94 100644 --- a/src/platform/osx_path.m +++ b/src/platform/osx_path.m @@ -26,32 +26,38 @@ str8 path_find_executable(mem_arena* arena) str8 path_find_resource(mem_arena* arena, str8 relPath) { str8_list list = {}; - mem_arena* scratch = mem_scratch(); + mem_arena_scope scratch = mem_scratch_begin_next(arena); - str8 executablePath = path_find_executable(scratch); + str8 executablePath = path_find_executable(scratch.arena); str8 dirPath = path_slice_directory(executablePath); - str8_list_push(scratch, &list, dirPath); - str8_list_push(scratch, &list, STR8("/")); - str8_list_push(scratch, &list, relPath); - str8 path = str8_list_join(scratch, list); - char* pathCString = str8_to_cstring(scratch, path); - char* buffer = mem_arena_alloc_array(scratch, char, path.len+1); - char* real = realpath(pathCString, buffer); + str8_list_push(scratch.arena, &list, dirPath); + str8_list_push(scratch.arena, &list, STR8("/")); + str8_list_push(scratch.arena, &list, relPath); + str8 path = str8_list_join(scratch.arena, list); + char* pathCString = str8_to_cstring(scratch.arena, path); + + char* real = realpath(pathCString, 0); str8 result = str8_push_cstring(arena, real); + + free(real); + + mem_scratch_end(scratch); + return(result); } str8 path_find_canonical(mem_arena* arena, str8 path) { - mem_arena* scratch = mem_scratch(); - char* pathCString = str8_to_cstring(scratch, path); + mem_arena_scope scratch = mem_scratch_begin_next(arena); + char* pathCString = str8_to_cstring(scratch.arena, path); char* real = realpath(pathCString, 0); str8 result = str8_push_cstring(arena, real); free(real); + mem_scratch_end(scratch); return(result); } diff --git a/src/platform/platform_path.c b/src/platform/platform_path.c index 3139375..fcff779 100644 --- a/src/platform/platform_path.c +++ b/src/platform/platform_path.c @@ -43,10 +43,11 @@ str8 path_slice_filename(str8 fullPath) str8_list path_split(mem_arena* arena, str8 path) { - //TODO: use secondary scratch arena + mem_arena_scope tmp = mem_scratch_begin_next(arena); str8_list split = {0}; - str8_list_push(arena, &split, STR8("/")); + str8_list_push(tmp.arena, &split, STR8("/")); str8_list res = str8_split(arena, path, split); + mem_scratch_end(tmp); return(res); } @@ -58,8 +59,6 @@ str8 path_join(mem_arena* arena, str8_list elements) str8 path_append(mem_arena* arena, str8 parent, str8 relPath) { - //TODO: use secondary scratch arena - str8 result = {0}; if(parent.len == 0) @@ -72,16 +71,20 @@ str8 path_append(mem_arena* arena, str8 parent, str8 relPath) } else { + mem_arena_scope tmp = mem_scratch_begin_next(arena); + str8_list list = {0}; - str8_list_push(arena, &list, parent); + str8_list_push(tmp.arena, &list, parent); if( (parent.ptr[parent.len-1] != '/') &&(relPath.ptr[relPath.len-1] != '/')) { - str8_list_push(arena, &list, STR8("/")); + str8_list_push(tmp.arena, &list, STR8("/")); } - str8_list_push(arena, &list, relPath); + str8_list_push(tmp.arena, &list, relPath); result = str8_list_join(arena, list); + + mem_scratch_end(tmp); } return(result); }