From 4f9ea02126878f0c4d61e226a4ce6c2e77678864 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Mon, 10 Feb 2025 13:59:20 +0000 Subject: [PATCH] meta: add module for disk I/O functionality --- CMakeLists.txt | 2 +- io/CMakeLists.txt | 3 +++ io/include/blue/io.h | 0 io/include/blue/io/directory.h | 34 +++++++++++++++++++++++++++++ io/include/blue/io/path.h | 25 ++++++++++++++++++++++ io/sys/darwin/directory.c | 39 ++++++++++++++++++++++++++++++++++ io/sys/darwin/path.c | 0 7 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 io/CMakeLists.txt create mode 100644 io/include/blue/io.h create mode 100644 io/include/blue/io/directory.h create mode 100644 io/include/blue/io/path.h create mode 100644 io/sys/darwin/directory.c create mode 100644 io/sys/darwin/path.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 77d8307..38343db 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ include (TestBigEndian) set_property(GLOBAL PROPERTY USE_FOLDERS ON) -set(b_modules core object term cmd) +set(b_modules core object term cmd io) set(b_system_name ${CMAKE_SYSTEM_NAME}) string(TOLOWER ${b_system_name} b_system_name) diff --git a/io/CMakeLists.txt b/io/CMakeLists.txt new file mode 100644 index 0000000..fd25714 --- /dev/null +++ b/io/CMakeLists.txt @@ -0,0 +1,3 @@ +include(../cmake/Templates.cmake) + +add_bluelib_module(NAME io DEPENDENCIES core) diff --git a/io/include/blue/io.h b/io/include/blue/io.h new file mode 100644 index 0000000..e69de29 diff --git a/io/include/blue/io/directory.h b/io/include/blue/io/directory.h new file mode 100644 index 0000000..6021f07 --- /dev/null +++ b/io/include/blue/io/directory.h @@ -0,0 +1,34 @@ +#ifndef BLUELIB_IO_DIRECTORY_H_ +#define BLUELIB_IO_DIRECTORY_H_ + +#include +#include +#include + +#define B_DIRECTORY_ROOT ((b_directory *)NULL) + +typedef struct b_directory b_directory; + +struct z__b_directory_iterator; + +typedef struct b_directory_iterator { + b_iterator _base; + char *filename; + char *filepath; + struct z__b_directory_iterator *_z; +} b_directory_iterator; + +#define b_directory_foreach(it, dir, flags) \ + for (int z__b_unique_name() = b_directory_iterator_begin(dir, it, flags); \ + b_directory_iterator_is_valid(it); b_directory_iterator_next(it)) + +BLUE_API b_status b_directory_open( + b_directory *root, const char *path, b_directory **out); + +BLUE_API int b_directory_iterator_begin( + b_directory *directory, b_directory_iterator *it); +BLUE_API bool b_directory_iterator_next(b_directory_iterator *it); +BLUE_API b_status b_directory_iterator_erase(b_directory_iterator *it); +BLUE_API bool b_directory_iterator_is_valid(const b_directory_iterator *it); + +#endif diff --git a/io/include/blue/io/path.h b/io/include/blue/io/path.h new file mode 100644 index 0000000..30590d2 --- /dev/null +++ b/io/include/blue/io/path.h @@ -0,0 +1,25 @@ +#ifndef BLUELIB_IO_PATH_H_ +#define BLUELIB_IO_PATH_H_ + +#include +#include +#include +#include + +typedef struct b_path b_path; + +BLUE_API b_status b_path_create(b_path **out); +BLUE_API b_status b_path_create_root(b_path **out); +BLUE_API b_status b_path_create_cwd(b_path **out); +BLUE_API b_status b_path_create_from_cstr(const char *path, b_path **out); + +BLUE_API b_status b_path_join(const b_path *paths[], size_t nr_paths, b_path **out); + +BLUE_API b_status b_path_make_absolute(const b_path *in, b_path **out); +BLUE_API b_status b_path_make_relative(const b_path *in, b_path **out); +BLUE_API b_status b_path_make_canonical(const b_path *in, b_path **out); + +BLUE_API b_path *b_path_retain(b_path *path); +BLUE_API void b_path_release(b_path *path); + +#endif diff --git a/io/sys/darwin/directory.c b/io/sys/darwin/directory.c new file mode 100644 index 0000000..1c63c8a --- /dev/null +++ b/io/sys/darwin/directory.c @@ -0,0 +1,39 @@ +#include +#include + +struct b_directory { + int fd; + char *abs_path; +}; + +struct z__b_directory_iterator { + FTS *fts; + FTSENT *node; +}; + +enum b_status b_directory_open( + struct b_directory *root, const char *path, struct b_directory **out) +{ + return B_SUCCESS; +} + +int b_directory_iterator_begin( + struct b_directory *directory, struct b_directory_iterator *it) +{ + return 0; +} + +bool b_directory_iterator_next(struct b_directory_iterator *it) +{ + return false; +} + +enum b_status b_directory_iterator_erase(struct b_directory_iterator *it) +{ + return B_SUCCESS; +} + +bool b_directory_iterator_is_valid(const struct b_directory_iterator *it) +{ + return false; +} diff --git a/io/sys/darwin/path.c b/io/sys/darwin/path.c new file mode 100644 index 0000000..e69de29