Add process state
This commit is contained in:
+46
@@ -0,0 +1,46 @@
|
||||
#include "src/path.h"
|
||||
#include "src/fs.h"
|
||||
#include "src/memory.h"
|
||||
#include "src/string.h"
|
||||
#include "src/util.h"
|
||||
#include <stdint.h>
|
||||
|
||||
path_t *path_open(const fs_node_t *root, const path_t *source, char *path) {
|
||||
path_t *result = memory_allocate(sizeof(path_t));
|
||||
|
||||
char *path_components[PATH_DEPTH];
|
||||
uint8_t path_length = (uint8_t)string_split(path, '/', PATH_DEPTH, path_components);
|
||||
if (!string_empty(path_components[0])) {
|
||||
for (uint8_t i = 0; i < source->depth; i++) {
|
||||
result->stack[result->depth++] = fs_open_again(source->stack[i]);
|
||||
}
|
||||
}
|
||||
|
||||
for (uint8_t i = 0; i < path_length; i++) {
|
||||
if (string_empty(path_components[i]) || string_equal(path_components[i], ".")) {
|
||||
continue;
|
||||
} else if (string_equal(path_components[i], "..")) {
|
||||
if (result->depth) {
|
||||
fs_close(result->stack[--result->depth]);
|
||||
}
|
||||
} else {
|
||||
const fs_node_t *prev = result->depth ? result->stack[result->depth - 1] : root;
|
||||
fs_node_t *next = prev->is_dir ? fs_open_by(prev, path_components[i]) : NUL;
|
||||
if (!next || result->depth >= PATH_DEPTH) {
|
||||
path_close(result);
|
||||
return NUL;
|
||||
} else {
|
||||
result->stack[result->depth++] = next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void path_close(path_t *path) {
|
||||
for (uint64_t i = 0; i < path->depth; i++) {
|
||||
fs_close(path->stack[i]);
|
||||
}
|
||||
memory_free(path);
|
||||
}
|
||||
Reference in New Issue
Block a user