/************************************************************************* * * 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