meta: rename to fx
This commit is contained in:
@@ -1,99 +1,99 @@
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
|
||||
#include <Windows.h>
|
||||
#include <blue/io/directory.h>
|
||||
#include <fx/io/directory.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
struct b_directory {
|
||||
struct b_dsref base;
|
||||
struct fx_directory {
|
||||
struct fx_dsref base;
|
||||
HANDLE handle;
|
||||
struct b_path *abs_path;
|
||||
struct fx_path *abs_path;
|
||||
};
|
||||
|
||||
struct z__b_directory_iterator {
|
||||
b_queue state_stack;
|
||||
struct z__fx_directory_iterator {
|
||||
fx_queue state_stack;
|
||||
};
|
||||
|
||||
struct iteration_state {
|
||||
const b_path *search_path;
|
||||
b_queue_entry entry;
|
||||
const fx_path *search_path;
|
||||
fx_queue_entry entry;
|
||||
HANDLE search;
|
||||
WIN32_FIND_DATAA data;
|
||||
bool child_search_complete;
|
||||
};
|
||||
|
||||
static void directory_release(struct b_dsref *obj);
|
||||
static void directory_release(struct fx_dsref *obj);
|
||||
|
||||
static struct b_dsref_type directory_type = {
|
||||
static struct fx_dsref_type directory_type = {
|
||||
.t_name = "corelib::directory",
|
||||
.t_flags = B_DSREF_FUNDAMENTAL,
|
||||
.t_id = B_DSREF_TYPE_PATH,
|
||||
.t_instance_size = sizeof(struct b_directory),
|
||||
.t_flags = FX_DSREF_FUNDAMENTAL,
|
||||
.t_id = FX_DSREF_TYPE_PATH,
|
||||
.t_instance_size = sizeof(struct fx_directory),
|
||||
.t_release = directory_release,
|
||||
};
|
||||
|
||||
static enum b_status status_from_win32_error(int error, enum b_status default_value)
|
||||
static enum fx_status status_from_win32_error(int error, enum fx_status default_value)
|
||||
{
|
||||
switch (error) {
|
||||
case ERROR_FILE_NOT_FOUND:
|
||||
return B_ERR_NO_ENTRY;
|
||||
return FX_ERR_NO_ENTRY;
|
||||
default:
|
||||
return default_value;
|
||||
}
|
||||
}
|
||||
|
||||
enum b_status b_directory_open(
|
||||
struct b_directory *root, const struct b_path *path,
|
||||
struct b_directory **out)
|
||||
enum fx_status fx_directory_open(
|
||||
struct fx_directory *root, const struct fx_path *path,
|
||||
struct fx_directory **out)
|
||||
{
|
||||
enum b_status status = B_SUCCESS;
|
||||
enum fx_status status = FX_SUCCESS;
|
||||
|
||||
const b_path *parts[] = {
|
||||
const fx_path *parts[] = {
|
||||
root ? root->abs_path : NULL,
|
||||
path,
|
||||
};
|
||||
|
||||
b_path *new_path = b_path_join(parts, sizeof parts / sizeof *parts);
|
||||
fx_path *new_path = fx_path_join(parts, sizeof parts / sizeof *parts);
|
||||
if (!new_path) {
|
||||
return B_ERR_NO_MEMORY;
|
||||
return FX_ERR_NO_MEMORY;
|
||||
}
|
||||
|
||||
HANDLE dir_handle = CreateFileA(
|
||||
b_path_ptr(new_path), GENERIC_READ,
|
||||
fx_path_ptr(new_path), GENERIC_READ,
|
||||
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
|
||||
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, INVALID_HANDLE_VALUE);
|
||||
|
||||
if (dir_handle == INVALID_HANDLE_VALUE) {
|
||||
status = status_from_win32_error(GetLastError(), B_ERR_IO_FAILURE);
|
||||
status = status_from_win32_error(GetLastError(), FX_ERR_IO_FAILURE);
|
||||
|
||||
b_path_release(new_path);
|
||||
fx_path_release(new_path);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
BY_HANDLE_FILE_INFORMATION dir_info;
|
||||
if (!GetFileInformationByHandle(dir_handle, &dir_info)) {
|
||||
status = status_from_win32_error(GetLastError(), B_ERR_IO_FAILURE);
|
||||
status = status_from_win32_error(GetLastError(), FX_ERR_IO_FAILURE);
|
||||
|
||||
CloseHandle(dir_handle);
|
||||
b_path_release(new_path);
|
||||
fx_path_release(new_path);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
if (!(dir_info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
|
||||
CloseHandle(dir_handle);
|
||||
b_path_release(new_path);
|
||||
return B_ERR_NOT_DIRECTORY;
|
||||
fx_path_release(new_path);
|
||||
return FX_ERR_NOT_DIRECTORY;
|
||||
}
|
||||
|
||||
struct b_directory *dir
|
||||
= (struct b_directory *)b_dsref_type_instantiate(&directory_type);
|
||||
struct fx_directory *dir
|
||||
= (struct fx_directory *)fx_dsref_type_instantiate(&directory_type);
|
||||
if (!path) {
|
||||
CloseHandle(dir_handle);
|
||||
b_path_release(new_path);
|
||||
return B_ERR_NO_MEMORY;
|
||||
fx_path_release(new_path);
|
||||
return FX_ERR_NO_MEMORY;
|
||||
}
|
||||
|
||||
dir->abs_path = new_path;
|
||||
@@ -101,23 +101,23 @@ enum b_status b_directory_open(
|
||||
|
||||
*out = dir;
|
||||
|
||||
return B_SUCCESS;
|
||||
return FX_SUCCESS;
|
||||
}
|
||||
|
||||
static struct iteration_state *get_iteration_state(
|
||||
struct z__b_directory_iterator *it)
|
||||
struct z__fx_directory_iterator *it)
|
||||
{
|
||||
b_queue_entry *last = b_queue_last(&it->state_stack);
|
||||
fx_queue_entry *last = fx_queue_last(&it->state_stack);
|
||||
|
||||
if (!last) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return b_unbox(struct iteration_state, last, entry);
|
||||
return fx_unbox(struct iteration_state, last, entry);
|
||||
}
|
||||
|
||||
static struct iteration_state *push_iteration_state(
|
||||
struct z__b_directory_iterator *it)
|
||||
struct z__fx_directory_iterator *it)
|
||||
{
|
||||
struct iteration_state *state = malloc(sizeof *state);
|
||||
if (!state) {
|
||||
@@ -126,11 +126,11 @@ static struct iteration_state *push_iteration_state(
|
||||
|
||||
memset(state, 0x0, sizeof *state);
|
||||
|
||||
b_queue_push_back(&it->state_stack, &state->entry);
|
||||
fx_queue_push_back(&it->state_stack, &state->entry);
|
||||
return state;
|
||||
}
|
||||
|
||||
static void pop_iteration_state(struct z__b_directory_iterator *it)
|
||||
static void pop_iteration_state(struct z__fx_directory_iterator *it)
|
||||
{
|
||||
struct iteration_state *state = get_iteration_state(it);
|
||||
|
||||
@@ -138,14 +138,14 @@ static void pop_iteration_state(struct z__b_directory_iterator *it)
|
||||
return;
|
||||
}
|
||||
|
||||
b_queue_pop_back(&it->state_stack);
|
||||
fx_queue_pop_back(&it->state_stack);
|
||||
FindClose(state->search);
|
||||
free(state);
|
||||
}
|
||||
|
||||
static void cleanup_iterator(struct b_directory_iterator *it)
|
||||
static void cleanup_iterator(struct fx_directory_iterator *it)
|
||||
{
|
||||
while (!b_queue_empty(&it->_z->state_stack)) {
|
||||
while (!fx_queue_empty(&it->_z->state_stack)) {
|
||||
pop_iteration_state(it->_z);
|
||||
}
|
||||
|
||||
@@ -153,10 +153,10 @@ static void cleanup_iterator(struct b_directory_iterator *it)
|
||||
it->_z = NULL;
|
||||
}
|
||||
|
||||
static void update_iterator_data(struct b_directory_iterator *it)
|
||||
static void update_iterator_data(struct fx_directory_iterator *it)
|
||||
{
|
||||
if (it->filepath) {
|
||||
b_path_release(B_PATH(it->filepath));
|
||||
fx_path_release(FX_PATH(it->filepath));
|
||||
it->filepath = NULL;
|
||||
}
|
||||
|
||||
@@ -164,44 +164,44 @@ static void update_iterator_data(struct b_directory_iterator *it)
|
||||
if (state) {
|
||||
it->filename = state->data.cFileName;
|
||||
|
||||
struct b_path *filename = b_path_create_from_cstr(it->filename);
|
||||
struct fx_path *filename = fx_path_create_from_cstr(it->filename);
|
||||
|
||||
const struct b_path *parts[] = {
|
||||
const struct fx_path *parts[] = {
|
||||
state->search_path,
|
||||
filename,
|
||||
};
|
||||
|
||||
it->filepath = b_path_join(parts, sizeof parts / sizeof parts[0]);
|
||||
it->filepath = fx_path_join(parts, sizeof parts / sizeof parts[0]);
|
||||
}
|
||||
}
|
||||
|
||||
static bool move_into_directory(struct b_directory_iterator *it, const char *dir_name)
|
||||
static bool move_into_directory(struct fx_directory_iterator *it, const char *dir_name)
|
||||
{
|
||||
struct iteration_state *state = get_iteration_state(it->_z);
|
||||
|
||||
struct b_path *dir_name_p = b_path_create_from_cstr(dir_name);
|
||||
struct b_path *wildcard = b_path_create_from_cstr("*");
|
||||
struct fx_path *dir_name_p = fx_path_create_from_cstr(dir_name);
|
||||
struct fx_path *wildcard = fx_path_create_from_cstr("*");
|
||||
|
||||
const struct b_path *parts[] = {
|
||||
const struct fx_path *parts[] = {
|
||||
state ? state->search_path : NULL,
|
||||
dir_name_p,
|
||||
};
|
||||
|
||||
struct b_path *dir_path = b_path_join(parts, sizeof parts / sizeof *parts);
|
||||
struct fx_path *dir_path = fx_path_join(parts, sizeof parts / sizeof *parts);
|
||||
|
||||
parts[0] = dir_path;
|
||||
parts[1] = wildcard;
|
||||
|
||||
struct b_path *search_path
|
||||
= b_path_join(parts, sizeof parts / sizeof *parts);
|
||||
struct fx_path *search_path
|
||||
= fx_path_join(parts, sizeof parts / sizeof *parts);
|
||||
|
||||
state = push_iteration_state(it->_z);
|
||||
state->search_path = dir_path;
|
||||
state->search = FindFirstFileA(b_path_ptr(search_path), &state->data);
|
||||
state->search = FindFirstFileA(fx_path_ptr(search_path), &state->data);
|
||||
|
||||
b_path_release(search_path);
|
||||
b_path_release(wildcard);
|
||||
b_path_release(dir_name_p);
|
||||
fx_path_release(search_path);
|
||||
fx_path_release(wildcard);
|
||||
fx_path_release(dir_name_p);
|
||||
|
||||
if (state->search == INVALID_HANDLE_VALUE) {
|
||||
pop_iteration_state(it->_z);
|
||||
@@ -222,15 +222,15 @@ static bool move_into_directory(struct b_directory_iterator *it, const char *dir
|
||||
}
|
||||
|
||||
static bool move_to_first_item(
|
||||
struct b_directory_iterator *it, const struct b_path *root_dir)
|
||||
struct fx_directory_iterator *it, const struct fx_path *root_dir)
|
||||
{
|
||||
bool has_results = move_into_directory(it, b_path_ptr(root_dir));
|
||||
bool has_results = move_into_directory(it, fx_path_ptr(root_dir));
|
||||
|
||||
if (!has_results) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (it->flags & B_DIRECTORY_ITERATE_PARENT_FIRST) {
|
||||
if (it->flags & FX_DIRECTORY_ITERATE_PARENT_FIRST) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -252,14 +252,14 @@ static bool move_to_first_item(
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool move_to_next_item(struct b_directory_iterator *it)
|
||||
static bool move_to_next_item(struct fx_directory_iterator *it)
|
||||
{
|
||||
while (true) {
|
||||
struct iteration_state *state = get_iteration_state(it->_z);
|
||||
|
||||
if (!state->child_search_complete
|
||||
&& (state->data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
||||
&& (it->flags & B_DIRECTORY_ITERATE_PARENT_FIRST)) {
|
||||
&& (it->flags & FX_DIRECTORY_ITERATE_PARENT_FIRST)) {
|
||||
if (move_into_directory(it, state->data.cFileName)) {
|
||||
return true;
|
||||
}
|
||||
@@ -271,7 +271,7 @@ static bool move_to_next_item(struct b_directory_iterator *it)
|
||||
pop_iteration_state(it->_z);
|
||||
state = get_iteration_state(it->_z);
|
||||
|
||||
if (it->flags & B_DIRECTORY_ITERATE_PARENT_FIRST
|
||||
if (it->flags & FX_DIRECTORY_ITERATE_PARENT_FIRST
|
||||
&& state != NULL) {
|
||||
state->child_search_complete = true;
|
||||
continue;
|
||||
@@ -286,7 +286,7 @@ static bool move_to_next_item(struct b_directory_iterator *it)
|
||||
return true;
|
||||
}
|
||||
|
||||
if (it->flags & B_DIRECTORY_ITERATE_PARENT_FIRST) {
|
||||
if (it->flags & FX_DIRECTORY_ITERATE_PARENT_FIRST) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -311,17 +311,17 @@ static bool move_to_next_item(struct b_directory_iterator *it)
|
||||
return true;
|
||||
}
|
||||
|
||||
int b_directory_iterator_begin(
|
||||
struct b_directory *directory, struct b_directory_iterator *it,
|
||||
enum b_directory_iterator_flags flags)
|
||||
int fx_directory_iterator_begin(
|
||||
struct fx_directory *directory, struct fx_directory_iterator *it,
|
||||
enum fx_directory_iterator_flags flags)
|
||||
{
|
||||
if (b_directory_iterator_is_valid(it)) {
|
||||
if (fx_directory_iterator_is_valid(it)) {
|
||||
cleanup_iterator(it);
|
||||
}
|
||||
|
||||
it->flags = flags;
|
||||
|
||||
struct z__b_directory_iterator *it_data = malloc(sizeof *it_data);
|
||||
struct z__fx_directory_iterator *it_data = malloc(sizeof *it_data);
|
||||
memset(it_data, 0x0, sizeof *it_data);
|
||||
|
||||
it->_z = it_data;
|
||||
@@ -332,7 +332,7 @@ int b_directory_iterator_begin(
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool b_directory_iterator_next(struct b_directory_iterator *it)
|
||||
bool fx_directory_iterator_next(struct fx_directory_iterator *it)
|
||||
{
|
||||
if (!it->_z) {
|
||||
return false;
|
||||
@@ -343,12 +343,12 @@ bool b_directory_iterator_next(struct b_directory_iterator *it)
|
||||
return result;
|
||||
}
|
||||
|
||||
enum b_status b_directory_iterator_erase(struct b_directory_iterator *it)
|
||||
enum fx_status fx_directory_iterator_erase(struct fx_directory_iterator *it)
|
||||
{
|
||||
return B_SUCCESS;
|
||||
return FX_SUCCESS;
|
||||
}
|
||||
|
||||
bool b_directory_iterator_is_valid(const struct b_directory_iterator *it)
|
||||
bool fx_directory_iterator_is_valid(const struct fx_directory_iterator *it)
|
||||
{
|
||||
if (!it->_z) {
|
||||
return false;
|
||||
@@ -361,6 +361,6 @@ bool b_directory_iterator_is_valid(const struct b_directory_iterator *it)
|
||||
return true;
|
||||
}
|
||||
|
||||
static void directory_release(struct b_dsref *obj)
|
||||
static void directory_release(struct fx_dsref *obj)
|
||||
{
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user