Files
wizapp-stdlib/src/os/cpath/cpath.c
T
abdelrahman a998f6b981
Release / release (push) Successful in 8s
Standardize naming conventions (#12)
## Summary

Standardize naming conventions across the entire wizapp-stdlib codebase by replacing inconsistent prefixes and snake_case with a unified `wp` prefix + CamelCase scheme.

## Changes

### Naming convention applied

| Pattern | Before | After |
|---|---|---|
| Public functions | `wapp_module_function` | `wpModuleFunction` |
| Public types | `GenericXxx`, bare `Xxx` | `WpXxx` |
| Constants / enum values | `WAPP_XXX`, `SHELL_XXX` | `WP_XXX`, `WP_SHELL_XXX` |
| Internal functions | `_module_function` | `_moduleFunction` |
| Storage-class macros | `wapp_extern`, `wapp_intern` | `wp_extern`, `wp_intern` |

### Modules affected

All 20 modules were renamed: `arena`, `array`, `dbl_list`, `queue`, `str8`, `mem_allocator`, `mem_utils`, `mem_os`, `file`, `cpath`, `log`, `shell_commander`, `shell_termcolour`, `shell_utils`, `prng/xorshift`, `uuid`, `tester`, `aliases`, `assert`, `misc_utils`, `platform` — plus their test files.

### Backward compatibility

Added `src/oldnames.h` with `#define OLD_NAME NEW_NAME` for every renamed symbol, organized by module under Constants → Types → Functions sections. Existing code that includes this file will compile without changes.

Reviewed-on: #12
Co-authored-by: Abdelrahman <said.abdelrahman89@gmail.com>
Co-committed-by: Abdelrahman <said.abdelrahman89@gmail.com>
2026-06-26 17:17:27 +00:00

135 lines
3.3 KiB
C

// vim:fileencoding=utf-8:foldmethod=marker
#include "cpath.h"
#include "../allocators/arena/mem_arena_allocator.h"
#include "../../common/aliases/aliases.h"
#include "../../common/misc/misc_utils.h"
#include "../../base/dbl_list/dbl_list.h"
#include "../../base/mem/allocator/mem_allocator.h"
#include "../../base/strings/str8/str8.h"
#include <stdarg.h>
u32 wpCpathJoinPath(WpStr8 *dst, const WpStr8List *parts) {
if (!dst || !parts) {
return WP_CPATH_JOIN_RESULT_INVALID_ARGS;
}
if (parts->node_count == 0) {
return WP_CPATH_JOIN_RESULT_EMPTY_PARTS;
}
WpStr8 separator = wpStr8Buf(4);
wpStr8PushBack(&separator, WP_PATH_SEP);
u64 required_capacity = parts->node_count * separator.size + wpStr8ListTotalSize(parts);
if (dst->capacity < required_capacity) {
return WP_CPATH_JOIN_RESULT_INSUFFICIENT_DST_CAPACITY;
}
// Handle first node
WpStr8 *first_node = wpDblListGet(WpStr8, parts, 0);
wpStr8CopyStr8Capped(dst, first_node);
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
// MSVC Spectre mitigation warnings
WpStr8 *node = first_node;
u64 node_index = 1;
b8 running = node_index < parts->node_count;
while (running) {
node = wpDblListGet(WpStr8, parts, node_index);
if (node->size == 0) {
goto CPATH_JOIN_LOOP_END;
}
if (dst->size > 0) {
char dst_last = wpStr8Get(dst, dst->size - 1);
char node_start = wpStr8Get(node, 0);
b8 add_path_sep = dst_last != WP_PATH_SEP && node_start != WP_PATH_SEP;
if (add_path_sep) {
wpStr8ConcatCapped(dst, &separator);
}
}
wpStr8ConcatCapped(dst, node);
CPATH_JOIN_LOOP_END:
++node_index;
running = node_index < parts->node_count;
}
return WP_CPATH_JOIN_RESULT_SUCCESS;
}
WpStr8 *_dirup(const WpAllocator *allocator, WpStr8RO *path, u64 levels) {
WpStr8 *output = NULL;
if (!allocator || !path) {
goto RETURN_DIRUP;
}
b8 absolute = wpStr8Get(path, 0) == WP_PATH_SEP;
WpStr8 separator = wpStr8Buf(4);
wpStr8PushBack(&separator, WP_PATH_SEP);
if (path->size == 0) {
output = wpStr8AllocBuf(allocator, 16);
if (!output) {
goto RETURN_DIRUP;
}
wpStr8PushBack(output, absolute ? WP_PATH_SEP : '.');
goto RETURN_DIRUP;
}
if (levels < 1) {
output = wpStr8AllocStr8(allocator, path);
goto RETURN_DIRUP;
}
WpAllocator tmp_arena = wpMemArenaAllocatorInit(MiB(8));
if (wpMemAllocatorInvalid(&tmp_arena)) {
goto RETURN_DIRUP;
}
WpStr8List *parts = wpStr8Split(&tmp_arena, path, &separator);
if (!parts) {
goto RETURN_DIRUP;
}
if (levels >= parts->node_count) {
output = wpStr8AllocBuf(allocator, 16);
if (!output) {
goto LIST_CLEANUP_DIRUP;
}
wpStr8PushBack(output, absolute ? WP_PATH_SEP : '.');
} else {
for (u64 i = 0; i < levels; ++i) {
wpDblListPopBack(WpStr8, parts);
}
u64 alignment = sizeof(void *) * 2;
u64 alloc_size = wpStr8ListTotalSize(parts) + parts->node_count * separator.size;
u64 modulo = alloc_size & (alignment - 1);
alloc_size += alignment - modulo;
output = wpStr8AllocBuf(allocator, alloc_size);
if (output) {
if (absolute) {
wpStr8PushBack(output, WP_PATH_SEP);
}
WpStr8 *joined = wpStr8Join(&tmp_arena, parts, &separator);
if (joined) {
wpStr8ConcatCapped(output, joined);
}
}
}
LIST_CLEANUP_DIRUP:
wpMemArenaAllocatorDestroy(&tmp_arena);
RETURN_DIRUP:
return output;
}