[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
This commit is contained in:
parent
ba125ae860
commit
debffac5c0
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue