110 lines
2.7 KiB
C
110 lines
2.7 KiB
C
/*************************************************************************
|
|
*
|
|
* Orca
|
|
* Copyright 2023 Martin Fouilleul and the Orca project contributors
|
|
* See LICENSE.txt for licensing information
|
|
*
|
|
**************************************************************************/
|
|
|
|
#include "platform_path.h"
|
|
|
|
oc_str8 oc_path_slice_directory(oc_str8 fullPath)
|
|
{
|
|
i64 lastSlashIndex = -1;
|
|
|
|
for(i64 i = fullPath.len - 1; i >= 0; i--)
|
|
{
|
|
if(fullPath.ptr[i] == '/')
|
|
{
|
|
lastSlashIndex = i;
|
|
break;
|
|
}
|
|
}
|
|
oc_str8 directory = oc_str8_slice(fullPath, 0, lastSlashIndex + 1);
|
|
return (directory);
|
|
}
|
|
|
|
oc_str8 oc_path_slice_filename(oc_str8 fullPath)
|
|
{
|
|
i64 lastSlashIndex = -1;
|
|
|
|
for(i64 i = fullPath.len - 1; i >= 0; i--)
|
|
{
|
|
if(fullPath.ptr[i] == '/')
|
|
{
|
|
lastSlashIndex = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
oc_str8 basename = oc_str8_slice(fullPath, lastSlashIndex + 1, fullPath.len);
|
|
return (basename);
|
|
}
|
|
|
|
oc_str8_list oc_path_split(oc_arena* arena, oc_str8 path)
|
|
{
|
|
oc_arena_scope tmp = oc_scratch_begin_next(arena);
|
|
oc_str8_list split = { 0 };
|
|
oc_str8_list_push(tmp.arena, &split, OC_STR8("/"));
|
|
oc_str8_list res = oc_str8_split(arena, path, split);
|
|
oc_scratch_end(tmp);
|
|
return (res);
|
|
}
|
|
|
|
oc_str8 oc_path_join(oc_arena* arena, oc_str8_list elements)
|
|
{
|
|
//TODO: check if elements have ending/begining '/' ?
|
|
oc_str8 res = oc_str8_list_collate(arena, elements, OC_STR8(""), OC_STR8("/"), (oc_str8){ 0 });
|
|
return (res);
|
|
}
|
|
|
|
oc_str8 oc_path_append(oc_arena* arena, oc_str8 parent, oc_str8 relPath)
|
|
{
|
|
oc_str8 result = { 0 };
|
|
|
|
if(parent.len == 0)
|
|
{
|
|
result = oc_str8_push_copy(arena, relPath);
|
|
}
|
|
else if(relPath.len == 0)
|
|
{
|
|
result = oc_str8_push_copy(arena, parent);
|
|
}
|
|
else
|
|
{
|
|
oc_arena_scope tmp = oc_scratch_begin_next(arena);
|
|
|
|
oc_str8_list list = { 0 };
|
|
oc_str8_list_push(tmp.arena, &list, parent);
|
|
if((parent.ptr[parent.len - 1] != '/')
|
|
&& (relPath.ptr[relPath.len - 1] != '/'))
|
|
{
|
|
oc_str8_list_push(tmp.arena, &list, OC_STR8("/"));
|
|
}
|
|
oc_str8_list_push(tmp.arena, &list, relPath);
|
|
|
|
result = oc_str8_list_join(arena, list);
|
|
|
|
oc_scratch_end(tmp);
|
|
}
|
|
return (result);
|
|
}
|
|
|
|
#if !defined(OC_PLATFORM_ORCA) || !OC_PLATFORM_ORCA
|
|
|
|
oc_str8 oc_path_executable_relative(oc_arena* arena, oc_str8 relPath)
|
|
{
|
|
oc_str8_list list = { 0 };
|
|
oc_arena_scope scratch = oc_scratch_begin_next(arena);
|
|
|
|
oc_str8 executablePath = oc_path_executable(scratch.arena);
|
|
oc_str8 dirPath = oc_path_slice_directory(executablePath);
|
|
|
|
oc_str8 path = oc_path_append(arena, dirPath, relPath);
|
|
|
|
oc_scratch_end(scratch);
|
|
return (path);
|
|
}
|
|
|
|
#endif
|