From b2cb998d72b032ae34c4f42f8a6567533d250d58 Mon Sep 17 00:00:00 2001 From: Kevin Day Date: Wed, 16 Apr 2025 22:11:27 -0500 Subject: [PATCH] Update: Add directory functions, re-design fl_directory_do(). Add several directory functions. I still may need to add more, such as a rewind to handle rewinddir(). Change the directory recurse do flags from an enumeration to defines. Add a type fo handling `DIR *` called `f_directory_stream_t`. Get rid of the directory listing structure to reduce memory usage. This is only possible by replacing the `scandir()` with custom direct processing. This change reduces the number of looping and removes the sorting behavior. The directory recurse do flags are now redesigned. The `top` is now entirely removed because a depth of 0 can be used to test for top without needing a flag. The `opendir()` still has a notable cost, especially during recursion. I need to do more research into how to more efficiently call `opendir()` without consuming too much memory. The documentation comments still needs to be reviewed following these changes. Make sure the directory functions only update the id values if there is no error. Explicitly check for `-1` as return error rather than `< 0` to be more consistent with the standards. Use typedefs to define callbacks. Tweak the `fl_directory_list()` design. Tweak the `fl_directory_path_pop()` design. --- build/disable/level_0/f_directory.h | 13 +- build/stand_alone/fake.config.h | 12 +- build/stand_alone/firewall.config.h | 12 +- level_0/f_directory/c/directory.c | 172 ++++++++- level_0/f_directory/c/directory.h | 190 +++++++++- level_0/f_directory/c/directory/common.h | 111 +++--- level_0/f_directory/c/directory/listing.h | 37 ++ level_0/f_directory/c/directory/recurse_do.c | 240 ------------- level_0/f_directory/c/directory/recurse_do.h | 9 +- level_0/f_directory/data/build/settings-mocks | 4 + level_0/f_directory/data/build/settings-tests | 1 + level_0/f_directory/tests/unit/c/mock-directory.c | 48 +++ level_0/f_directory/tests/unit/c/mock-directory.h | 8 + .../c/test-directory-recurse_dos_delete_callback.c | 346 ------------------ .../test-directory-recurse_dos_destroy_callback.c | 346 ------------------ .../test-directory-recurse_doss_delete_callback.c | 397 --------------------- .../test-directory-recurse_doss_destroy_callback.c | 397 --------------------- .../tests/unit/c/test-directory-stream_close.c | 67 ++++ .../tests/unit/c/test-directory-stream_close.h | 27 ++ .../tests/unit/c/test-directory-stream_open.c | 102 ++++++ .../tests/unit/c/test-directory-stream_open.h | 34 ++ .../tests/unit/c/test-directory-stream_open_id.c | 84 +++++ .../tests/unit/c/test-directory-stream_open_id.h | 27 ++ .../tests/unit/c/test-directory-stream_read.c | 76 ++++ .../tests/unit/c/test-directory-stream_read.h | 27 ++ .../tests/unit/c/test-directory-stream_rewind.c | 30 ++ .../tests/unit/c/test-directory-stream_rewind.h | 20 ++ .../tests/unit/c/test-directory-stream_seek.c | 30 ++ .../tests/unit/c/test-directory-stream_seek.h | 20 ++ .../tests/unit/c/test-directory-stream_tell.c | 72 ++++ .../tests/unit/c/test-directory-stream_tell.h | 27 ++ level_0/f_directory/tests/unit/c/test-directory.c | 19 + level_0/f_directory/tests/unit/c/test-directory.h | 7 + level_1/fl_directory/c/directory.c | 152 +++----- level_1/fl_directory/c/directory.h | 66 ++-- level_1/fl_directory/c/private-directory.c | 316 +++++++--------- level_1/fl_directory/c/private-directory.h | 12 +- level_3/fake/c/main/build.c | 2 +- level_3/fake/c/main/fake/do.c | 24 +- level_3/fake/c/main/make/operate_process_type.c | 6 +- 40 files changed, 1433 insertions(+), 2157 deletions(-) create mode 100644 level_0/f_directory/tests/unit/c/test-directory-stream_close.c create mode 100644 level_0/f_directory/tests/unit/c/test-directory-stream_close.h create mode 100644 level_0/f_directory/tests/unit/c/test-directory-stream_open.c create mode 100644 level_0/f_directory/tests/unit/c/test-directory-stream_open.h create mode 100644 level_0/f_directory/tests/unit/c/test-directory-stream_open_id.c create mode 100644 level_0/f_directory/tests/unit/c/test-directory-stream_open_id.h create mode 100644 level_0/f_directory/tests/unit/c/test-directory-stream_read.c create mode 100644 level_0/f_directory/tests/unit/c/test-directory-stream_read.h create mode 100644 level_0/f_directory/tests/unit/c/test-directory-stream_rewind.c create mode 100644 level_0/f_directory/tests/unit/c/test-directory-stream_rewind.h create mode 100644 level_0/f_directory/tests/unit/c/test-directory-stream_seek.c create mode 100644 level_0/f_directory/tests/unit/c/test-directory-stream_seek.h create mode 100644 level_0/f_directory/tests/unit/c/test-directory-stream_tell.c create mode 100644 level_0/f_directory/tests/unit/c/test-directory-stream_tell.h diff --git a/build/disable/level_0/f_directory.h b/build/disable/level_0/f_directory.h index c5b9a71..0cbb172 100644 --- a/build/disable/level_0/f_directory.h +++ b/build/disable/level_0/f_directory.h @@ -1,11 +1,14 @@ #define _di_f_directory_at_d_ #define _di_f_directory_back_s_ +#define _di_f_directory_compare_call_t_ #define _di_f_directory_create_ #define _di_f_directory_create_at_ #define _di_f_directory_current_s_ #define _di_f_directory_empty_ +#define _di_f_directory_entity_t_ #define _di_f_directory_exists_ #define _di_f_directory_exists_at_ +#define _di_f_directory_filter_call_t_ #define _di_f_directory_flag_d_ #define _di_f_directory_is_ #define _di_f_directory_is_at_ @@ -24,7 +27,7 @@ #define _di_f_directory_open_at_ #define _di_f_directory_recurse_do_delete_ #define _di_f_directory_recurse_do_destroy_ -#define _di_f_directory_recurse_do_flag_e_ +#define _di_f_directory_recurse_do_flag_d_ #define _di_f_directory_recurse_do_t_ #define _di_f_directory_recurse_dos_delete_callback_ #define _di_f_directory_recurse_dos_destroy_callback_ @@ -44,5 +47,13 @@ #define _di_f_directory_statusss_delete_callback_ #define _di_f_directory_statusss_destroy_callback_ #define _di_f_directory_statusss_t_ +#define _di_f_directory_stream_close_ +#define _di_f_directory_stream_open_ +#define _di_f_directory_stream_open_id_ +#define _di_f_directory_stream_read_ +#define _di_f_directory_stream_rewind_ +#define _di_f_directory_stream_seek_ +#define _di_f_directory_stream_t_ +#define _di_f_directory_stream_tell_ #define _di_f_directory_touch_ #define _di_f_directory_touch_at_ diff --git a/build/stand_alone/fake.config.h b/build/stand_alone/fake.config.h index 800dab5..e95d3dc 100644 --- a/build/stand_alone/fake.config.h +++ b/build/stand_alone/fake.config.h @@ -302,11 +302,14 @@ #define _di_f_date_t_ //#define _di_f_directory_at_d_ //#define _di_f_directory_back_s_ +//#define _di_f_directory_compare_call_t_ //#define _di_f_directory_create_ #define _di_f_directory_create_at_ //#define _di_f_directory_current_s_ +//#define _di_f_directory_entity_t //#define _di_f_directory_exists_ #define _di_f_directory_exists_at_ +//#define _di_f_directory_filter_call_t_ //#define _di_f_directory_flag_d_ //#define _di_f_directory_is_ #define _di_f_directory_is_at_ @@ -325,7 +328,7 @@ #define _di_f_directory_open_at_ //#define _di_f_directory_recurse_do_delete_ #define _di_f_directory_recurse_do_destroy_ -//#define _di_f_directory_recurse_do_flag_e_ +//#define _di_f_directory_recurse_do_flag_d_ //#define _di_f_directory_recurse_do_t_ #define _di_f_directory_recurse_dos_delete_callback_ #define _di_f_directory_recurse_dos_destroy_callback_ @@ -335,6 +338,13 @@ #define _di_f_directory_recurse_doss_t_ //#define _di_f_directory_remove_ //#define _di_f_directory_remove_custom_ +//#define _di_f_directory_stream_close_ +//#define _di_f_directory_stream_open_ +#define _di_f_directory_stream_open_id_ +//#define _di_f_directory_stream_read_ +#define _di_f_directory_stream_rewind_ +#define _di_f_directory_stream_seek_ +#define _di_f_directory_stream_tell_ //#define _di_f_directory_s_ #define _di_f_directory_status_delete_ #define _di_f_directory_status_destroy_ diff --git a/build/stand_alone/firewall.config.h b/build/stand_alone/firewall.config.h index 1b53451..3aecd6a 100644 --- a/build/stand_alone/firewall.config.h +++ b/build/stand_alone/firewall.config.h @@ -303,11 +303,14 @@ #define _di_f_date_t_ #define _di_f_directory_at_d_ //#define _di_f_directory_back_s_ +#define _di_f_directory_compare_call_t_ #define _di_f_directory_create_ #define _di_f_directory_create_at_ //#define _di_f_directory_current_s_ +#define _di_f_directory_entity_t #define _di_f_directory_exists_ #define _di_f_directory_exists_at_ +#define _di_f_directory_filter_call_t_ //#define _di_f_directory_flag_d_ #define _di_f_directory_is_ #define _di_f_directory_is_at_ @@ -326,7 +329,7 @@ #define _di_f_directory_open_at_ #define _di_f_directory_recurse_do_delete_ #define _di_f_directory_recurse_do_destroy_ -#define _di_f_directory_recurse_do_flag_e_ +#define _di_f_directory_recurse_do_flag_d_ //#define _di_f_directory_recurse_do_t_ #define _di_f_directory_recurse_dos_delete_callback_ #define _di_f_directory_recurse_dos_destroy_callback_ @@ -336,6 +339,13 @@ #define _di_f_directory_recurse_doss_t_ #define _di_f_directory_remove_ #define _di_f_directory_remove_custom_ +#define _di_f_directory_stream_close_ +#define _di_f_directory_stream_open_ +#define _di_f_directory_stream_open_id_ +#define _di_f_directory_stream_read_ +#define _di_f_directory_stream_rewind_ +#define _di_f_directory_stream_seek_ +#define _di_f_directory_stream_tell_ //#define _di_f_directory_s_ #define _di_f_directory_status_delete_ #define _di_f_directory_status_destroy_ diff --git a/level_0/f_directory/c/directory.c b/level_0/f_directory/c/directory.c index f54a9f9..8b5ebdc 100644 --- a/level_0/f_directory/c/directory.c +++ b/level_0/f_directory/c/directory.c @@ -30,7 +30,7 @@ extern "C" { f_status_t status = F_true; - DIR *parent = opendir(path.string); + const f_directory_stream_t parent = opendir(path.string); if (!parent) { if (errno == ENOMEM) return F_status_set_error(F_memory_not); @@ -46,7 +46,7 @@ extern "C" { errno = 0; // The '.' and '..' paths must not be counted, so check at most 3 dirents. - struct dirent * dir = readdir(parent); + f_directory_entity_t * dir = readdir(parent); if (dir) { errno = 0; @@ -195,21 +195,21 @@ extern "C" { #endif // _di_f_directory_is_at_ #ifndef _di_f_directory_list_ - f_status_t f_directory_list(const f_string_static_t path, int (*filter)(const struct dirent *), int (*sort)(const struct dirent **, const struct dirent **), f_string_dynamics_t *names) { + f_status_t f_directory_list(const f_string_static_t path, int (*filter)(const f_directory_entity_t *), int (*sort)(const f_directory_entity_t **, const f_directory_entity_t **), f_string_dynamics_t *names) { #ifndef _di_level_0_parameter_checking_ if (!names) return F_status_set_error(F_parameter); #endif // _di_level_0_parameter_checking_ if (!path.used) return F_data_not; - struct dirent **listing = 0; + f_directory_entity_t **listing = 0; f_status_t status = F_okay; const size_t length = scandir(path.string, &listing, filter, sort); if (length == -1) { if (listing) { - f_memory_delete(1, sizeof(struct dirent *), (void *) &listing); + f_memory_delete(1, sizeof(f_directory_entity_t *), (void *) &listing); } if (errno == ENOMEM) return F_status_set_error(F_memory_not); @@ -226,7 +226,7 @@ extern "C" { // There is no reason to include "." and ".." in the directory listing. if (!strncmp(listing[i]->d_name, f_directory_back_s.string, f_directory_back_s.used + 1) || !strncmp(listing[i]->d_name, f_directory_current_s.string, f_directory_current_s.used + 1)) { - f_memory_delete(1, sizeof(struct dirent), (void *) &listing[i]); + f_memory_delete(1, sizeof(f_directory_entity_t), (void *) &listing[i]); continue; } @@ -235,7 +235,7 @@ extern "C" { if (F_status_is_error(status)) { for (; i < length; ++i) { - f_memory_delete(1, sizeof(struct dirent), (void *) &listing[i]); + f_memory_delete(1, sizeof(f_directory_entity_t), (void *) &listing[i]); } // for break; @@ -247,7 +247,7 @@ extern "C" { if (F_status_is_error(status)) { for (; i < length; ++i) { - f_memory_delete(1, sizeof(struct dirent), (void *) &listing[i]); + f_memory_delete(1, sizeof(f_directory_entity_t), (void *) &listing[i]); } // for break; @@ -256,11 +256,11 @@ extern "C" { memcpy(names->array[names->used].string, listing[i]->d_name, sizeof(f_char_t) * size); names->array[names->used++].used = size; - f_memory_delete(1, sizeof(struct dirent), (void *) &listing[i]); + f_memory_delete(1, sizeof(f_directory_entity_t), (void *) &listing[i]); } // for if (listing) { - f_memory_delete(1, sizeof(struct dirent *), (void *) &listing); + f_memory_delete(1, sizeof(f_directory_entity_t *), (void *) &listing); } if (F_status_is_error(status)) return status; @@ -271,7 +271,7 @@ extern "C" { #endif // _di_f_directory_list_ #ifndef _di_f_directory_open_ - f_status_t f_directory_open(const f_string_static_t path, const uint8_t dereference, int *id) { + f_status_t f_directory_open(const f_string_static_t path, const uint8_t dereference, int * const id) { #ifndef _di_level_0_parameter_checking_ if (!id) return F_status_set_error(F_parameter); #endif // _di_level_0_parameter_checking_ @@ -284,9 +284,9 @@ extern "C" { flag |= F_directory_flag_no_follow_d; } - *id = open(path.string, flag); + const int result = open(path.string, flag); - if (*id < 0) { + if (result == -1) { if (errno == EACCES) return F_status_set_error(F_access_denied); if (errno == EFAULT) return F_status_set_error(F_buffer); if (errno == EFBIG || errno == EOVERFLOW) return F_status_set_error(F_number_overflow); @@ -305,12 +305,14 @@ extern "C" { return F_status_set_error(F_failure); } + *id = result; + return F_okay; } #endif // _di_f_directory_open_ #ifndef _di_f_directory_open_at_ - f_status_t f_directory_open_at(const int at_id, const f_string_static_t path, const uint8_t dereference, int *id) { + f_status_t f_directory_open_at(const int at_id, const f_string_static_t path, const uint8_t dereference, int * const id) { #ifndef _di_level_0_parameter_checking_ if (!id) return F_status_set_error(F_parameter); #endif // _di_level_0_parameter_checking_ @@ -323,9 +325,9 @@ extern "C" { flag |= F_directory_flag_no_follow_d; } - *id = openat(at_id, path.string, flag); + const int result = openat(at_id, path.string, flag); - if (*id < 0) { + if (result == -1) { if (errno == EACCES) return F_status_set_error(F_access_denied); if (errno == EBADF) return F_status_set_error(F_directory_descriptor); if (errno == EFAULT) return F_status_set_error(F_buffer); @@ -345,6 +347,8 @@ extern "C" { return F_status_set_error(F_failure); } + *id = result; + return F_okay; } #endif // _di_f_directory_open_at_ @@ -370,7 +374,7 @@ extern "C" { result = remove(path.string); } - if (result < 0) { + if (result == -1) { if (errno == EACCES) return F_status_set_error(F_access_denied); if (errno == EBUSY) return F_status_set_error(F_busy); if (errno == EFAULT) return F_status_set_error(F_buffer); @@ -420,7 +424,7 @@ extern "C" { result = remove(path.string); } - if (result < 0) { + if (result == -1) { if (errno == EACCES) return F_status_set_error(F_access_denied); if (errno == EBUSY) return F_status_set_error(F_busy); if (errno == EFAULT) return F_status_set_error(F_buffer); @@ -445,6 +449,138 @@ extern "C" { } #endif // _di_f_directory_remove_custom_ +#ifndef _di_f_directory_stream_close_ + f_status_t f_directory_stream_close(const f_directory_stream_t stream) { + + if (closedir(stream) == -1) { + if (errno == EBADF) return F_status_set_error(F_directory_descriptor); + + return F_status_set_error(F_failure); + } + + return F_okay; + } +#endif // _di_f_directory_stream_close_ + +#ifndef _di_f_directory_stream_open_ + f_status_t f_directory_stream_open(const f_string_static_t path, f_directory_stream_t * const stream) { + #ifndef _di_level_0_parameter_checking_ + if (!stream) return F_status_set_error(F_parameter); + #endif // _di_level_0_parameter_checking_ + + if (!path.used) return F_data_not; + + const f_directory_stream_t result = opendir(path.string); + + if (!result) { + if (errno == EACCES) return F_status_set_error(F_access_denied); + if (errno == EBADF) return F_status_set_error(F_directory_descriptor); + if (errno == EMFILE) return F_status_set_error(F_file_descriptor_max); + if (errno == ENFILE) return F_status_set_error(F_file_open_max); + if (errno == ENOENT) return F_status_set_error(F_directory_found_not); + if (errno == ENOMEM) return F_status_set_error(F_memory_not); + if (errno == ENOTDIR) return F_status_set_error(F_file_type_not_directory); + + return F_status_set_error(F_failure); + } + + *stream = result; + + return F_okay; + } +#endif // _di_f_directory_stream_open_ + +#ifndef _di_f_directory_stream_open_id_ + f_status_t f_directory_stream_open_id(const int id, f_directory_stream_t * const stream) { + #ifndef _di_level_0_parameter_checking_ + if (!stream) return F_status_set_error(F_parameter); + #endif // _di_level_0_parameter_checking_ + + const f_directory_stream_t result = fdopendir(id); + + if (!result) { + if (errno == EACCES) return F_status_set_error(F_access_denied); + if (errno == EBADF) return F_status_set_error(F_directory_descriptor); + if (errno == EMFILE) return F_status_set_error(F_file_descriptor_max); + if (errno == ENFILE) return F_status_set_error(F_file_open_max); + if (errno == ENOENT) return F_status_set_error(F_directory_found_not); + if (errno == ENOMEM) return F_status_set_error(F_memory_not); + if (errno == ENOTDIR) return F_status_set_error(F_file_type_not_directory); + + return F_status_set_error(F_failure); + } + + *stream = result; + + return F_okay; + } +#endif // _di_f_directory_stream_open_id_ + +#ifndef _di_f_directory_stream_read_ + f_status_t f_directory_stream_read(const f_directory_stream_t stream, f_directory_entity_t * const entity) { + #ifndef _di_level_0_parameter_checking_ + if (!stream) return F_status_set_error(F_parameter); + #endif // _di_level_0_parameter_checking_ + + // The errno must be cleared before calling readdir(). + errno = 0; + + f_directory_entity_t * const result = readdir(stream); + + if (!result && errno) { + if (errno == EBADF) return F_status_set_error(F_directory_descriptor); + + return F_status_set_error(F_failure); + } + + if (result) { + *entity = *result; + + return F_okay; + } + + return F_okay_eos; + } +#endif // _di_f_directory_stream_read_ + +#ifndef _di_f_directory_stream_rewind_ + f_status_t f_directory_stream_rewind(const f_directory_stream_t stream) { + + rewinddir(stream); + + return F_okay; + } +#endif // _di_f_directory_stream_rewind_ + +#ifndef _di_f_directory_stream_seek_ + f_status_t f_directory_stream_seek(const f_directory_stream_t stream, const long to) { + + seekdir(stream, to); + + return F_okay; + } +#endif // _di_f_directory_stream_seek_ + +#ifndef _di_f_directory_stream_tell_ + f_status_t f_directory_stream_tell(const f_directory_stream_t stream, long * const at) { + #ifndef _di_level_0_parameter_checking_ + if (!at) return F_status_set_error(F_parameter); + #endif // _di_level_0_parameter_checking_ + + const long result = telldir(stream); + + if (result == -1) { + if (errno == EBADF) return F_status_set_error(F_directory_descriptor); + + return F_status_set_error(F_failure); + } + + *at = result; + + return F_okay; + } +#endif // _di_f_directory_stream_tell_ + #ifndef _di_f_directory_touch_ f_status_t f_directory_touch(const f_string_static_t path, const mode_t mode) { diff --git a/level_0/f_directory/c/directory.h b/level_0/f_directory/c/directory.h index 4382d06..b924b0a 100644 --- a/level_0/f_directory/c/directory.h +++ b/level_0/f_directory/c/directory.h @@ -131,11 +131,11 @@ extern "C" { * F_directory_descriptor (with error bit) for bad directory descriptor after opening the path. * F_directory_found_not (with error bit) if there is not file at the path. * F_directory_read (with error bit) if there is an error while reading the directory. - * F_failure (with error bit) if failed to read directory information. * F_file_descriptor_max (with error bit) if max file descriptors is reached. * F_file_open_max (with error bit) too many open files. * F_memory_not (with error bit) on out of memory. * F_parameter (with error bit) if a parameter is invalid. + * F_failure (with error bit) for any other error. * * Errors (with error bit) from: f_file_stat_at(). * @@ -281,16 +281,16 @@ extern "C" { * F_directory_empty if directory is empty. * * F_array_too_large (with error bit) if the directory buffer max length would be exceeded. - * F_failure (with error bit) if failed to read directory information. * F_memory_not (with error bit) on out of memory. * F_parameter (with error bit) if a parameter is invalid. + * F_failure (with error bit) for any other error. * * @see alphasort() * @see scandir() * @see versionsort() */ #ifndef _di_f_directory_list_ - extern f_status_t f_directory_list(const f_string_static_t path, int (*filter)(const struct dirent *), int (*sort)(const struct dirent **, const struct dirent **), f_string_dynamics_t *names); + extern f_status_t f_directory_list(const f_string_static_t path, int (*filter)(const f_directory_entity_t *), int (*sort)(const f_directory_entity_t **, const f_directory_entity_t **), f_string_dynamics_t *names); #endif // _di_f_directory_list_ /** @@ -304,8 +304,9 @@ extern "C" { * Set to TRUE to dereference symlinks (often is what is desired). * Set to FALSE to operate on the symlink itself. * @param id - * The file descriptor. - * This is updated with the result of open() or openat(). + * The directory file descriptor. + * + * Must not be NULL. * * @return * F_okay on success. @@ -314,9 +315,8 @@ extern "C" { * F_access_denied (with error bit) on access denied. * F_buffer (with error bit) if the buffer is invalid. * F_directory_found_not (with error bit) if directory was not found. - * F_failure (with error bit) if failed to read directory information. * F_file_open_max (with error bit) too many open files. - * F_file_type_directory_not (with error bit) file is not a directory. + * F_file_type_not_directory (with error bit) file is not a directory. * F_interrupt (with error bit) when program received an interrupt signal, halting operation. * F_loop (with error bit) on loop error. * F_memory_not (with error bit) if out of memory. @@ -326,11 +326,12 @@ extern "C" { * F_prohibited (with error bit) if file system does not allow for removing. * F_read_only (with error bit) if file is read-only. * F_space_not (with error bit) if file system is out of space (or file system quota is reached). + * F_failure (with error bit) for any other error. * * @see open() */ #ifndef _di_f_directory_open_ - extern f_status_t f_directory_open(const f_string_static_t path, const uint8_t dereference, int *id); + extern f_status_t f_directory_open(const f_string_static_t path, const uint8_t dereference, int * const id); #endif // _di_f_directory_open_ /** @@ -346,8 +347,9 @@ extern "C" { * Set to TRUE to dereference symlinks (often is what is desired). * Set to FALSE to operate on the symlink itself. * @param id - * The file descriptor. - * This is updated with the result of open() or openat(). + * The directory file descriptor. + * + * Must not be NULL. * * @return * F_okay on success. @@ -357,9 +359,8 @@ extern "C" { * F_buffer (with error bit) if the buffer is invalid. * F_directory_found_not (with error bit) if directory was not found. * F_directory_descriptor (with error bit) for bad directory descriptor for at_id. - * F_failure (with error bit) if failed to read directory information. * F_file_open_max (with error bit) too many open files. - * F_file_type_directory_not (with error bit) file is not a directory. + * F_file_type_not_directory (with error bit) file is not a directory. * F_interrupt (with error bit) when program received an interrupt signal, halting operation. * F_loop (with error bit) on loop error. * F_memory_not (with error bit) if out of memory. @@ -369,11 +370,12 @@ extern "C" { * F_prohibited (with error bit) if file system does not allow for removing. * F_read_only (with error bit) if file is read-only. * F_space_not (with error bit) if file system is out of space (or file system quota is reached). + * F_failure (with error bit) for any other error. * * @see openat() */ #ifndef _di_f_directory_open_at_ - extern f_status_t f_directory_open_at(const int at_id, const f_string_static_t path, const uint8_t dereference, int *id); + extern f_status_t f_directory_open_at(const int at_id, const f_string_static_t path, const uint8_t dereference, int * const id); #endif // _di_f_directory_open_at_ /** @@ -462,6 +464,168 @@ extern "C" { #endif // _di_f_directory_remove_custom_ /** + * Close an open directory stream. + * + * @param stream + * The directory stream to close. + * + * @return + * F_okay on success. + * + * F_directory_descriptor (with error bit) for bad directory descriptor. + * F_failure (with error bit) for any other error. + * + * @see closedir() + */ +#ifndef _di_f_directory_stream_close_ + extern f_status_t f_directory_stream_close(const f_directory_stream_t stream); +#endif // _di_f_directory_stream_close_ + +/** + * Open the directory stream specified by the directory file descriptor. + * + * @param path + * The file path to the directory. + * @param stream + * The directory stream. + * + * Must not be NULL. + * + * @return + * F_okay on success. + * F_data_not if path.used is 0. + * + * F_access_denied (with error bit) on access denied. + * F_directory_descriptor (with error bit) for bad directory descriptor. + * F_directory_found_not (with error bit) if directory was not found. + * F_file_descriptor_max (with error bit) if max file descriptors is reached. + * F_file_open_max (with error bit) too many open files. + * F_file_type_not_directory (with error bit) file is not a directory. + * F_memory_not (with error bit) if out of memory. + * F_parameter (with error bit) if a parameter is invalid. + * F_failure (with error bit) for any other error. + * + * @see fdopendir() + */ +#ifndef _di_f_directory_stream_open_ + extern f_status_t f_directory_stream_open(const f_string_static_t path, f_directory_stream_t * const stream); +#endif // _di_f_directory_stream_open_ + +/** + * Open the directory stream specified by the directory file descriptor. + * + * @param at_id + * The parent directory, as an open directory file descriptor, in which path is relative to. + * @param id + * The directory file descriptor of the directory to open the stream of. + * @param stream + * The directory stream. + * + * Must not be NULL. + * + * @return + * F_okay on success. + * + * F_access_denied (with error bit) on access denied. + * F_directory_descriptor (with error bit) for bad directory descriptor. + * F_directory_found_not (with error bit) if directory was not found. + * F_file_descriptor_max (with error bit) if max file descriptors is reached. + * F_file_open_max (with error bit) too many open files. + * F_file_type_not_directory (with error bit) file is not a directory. + * F_memory_not (with error bit) if out of memory. + * F_parameter (with error bit) if a parameter is invalid. + * F_failure (with error bit) for any other error. + * + * @see fdopendir() + */ +#ifndef _di_f_directory_stream_open_id_ + extern f_status_t f_directory_stream_open_id(const int id, f_directory_stream_t * const stream); +#endif // _di_f_directory_stream_open_id_ + +/** + * Read a directory stream. + * + * @param stream + * The directory stream. + * @param entity + * A pointer to the statically allocated entity loaded from the stream. + * + * Must not be NULL. + * + * @return + * F_okay on success. + * F_okay_eos on success and the end of the stream is reached (the entity value will be NULL). + * + * F_directory_descriptor (with error bit) for bad directory descriptor. + * F_parameter (with error bit) if a parameter is invalid. + * F_failure (with error bit) for any other error. + * + * @see readdir() + */ +#ifndef _di_f_directory_stream_read_ + extern f_status_t f_directory_stream_read(const f_directory_stream_t stream, f_directory_entity_t * const entity); +#endif // _di_f_directory_stream_read_ + +/** + * Reset the directory stream to the start of the stream. + * + * @param stream + * The directory stream. + * + * @return + * F_okay on success. + * + * F_failure (with error bit) for any other error. + * + * @see rewinddir() + */ +#ifndef _di_f_directory_stream_rewind_ + extern f_status_t f_directory_stream_rewind(const f_directory_stream_t stream); +#endif // _di_f_directory_stream_rewind_ + +/** + * Seek to a given position in the directory stream. + * + * @param stream + * The directory stream. + * @param to + * The position to seek to. + * + * @return + * F_okay on success. + * + * F_failure (with error bit) for any other error. + * + * @see seekdir() + */ +#ifndef _di_f_directory_stream_seek_ + extern f_status_t f_directory_stream_seek(const f_directory_stream_t stream, const long to); +#endif // _di_f_directory_stream_seek_ + +/** + * Get the current location of a directory stream. + * + * @param stream + * The directory stream. + * @param at + * The location in which the stream is at. + * + * Must not be NULL. + * + * @return + * F_okay on success. + * + * F_directory_descriptor (with error bit) for bad directory descriptor. + * F_parameter (with error bit) if a parameter is invalid. + * F_failure (with error bit) for any other error. + * + * @see telldir() + */ +#ifndef _di_f_directory_stream_tell_ + extern f_status_t f_directory_stream_tell(const f_directory_stream_t stream, long * const at); +#endif // _di_f_directory_stream_tell_ + +/** * Update the files access and modification timestamp, creating the directory if it does not already exist. * * When the file is created, it is created as a directory file. diff --git a/level_0/f_directory/c/directory/common.h b/level_0/f_directory/c/directory/common.h index 8cd0bb0..d215687 100644 --- a/level_0/f_directory/c/directory/common.h +++ b/level_0/f_directory/c/directory/common.h @@ -107,59 +107,82 @@ extern "C" { /** * Directory recurse do flags. * - * f_directory_recurse_do_flag_*_e: - * For the recurse flag property. + * f_directory_recurse_do_flag_*_d: + * + * The basic flags: * - none: No flags are set. * - action: Perform the normal action. * - after: Perform this action after recursion before a single directory path. * - before: Perform this action before recursion on a single directory path. + * - clean: This action is performed during a clean up phase (such as closing an open directory listing stream). * - dereference: Dereference symbolic links rather than operating on the link itself. * - list: Perform this action after directory listing is loaded. + * - path: The "name" represents a path rather than a file name (generally used for error handling or when not processing a recursed file). * - top: Operate on top-most directory, or for the callback parameter, designate that this is the top path. - * - top_after: Operate on top-most directory, after the top-level directory is processed or recursed. - * - top_before: Operate on top-most directory, before the top-level directory is processed or recursed. - * - top_mask: Helper flag representing the top, top_after, and top_before flags being set. * - * For the action and handle callback parameter: - * - action_mask: Helper flag representing the action flags being set. - * - block: File is a block. - * - character: File is a character. - * - directory: File is a directory. - * - fifo: File is a file-in/file-out. - * - link: File is a link. - * - path: The "name" represents a path rather than a file name (generally used for error handling or when not processing a recursed file). - * - regular: File is a regular file. - * - socket: File is a socket. - * - unknown: File is an unknown type. + * The type flags: + * - block: File is a block. + * - character: File is a character. + * - directory: File is a directory. + * - fifo: File is a file-in/file-out. + * - link: File is a link. + * - regular: File is a regular file. + * - socket: File is a socket. + * - unknown: File is an unknown type. + * - white_out: File is a special type called "white out", which is supported in Linux but is not generally used by most file systems. + * + * The helper flags: + * - before_after: Helper flag representing both before and after flags. + * - except_directory: Helper flag representing all type flags except for directory. + * - mask_basic: Helper flag representing the basic flags. + * - mask_type: Helper flag representing the action flags. + * - list_after: Helper flag representing both path and after flags. + * - list_before: Helper flag representing both path and before flags. + * - list_path: Helper flag representing both path and list flags. + */ +#ifndef _di_f_directory_recurse_do_flag_d_ + + // The basic flags. + #define f_directory_recurse_do_flag_none_d 0x0 + #define f_directory_recurse_do_flag_action_d 0x1 + #define f_directory_recurse_do_flag_after_d 0x2 + #define f_directory_recurse_do_flag_before_d 0x4 + #define f_directory_recurse_do_flag_clean_d 0x8 + #define f_directory_recurse_do_flag_dereference_d 0x10 + #define f_directory_recurse_do_flag_list_d 0x20 + #define f_directory_recurse_do_flag_path_d 0x40 + + // The type flags. + #define f_directory_recurse_do_flag_block_d 0x80 + #define f_directory_recurse_do_flag_character_d 0x100 + #define f_directory_recurse_do_flag_directory_d 0x200 + #define f_directory_recurse_do_flag_fifo_d 0x400 + #define f_directory_recurse_do_flag_link_d 0x800 + #define f_directory_recurse_do_flag_regular_d 0x1000 + #define f_directory_recurse_do_flag_socket_d 0x2000 + #define f_directory_recurse_do_flag_unknown_d 0x4000 + #define f_directory_recurse_do_flag_white_out_d 0x8000 + + // The helper flags. + #define f_directory_recurse_do_flag_before_after_d 0x6 + #define f_directory_recurse_do_flag_except_directory_d 0xfd80 + #define f_directory_recurse_do_flag_mask_basic_d 0x7f + #define f_directory_recurse_do_flag_mask_type_d 0xff80 + #define f_directory_recurse_do_flag_path_after_d 0x42 + #define f_directory_recurse_do_flag_path_before_d 0x44 + #define f_directory_recurse_do_flag_path_list_d 0x60 +#endif // _di_f_directory_recurse_do_flag_d_ + +/** + * A typedef for representing a directory stream pointer type (aka a "DIR *"). + * + * This should be expected to point to a structure of type DIR. */ -#ifndef _di_f_directory_recurse_do_flag_e_ - enum { - - // For the recurse flag property. - f_directory_recurse_do_flag_none_e = 0x0, - f_directory_recurse_do_flag_action_e = 0x1, - f_directory_recurse_do_flag_after_e = 0x2, - f_directory_recurse_do_flag_before_e = 0x4, - f_directory_recurse_do_flag_dereference_e = 0x8, - f_directory_recurse_do_flag_list_e = 0x10, - f_directory_recurse_do_flag_top_e = 0x20, - f_directory_recurse_do_flag_top_after_e = 0x40, - f_directory_recurse_do_flag_top_before_e = 0x80, - f_directory_recurse_do_flag_top_mask_e = 0xe0, - - // For the action callback parameter. - f_directory_recurse_do_flag_action_mask_e = 0x1ff00, - f_directory_recurse_do_flag_block_e = 0x100, - f_directory_recurse_do_flag_character_e = 0x200, - f_directory_recurse_do_flag_directory_e = 0x400, - f_directory_recurse_do_flag_fifo_e = 0x800, - f_directory_recurse_do_flag_link_e = 0x1000, - f_directory_recurse_do_flag_path_e = 0x2000, - f_directory_recurse_do_flag_regular_e = 0x4000, - f_directory_recurse_do_flag_socket_e = 0x8000, - f_directory_recurse_do_flag_unknown_e = 0x10000, - }; // enum -#endif // _di_f_directory_recurse_do_flag_e_ +#ifndef _di_f_directory_stream_t_ + typedef DIR * f_directory_stream_t; + + #define f_directory_stream_t_initialize 0 +#endif // _di_f_directory_stream_t_ #ifdef __cplusplus } // extern "C" diff --git a/level_0/f_directory/c/directory/listing.h b/level_0/f_directory/c/directory/listing.h index d1f1673..af10ddb 100644 --- a/level_0/f_directory/c/directory/listing.h +++ b/level_0/f_directory/c/directory/listing.h @@ -17,6 +17,43 @@ extern "C" { #endif /** + * Directory entity type. + * + * The standard dirent structure is like this: + * + * ino_t d_ino: The inode number. + * off_t d_off: A number that is specific to file systems for internal use, see telldir(). + * unsigned short d_reclen: Record length in bytes. + * unsigned char d_type: Type of file, but not all types are supported on all file systems. + * char d_name[]: A NULL terminated file name string. + */ +#ifndef _di_f_directory_entity_t_ + typedef struct dirent f_directory_entity_t; + + #define f_directory_entity_t_initialize { 0 } +#endif // _di_f_directory_entity_t_ + +/** + * Directory filter callback type. + */ +#ifndef _di_f_directory_filter_call_t_ + typedef int (*f_directory_filter_call_t) (const f_directory_entity_t *); + + #define f_directory_recurse_do_call_t_initialize 0 +#endif // _di_f_directory_filter_call_t_ + +/** + * Directory compare callback type. + * + * Should match functions like alphasort() and versionsort(). + */ +#ifndef _di_f_directory_compare_call_t_ + typedef int (*f_directory_compare_call_t) (const f_directory_entity_t **, const f_directory_entity_t **); + + #define f_directory_recurse_do_call_t_initialize 0 +#endif // _di_f_directory_compare_call_t_ + +/** * A structure representing a listing of paths found within a directory. * * Each property represents a set of paths grouped by directory entity file type. diff --git a/level_0/f_directory/c/directory/recurse_do.c b/level_0/f_directory/c/directory/recurse_do.c index 8222493..abff1b5 100644 --- a/level_0/f_directory/c/directory/recurse_do.c +++ b/level_0/f_directory/c/directory/recurse_do.c @@ -22,46 +22,6 @@ extern "C" { status = f_memory_array_resize(0, sizeof(f_char_t), (void **) &recurse->path_cache.string, &recurse->path_cache.used, &recurse->path_cache.size); if (F_status_is_error(status)) return status; } - - if (recurse->listing.block.size && recurse->listing.block.array) { - status = f_memory_arrays_resize(0, sizeof(f_string_dynamic_t), (void **) &recurse->listing.block.array, &recurse->listing.block.used, &recurse->listing.block.size, &f_string_dynamics_delete_callback); - if (F_status_is_error(status)) return status; - } - - if (recurse->listing.character.size && recurse->listing.character.array) { - status = f_memory_arrays_resize(0, sizeof(f_string_dynamic_t), (void **) &recurse->listing.character.array, &recurse->listing.character.used, &recurse->listing.character.size, &f_string_dynamics_delete_callback); - if (F_status_is_error(status)) return status; - } - - if (recurse->listing.directory.size && recurse->listing.directory.array) { - status = f_memory_arrays_resize(0, sizeof(f_string_dynamic_t), (void **) &recurse->listing.directory.array, &recurse->listing.directory.used, &recurse->listing.directory.size, &f_string_dynamics_delete_callback); - if (F_status_is_error(status)) return status; - } - - if (recurse->listing.regular.size && recurse->listing.regular.array) { - status = f_memory_arrays_resize(0, sizeof(f_string_dynamic_t), (void **) &recurse->listing.regular.array, &recurse->listing.regular.used, &recurse->listing.regular.size, &f_string_dynamics_delete_callback); - if (F_status_is_error(status)) return status; - } - - if (recurse->listing.link.size && recurse->listing.link.array) { - status = f_memory_arrays_resize(0, sizeof(f_string_dynamic_t), (void **) &recurse->listing.link.array, &recurse->listing.link.used, &recurse->listing.link.size, &f_string_dynamics_delete_callback); - if (F_status_is_error(status)) return status; - } - - if (recurse->listing.fifo.size && recurse->listing.fifo.array) { - status = f_memory_arrays_resize(0, sizeof(f_string_dynamic_t), (void **) &recurse->listing.fifo.array, &recurse->listing.fifo.used, &recurse->listing.fifo.size, &f_string_dynamics_delete_callback); - if (F_status_is_error(status)) return status; - } - - if (recurse->listing.socket.size && recurse->listing.socket.array) { - status = f_memory_arrays_resize(0, sizeof(f_string_dynamic_t), (void **) &recurse->listing.socket.array, &recurse->listing.socket.used, &recurse->listing.socket.size, &f_string_dynamics_delete_callback); - if (F_status_is_error(status)) return status; - } - - if (recurse->listing.unknown.size && recurse->listing.unknown.array) { - status = f_memory_arrays_resize(0, sizeof(f_string_dynamic_t), (void **) &recurse->listing.unknown.array, &recurse->listing.unknown.used, &recurse->listing.unknown.size, &f_string_dynamics_delete_callback); - if (F_status_is_error(status)) return status; - } } return F_okay; @@ -86,46 +46,6 @@ extern "C" { status = f_memory_array_adjust(0, sizeof(f_char_t), (void **) &recurse->path_cache.string, &recurse->path_cache.used, &recurse->path_cache.size); if (F_status_is_error(status)) return status; } - - if (recurse->listing.block.size && recurse->listing.block.array) { - status = f_memory_arrays_adjust(0, sizeof(f_string_dynamic_t), (void **) &recurse->listing.block.array, &recurse->listing.block.used, &recurse->listing.block.size, &f_string_dynamics_destroy_callback); - if (F_status_is_error(status)) return status; - } - - if (recurse->listing.character.size && recurse->listing.character.array) { - status = f_memory_arrays_adjust(0, sizeof(f_string_dynamic_t), (void **) &recurse->listing.character.array, &recurse->listing.character.used, &recurse->listing.character.size, &f_string_dynamics_destroy_callback); - if (F_status_is_error(status)) return status; - } - - if (recurse->listing.directory.size && recurse->listing.directory.array) { - status = f_memory_arrays_adjust(0, sizeof(f_string_dynamic_t), (void **) &recurse->listing.directory.array, &recurse->listing.directory.used, &recurse->listing.directory.size, &f_string_dynamics_destroy_callback); - if (F_status_is_error(status)) return status; - } - - if (recurse->listing.regular.size && recurse->listing.regular.array) { - status = f_memory_arrays_adjust(0, sizeof(f_string_dynamic_t), (void **) &recurse->listing.regular.array, &recurse->listing.regular.used, &recurse->listing.regular.size, &f_string_dynamics_destroy_callback); - if (F_status_is_error(status)) return status; - } - - if (recurse->listing.link.size && recurse->listing.link.array) { - status = f_memory_arrays_adjust(0, sizeof(f_string_dynamic_t), (void **) &recurse->listing.link.array, &recurse->listing.link.used, &recurse->listing.link.size, &f_string_dynamics_destroy_callback); - if (F_status_is_error(status)) return status; - } - - if (recurse->listing.fifo.size && recurse->listing.fifo.array) { - status = f_memory_arrays_adjust(0, sizeof(f_string_dynamic_t), (void **) &recurse->listing.fifo.array, &recurse->listing.fifo.used, &recurse->listing.fifo.size, &f_string_dynamics_destroy_callback); - if (F_status_is_error(status)) return status; - } - - if (recurse->listing.socket.size && recurse->listing.socket.array) { - status = f_memory_arrays_adjust(0, sizeof(f_string_dynamic_t), (void **) &recurse->listing.socket.array, &recurse->listing.socket.used, &recurse->listing.socket.size, &f_string_dynamics_destroy_callback); - if (F_status_is_error(status)) return status; - } - - if (recurse->listing.unknown.size && recurse->listing.unknown.array) { - status = f_memory_arrays_adjust(0, sizeof(f_string_dynamic_t), (void **) &recurse->listing.unknown.array, &recurse->listing.unknown.used, &recurse->listing.unknown.size, &f_string_dynamics_destroy_callback); - if (F_status_is_error(status)) return status; - } } return F_okay; @@ -150,46 +70,6 @@ extern "C" { status = f_memory_array_resize(0, sizeof(f_char_t), (void **) &array[i].path_cache.string, &array[i].path_cache.used, &array[i].path_cache.size); if (F_status_is_error(status)) return status; } - - if (array[i].listing.block.size && array[i].listing.block.array) { - status = f_memory_arrays_resize(0, sizeof(f_string_dynamic_t), (void **) &array[i].listing.block.array, &array[i].listing.block.used, &array[i].listing.block.size, &f_string_dynamics_delete_callback); - if (F_status_is_error(status)) return status; - } - - if (array[i].listing.character.size && array[i].listing.character.array) { - status = f_memory_arrays_resize(0, sizeof(f_string_dynamic_t), (void **) &array[i].listing.character.array, &array[i].listing.character.used, &array[i].listing.character.size, &f_string_dynamics_delete_callback); - if (F_status_is_error(status)) return status; - } - - if (array[i].listing.directory.size && array[i].listing.directory.array) { - status = f_memory_arrays_resize(0, sizeof(f_string_dynamic_t), (void **) &array[i].listing.directory.array, &array[i].listing.directory.used, &array[i].listing.directory.size, &f_string_dynamics_delete_callback); - if (F_status_is_error(status)) return status; - } - - if (array[i].listing.regular.size && array[i].listing.regular.array) { - status = f_memory_arrays_resize(0, sizeof(f_string_dynamic_t), (void **) &array[i].listing.regular.array, &array[i].listing.regular.used, &array[i].listing.regular.size, &f_string_dynamics_delete_callback); - if (F_status_is_error(status)) return status; - } - - if (array[i].listing.link.size && array[i].listing.link.array) { - status = f_memory_arrays_resize(0, sizeof(f_string_dynamic_t), (void **) &array[i].listing.link.array, &array[i].listing.link.used, &array[i].listing.link.size, &f_string_dynamics_delete_callback); - if (F_status_is_error(status)) return status; - } - - if (array[i].listing.fifo.size && array[i].listing.fifo.array) { - status = f_memory_arrays_resize(0, sizeof(f_string_dynamic_t), (void **) &array[i].listing.fifo.array, &array[i].listing.fifo.used, &array[i].listing.fifo.size, &f_string_dynamics_delete_callback); - if (F_status_is_error(status)) return status; - } - - if (array[i].listing.socket.size && array[i].listing.socket.array) { - status = f_memory_arrays_resize(0, sizeof(f_string_dynamic_t), (void **) &array[i].listing.socket.array, &array[i].listing.socket.used, &array[i].listing.socket.size, &f_string_dynamics_delete_callback); - if (F_status_is_error(status)) return status; - } - - if (array[i].listing.unknown.size && array[i].listing.unknown.array) { - status = f_memory_arrays_resize(0, sizeof(f_string_dynamic_t), (void **) &array[i].listing.unknown.array, &array[i].listing.unknown.used, &array[i].listing.unknown.size, &f_string_dynamics_delete_callback); - if (F_status_is_error(status)) return status; - } } // for } @@ -215,46 +95,6 @@ extern "C" { status = f_memory_array_adjust(0, sizeof(f_char_t), (void **) &array[i].path_cache.string, &array[i].path_cache.used, &array[i].path_cache.size); if (F_status_is_error(status)) return status; } - - if (array[i].listing.block.size && array[i].listing.block.array) { - status = f_memory_arrays_adjust(0, sizeof(f_string_dynamic_t), (void **) &array[i].listing.block.array, &array[i].listing.block.used, &array[i].listing.block.size, &f_string_dynamics_destroy_callback); - if (F_status_is_error(status)) return status; - } - - if (array[i].listing.character.size && array[i].listing.character.array) { - status = f_memory_arrays_adjust(0, sizeof(f_string_dynamic_t), (void **) &array[i].listing.character.array, &array[i].listing.character.used, &array[i].listing.character.size, &f_string_dynamics_destroy_callback); - if (F_status_is_error(status)) return status; - } - - if (array[i].listing.directory.size && array[i].listing.directory.array) { - status = f_memory_arrays_adjust(0, sizeof(f_string_dynamic_t), (void **) &array[i].listing.directory.array, &array[i].listing.directory.used, &array[i].listing.directory.size, &f_string_dynamics_destroy_callback); - if (F_status_is_error(status)) return status; - } - - if (array[i].listing.regular.size && array[i].listing.regular.array) { - status = f_memory_arrays_adjust(0, sizeof(f_string_dynamic_t), (void **) &array[i].listing.regular.array, &array[i].listing.regular.used, &array[i].listing.regular.size, &f_string_dynamics_destroy_callback); - if (F_status_is_error(status)) return status; - } - - if (array[i].listing.link.size && array[i].listing.link.array) { - status = f_memory_arrays_adjust(0, sizeof(f_string_dynamic_t), (void **) &array[i].listing.link.array, &array[i].listing.link.used, &array[i].listing.link.size, &f_string_dynamics_destroy_callback); - if (F_status_is_error(status)) return status; - } - - if (array[i].listing.fifo.size && array[i].listing.fifo.array) { - status = f_memory_arrays_adjust(0, sizeof(f_string_dynamic_t), (void **) &array[i].listing.fifo.array, &array[i].listing.fifo.used, &array[i].listing.fifo.size, &f_string_dynamics_destroy_callback); - if (F_status_is_error(status)) return status; - } - - if (array[i].listing.socket.size && array[i].listing.socket.array) { - status = f_memory_arrays_adjust(0, sizeof(f_string_dynamic_t), (void **) &array[i].listing.socket.array, &array[i].listing.socket.used, &array[i].listing.socket.size, &f_string_dynamics_destroy_callback); - if (F_status_is_error(status)) return status; - } - - if (array[i].listing.unknown.size && array[i].listing.unknown.array) { - status = f_memory_arrays_adjust(0, sizeof(f_string_dynamic_t), (void **) &array[i].listing.unknown.array, &array[i].listing.unknown.used, &array[i].listing.unknown.size, &f_string_dynamics_destroy_callback); - if (F_status_is_error(status)) return status; - } } // for } @@ -283,46 +123,6 @@ extern "C" { status = f_memory_array_resize(0, sizeof(f_char_t), (void **) &array[i].array[j].path_cache.string, &array[i].array[j].path_cache.used, &array[i].array[j].path_cache.size); if (F_status_is_error(status)) return status; } - - if (array[i].array[j].listing.block.size && array[i].array[j].listing.block.array) { - status = f_memory_arrays_resize(0, sizeof(f_string_dynamic_t), (void **) &array[i].array[j].listing.block.array, &array[i].array[j].listing.block.used, &array[i].array[j].listing.block.size, &f_string_dynamics_delete_callback); - if (F_status_is_error(status)) return status; - } - - if (array[i].array[j].listing.character.size && array[i].array[j].listing.character.array) { - status = f_memory_arrays_resize(0, sizeof(f_string_dynamic_t), (void **) &array[i].array[j].listing.character.array, &array[i].array[j].listing.character.used, &array[i].array[j].listing.character.size, &f_string_dynamics_delete_callback); - if (F_status_is_error(status)) return status; - } - - if (array[i].array[j].listing.directory.size && array[i].array[j].listing.directory.array) { - status = f_memory_arrays_resize(0, sizeof(f_string_dynamic_t), (void **) &array[i].array[j].listing.directory.array, &array[i].array[j].listing.directory.used, &array[i].array[j].listing.directory.size, &f_string_dynamics_delete_callback); - if (F_status_is_error(status)) return status; - } - - if (array[i].array[j].listing.regular.size && array[i].array[j].listing.regular.array) { - status = f_memory_arrays_resize(0, sizeof(f_string_dynamic_t), (void **) &array[i].array[j].listing.regular.array, &array[i].array[j].listing.regular.used, &array[i].array[j].listing.regular.size, &f_string_dynamics_delete_callback); - if (F_status_is_error(status)) return status; - } - - if (array[i].array[j].listing.link.size && array[i].array[j].listing.link.array) { - status = f_memory_arrays_resize(0, sizeof(f_string_dynamic_t), (void **) &array[i].array[j].listing.link.array, &array[i].array[j].listing.link.used, &array[i].array[j].listing.link.size, &f_string_dynamics_delete_callback); - if (F_status_is_error(status)) return status; - } - - if (array[i].array[j].listing.fifo.size && array[i].array[j].listing.fifo.array) { - status = f_memory_arrays_resize(0, sizeof(f_string_dynamic_t), (void **) &array[i].array[j].listing.fifo.array, &array[i].array[j].listing.fifo.used, &array[i].array[j].listing.fifo.size, &f_string_dynamics_delete_callback); - if (F_status_is_error(status)) return status; - } - - if (array[i].array[j].listing.socket.size && array[i].array[j].listing.socket.array) { - status = f_memory_arrays_resize(0, sizeof(f_string_dynamic_t), (void **) &array[i].array[j].listing.socket.array, &array[i].array[j].listing.socket.used, &array[i].array[j].listing.socket.size, &f_string_dynamics_delete_callback); - if (F_status_is_error(status)) return status; - } - - if (array[i].array[j].listing.unknown.size && array[i].array[j].listing.unknown.array) { - status = f_memory_arrays_resize(0, sizeof(f_string_dynamic_t), (void **) &array[i].array[j].listing.unknown.array, &array[i].array[j].listing.unknown.used, &array[i].array[j].listing.unknown.size, &f_string_dynamics_delete_callback); - if (F_status_is_error(status)) return status; - } } // for if (array[i].size && array[i].array) { @@ -357,46 +157,6 @@ extern "C" { status = f_memory_array_adjust(0, sizeof(f_char_t), (void **) &array[i].array[j].path_cache.string, &array[i].array[j].path_cache.used, &array[i].array[j].path_cache.size); if (F_status_is_error(status)) return status; } - - if (array[i].array[j].listing.block.size && array[i].array[j].listing.block.array) { - status = f_memory_arrays_adjust(0, sizeof(f_string_dynamic_t), (void **) &array[i].array[j].listing.block.array, &array[i].array[j].listing.block.used, &array[i].array[j].listing.block.size, &f_string_dynamics_destroy_callback); - if (F_status_is_error(status)) return status; - } - - if (array[i].array[j].listing.character.size && array[i].array[j].listing.character.array) { - status = f_memory_arrays_adjust(0, sizeof(f_string_dynamic_t), (void **) &array[i].array[j].listing.character.array, &array[i].array[j].listing.character.used, &array[i].array[j].listing.character.size, &f_string_dynamics_destroy_callback); - if (F_status_is_error(status)) return status; - } - - if (array[i].array[j].listing.directory.size && array[i].array[j].listing.directory.array) { - status = f_memory_arrays_adjust(0, sizeof(f_string_dynamic_t), (void **) &array[i].array[j].listing.directory.array, &array[i].array[j].listing.directory.used, &array[i].array[j].listing.directory.size, &f_string_dynamics_destroy_callback); - if (F_status_is_error(status)) return status; - } - - if (array[i].array[j].listing.regular.size && array[i].array[j].listing.regular.array) { - status = f_memory_arrays_adjust(0, sizeof(f_string_dynamic_t), (void **) &array[i].array[j].listing.regular.array, &array[i].array[j].listing.regular.used, &array[i].array[j].listing.regular.size, &f_string_dynamics_destroy_callback); - if (F_status_is_error(status)) return status; - } - - if (array[i].array[j].listing.link.size && array[i].array[j].listing.link.array) { - status = f_memory_arrays_adjust(0, sizeof(f_string_dynamic_t), (void **) &array[i].array[j].listing.link.array, &array[i].array[j].listing.link.used, &array[i].array[j].listing.link.size, &f_string_dynamics_destroy_callback); - if (F_status_is_error(status)) return status; - } - - if (array[i].array[j].listing.fifo.size && array[i].array[j].listing.fifo.array) { - status = f_memory_arrays_adjust(0, sizeof(f_string_dynamic_t), (void **) &array[i].array[j].listing.fifo.array, &array[i].array[j].listing.fifo.used, &array[i].array[j].listing.fifo.size, &f_string_dynamics_destroy_callback); - if (F_status_is_error(status)) return status; - } - - if (array[i].array[j].listing.socket.size && array[i].array[j].listing.socket.array) { - status = f_memory_arrays_adjust(0, sizeof(f_string_dynamic_t), (void **) &array[i].array[j].listing.socket.array, &array[i].array[j].listing.socket.used, &array[i].array[j].listing.socket.size, &f_string_dynamics_destroy_callback); - if (F_status_is_error(status)) return status; - } - - if (array[i].array[j].listing.unknown.size && array[i].array[j].listing.unknown.array) { - status = f_memory_arrays_adjust(0, sizeof(f_string_dynamic_t), (void **) &array[i].array[j].listing.unknown.array, &array[i].array[j].listing.unknown.used, &array[i].array[j].listing.unknown.size, &f_string_dynamics_destroy_callback); - if (F_status_is_error(status)) return status; - } } // for if (array[i].size && array[i].array) { diff --git a/level_0/f_directory/c/directory/recurse_do.h b/level_0/f_directory/c/directory/recurse_do.h index 45d4d9d..7fc26de 100644 --- a/level_0/f_directory/c/directory/recurse_do.h +++ b/level_0/f_directory/c/directory/recurse_do.h @@ -46,7 +46,6 @@ extern "C" { * - mode: A file mode flag to use when working on files, such as when copying a file. * * - state: A pointer to the state information, where state.interrupt() and state.handle() are called appopriately. - * - listing: A directory listing structure used internally to help reduce repeated memory allocation overhead. * * - path: A path representing the current directory path being operated on and usually represents the parent path of some file or directory (generally assigned internally). * - path_cache: A path-related cache made available for the caller to use, such as combining the path and the file name in the action callback. @@ -70,7 +69,6 @@ extern "C" { f_mode_t mode; f_state_t state; - f_directory_listing_t listing; f_string_dynamic_t path; f_string_dynamic_t path_cache; @@ -85,10 +83,9 @@ extern "C" { #define f_directory_recurse_do_t_initialize { \ 0, \ F_directory_max_recurse_depth_d, \ - f_directory_recurse_do_flag_none_e, \ + f_directory_recurse_do_flag_none_d, \ f_mode_t_initialize, \ f_state_t_initialize, \ - f_directory_listing_t_initialize, \ f_string_dynamic_t_initialize, \ f_string_dynamic_t_initialize, \ 0, \ @@ -96,13 +93,12 @@ extern "C" { f_directory_recurse_do_call_t_initialize, \ } - #define macro_f_directory_recurse_do_t_initialize_1(depth, depth_max, flag, mode, state, listing, path, path_cache, path_top, action, handle) { \ + #define macro_f_directory_recurse_do_t_initialize_1(depth, depth_max, flag, mode, state, path, path_cache, path_top, action, handle) { \ depth, \ depth_max, \ flag, \ mode, \ state, \ - listing, \ path, \ path_cache, \ path_top, \ @@ -116,7 +112,6 @@ extern "C" { flag, \ mode, \ state, \ - f_directory_listing_t_initialize, \ f_string_dynamic_t_initialize, \ f_string_dynamic_t_initialize, \ 0, \ diff --git a/level_0/f_directory/data/build/settings-mocks b/level_0/f_directory/data/build/settings-mocks index e936bd4..8021449 100644 --- a/level_0/f_directory/data/build/settings-mocks +++ b/level_0/f_directory/data/build/settings-mocks @@ -72,6 +72,7 @@ flags -Wl,--wrap=f_memory_arrays_adjust flags -Wl,--wrap=f_memory_arrays_resize flags -Wl,--wrap=alphasort flags -Wl,--wrap=closedir +flags -Wl,--wrap=fdopendir flags -Wl,--wrap=fstatat flags -Wl,--wrap=mkdir flags -Wl,--wrap=mkdirat @@ -81,7 +82,10 @@ flags -Wl,--wrap=openat flags -Wl,--wrap=opendir flags -Wl,--wrap=readdir flags -Wl,--wrap=remove +flags -Wl,--wrap=rewinddir flags -Wl,--wrap=scandir +flags -Wl,--wrap=seekdir flags -Wl,--wrap=stat +flags -Wl,--wrap=telldir flags -Wl,--wrap=utimensat flags -Wl,--wrap=versionsort diff --git a/level_0/f_directory/data/build/settings-tests b/level_0/f_directory/data/build/settings-tests index 4ac59c7..c43f466 100644 --- a/level_0/f_directory/data/build/settings-tests +++ b/level_0/f_directory/data/build/settings-tests @@ -28,6 +28,7 @@ build_libraries-individual -lf_memory -lf_string -lf_directory build_sources_program test-directory.c test-directory-create.c test-directory-create_at.c test-directory-empty.c test-directory-exists.c test-directory-exists_at.c test-directory-is.c test-directory-is_at.c test-directory-list.c test-directory-open.c test-directory-open_at.c test-directory-remove.c test-directory-remove_custom.c test-directory-touch.c test-directory-touch_at.c build_sources_program test-directory-listings_destroy_callback.c test-directory-listings_delete_callback.c test-directory-listingss_destroy_callback.c test-directory-listingss_delete_callback.c build_sources_program test-directory-recurse_dos_destroy_callback.c test-directory-recurse_dos_delete_callback.c test-directory-recurse_doss_destroy_callback.c test-directory-recurse_doss_delete_callback.c +build_sources_program test-directory-stream_close.c test-directory-stream_open.c test-directory-stream_open_id.c test-directory-stream_read.c test-directory-stream_rewind.c test-directory-stream_seek.c test-directory-stream_tell.c build_sources_program test-directory-statuss_destroy_callback.c test-directory-statuss_delete_callback.c test-directory-statusss_destroy_callback.c test-directory-statusss_delete_callback.c build_script no diff --git a/level_0/f_directory/tests/unit/c/mock-directory.c b/level_0/f_directory/tests/unit/c/mock-directory.c index be1bde2..93fc08f 100644 --- a/level_0/f_directory/tests/unit/c/mock-directory.c +++ b/level_0/f_directory/tests/unit/c/mock-directory.c @@ -109,6 +109,23 @@ int __wrap_closedir(DIR *dirp) { return mock_type(int); } +DIR *__wrap_fdopendir(int fd) { + + if (mock_unwrap) { + return __real_fdopendir(fd); + } + + const bool failure = mock_type(bool); + + if (failure) { + errno = mock_type(int); + + return 0; + } + + return mock_type(DIR *); +} + int __wrap_fstatat(int dirfd, const char *pathname, struct stat *statbuf, int flags) { if (mock_unwrap) { @@ -278,6 +295,13 @@ int __wrap_remove(const char *pathname) { return mock_type(int); } +void __wrap_rewinddir(DIR *dirp) { + + if (mock_unwrap) { + __real_rewinddir(dirp); + } +} + int __wrap_scandir(const char *dirp, struct dirent ***namelist, int (*filter)(const struct dirent *), int (*compar)(const struct dirent **, const struct dirent **)) { if (mock_unwrap) { @@ -297,6 +321,13 @@ int __wrap_scandir(const char *dirp, struct dirent ***namelist, int (*filter)(co return mock_type(int); } +void __wrap_seekdir(DIR *dirp, long loc) { + + if (mock_unwrap) { + __real_seekdir(dirp, loc); + } +} + int __wrap_stat(const char *pathname, struct stat *statbuf) { if (mock_unwrap) { @@ -330,6 +361,23 @@ int __wrap_stat(const char *pathname, struct stat *statbuf) { return mock_type(int); } +long __wrap_telldir(DIR *dirp) { + + if (mock_unwrap) { + return __real_telldir(dirp); + } + + const bool failure = mock_type(bool); + + if (failure) { + errno = mock_type(int); + + return -1; + } + + return mock_type(long); +} + int __wrap_utimensat(int dirfd, const char *pathname, const struct timespec times[2], int flags) { if (mock_unwrap) { diff --git a/level_0/f_directory/tests/unit/c/mock-directory.h b/level_0/f_directory/tests/unit/c/mock-directory.h index 72787e1..9f7b5a0 100644 --- a/level_0/f_directory/tests/unit/c/mock-directory.h +++ b/level_0/f_directory/tests/unit/c/mock-directory.h @@ -43,6 +43,7 @@ extern f_status_t __wrap_f_memory_arrays_resize(const f_number_unsigned_t length extern int __real_alphasort(const struct dirent **a, const struct dirent **b); extern int __real_closedir(DIR *dirp); +extern DIR *__real_fdopendir(int fd); extern int __real_fstatat(int dirfd, const char *pathname, struct stat *statbuf, int flags); extern int __real_mkdir(const char *pathname, mode_t mode); extern int __real_mkdirat(int dirfd, const char *pathname, mode_t mode); @@ -52,13 +53,17 @@ extern int __real_openat(int dirfd, const char *pathname, int flags); extern DIR *__real_opendir(const char *name); extern struct dirent *__real_readdir(DIR *dirp); extern int __real_remove(const char *pathname); +extern void __real_rewinddir(DIR *dirp); extern int __real_scandir(const char *dirp, struct dirent ***namelist, int (*filter)(const struct dirent *), int (*compar)(const struct dirent **, const struct dirent **)); +extern void __real_seekdir(DIR *dirp, long loc); extern int __real_stat(const char *pathname, struct stat *statbuf); +extern long __real_telldir(DIR *dirp); extern int __real_utimensat(int dirfd, const char *pathname, const struct timespec times[2], int flags); extern int __real_versionsort(const struct dirent **a, const struct dirent **b); extern int __wrap_alphasort(const struct dirent **a, const struct dirent **b); extern int __wrap_closedir(DIR *dirp); +extern DIR *__wrap_fdopendir(int fd); extern int __wrap_fstatat(int dirfd, const char *pathname, struct stat *statbuf, int flags); extern int __wrap_mkdir(const char *pathname, mode_t mode); extern int __wrap_mkdirat(int dirfd, const char *pathname, mode_t mode); @@ -68,8 +73,11 @@ extern int __wrap_openat(int dirfd, const char *pathname, int flags); extern DIR *__wrap_opendir(const char *name); extern struct dirent *__wrap_readdir(DIR *dirp); extern int __wrap_remove(const char *pathname); +extern void __wrap_rewinddir(DIR *dirp); extern int __wrap_scandir(const char *dirp, struct dirent ***namelist, int (*filter)(const struct dirent *), int (*compar)(const struct dirent **, const struct dirent **)); +extern void __wrap_seekdir(DIR *dirp, long loc); extern int __wrap_stat(const char *pathname, struct stat *statbuf); +extern long __wrap_telldir(DIR *dirp); extern int __wrap_utimensat(int dirfd, const char *pathname, const struct timespec times[2], int flags); extern int __wrap_versionsort(const struct dirent **a, const struct dirent **b); diff --git a/level_0/f_directory/tests/unit/c/test-directory-recurse_dos_delete_callback.c b/level_0/f_directory/tests/unit/c/test-directory-recurse_dos_delete_callback.c index f132f24..28d842f 100644 --- a/level_0/f_directory/tests/unit/c/test-directory-recurse_dos_delete_callback.c +++ b/level_0/f_directory/tests/unit/c/test-directory-recurse_dos_delete_callback.c @@ -11,22 +11,8 @@ void test__f_directory_recurse_dos_delete_callback__fails(void **state) { mock_unwrap_f_memory = 0; f_string_static_t base = macro_f_string_static_t_initialize_1(F_string_empty_s, 1, 0); - f_string_static_t base_array[] = { base }; - f_string_statics_t bases = macro_f_string_statics_t_initialize_1(base_array, 1, 0); - - f_directory_listing_t listing = { - .block = bases, - .character = bases, - .directory = bases, - .regular = bases, - .link = bases, - .fifo = bases, - .socket = bases, - .unknown = bases, - }; f_directory_recurse_do_t data = { - .listing = listing, .path = base, .path_cache = base, }; @@ -42,14 +28,6 @@ void test__f_directory_recurse_dos_delete_callback__fails(void **state) { assert_int_equal(status, F_status_set_error(F_failure)); } - data_array[0].listing.block = bases; - data_array[0].listing.character = bases; - data_array[0].listing.directory = bases; - data_array[0].listing.regular = bases; - data_array[0].listing.link = bases; - data_array[0].listing.fifo = bases; - data_array[0].listing.socket = bases; - data_array[0].listing.unknown = bases; data_array[0].path = base; data_array[0].path_cache = base; @@ -64,298 +42,6 @@ void test__f_directory_recurse_dos_delete_callback__fails(void **state) { assert_int_equal(status, F_status_set_error(F_failure)); } - - data_array[0].listing.block = bases; - data_array[0].listing.character = bases; - data_array[0].listing.directory = bases; - data_array[0].listing.regular = bases; - data_array[0].listing.link = bases; - data_array[0].listing.fifo = bases; - data_array[0].listing.socket = bases; - data_array[0].listing.unknown = bases; - data_array[0].path = base; - data_array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, true); - will_return(__wrap_f_memory_arrays_resize, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_dos_delete_callback(0, 1, (void *) data_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } - - data_array[0].listing.block = bases; - data_array[0].listing.character = bases; - data_array[0].listing.directory = bases; - data_array[0].listing.regular = bases; - data_array[0].listing.link = bases; - data_array[0].listing.fifo = bases; - data_array[0].listing.socket = bases; - data_array[0].listing.unknown = bases; - data_array[0].path = base; - data_array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, true); - will_return(__wrap_f_memory_arrays_resize, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_dos_delete_callback(0, 1, (void *) data_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } - - data_array[0].listing.block = bases; - data_array[0].listing.character = bases; - data_array[0].listing.directory = bases; - data_array[0].listing.regular = bases; - data_array[0].listing.link = bases; - data_array[0].listing.fifo = bases; - data_array[0].listing.socket = bases; - data_array[0].listing.unknown = bases; - data_array[0].path = base; - data_array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, true); - will_return(__wrap_f_memory_arrays_resize, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_dos_delete_callback(0, 1, (void *) data_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } - - data_array[0].listing.block = bases; - data_array[0].listing.character = bases; - data_array[0].listing.directory = bases; - data_array[0].listing.regular = bases; - data_array[0].listing.link = bases; - data_array[0].listing.fifo = bases; - data_array[0].listing.socket = bases; - data_array[0].listing.unknown = bases; - data_array[0].path = base; - data_array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, true); - will_return(__wrap_f_memory_arrays_resize, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_dos_delete_callback(0, 1, (void *) data_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } - - data_array[0].listing.block = bases; - data_array[0].listing.character = bases; - data_array[0].listing.directory = bases; - data_array[0].listing.regular = bases; - data_array[0].listing.link = bases; - data_array[0].listing.fifo = bases; - data_array[0].listing.socket = bases; - data_array[0].listing.unknown = bases; - data_array[0].path = base; - data_array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, true); - will_return(__wrap_f_memory_arrays_resize, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_dos_delete_callback(0, 1, (void *) data_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } - - data_array[0].listing.block = bases; - data_array[0].listing.character = bases; - data_array[0].listing.directory = bases; - data_array[0].listing.regular = bases; - data_array[0].listing.link = bases; - data_array[0].listing.fifo = bases; - data_array[0].listing.socket = bases; - data_array[0].listing.unknown = bases; - data_array[0].path = base; - data_array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, true); - will_return(__wrap_f_memory_arrays_resize, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_dos_delete_callback(0, 1, (void *) data_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } - - data_array[0].listing.block = bases; - data_array[0].listing.character = bases; - data_array[0].listing.directory = bases; - data_array[0].listing.regular = bases; - data_array[0].listing.link = bases; - data_array[0].listing.fifo = bases; - data_array[0].listing.socket = bases; - data_array[0].listing.unknown = bases; - data_array[0].path = base; - data_array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, true); - will_return(__wrap_f_memory_arrays_resize, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_dos_delete_callback(0, 1, (void *) data_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } - - data_array[0].listing.block = bases; - data_array[0].listing.character = bases; - data_array[0].listing.directory = bases; - data_array[0].listing.regular = bases; - data_array[0].listing.link = bases; - data_array[0].listing.fifo = bases; - data_array[0].listing.socket = bases; - data_array[0].listing.unknown = bases; - data_array[0].path = base; - data_array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, true); - will_return(__wrap_f_memory_arrays_resize, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_dos_delete_callback(0, 1, (void *) data_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } } void test__f_directory_recurse_dos_delete_callback__works(void **state) { @@ -376,30 +62,6 @@ void test__f_directory_recurse_dos_delete_callback__works(void **state) { status = f_memory_array_resize(1, sizeof(f_char_t), (void **) &datas.array[0].path_cache.string, &datas.array[0].path_cache.used, &datas.array[0].path_cache.size); assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datas.array[0].listing.block.array, &datas.array[0].listing.block.used, &datas.array[0].listing.block.size, &f_string_dynamics_delete_callback); - assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datas.array[0].listing.character.array, &datas.array[0].listing.character.used, &datas.array[0].listing.character.size, &f_string_dynamics_delete_callback); - assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datas.array[0].listing.directory.array, &datas.array[0].listing.directory.used, &datas.array[0].listing.directory.size, &f_string_dynamics_delete_callback); - assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datas.array[0].listing.regular.array, &datas.array[0].listing.regular.used, &datas.array[0].listing.regular.size, &f_string_dynamics_delete_callback); - assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datas.array[0].listing.link.array, &datas.array[0].listing.link.used, &datas.array[0].listing.link.size, &f_string_dynamics_delete_callback); - assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datas.array[0].listing.fifo.array, &datas.array[0].listing.fifo.used, &datas.array[0].listing.fifo.size, &f_string_dynamics_delete_callback); - assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datas.array[0].listing.socket.array, &datas.array[0].listing.socket.used, &datas.array[0].listing.socket.size, &f_string_dynamics_delete_callback); - assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datas.array[0].listing.unknown.array, &datas.array[0].listing.unknown.used, &datas.array[0].listing.unknown.size, &f_string_dynamics_delete_callback); - assert_int_equal(status, F_okay); } { @@ -408,14 +70,6 @@ void test__f_directory_recurse_dos_delete_callback__works(void **state) { assert_int_equal(status, F_okay); assert_int_equal(datas.array[0].path.size, 0); assert_int_equal(datas.array[0].path_cache.size, 0); - assert_int_equal(datas.array[0].listing.block.size, 0); - assert_int_equal(datas.array[0].listing.character.size, 0); - assert_int_equal(datas.array[0].listing.directory.size, 0); - assert_int_equal(datas.array[0].listing.regular.size, 0); - assert_int_equal(datas.array[0].listing.link.size, 0); - assert_int_equal(datas.array[0].listing.fifo.size, 0); - assert_int_equal(datas.array[0].listing.socket.size, 0); - assert_int_equal(datas.array[0].listing.unknown.size, 0); } free((void *) datas.array); diff --git a/level_0/f_directory/tests/unit/c/test-directory-recurse_dos_destroy_callback.c b/level_0/f_directory/tests/unit/c/test-directory-recurse_dos_destroy_callback.c index d694b27..2a071bb 100644 --- a/level_0/f_directory/tests/unit/c/test-directory-recurse_dos_destroy_callback.c +++ b/level_0/f_directory/tests/unit/c/test-directory-recurse_dos_destroy_callback.c @@ -11,22 +11,8 @@ void test__f_directory_recurse_dos_destroy_callback__fails(void **state) { mock_unwrap_f_memory = 0; f_string_static_t base = macro_f_string_static_t_initialize_1(F_string_empty_s, 1, 0); - f_string_static_t base_array[] = { base }; - f_string_statics_t bases = macro_f_string_statics_t_initialize_1(base_array, 1, 0); - - f_directory_listing_t listing = { - .block = bases, - .character = bases, - .directory = bases, - .regular = bases, - .link = bases, - .fifo = bases, - .socket = bases, - .unknown = bases, - }; f_directory_recurse_do_t data = { - .listing = listing, .path = base, .path_cache = base, }; @@ -42,14 +28,6 @@ void test__f_directory_recurse_dos_destroy_callback__fails(void **state) { assert_int_equal(status, F_status_set_error(F_failure)); } - data_array[0].listing.block = bases; - data_array[0].listing.character = bases; - data_array[0].listing.directory = bases; - data_array[0].listing.regular = bases; - data_array[0].listing.link = bases; - data_array[0].listing.fifo = bases; - data_array[0].listing.socket = bases; - data_array[0].listing.unknown = bases; data_array[0].path = base; data_array[0].path_cache = base; @@ -64,298 +42,6 @@ void test__f_directory_recurse_dos_destroy_callback__fails(void **state) { assert_int_equal(status, F_status_set_error(F_failure)); } - - data_array[0].listing.block = bases; - data_array[0].listing.character = bases; - data_array[0].listing.directory = bases; - data_array[0].listing.regular = bases; - data_array[0].listing.link = bases; - data_array[0].listing.fifo = bases; - data_array[0].listing.socket = bases; - data_array[0].listing.unknown = bases; - data_array[0].path = base; - data_array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, true); - will_return(__wrap_f_memory_arrays_adjust, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_dos_destroy_callback(0, 1, (void *) data_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } - - data_array[0].listing.block = bases; - data_array[0].listing.character = bases; - data_array[0].listing.directory = bases; - data_array[0].listing.regular = bases; - data_array[0].listing.link = bases; - data_array[0].listing.fifo = bases; - data_array[0].listing.socket = bases; - data_array[0].listing.unknown = bases; - data_array[0].path = base; - data_array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, true); - will_return(__wrap_f_memory_arrays_adjust, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_dos_destroy_callback(0, 1, (void *) data_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } - - data_array[0].listing.block = bases; - data_array[0].listing.character = bases; - data_array[0].listing.directory = bases; - data_array[0].listing.regular = bases; - data_array[0].listing.link = bases; - data_array[0].listing.fifo = bases; - data_array[0].listing.socket = bases; - data_array[0].listing.unknown = bases; - data_array[0].path = base; - data_array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, true); - will_return(__wrap_f_memory_arrays_adjust, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_dos_destroy_callback(0, 1, (void *) data_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } - - data_array[0].listing.block = bases; - data_array[0].listing.character = bases; - data_array[0].listing.directory = bases; - data_array[0].listing.regular = bases; - data_array[0].listing.link = bases; - data_array[0].listing.fifo = bases; - data_array[0].listing.socket = bases; - data_array[0].listing.unknown = bases; - data_array[0].path = base; - data_array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, true); - will_return(__wrap_f_memory_arrays_adjust, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_dos_destroy_callback(0, 1, (void *) data_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } - - data_array[0].listing.block = bases; - data_array[0].listing.character = bases; - data_array[0].listing.directory = bases; - data_array[0].listing.regular = bases; - data_array[0].listing.link = bases; - data_array[0].listing.fifo = bases; - data_array[0].listing.socket = bases; - data_array[0].listing.unknown = bases; - data_array[0].path = base; - data_array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, true); - will_return(__wrap_f_memory_arrays_adjust, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_dos_destroy_callback(0, 1, (void *) data_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } - - data_array[0].listing.block = bases; - data_array[0].listing.character = bases; - data_array[0].listing.directory = bases; - data_array[0].listing.regular = bases; - data_array[0].listing.link = bases; - data_array[0].listing.fifo = bases; - data_array[0].listing.socket = bases; - data_array[0].listing.unknown = bases; - data_array[0].path = base; - data_array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, true); - will_return(__wrap_f_memory_arrays_adjust, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_dos_destroy_callback(0, 1, (void *) data_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } - - data_array[0].listing.block = bases; - data_array[0].listing.character = bases; - data_array[0].listing.directory = bases; - data_array[0].listing.regular = bases; - data_array[0].listing.link = bases; - data_array[0].listing.fifo = bases; - data_array[0].listing.socket = bases; - data_array[0].listing.unknown = bases; - data_array[0].path = base; - data_array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, true); - will_return(__wrap_f_memory_arrays_adjust, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_dos_destroy_callback(0, 1, (void *) data_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } - - data_array[0].listing.block = bases; - data_array[0].listing.character = bases; - data_array[0].listing.directory = bases; - data_array[0].listing.regular = bases; - data_array[0].listing.link = bases; - data_array[0].listing.fifo = bases; - data_array[0].listing.socket = bases; - data_array[0].listing.unknown = bases; - data_array[0].path = base; - data_array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, true); - will_return(__wrap_f_memory_arrays_adjust, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_dos_destroy_callback(0, 1, (void *) data_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } } void test__f_directory_recurse_dos_destroy_callback__works(void **state) { @@ -376,30 +62,6 @@ void test__f_directory_recurse_dos_destroy_callback__works(void **state) { status = f_memory_array_resize(1, sizeof(f_char_t), (void **) &datas.array[0].path_cache.string, &datas.array[0].path_cache.used, &datas.array[0].path_cache.size); assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datas.array[0].listing.block.array, &datas.array[0].listing.block.used, &datas.array[0].listing.block.size, &f_string_dynamics_destroy_callback); - assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datas.array[0].listing.character.array, &datas.array[0].listing.character.used, &datas.array[0].listing.character.size, &f_string_dynamics_destroy_callback); - assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datas.array[0].listing.directory.array, &datas.array[0].listing.directory.used, &datas.array[0].listing.directory.size, &f_string_dynamics_destroy_callback); - assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datas.array[0].listing.regular.array, &datas.array[0].listing.regular.used, &datas.array[0].listing.regular.size, &f_string_dynamics_destroy_callback); - assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datas.array[0].listing.link.array, &datas.array[0].listing.link.used, &datas.array[0].listing.link.size, &f_string_dynamics_destroy_callback); - assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datas.array[0].listing.fifo.array, &datas.array[0].listing.fifo.used, &datas.array[0].listing.fifo.size, &f_string_dynamics_destroy_callback); - assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datas.array[0].listing.socket.array, &datas.array[0].listing.socket.used, &datas.array[0].listing.socket.size, &f_string_dynamics_destroy_callback); - assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datas.array[0].listing.unknown.array, &datas.array[0].listing.unknown.used, &datas.array[0].listing.unknown.size, &f_string_dynamics_destroy_callback); - assert_int_equal(status, F_okay); } { @@ -408,14 +70,6 @@ void test__f_directory_recurse_dos_destroy_callback__works(void **state) { assert_int_equal(status, F_okay); assert_int_equal(datas.array[0].path.size, 0); assert_int_equal(datas.array[0].path_cache.size, 0); - assert_int_equal(datas.array[0].listing.block.size, 0); - assert_int_equal(datas.array[0].listing.character.size, 0); - assert_int_equal(datas.array[0].listing.directory.size, 0); - assert_int_equal(datas.array[0].listing.regular.size, 0); - assert_int_equal(datas.array[0].listing.link.size, 0); - assert_int_equal(datas.array[0].listing.fifo.size, 0); - assert_int_equal(datas.array[0].listing.socket.size, 0); - assert_int_equal(datas.array[0].listing.unknown.size, 0); } free((void *) datas.array); diff --git a/level_0/f_directory/tests/unit/c/test-directory-recurse_doss_delete_callback.c b/level_0/f_directory/tests/unit/c/test-directory-recurse_doss_delete_callback.c index eab60de..c8eabf0 100644 --- a/level_0/f_directory/tests/unit/c/test-directory-recurse_doss_delete_callback.c +++ b/level_0/f_directory/tests/unit/c/test-directory-recurse_doss_delete_callback.c @@ -11,22 +11,8 @@ void test__f_directory_recurse_doss_delete_callback__fails(void **state) { mock_unwrap_f_memory = 0; f_string_static_t base = macro_f_string_static_t_initialize_1(F_string_empty_s, 1, 0); - f_string_static_t base_array[] = { base }; - f_string_statics_t bases = macro_f_string_statics_t_initialize_1(base_array, 1, 0); - - f_directory_listing_t listing = { - .block = bases, - .character = bases, - .directory = bases, - .regular = bases, - .link = bases, - .fifo = bases, - .socket = bases, - .unknown = bases, - }; f_directory_recurse_do_t data = { - .listing = listing, .path = base, .path_cache = base, }; @@ -45,14 +31,6 @@ void test__f_directory_recurse_doss_delete_callback__fails(void **state) { } datas_array[0] = datas; - datas_array[0].array[0].listing.block = bases; - datas_array[0].array[0].listing.character = bases; - datas_array[0].array[0].listing.directory = bases; - datas_array[0].array[0].listing.regular = bases; - datas_array[0].array[0].listing.link = bases; - datas_array[0].array[0].listing.fifo = bases; - datas_array[0].array[0].listing.socket = bases; - datas_array[0].array[0].listing.unknown = bases; datas_array[0].array[0].path = base; datas_array[0].array[0].path_cache = base; @@ -67,357 +45,6 @@ void test__f_directory_recurse_doss_delete_callback__fails(void **state) { assert_int_equal(status, F_status_set_error(F_failure)); } - - datas_array[0] = datas; - datas_array[0].array[0].listing.block = bases; - datas_array[0].array[0].listing.character = bases; - datas_array[0].array[0].listing.directory = bases; - datas_array[0].array[0].listing.regular = bases; - datas_array[0].array[0].listing.link = bases; - datas_array[0].array[0].listing.fifo = bases; - datas_array[0].array[0].listing.socket = bases; - datas_array[0].array[0].listing.unknown = bases; - datas_array[0].array[0].path = base; - datas_array[0].array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, true); - will_return(__wrap_f_memory_arrays_resize, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_doss_delete_callback(0, 1, (void *) datas_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } - - datas_array[0] = datas; - datas_array[0].array[0].listing.block = bases; - datas_array[0].array[0].listing.character = bases; - datas_array[0].array[0].listing.directory = bases; - datas_array[0].array[0].listing.regular = bases; - datas_array[0].array[0].listing.link = bases; - datas_array[0].array[0].listing.fifo = bases; - datas_array[0].array[0].listing.socket = bases; - datas_array[0].array[0].listing.unknown = bases; - datas_array[0].array[0].path = base; - datas_array[0].array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, true); - will_return(__wrap_f_memory_arrays_resize, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_doss_delete_callback(0, 1, (void *) datas_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } - - datas_array[0] = datas; - datas_array[0].array[0].listing.block = bases; - datas_array[0].array[0].listing.character = bases; - datas_array[0].array[0].listing.directory = bases; - datas_array[0].array[0].listing.regular = bases; - datas_array[0].array[0].listing.link = bases; - datas_array[0].array[0].listing.fifo = bases; - datas_array[0].array[0].listing.socket = bases; - datas_array[0].array[0].listing.unknown = bases; - datas_array[0].array[0].path = base; - datas_array[0].array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, true); - will_return(__wrap_f_memory_arrays_resize, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_doss_delete_callback(0, 1, (void *) datas_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } - - datas_array[0] = datas; - datas_array[0].array[0].listing.block = bases; - datas_array[0].array[0].listing.character = bases; - datas_array[0].array[0].listing.directory = bases; - datas_array[0].array[0].listing.regular = bases; - datas_array[0].array[0].listing.link = bases; - datas_array[0].array[0].listing.fifo = bases; - datas_array[0].array[0].listing.socket = bases; - datas_array[0].array[0].listing.unknown = bases; - datas_array[0].array[0].path = base; - datas_array[0].array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, true); - will_return(__wrap_f_memory_arrays_resize, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_doss_delete_callback(0, 1, (void *) datas_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } - - datas_array[0] = datas; - datas_array[0].array[0].listing.block = bases; - datas_array[0].array[0].listing.character = bases; - datas_array[0].array[0].listing.directory = bases; - datas_array[0].array[0].listing.regular = bases; - datas_array[0].array[0].listing.link = bases; - datas_array[0].array[0].listing.fifo = bases; - datas_array[0].array[0].listing.socket = bases; - datas_array[0].array[0].listing.unknown = bases; - datas_array[0].array[0].path = base; - datas_array[0].array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, true); - will_return(__wrap_f_memory_arrays_resize, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_doss_delete_callback(0, 1, (void *) datas_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } - - datas_array[0] = datas; - datas_array[0].array[0].listing.block = bases; - datas_array[0].array[0].listing.character = bases; - datas_array[0].array[0].listing.directory = bases; - datas_array[0].array[0].listing.regular = bases; - datas_array[0].array[0].listing.link = bases; - datas_array[0].array[0].listing.fifo = bases; - datas_array[0].array[0].listing.socket = bases; - datas_array[0].array[0].listing.unknown = bases; - datas_array[0].array[0].path = base; - datas_array[0].array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, true); - will_return(__wrap_f_memory_arrays_resize, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_doss_delete_callback(0, 1, (void *) datas_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } - - datas_array[0] = datas; - datas_array[0].array[0].listing.block = bases; - datas_array[0].array[0].listing.character = bases; - datas_array[0].array[0].listing.directory = bases; - datas_array[0].array[0].listing.regular = bases; - datas_array[0].array[0].listing.link = bases; - datas_array[0].array[0].listing.fifo = bases; - datas_array[0].array[0].listing.socket = bases; - datas_array[0].array[0].listing.unknown = bases; - datas_array[0].array[0].path = base; - datas_array[0].array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, true); - will_return(__wrap_f_memory_arrays_resize, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_doss_delete_callback(0, 1, (void *) datas_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } - - datas_array[0] = datas; - datas_array[0].array[0].listing.block = bases; - datas_array[0].array[0].listing.character = bases; - datas_array[0].array[0].listing.directory = bases; - datas_array[0].array[0].listing.regular = bases; - datas_array[0].array[0].listing.link = bases; - datas_array[0].array[0].listing.fifo = bases; - datas_array[0].array[0].listing.socket = bases; - datas_array[0].array[0].listing.unknown = bases; - datas_array[0].array[0].path = base; - datas_array[0].array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, true); - will_return(__wrap_f_memory_arrays_resize, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_doss_delete_callback(0, 1, (void *) datas_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } - - datas_array[0] = datas; - datas_array[0].array[0].listing.block = bases; - datas_array[0].array[0].listing.character = bases; - datas_array[0].array[0].listing.directory = bases; - datas_array[0].array[0].listing.regular = bases; - datas_array[0].array[0].listing.link = bases; - datas_array[0].array[0].listing.fifo = bases; - datas_array[0].array[0].listing.socket = bases; - datas_array[0].array[0].listing.unknown = bases; - datas_array[0].array[0].path = base; - datas_array[0].array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_array_resize, false); - will_return(__wrap_f_memory_array_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_arrays_resize, false); - will_return(__wrap_f_memory_arrays_resize, F_okay); - - will_return(__wrap_f_memory_array_resize, true); - will_return(__wrap_f_memory_array_resize, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_doss_delete_callback(0, 1, (void *) datas_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } } void test__f_directory_recurse_doss_delete_callback__works(void **state) { @@ -441,30 +68,6 @@ void test__f_directory_recurse_doss_delete_callback__works(void **state) { status = f_memory_array_resize(1, sizeof(f_char_t), (void **) &datass.array[0].array[0].path_cache.string, &datass.array[0].array[0].path_cache.used, &datass.array[0].array[0].path_cache.size); assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datass.array[0].array[0].listing.block.array, &datass.array[0].array[0].listing.block.used, &datass.array[0].array[0].listing.block.size, &f_string_dynamics_delete_callback); - assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datass.array[0].array[0].listing.character.array, &datass.array[0].array[0].listing.character.used, &datass.array[0].array[0].listing.character.size, &f_string_dynamics_delete_callback); - assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datass.array[0].array[0].listing.directory.array, &datass.array[0].array[0].listing.directory.used, &datass.array[0].array[0].listing.directory.size, &f_string_dynamics_delete_callback); - assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datass.array[0].array[0].listing.regular.array, &datass.array[0].array[0].listing.regular.used, &datass.array[0].array[0].listing.regular.size, &f_string_dynamics_delete_callback); - assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datass.array[0].array[0].listing.link.array, &datass.array[0].array[0].listing.link.used, &datass.array[0].array[0].listing.link.size, &f_string_dynamics_delete_callback); - assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datass.array[0].array[0].listing.fifo.array, &datass.array[0].array[0].listing.fifo.used, &datass.array[0].array[0].listing.fifo.size, &f_string_dynamics_delete_callback); - assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datass.array[0].array[0].listing.socket.array, &datass.array[0].array[0].listing.socket.used, &datass.array[0].array[0].listing.socket.size, &f_string_dynamics_delete_callback); - assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datass.array[0].array[0].listing.unknown.array, &datass.array[0].array[0].listing.unknown.used, &datass.array[0].array[0].listing.unknown.size, &f_string_dynamics_delete_callback); - assert_int_equal(status, F_okay); } { diff --git a/level_0/f_directory/tests/unit/c/test-directory-recurse_doss_destroy_callback.c b/level_0/f_directory/tests/unit/c/test-directory-recurse_doss_destroy_callback.c index b2be796..0b7f923 100644 --- a/level_0/f_directory/tests/unit/c/test-directory-recurse_doss_destroy_callback.c +++ b/level_0/f_directory/tests/unit/c/test-directory-recurse_doss_destroy_callback.c @@ -11,22 +11,8 @@ void test__f_directory_recurse_doss_destroy_callback__fails(void **state) { mock_unwrap_f_memory = 0; f_string_static_t base = macro_f_string_static_t_initialize_1(F_string_empty_s, 1, 0); - f_string_static_t base_array[] = { base }; - f_string_statics_t bases = macro_f_string_statics_t_initialize_1(base_array, 1, 0); - - f_directory_listing_t listing = { - .block = bases, - .character = bases, - .directory = bases, - .regular = bases, - .link = bases, - .fifo = bases, - .socket = bases, - .unknown = bases, - }; f_directory_recurse_do_t data = { - .listing = listing, .path = base, .path_cache = base, }; @@ -45,14 +31,6 @@ void test__f_directory_recurse_doss_destroy_callback__fails(void **state) { } datas_array[0] = datas; - datas_array[0].array[0].listing.block = bases; - datas_array[0].array[0].listing.character = bases; - datas_array[0].array[0].listing.directory = bases; - datas_array[0].array[0].listing.regular = bases; - datas_array[0].array[0].listing.link = bases; - datas_array[0].array[0].listing.fifo = bases; - datas_array[0].array[0].listing.socket = bases; - datas_array[0].array[0].listing.unknown = bases; datas_array[0].array[0].path = base; datas_array[0].array[0].path_cache = base; @@ -67,357 +45,6 @@ void test__f_directory_recurse_doss_destroy_callback__fails(void **state) { assert_int_equal(status, F_status_set_error(F_failure)); } - - datas_array[0] = datas; - datas_array[0].array[0].listing.block = bases; - datas_array[0].array[0].listing.character = bases; - datas_array[0].array[0].listing.directory = bases; - datas_array[0].array[0].listing.regular = bases; - datas_array[0].array[0].listing.link = bases; - datas_array[0].array[0].listing.fifo = bases; - datas_array[0].array[0].listing.socket = bases; - datas_array[0].array[0].listing.unknown = bases; - datas_array[0].array[0].path = base; - datas_array[0].array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, true); - will_return(__wrap_f_memory_arrays_adjust, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_doss_destroy_callback(0, 1, (void *) datas_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } - - datas_array[0] = datas; - datas_array[0].array[0].listing.block = bases; - datas_array[0].array[0].listing.character = bases; - datas_array[0].array[0].listing.directory = bases; - datas_array[0].array[0].listing.regular = bases; - datas_array[0].array[0].listing.link = bases; - datas_array[0].array[0].listing.fifo = bases; - datas_array[0].array[0].listing.socket = bases; - datas_array[0].array[0].listing.unknown = bases; - datas_array[0].array[0].path = base; - datas_array[0].array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, true); - will_return(__wrap_f_memory_arrays_adjust, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_doss_destroy_callback(0, 1, (void *) datas_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } - - datas_array[0] = datas; - datas_array[0].array[0].listing.block = bases; - datas_array[0].array[0].listing.character = bases; - datas_array[0].array[0].listing.directory = bases; - datas_array[0].array[0].listing.regular = bases; - datas_array[0].array[0].listing.link = bases; - datas_array[0].array[0].listing.fifo = bases; - datas_array[0].array[0].listing.socket = bases; - datas_array[0].array[0].listing.unknown = bases; - datas_array[0].array[0].path = base; - datas_array[0].array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, true); - will_return(__wrap_f_memory_arrays_adjust, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_doss_destroy_callback(0, 1, (void *) datas_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } - - datas_array[0] = datas; - datas_array[0].array[0].listing.block = bases; - datas_array[0].array[0].listing.character = bases; - datas_array[0].array[0].listing.directory = bases; - datas_array[0].array[0].listing.regular = bases; - datas_array[0].array[0].listing.link = bases; - datas_array[0].array[0].listing.fifo = bases; - datas_array[0].array[0].listing.socket = bases; - datas_array[0].array[0].listing.unknown = bases; - datas_array[0].array[0].path = base; - datas_array[0].array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, true); - will_return(__wrap_f_memory_arrays_adjust, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_doss_destroy_callback(0, 1, (void *) datas_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } - - datas_array[0] = datas; - datas_array[0].array[0].listing.block = bases; - datas_array[0].array[0].listing.character = bases; - datas_array[0].array[0].listing.directory = bases; - datas_array[0].array[0].listing.regular = bases; - datas_array[0].array[0].listing.link = bases; - datas_array[0].array[0].listing.fifo = bases; - datas_array[0].array[0].listing.socket = bases; - datas_array[0].array[0].listing.unknown = bases; - datas_array[0].array[0].path = base; - datas_array[0].array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, true); - will_return(__wrap_f_memory_arrays_adjust, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_doss_destroy_callback(0, 1, (void *) datas_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } - - datas_array[0] = datas; - datas_array[0].array[0].listing.block = bases; - datas_array[0].array[0].listing.character = bases; - datas_array[0].array[0].listing.directory = bases; - datas_array[0].array[0].listing.regular = bases; - datas_array[0].array[0].listing.link = bases; - datas_array[0].array[0].listing.fifo = bases; - datas_array[0].array[0].listing.socket = bases; - datas_array[0].array[0].listing.unknown = bases; - datas_array[0].array[0].path = base; - datas_array[0].array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, true); - will_return(__wrap_f_memory_arrays_adjust, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_doss_destroy_callback(0, 1, (void *) datas_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } - - datas_array[0] = datas; - datas_array[0].array[0].listing.block = bases; - datas_array[0].array[0].listing.character = bases; - datas_array[0].array[0].listing.directory = bases; - datas_array[0].array[0].listing.regular = bases; - datas_array[0].array[0].listing.link = bases; - datas_array[0].array[0].listing.fifo = bases; - datas_array[0].array[0].listing.socket = bases; - datas_array[0].array[0].listing.unknown = bases; - datas_array[0].array[0].path = base; - datas_array[0].array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, true); - will_return(__wrap_f_memory_arrays_adjust, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_doss_destroy_callback(0, 1, (void *) datas_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } - - datas_array[0] = datas; - datas_array[0].array[0].listing.block = bases; - datas_array[0].array[0].listing.character = bases; - datas_array[0].array[0].listing.directory = bases; - datas_array[0].array[0].listing.regular = bases; - datas_array[0].array[0].listing.link = bases; - datas_array[0].array[0].listing.fifo = bases; - datas_array[0].array[0].listing.socket = bases; - datas_array[0].array[0].listing.unknown = bases; - datas_array[0].array[0].path = base; - datas_array[0].array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, true); - will_return(__wrap_f_memory_arrays_adjust, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_doss_destroy_callback(0, 1, (void *) datas_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } - - datas_array[0] = datas; - datas_array[0].array[0].listing.block = bases; - datas_array[0].array[0].listing.character = bases; - datas_array[0].array[0].listing.directory = bases; - datas_array[0].array[0].listing.regular = bases; - datas_array[0].array[0].listing.link = bases; - datas_array[0].array[0].listing.fifo = bases; - datas_array[0].array[0].listing.socket = bases; - datas_array[0].array[0].listing.unknown = bases; - datas_array[0].array[0].path = base; - datas_array[0].array[0].path_cache = base; - - { - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_array_adjust, false); - will_return(__wrap_f_memory_array_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_arrays_adjust, false); - will_return(__wrap_f_memory_arrays_adjust, F_okay); - - will_return(__wrap_f_memory_array_adjust, true); - will_return(__wrap_f_memory_array_adjust, F_status_set_error(F_failure)); - - const f_status_t status = f_directory_recurse_doss_destroy_callback(0, 1, (void *) datas_array); - - assert_int_equal(status, F_status_set_error(F_failure)); - } } void test__f_directory_recurse_doss_destroy_callback__works(void **state) { @@ -441,30 +68,6 @@ void test__f_directory_recurse_doss_destroy_callback__works(void **state) { status = f_memory_array_resize(1, sizeof(f_char_t), (void **) &datass.array[0].array[0].path_cache.string, &datass.array[0].array[0].path_cache.used, &datass.array[0].array[0].path_cache.size); assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datass.array[0].array[0].listing.block.array, &datass.array[0].array[0].listing.block.used, &datass.array[0].array[0].listing.block.size, &f_string_dynamics_destroy_callback); - assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datass.array[0].array[0].listing.character.array, &datass.array[0].array[0].listing.character.used, &datass.array[0].array[0].listing.character.size, &f_string_dynamics_destroy_callback); - assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datass.array[0].array[0].listing.directory.array, &datass.array[0].array[0].listing.directory.used, &datass.array[0].array[0].listing.directory.size, &f_string_dynamics_destroy_callback); - assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datass.array[0].array[0].listing.regular.array, &datass.array[0].array[0].listing.regular.used, &datass.array[0].array[0].listing.regular.size, &f_string_dynamics_destroy_callback); - assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datass.array[0].array[0].listing.link.array, &datass.array[0].array[0].listing.link.used, &datass.array[0].array[0].listing.link.size, &f_string_dynamics_destroy_callback); - assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datass.array[0].array[0].listing.fifo.array, &datass.array[0].array[0].listing.fifo.used, &datass.array[0].array[0].listing.fifo.size, &f_string_dynamics_destroy_callback); - assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datass.array[0].array[0].listing.socket.array, &datass.array[0].array[0].listing.socket.used, &datass.array[0].array[0].listing.socket.size, &f_string_dynamics_destroy_callback); - assert_int_equal(status, F_okay); - - status = f_memory_arrays_resize(1, sizeof(f_string_dynamic_t), (void **) &datass.array[0].array[0].listing.unknown.array, &datass.array[0].array[0].listing.unknown.used, &datass.array[0].array[0].listing.unknown.size, &f_string_dynamics_destroy_callback); - assert_int_equal(status, F_okay); } { diff --git a/level_0/f_directory/tests/unit/c/test-directory-stream_close.c b/level_0/f_directory/tests/unit/c/test-directory-stream_close.c new file mode 100644 index 0000000..4e25ad2 --- /dev/null +++ b/level_0/f_directory/tests/unit/c/test-directory-stream_close.c @@ -0,0 +1,67 @@ +#include "test-directory.h" +#include "test-directory-stream_close.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void test__f_directory_stream_close__fails(void **state) { + + mock_unwrap = 0; + mock_unwrap_f_memory = 1; + + // The "DIR" structure cannot be easily instantiated so just use a real call to PWD. + mock_unwrap = 1; + DIR *directory = opendir(f_directory_current_s.string); + mock_unwrap = 0; + + int errnos[] = { + EBADF, + mock_errno_generic, + }; + + f_status_t statuss[] = { + F_status_set_error(F_directory_descriptor), + F_status_set_error(F_failure), + }; + + for (int i = 0; i < 2; ++i) { + + will_return(__wrap_closedir, true); + will_return(__wrap_closedir, errnos[i]); + + const f_status_t status = f_directory_stream_close(directory); + + assert_int_equal(status, statuss[i]); + } // for + + mock_unwrap = 1; + closedir(directory); +} + +void test__f_directory_stream_close__works(void **state) { + + mock_unwrap = 0; + mock_unwrap_f_memory = 1; + + // The "DIR" structure cannot be easily instantiated so just use a real call to PWD. + mock_unwrap = 1; + DIR *directory = opendir(f_directory_current_s.string); + mock_unwrap = 0; + + { + will_return(__wrap_closedir, false); + will_return(__wrap_closedir, 0); + + const f_status_t status = f_directory_stream_close(directory); + + assert_int_equal(status, F_okay); + } + + mock_unwrap = 1; + closedir(directory); +} + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/level_0/f_directory/tests/unit/c/test-directory-stream_close.h b/level_0/f_directory/tests/unit/c/test-directory-stream_close.h new file mode 100644 index 0000000..283fa51 --- /dev/null +++ b/level_0/f_directory/tests/unit/c/test-directory-stream_close.h @@ -0,0 +1,27 @@ +/** + * FLL - Level 0 + * + * Project: Directory + * API Version: 0.7 + * Licenses: lgpl-2.1-or-later + * + * Test the directory project. + */ +#ifndef _TEST__F_directory_stream_close_h +#define _TEST__F_directory_stream_close_h + +/** + * Test that function fails. + * + * @see f_directory_stream_close() + */ +extern void test__f_directory_stream_close__fails(void **state); + +/** + * Test that function works. + * + * @see f_directory_stream_close() + */ +extern void test__f_directory_stream_close__works(void **state); + +#endif // _TEST__F_directory_stream_close_h diff --git a/level_0/f_directory/tests/unit/c/test-directory-stream_open.c b/level_0/f_directory/tests/unit/c/test-directory-stream_open.c new file mode 100644 index 0000000..32d4165 --- /dev/null +++ b/level_0/f_directory/tests/unit/c/test-directory-stream_open.c @@ -0,0 +1,102 @@ +#include "test-directory.h" +#include "test-directory-stream_open.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void test__f_directory_stream_open__fails(void **state) { + + mock_unwrap = 0; + mock_unwrap_f_memory = 1; + + // The "DIR" structure cannot be easily instantiated so just use a real call to PWD. + mock_unwrap = 1; + DIR *directory = opendir(f_directory_current_s.string); + mock_unwrap = 0; + + const f_string_static_t path = macro_f_string_static_t_initialize_1("test", 0, 4); + + int errnos[] = { + EACCES, + EBADF, + EMFILE, + ENFILE, + ENOENT, + ENOMEM, + ENOTDIR, + mock_errno_generic, + }; + + f_status_t statuss[] = { + F_status_set_error(F_access_denied), + F_status_set_error(F_directory_descriptor), + F_status_set_error(F_file_descriptor_max), + F_status_set_error(F_file_open_max), + F_status_set_error(F_directory_found_not), + F_status_set_error(F_memory_not), + F_status_set_error(F_file_type_not_directory), + F_status_set_error(F_failure), + }; + + for (int i = 0; i < 8; ++i) { + + f_directory_stream_t stream = f_directory_stream_t_initialize; + + will_return(__wrap_opendir, true); + will_return(__wrap_opendir, errnos[i]); + + const f_status_t status = f_directory_stream_open(path, &stream); + + assert_int_equal(status, statuss[i]); + } // for + + mock_unwrap = 1; + closedir(directory); +} + +void test__f_directory_stream_open__returns_data_not(void **state) { + + mock_unwrap = 0; + mock_unwrap_f_memory = 1; + + { + f_directory_stream_t stream = f_directory_stream_t_initialize; + + const f_status_t status = f_directory_stream_open(f_string_empty_s, &stream); + + assert_int_equal(status, F_data_not); + } +} + +void test__f_directory_stream_open__works(void **state) { + + mock_unwrap = 0; + mock_unwrap_f_memory = 1; + + // The "DIR" structure cannot be easily instantiated so just use a real call to PWD. + mock_unwrap = 1; + DIR *directory = opendir(f_directory_current_s.string); + mock_unwrap = 0; + + const f_string_static_t path = macro_f_string_static_t_initialize_1("test", 0, 4); + + { + f_directory_stream_t stream = f_directory_stream_t_initialize; + + will_return(__wrap_opendir, false); + will_return(__wrap_opendir, directory); + + const f_status_t status = f_directory_stream_open(path, &stream); + + assert_int_equal(status, F_okay); + assert_int_equal(stream, directory); + } + + mock_unwrap = 1; + closedir(directory); +} + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/level_0/f_directory/tests/unit/c/test-directory-stream_open.h b/level_0/f_directory/tests/unit/c/test-directory-stream_open.h new file mode 100644 index 0000000..cbc93d8 --- /dev/null +++ b/level_0/f_directory/tests/unit/c/test-directory-stream_open.h @@ -0,0 +1,34 @@ +/** + * FLL - Level 0 + * + * Project: Directory + * API Version: 0.7 + * Licenses: lgpl-2.1-or-later + * + * Test the directory project. + */ +#ifndef _TEST__F_directory_stream_open_h +#define _TEST__F_directory_stream_open_h + +/** + * Test that function fails. + * + * @see f_directory_stream_open() + */ +extern void test__f_directory_stream_open__fails(void **state); + +/** + * Test that function works but the path is empty. + * + * @see f_directory_stream_open() + */ +extern void test__f_directory_stream_open__returns_data_not(void **state); + +/** + * Test that function works. + * + * @see f_directory_stream_open() + */ +extern void test__f_directory_stream_open__works(void **state); + +#endif // _TEST__F_directory_stream_open_h diff --git a/level_0/f_directory/tests/unit/c/test-directory-stream_open_id.c b/level_0/f_directory/tests/unit/c/test-directory-stream_open_id.c new file mode 100644 index 0000000..0b6fd4f --- /dev/null +++ b/level_0/f_directory/tests/unit/c/test-directory-stream_open_id.c @@ -0,0 +1,84 @@ +#include "test-directory.h" +#include "test-directory-stream_open_id.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void test__f_directory_stream_open_id__fails(void **state) { + + mock_unwrap = 0; + mock_unwrap_f_memory = 1; + + // The "DIR" structure cannot be easily instantiated so just use a real call to PWD. + mock_unwrap = 1; + DIR *directory = opendir(f_directory_current_s.string); + mock_unwrap = 0; + + int errnos[] = { + EACCES, + EBADF, + EMFILE, + ENFILE, + ENOENT, + ENOMEM, + ENOTDIR, + mock_errno_generic, + }; + + f_status_t statuss[] = { + F_status_set_error(F_access_denied), + F_status_set_error(F_directory_descriptor), + F_status_set_error(F_file_descriptor_max), + F_status_set_error(F_file_open_max), + F_status_set_error(F_directory_found_not), + F_status_set_error(F_memory_not), + F_status_set_error(F_file_type_not_directory), + F_status_set_error(F_failure), + }; + + for (int i = 0; i < 8; ++i) { + + f_directory_stream_t stream = f_directory_stream_t_initialize; + + will_return(__wrap_fdopendir, true); + will_return(__wrap_fdopendir, errnos[i]); + + const f_status_t status = f_directory_stream_open_id(1, &stream); + + assert_int_equal(status, statuss[i]); + } // for + + mock_unwrap = 1; + closedir(directory); +} + +void test__f_directory_stream_open_id__works(void **state) { + + mock_unwrap = 0; + mock_unwrap_f_memory = 1; + + // The "DIR" structure cannot be easily instantiated so just use a real call to PWD. + mock_unwrap = 1; + DIR *directory = opendir(f_directory_current_s.string); + mock_unwrap = 0; + + { + f_directory_stream_t stream = f_directory_stream_t_initialize; + + will_return(__wrap_fdopendir, false); + will_return(__wrap_fdopendir, directory); + + const f_status_t status = f_directory_stream_open_id(1, &stream); + + assert_int_equal(status, F_okay); + assert_int_equal(stream, directory); + } + + mock_unwrap = 1; + closedir(directory); +} + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/level_0/f_directory/tests/unit/c/test-directory-stream_open_id.h b/level_0/f_directory/tests/unit/c/test-directory-stream_open_id.h new file mode 100644 index 0000000..0c158db --- /dev/null +++ b/level_0/f_directory/tests/unit/c/test-directory-stream_open_id.h @@ -0,0 +1,27 @@ +/** + * FLL - Level 0 + * + * Project: Directory + * API Version: 0.7 + * Licenses: lgpl-2.1-or-later + * + * Test the directory project. + */ +#ifndef _TEST__F_directory_stream_open_id_h +#define _TEST__F_directory_stream_open_id_h + +/** + * Test that function fails. + * + * @see f_directory_stream_open_id() + */ +extern void test__f_directory_stream_open_id__fails(void **state); + +/** + * Test that function works. + * + * @see f_directory_stream_open_id() + */ +extern void test__f_directory_stream_open_id__works(void **state); + +#endif // _TEST__F_directory_stream_open_id_h diff --git a/level_0/f_directory/tests/unit/c/test-directory-stream_read.c b/level_0/f_directory/tests/unit/c/test-directory-stream_read.c new file mode 100644 index 0000000..b9c6ea8 --- /dev/null +++ b/level_0/f_directory/tests/unit/c/test-directory-stream_read.c @@ -0,0 +1,76 @@ +#include "test-directory.h" +#include "test-directory-stream_read.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void test__f_directory_stream_read__fails(void **state) { + + mock_unwrap = 0; + mock_unwrap_f_memory = 1; + + // The "DIR" structure cannot be easily instantiated so just use a real call to PWD. + mock_unwrap = 1; + DIR *directory = opendir(f_directory_current_s.string); + mock_unwrap = 0; + + int errnos[] = { + EBADF, + mock_errno_generic, + }; + + f_status_t statuss[] = { + F_status_set_error(F_directory_descriptor), + F_status_set_error(F_failure), + }; + + for (int i = 0; i < 2; ++i) { + + f_directory_entity_t entity; + + will_return(__wrap_readdir, true); + will_return(__wrap_readdir, errnos[i]); + + const f_status_t status = f_directory_stream_read(directory, &entity); + + assert_int_equal(status, statuss[i]); + } // for + + mock_unwrap = 1; + closedir(directory); +} + +void test__f_directory_stream_read__works(void **state) { + + mock_unwrap = 0; + mock_unwrap_f_memory = 1; + + // The "DIR" structure cannot be easily instantiated so just use a real call to PWD. + mock_unwrap = 1; + DIR *directory = opendir(f_directory_current_s.string); + mock_unwrap = 0; + + f_directory_entity_t mocked; + + memset(&mocked, 1, sizeof(struct dirent)); + + { + f_directory_entity_t entity; + + will_return(__wrap_readdir, false); + will_return(__wrap_readdir, &mocked); + + const f_status_t status = f_directory_stream_read(directory, &entity); + + assert_int_equal(status, F_okay); + assert_memory_equal(&entity, &mocked, sizeof(f_directory_entity_t)); + } + + mock_unwrap = 1; + closedir(directory); +} + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/level_0/f_directory/tests/unit/c/test-directory-stream_read.h b/level_0/f_directory/tests/unit/c/test-directory-stream_read.h new file mode 100644 index 0000000..8d005c5 --- /dev/null +++ b/level_0/f_directory/tests/unit/c/test-directory-stream_read.h @@ -0,0 +1,27 @@ +/** + * FLL - Level 0 + * + * Project: Directory + * API Version: 0.7 + * Licenses: lgpl-2.1-or-later + * + * Test the directory project. + */ +#ifndef _TEST__F_directory_stream_read_h +#define _TEST__F_directory_stream_read_h + +/** + * Test that function fails. + * + * @see f_directory_stream_read() + */ +extern void test__f_directory_stream_read__fails(void **state); + +/** + * Test that function works. + * + * @see f_directory_stream_read() + */ +extern void test__f_directory_stream_read__works(void **state); + +#endif // _TEST__F_directory_stream_read_h diff --git a/level_0/f_directory/tests/unit/c/test-directory-stream_rewind.c b/level_0/f_directory/tests/unit/c/test-directory-stream_rewind.c new file mode 100644 index 0000000..77e2469 --- /dev/null +++ b/level_0/f_directory/tests/unit/c/test-directory-stream_rewind.c @@ -0,0 +1,30 @@ +#include "test-directory.h" +#include "test-directory-stream_rewind.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void test__f_directory_stream_rewind__works(void **state) { + + mock_unwrap = 0; + mock_unwrap_f_memory = 1; + + // The "DIR" structure cannot be easily instantiated so just use a real call to PWD. + mock_unwrap = 1; + DIR *directory = opendir(f_directory_current_s.string); + mock_unwrap = 0; + + { + const f_status_t status = f_directory_stream_rewind(directory); + + assert_int_equal(status, F_okay); + } + + mock_unwrap = 1; + closedir(directory); +} + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/level_0/f_directory/tests/unit/c/test-directory-stream_rewind.h b/level_0/f_directory/tests/unit/c/test-directory-stream_rewind.h new file mode 100644 index 0000000..f17d69e --- /dev/null +++ b/level_0/f_directory/tests/unit/c/test-directory-stream_rewind.h @@ -0,0 +1,20 @@ +/** + * FLL - Level 0 + * + * Project: Directory + * API Version: 0.7 + * Licenses: lgpl-2.1-or-later + * + * Test the directory project. + */ +#ifndef _TEST__F_directory_stream_rewind_h +#define _TEST__F_directory_stream_rewind_h + +/** + * Test that function works. + * + * @see f_directory_stream_rewind() + */ +extern void test__f_directory_stream_rewind__works(void **state); + +#endif // _TEST__F_directory_stream_rewind_h diff --git a/level_0/f_directory/tests/unit/c/test-directory-stream_seek.c b/level_0/f_directory/tests/unit/c/test-directory-stream_seek.c new file mode 100644 index 0000000..a4dbd20 --- /dev/null +++ b/level_0/f_directory/tests/unit/c/test-directory-stream_seek.c @@ -0,0 +1,30 @@ +#include "test-directory.h" +#include "test-directory-stream_seek.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void test__f_directory_stream_seek__works(void **state) { + + mock_unwrap = 0; + mock_unwrap_f_memory = 1; + + // The "DIR" structure cannot be easily instantiated so just use a real call to PWD. + mock_unwrap = 1; + DIR *directory = opendir(f_directory_current_s.string); + mock_unwrap = 0; + + { + const f_status_t status = f_directory_stream_seek(directory, 1); + + assert_int_equal(status, F_okay); + } + + mock_unwrap = 1; + closedir(directory); +} + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/level_0/f_directory/tests/unit/c/test-directory-stream_seek.h b/level_0/f_directory/tests/unit/c/test-directory-stream_seek.h new file mode 100644 index 0000000..6968c38 --- /dev/null +++ b/level_0/f_directory/tests/unit/c/test-directory-stream_seek.h @@ -0,0 +1,20 @@ +/** + * FLL - Level 0 + * + * Project: Directory + * API Version: 0.7 + * Licenses: lgpl-2.1-or-later + * + * Test the directory project. + */ +#ifndef _TEST__F_directory_stream_seek_h +#define _TEST__F_directory_stream_seek_h + +/** + * Test that function works. + * + * @see f_directory_stream_seek() + */ +extern void test__f_directory_stream_seek__works(void **state); + +#endif // _TEST__F_directory_stream_seek_h diff --git a/level_0/f_directory/tests/unit/c/test-directory-stream_tell.c b/level_0/f_directory/tests/unit/c/test-directory-stream_tell.c new file mode 100644 index 0000000..0981622 --- /dev/null +++ b/level_0/f_directory/tests/unit/c/test-directory-stream_tell.c @@ -0,0 +1,72 @@ +#include "test-directory.h" +#include "test-directory-stream_tell.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void test__f_directory_stream_tell__fails(void **state) { + + mock_unwrap = 0; + mock_unwrap_f_memory = 1; + + // The "DIR" structure cannot be easily instantiated so just use a real call to PWD. + mock_unwrap = 1; + DIR *directory = opendir(f_directory_current_s.string); + mock_unwrap = 0; + + int errnos[] = { + EBADF, + mock_errno_generic, + }; + + f_status_t statuss[] = { + F_status_set_error(F_directory_descriptor), + F_status_set_error(F_failure), + }; + + for (int i = 0; i < 2; ++i) { + + long id = 0; + + will_return(__wrap_telldir, true); + will_return(__wrap_telldir, errnos[i]); + + const f_status_t status = f_directory_stream_tell(directory, &id); + + assert_int_equal(status, statuss[i]); + } // for + + mock_unwrap = 1; + closedir(directory); +} + +void test__f_directory_stream_tell__works(void **state) { + + mock_unwrap = 0; + mock_unwrap_f_memory = 1; + + // The "DIR" structure cannot be easily instantiated so just use a real call to PWD. + mock_unwrap = 1; + DIR *directory = opendir(f_directory_current_s.string); + mock_unwrap = 0; + + { + long id = 0; + + will_return(__wrap_telldir, false); + will_return(__wrap_telldir, 1); + + const f_status_t status = f_directory_stream_tell(directory, &id); + + assert_int_equal(status, F_okay); + assert_int_equal(id, 1); + } + + mock_unwrap = 1; + closedir(directory); +} + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/level_0/f_directory/tests/unit/c/test-directory-stream_tell.h b/level_0/f_directory/tests/unit/c/test-directory-stream_tell.h new file mode 100644 index 0000000..9c89102 --- /dev/null +++ b/level_0/f_directory/tests/unit/c/test-directory-stream_tell.h @@ -0,0 +1,27 @@ +/** + * FLL - Level 0 + * + * Project: Directory + * API Version: 0.7 + * Licenses: lgpl-2.1-or-later + * + * Test the directory project. + */ +#ifndef _TEST__F_directory_stream_tell_h +#define _TEST__F_directory_stream_tell_h + +/** + * Test that function fails. + * + * @see f_directory_stream_tell() + */ +extern void test__f_directory_stream_tell__fails(void **state); + +/** + * Test that function works. + * + * @see f_directory_stream_tell() + */ +extern void test__f_directory_stream_tell__works(void **state); + +#endif // _TEST__F_directory_stream_tell_h diff --git a/level_0/f_directory/tests/unit/c/test-directory.c b/level_0/f_directory/tests/unit/c/test-directory.c index ca0d8b7..266d9c0 100644 --- a/level_0/f_directory/tests/unit/c/test-directory.c +++ b/level_0/f_directory/tests/unit/c/test-directory.c @@ -103,6 +103,25 @@ int main(void) { cmocka_unit_test(test__f_directory_statusss_delete_callback__works), cmocka_unit_test(test__f_directory_statusss_destroy_callback__works), + cmocka_unit_test(test__f_directory_stream_close__fails), + cmocka_unit_test(test__f_directory_stream_close__works), + + cmocka_unit_test(test__f_directory_stream_open__fails), + cmocka_unit_test(test__f_directory_stream_open__works), + + cmocka_unit_test(test__f_directory_stream_open_id__fails), + cmocka_unit_test(test__f_directory_stream_open_id__works), + + cmocka_unit_test(test__f_directory_stream_read__fails), + cmocka_unit_test(test__f_directory_stream_read__works), + + cmocka_unit_test(test__f_directory_stream_rewind__works), + + cmocka_unit_test(test__f_directory_stream_seek__works), + + cmocka_unit_test(test__f_directory_stream_tell__fails), + cmocka_unit_test(test__f_directory_stream_tell__works), + cmocka_unit_test(test__f_directory_touch__fails), cmocka_unit_test(test__f_directory_touch__returns_data_not), cmocka_unit_test(test__f_directory_touch__works), diff --git a/level_0/f_directory/tests/unit/c/test-directory.h b/level_0/f_directory/tests/unit/c/test-directory.h index c433dba..47f9527 100644 --- a/level_0/f_directory/tests/unit/c/test-directory.h +++ b/level_0/f_directory/tests/unit/c/test-directory.h @@ -50,6 +50,13 @@ #include "test-directory-statuss_destroy_callback.h" #include "test-directory-statusss_delete_callback.h" #include "test-directory-statusss_destroy_callback.h" +#include "test-directory-stream_close.h" +#include "test-directory-stream_open.h" +#include "test-directory-stream_open_id.h" +#include "test-directory-stream_read.h" +#include "test-directory-stream_rewind.h" +#include "test-directory-stream_seek.h" +#include "test-directory-stream_tell.h" #include "test-directory-touch.h" #include "test-directory-touch_at.h" diff --git a/level_1/fl_directory/c/directory.c b/level_1/fl_directory/c/directory.c index 5e319b2..ddf2080 100644 --- a/level_1/fl_directory/c/directory.c +++ b/level_1/fl_directory/c/directory.c @@ -65,7 +65,7 @@ extern "C" { if (!recurse->action) { recurse->state.status = F_status_set_error(F_parameter); - private_inline_fl_directory_do_handle(recurse, path, f_directory_recurse_do_flag_top_e); + private_inline_fl_directory_do_handle(recurse, path, 0); if (F_status_is_error(recurse->state.status)) return; if (recurse->state.status == F_done) { @@ -76,39 +76,31 @@ extern "C" { } #endif // _di_level_1_parameter_checking_ - if (!path.used) { - recurse->state.status = F_data_not; - - private_inline_fl_directory_do_handle(recurse, path, f_directory_recurse_do_flag_path_e | f_directory_recurse_do_flag_top_e); - if (F_status_is_error(recurse->state.status)) return; - - if (recurse->state.status == F_done) { - recurse->state.status = F_okay; - - return; - } - } + if (path.used) { + recurse->state.status = f_string_dynamic_append_nulless(path, &recurse->path); - recurse->state.status = f_string_dynamic_append_nulless(path, &recurse->path); + if (F_status_is_error_not(recurse->state.status)) { - if (F_status_is_error_not(recurse->state.status)) { - - // Do not allow trailing path separators in the string's length calculation, except root directory '/'. - for (; recurse->path.used; --recurse->path.used) { - if (recurse->path.string[recurse->path.used - 1] != f_path_separator_s.string[0]) break; - } // for + // Do not allow trailing path separators in the string's length calculation, except root directory '/'. + for (; recurse->path.used; --recurse->path.used) { + if (recurse->path.string[recurse->path.used - 1] != f_path_separator_s.string[0]) break; + } // for - recurse->path.string[recurse->path.used] = 0; + recurse->path.string[recurse->path.used] = 0; - recurse->state.status = f_directory_exists(path); + recurse->state.status = f_directory_exists(path); - if (recurse->state.status == F_false) { - recurse->state.status = F_status_set_error(F_directory_not); + if (recurse->state.status == F_false) { + recurse->state.status = F_status_set_error(F_directory_not); + } } } + else { + recurse->state.status = F_data_not; + } - if (F_status_is_error(recurse->state.status)) { - private_inline_fl_directory_do_handle(recurse, path, f_directory_recurse_do_flag_path_e | f_directory_recurse_do_flag_top_e); + if (!path.used || F_status_is_error(recurse->state.status)) { + private_inline_fl_directory_do_handle(recurse, path, f_directory_recurse_do_flag_path_d); if (F_status_is_error(recurse->state.status)) return; if (recurse->state.status == F_done) { @@ -116,28 +108,11 @@ extern "C" { return; } - } - - if (recurse->flag & f_directory_recurse_do_flag_top_before_e) { - recurse->state.status = F_okay; - - recurse->action(recurse, path, f_directory_recurse_do_flag_top_before_e | f_directory_recurse_do_flag_directory_e); - - if (F_status_is_error(recurse->state.status)) { - private_inline_fl_directory_do_handle(recurse, path, f_directory_recurse_do_flag_top_before_e | f_directory_recurse_do_flag_directory_e); - if (F_status_is_error(recurse->state.status)) return; - } - if (recurse->state.status == F_done) { - recurse->state.status = F_okay; - - return; - } + if (!path.used) return; } - if (recurse->depth_max) { - recurse->depth = 1; - + if (recurse->depth < recurse->depth_max) { private_fl_directory_do_recurse(recurse); if (F_status_is_error(recurse->state.status)) return; @@ -148,70 +123,35 @@ extern "C" { } } else { - recurse->state.status = F_okay; + const uint32_t flag_actions[] = { + recurse->flag & f_directory_recurse_do_flag_before_d ? f_directory_recurse_do_flag_before_d : 0, + f_directory_recurse_do_flag_action_d, + recurse->flag & f_directory_recurse_do_flag_after_d ? f_directory_recurse_do_flag_after_d : 0, + }; - recurse->listing.block.used = 0; - recurse->listing.character.used = 0; - recurse->listing.directory.used = 0; - recurse->listing.regular.used = 0; - recurse->listing.link.used = 0; - recurse->listing.fifo.used = 0; - recurse->listing.socket.used = 0; - recurse->listing.unknown.used = 0; + uint8_t action = 0; - recurse->state.status = private_fl_directory_list(path, 0, 0, recurse->flag & f_directory_recurse_do_flag_dereference_e, &recurse->listing); + for (action = 0; action < 3; ++action) { - if (F_status_is_error(recurse->state.status)) { - private_inline_fl_directory_do_handle(recurse, path, f_directory_recurse_do_flag_list_e | f_directory_recurse_do_flag_path_e); - if (F_status_is_error(recurse->state.status)) return; - } - - if (recurse->state.status == F_done) { - recurse->state.status = F_okay; - - return; - } - - if (recurse->flag & f_directory_recurse_do_flag_list_e) { - recurse->action(recurse, path, f_directory_recurse_do_flag_directory_e | f_directory_recurse_do_flag_list_e); - - if (F_status_is_error(recurse->state.status)) { - private_inline_fl_directory_do_handle(recurse, path, f_directory_recurse_do_flag_directory_e | f_directory_recurse_do_flag_list_e); - if (F_status_is_error(recurse->state.status)) return; + if (recurse->state.interrupt) { + recurse->state.interrupt((void *) &recurse->state, (void *) recurse); + if (F_status_set_fine(recurse->state.status) == F_interrupt) break; } - if (recurse->state.status == F_done) { + if (flag_actions[action]) { recurse->state.status = F_okay; - return; - } - } - - recurse->state.status = F_okay; - - recurse->action(recurse, path, f_directory_recurse_do_flag_action_e | f_directory_recurse_do_flag_directory_e | f_directory_recurse_do_flag_top_e); - - if (F_status_is_error(recurse->state.status)) { - private_inline_fl_directory_do_handle(recurse, path, f_directory_recurse_do_flag_action_e | f_directory_recurse_do_flag_directory_e | f_directory_recurse_do_flag_top_e); - if (F_status_is_error(recurse->state.status)) return; - } - - if (recurse->state.status == F_done) { - recurse->state.status = F_okay; + recurse->action(recurse, path, flag_actions[action] | recurse->flag); - return; - } - } - - if (recurse->flag & f_directory_recurse_do_flag_top_after_e) { - recurse->state.status = F_okay; - - recurse->action(recurse, path, f_directory_recurse_do_flag_action_e | f_directory_recurse_do_flag_directory_e | f_directory_recurse_do_flag_top_after_e); + if (F_status_is_error(recurse->state.status)) { + private_inline_fl_directory_do_handle(recurse, path, flag_actions[action] | recurse->flag); + if (F_status_is_error(recurse->state.status)) break; + } - if (F_status_is_error(recurse->state.status)) { - private_inline_fl_directory_do_handle(recurse, path, f_directory_recurse_do_flag_action_e | f_directory_recurse_do_flag_directory_e | f_directory_recurse_do_flag_top_after_e); - if (F_status_is_error(recurse->state.status)) return; - } + // There is nothing to continue onto, so all of these result in a break out of the loop. + if (recurse->state.status == F_break || recurse->state.status == F_done || recurse->state.status == F_continue || F_status_set_fine(recurse->state.status) == F_interrupt) break; + } + } // for } recurse->state.status = F_okay; @@ -219,7 +159,7 @@ extern "C" { #endif // _di_fl_directory_do_ #ifndef _di_fl_directory_list_ - f_status_t fl_directory_list(const f_string_static_t path, int (*filter)(const struct dirent *), int (*sort)(const struct dirent **, const struct dirent **), const bool dereference, f_directory_listing_t * const listing) { + f_status_t fl_directory_list(const f_string_static_t path, const f_directory_filter_call_t filter, const f_directory_compare_call_t sort, const bool dereference, f_directory_listing_t * const listing) { #ifndef _di_level_1_parameter_checking_ if (!listing) return F_status_set_error(F_parameter); #endif // _di_level_1_parameter_checking_ @@ -238,8 +178,8 @@ extern "C" { if (!path->used) return F_data_not; - const bool null_terminated = path->string[path->used] == 0; - bool first_nulless = F_false; + // 0x0 = unset, 0x1 = is NULL terminated, 0x2 = first NULLess. + uint8_t code = path->string[path->used] == 0 ? 0x1 : 0x0; f_number_unsigned_t i = path->used - 1; f_number_unsigned_t j = 0; @@ -259,9 +199,9 @@ extern "C" { return status; } - if (first_nulless) { + if (code & 0x2) { if (path->string[i] == f_path_separator_s.string[0]) { - if (null_terminated) { + if (code & 0x1) { path->string[i + 1] = 0; path->used = i + 2; } @@ -273,7 +213,7 @@ extern "C" { } } else { - first_nulless = F_true; + code |= 0x2; for (j = i; j > 0; --j) { if (!path->string[j]) continue; diff --git a/level_1/fl_directory/c/directory.h b/level_1/fl_directory/c/directory.h index ae9497c..55468e2 100644 --- a/level_1/fl_directory/c/directory.h +++ b/level_1/fl_directory/c/directory.h @@ -95,7 +95,7 @@ extern "C" { * * This function is designed and intended to be used on directories. * If depth is 0, the operations callacks are still called but are done at the top level. - * Be sure to use the recurse.path_top when depth is 0 or when f_directory_recurse_do_flag_top_e is set (the recurse.path may have been altered during the recursion). + * Be sure to use the recurse.path_top when depth is 0 or when f_directory_recurse_do_flag_top_d is set (the recurse.path may have been altered during the recursion). * * The action callback must set the error bit on recurse.state.status to ensure that the handle callbacks are called or not set the error bit to prevent this behavior. * @@ -111,47 +111,47 @@ extern "C" { * The caller should consider checking if recurse is NULL. * * General behavior flow: - * 1. Check recurse.action existence (if not _di_level_1_parameter_checking_), calling recurse.handle with (f_directory_recurse_do_flag_top_e) on error. - * 2. Check path.used, call recurse.handle with (f_directory_recurse_do_flag_path_e | f_directory_recurse_do_flag_top_e) on error. - * 3. Prepare recurse.path, call recurse.handle with (f_directory_recurse_do_flag_path_e | f_directory_recurse_do_flag_top_e) on error. + * 1. Check recurse.action existence (if not _di_level_1_parameter_checking_), calling recurse.handle with (f_directory_recurse_do_flag_top_d) on error. + * 2. Check path.used, call recurse.handle with (f_directory_recurse_do_flag_path_d | f_directory_recurse_do_flag_top_d) on error. + * 3. Prepare recurse.path, call recurse.handle with (f_directory_recurse_do_flag_path_d | f_directory_recurse_do_flag_top_d) on error. * 4. If recurse.flag has (f_directory_recurse_do_flag_top_before_e), call recurse.action with (f_directory_recurse_do_flag_top_before_e). * - Call recurse.handle with (f_directory_recurse_do_flag_top_before_e) on error. * * 5. If recurse.depth_max > 0, perform recursion. - * 1. Load directory listing, call recurse.handle with (f_directory_recurse_do_flag_list_e | f_directory_recurse_do_flag_path_e) on error. - * 2. If recurse.flag has (f_directory_recurse_do_flag_list_e), call recurse.action with (f_directory_recurse_do_flag_list_e). - * - Call recurse.handle with (f_directory_recurse_do_flag_list_e) on error. + * 1. Load directory listing, call recurse.handle with (f_directory_recurse_do_flag_list_d | f_directory_recurse_do_flag_path_d) on error. + * 2. If recurse.flag has (f_directory_recurse_do_flag_list_d), call recurse.action with (f_directory_recurse_do_flag_list_d). + * - Call recurse.handle with (f_directory_recurse_do_flag_list_d) on error. * * 3. For each file type, except directory (optionally calling recurse->state.interrupt() at the top of each loop): - * 1. Prepare list array, call recurse.handle with (f_directory_recurse_do_flag_directory_e) on error. - * 2. If recurse.flag has (f_directory_recurse_do_flag_before_e), call recurse.action with (f_directory_recurse_do_flag_before_e | f_directory_recurse_do_flag_*_e, where * represents type). - * - Call recurse.handle with (f_directory_recurse_do_flag_before_e | f_directory_recurse_do_flag_*_e, where * represents type) on error. + * 1. Prepare list array, call recurse.handle with (f_directory_recurse_do_flag_directory_d) on error. + * 2. If recurse.flag has (f_directory_recurse_do_flag_before_d), call recurse.action with (f_directory_recurse_do_flag_before_d | f_directory_recurse_do_flag_*_e, where * represents type). + * - Call recurse.handle with (f_directory_recurse_do_flag_before_d | f_directory_recurse_do_flag_*_e, where * represents type) on error. * - * 3. Call recurse.action with (f_directory_recurse_do_flag_action_e | f_directory_recurse_do_flag_*_e, where * represents type). - * - Call recurse.handle with (f_directory_recurse_do_flag_action_e | f_directory_recurse_do_flag_*_e, where * represents type) on error. + * 3. Call recurse.action with (f_directory_recurse_do_flag_action_d | f_directory_recurse_do_flag_*_e, where * represents type). + * - Call recurse.handle with (f_directory_recurse_do_flag_action_d | f_directory_recurse_do_flag_*_e, where * represents type) on error. * - * 4. If recurse.flag has (f_directory_recurse_do_flag_after_e), call recurse.action with (f_directory_recurse_do_flag_after_e | f_directory_recurse_do_flag_*_e, where * represents type). - * - Call recurse.handle with (f_directory_recurse_do_flag_after_e | f_directory_recurse_do_flag_*_e, where * represents type) on error. + * 4. If recurse.flag has (f_directory_recurse_do_flag_after_d), call recurse.action with (f_directory_recurse_do_flag_after_d | f_directory_recurse_do_flag_*_e, where * represents type). + * - Call recurse.handle with (f_directory_recurse_do_flag_after_d | f_directory_recurse_do_flag_*_e, where * represents type) on error. * * 4. For each directory (optionally calling recurse->state.interrupt() at the top of each loop): - * 1. Prepare list array, call recurse.handle with (f_directory_recurse_do_flag_directory_e) on error. - * 2. Call recurse.action with (f_directory_recurse_do_flag_action_e| f_directory_recurse_do_flag_before_e | f_directory_recurse_do_flag_directory_e). - * - Call recurse.handle with (f_directory_recurse_do_flag_action_e | f_directory_recurse_do_flag_before_e | f_directory_recurse_do_flag_directory_e) on error. + * 1. Prepare list array, call recurse.handle with (f_directory_recurse_do_flag_directory_d) on error. + * 2. Call recurse.action with (f_directory_recurse_do_flag_action_d| f_directory_recurse_do_flag_before_d | f_directory_recurse_do_flag_directory_d). + * - Call recurse.handle with (f_directory_recurse_do_flag_action_d | f_directory_recurse_do_flag_before_d | f_directory_recurse_do_flag_directory_d) on error. * * 3. If depth max is not reached, perform recursion. - * 4. If depth max is reached, call recurse.action with (f_directory_recurse_do_flag_action_e | f_directory_recurse_do_flag_directory_e). - * - Call recurse.handle with (f_directory_recurse_do_flag_action_e | f_directory_recurse_do_flag_directory_e) on error. + * 4. If depth max is reached, call recurse.action with (f_directory_recurse_do_flag_action_d | f_directory_recurse_do_flag_directory_d). + * - Call recurse.handle with (f_directory_recurse_do_flag_action_d | f_directory_recurse_do_flag_directory_d) on error. * - * 5. Call recurse.action with (f_directory_recurse_do_flag_after_e | f_directory_recurse_do_flag_directory_e). - * - Call recurse.handle with (f_directory_recurse_do_flag_after_e | f_directory_recurse_do_flag_directory_e) on error. + * 5. Call recurse.action with (f_directory_recurse_do_flag_after_d | f_directory_recurse_do_flag_directory_d). + * - Call recurse.handle with (f_directory_recurse_do_flag_after_d | f_directory_recurse_do_flag_directory_d) on error. * - * 6. Else if recurse.depth_max == 0, process directory, call recurse.handle with (f_directory_recurse_do_flag_top_e | f_directory_recurse_do_flag_directory_e) on error. - * 1. Load directory listing, call recurse.handle with (f_directory_recurse_do_flag_list_e | f_directory_recurse_do_flag_path_e) on error. - * 2. If recurse.flag has (f_directory_recurse_do_flag_list_e), call recurse.action with (f_directory_recurse_do_flag_list_e). - * - Call recurse.handle with (f_directory_recurse_do_flag_list_e) on error. + * 6. Else if recurse.depth_max == 0, process directory, call recurse.handle with (f_directory_recurse_do_flag_top_d | f_directory_recurse_do_flag_directory_d) on error. + * 1. Load directory listing, call recurse.handle with (f_directory_recurse_do_flag_list_d | f_directory_recurse_do_flag_path_d) on error. + * 2. If recurse.flag has (f_directory_recurse_do_flag_list_d), call recurse.action with (f_directory_recurse_do_flag_list_d). + * - Call recurse.handle with (f_directory_recurse_do_flag_list_d) on error. * - * 3. Call recurse.action with (f_directory_recurse_do_flag_action_e | f_directory_recurse_do_flag_directory_e | f_directory_recurse_do_flag_top_e). - * - Call recurse.handle with (f_directory_recurse_do_flag_action_e | f_directory_recurse_do_flag_directory_e | f_directory_recurse_do_flag_top_e) on error. + * 3. Call recurse.action with (f_directory_recurse_do_flag_action_d | f_directory_recurse_do_flag_directory_d | f_directory_recurse_do_flag_top_d). + * - Call recurse.handle with (f_directory_recurse_do_flag_action_d | f_directory_recurse_do_flag_directory_d | f_directory_recurse_do_flag_top_d) on error. * * 7. If recurse.flag has (f_directory_recurse_do_flag_top_after_e), call recurse.action with (f_directory_recurse_do_flag_top_after_e). * - Call recurse.handle with (f_directory_recurse_do_flag_top_after_e) on error. @@ -227,12 +227,14 @@ extern "C" { * @param path * Filesystem path to the directory. * @param filter - * A filter function of the form: int xxx(const struct direct *). - * Set to 0 to not use (NULL). + * (optional) A filter function. + * + * Set to NULL to disable. * @param sort - * A sort function of the form: int xxx(const struct direct *, const struct direct *). - * Set to 0 to not use (NULL). + * (optional) A sort function. * There are two pre-made libc functions available for this: alphasort() and versionsort(). + * + * Set to NULL to disable. * @param dereference * Set to TRUE to dereference symlinks (often is what is desired). * Set to FALSE to operate on the symlink itself. @@ -269,7 +271,7 @@ extern "C" { * @see f_memory_array_increase_by() */ #ifndef _di_fl_directory_list_ - extern f_status_t fl_directory_list(const f_string_static_t path, int (*filter)(const struct dirent *), int (*sort)(const struct dirent **, const struct dirent **), const bool dereference, f_directory_listing_t * const listing); + extern f_status_t fl_directory_list(const f_string_static_t path, const f_directory_filter_call_t filter, const f_directory_compare_call_t sort, const bool dereference, f_directory_listing_t * const listing); #endif // _di_fl_directory_list_ /** diff --git a/level_1/fl_directory/c/private-directory.c b/level_1/fl_directory/c/private-directory.c index 9b22654..370d21e 100644 --- a/level_1/fl_directory/c/private-directory.c +++ b/level_1/fl_directory/c/private-directory.c @@ -8,191 +8,125 @@ extern "C" { #if !defined(_di_fl_directory_do_) void private_fl_directory_do_recurse(f_directory_recurse_do_t * const recurse) { - f_string_dynamics_t directories_original = f_string_dynamics_t_initialize; + const uint32_t flag_actions[] = { + recurse->flag & f_directory_recurse_do_flag_before_d ? f_directory_recurse_do_flag_before_d : 0, + f_directory_recurse_do_flag_action_d, + recurse->flag & f_directory_recurse_do_flag_after_d ? f_directory_recurse_do_flag_after_d : 0, + }; - directories_original.array = recurse->listing.directory.array; - directories_original.used = recurse->listing.directory.used; - directories_original.size = recurse->listing.directory.size; + const f_number_unsigned_t used_original = recurse->path.used; - recurse->listing.directory.array = 0; - recurse->listing.directory.used = 0; - recurse->listing.directory.size = 0; + f_directory_stream_t stream = f_directory_stream_t_initialize; + f_directory_entity_t entity = f_directory_entity_t_initialize; + f_string_static_t name = f_string_static_t_initialize; - // Use a clean set for each recursion. - recurse->listing.block.used = 0; - recurse->listing.character.used = 0; - recurse->listing.regular.used = 0; - recurse->listing.link.used = 0; - recurse->listing.fifo.used = 0; - recurse->listing.socket.used = 0; - recurse->listing.unknown.used = 0; + uint32_t flag = 0; + uint8_t action = 0; + f_number_unsigned_t used_directory = 0; - recurse->state.status = private_fl_directory_list(recurse->path, 0, 0, recurse->flag & f_directory_recurse_do_flag_dereference_e, &recurse->listing); + recurse->state.status = f_directory_stream_open(recurse->path, &stream); if (F_status_is_error(recurse->state.status)) { - private_inline_fl_directory_do_handle(recurse, recurse->path, f_directory_recurse_do_flag_list_e | f_directory_recurse_do_flag_path_e); + private_inline_fl_directory_do_handle(recurse, recurse->path, f_directory_recurse_do_flag_path_list_d); + if (F_status_is_error(recurse->state.status)) return; - // Only the directory is to be freed because all others are preserved between recursions. - if (F_status_is_error(recurse->state.status)) { - f_memory_arrays_resize(0, sizeof(f_string_dynamic_t), (void **) &recurse->listing.directory.array, &recurse->listing.directory.used, &recurse->listing.directory.size, &f_string_dynamics_delete_callback); - - recurse->listing.directory.array = directories_original.array; - recurse->listing.directory.used = directories_original.used; - recurse->listing.directory.size = directories_original.size; - - return; + if (recurse->state.status != F_done) { + recurse->state.status = F_okay; } } - recurse->state.status = F_okay; + for (;;) { + if (recurse->state.interrupt) { + recurse->state.interrupt((void *) &recurse->state, (void *) recurse); + if (F_status_set_fine(recurse->state.status) == F_interrupt) break; + } - if (recurse->flag & f_directory_recurse_do_flag_list_e) { - recurse->action(recurse, recurse->path, f_directory_recurse_do_flag_list_e); + recurse->state.status = f_directory_stream_read(stream, &entity); + if (recurse->state.status == F_okay_eos) break; if (F_status_is_error(recurse->state.status)) { - private_inline_fl_directory_do_handle(recurse, recurse->path, f_directory_recurse_do_flag_list_e); + private_inline_fl_directory_do_handle(recurse, recurse->path, f_directory_recurse_do_flag_action_d | f_directory_recurse_do_flag_path_list_d); if (F_status_is_error(recurse->state.status)) return; - } - if (recurse->state.status != F_done) { - recurse->state.status = F_okay; + if (recurse->state.status != F_done) { + recurse->state.status = F_okay; + } } - } - - f_number_unsigned_t i = 0; - uint8_t j = 0; - const f_number_unsigned_t used_original = recurse->path.used; - f_number_unsigned_t used_directory = 0; - - static const uint32_t flag_actions[] = { - f_directory_recurse_do_flag_before_e, - f_directory_recurse_do_flag_action_e, - f_directory_recurse_do_flag_after_e, - }; - - static const uint32_t flags[] = { - f_directory_recurse_do_flag_block_e, - f_directory_recurse_do_flag_character_e, - f_directory_recurse_do_flag_regular_e, - f_directory_recurse_do_flag_link_e, - f_directory_recurse_do_flag_fifo_e, - f_directory_recurse_do_flag_socket_e, - f_directory_recurse_do_flag_unknown_e, - }; - - if (recurse->state.status != F_done) { - f_string_dynamics_t * const list[] = { - &recurse->listing.block, - &recurse->listing.character, - &recurse->listing.regular, - &recurse->listing.link, - &recurse->listing.fifo, - &recurse->listing.socket, - &recurse->listing.unknown, - }; - - for (uint8_t k = 0; k < 7; ++k) { - - for (i = 0; i < list[k]->used; ++i) { - - if (recurse->state.interrupt) { - recurse->state.interrupt((void *) &recurse->state, (void *) recurse); - if (F_status_set_fine(recurse->state.status) == F_interrupt) break; - } - recurse->path.used = used_original; + // Never process the '.' and '..' paths. + if (!strncmp(f_directory_current_s.string, entity.d_name, f_directory_current_s.used + 1) || !strncmp(f_directory_back_s.string, entity.d_name, f_directory_back_s.used + 1)) continue; - recurse->state.status = f_memory_array_increase_by(f_path_separator_s.used + list[k]->array[i].used + 1, sizeof(f_char_t), (void **) &recurse->path.string, &recurse->path.used, &recurse->path.size); - - if (F_status_is_error_not(recurse->state.status)) { - recurse->state.status = f_string_dynamic_append_assure(f_path_separator_s, &recurse->path); - } - - if (F_status_is_error_not(recurse->state.status)) { - recurse->state.status = f_string_dynamic_append_nulless(list[k]->array[i], &recurse->path); - } + if (entity.d_type == DT_FIFO) { + flag = f_directory_recurse_do_flag_fifo_d; + } + else if (entity.d_type == DT_CHR) { + flag = f_directory_recurse_do_flag_character_d; + } + else if (entity.d_type == DT_DIR) { + flag = f_directory_recurse_do_flag_directory_d; + } + else if (entity.d_type == DT_BLK) { + flag = f_directory_recurse_do_flag_block_d; + } + else if (entity.d_type == DT_REG) { + flag = f_directory_recurse_do_flag_regular_d; + } + else if (entity.d_type == DT_LNK) { + flag = f_directory_recurse_do_flag_link_d; + } + else if (entity.d_type == DT_SOCK) { + flag = f_directory_recurse_do_flag_socket_d; + } - // Guarantee NULL termination. - recurse->path.string[recurse->path.used] = 0; + // The DT_WHT may not be defined everywhere. + #ifdef DT_WHT + else if (entity.d_type == DT_WHT) { + flag = f_directory_recurse_do_flag_white_out_d; + } + #endif // DT_WHT - if (F_status_is_error(recurse->state.status)) { - private_inline_fl_directory_do_handle(recurse, list[k]->array[i], f_directory_recurse_do_flag_directory_e); + else { + flag = f_directory_recurse_do_flag_unknown_d; + } - if (F_status_is_error(recurse->state.status)) break; - if (recurse->state.status == F_break || recurse->state.status == F_done) break; - if (recurse->state.status == F_continue) continue; - } + recurse->path.used = used_original; - // Convenience and code simplification loop for processing before action, action, and after action. - for (j = 0; j < 3; ++j) { + name.string = entity.d_name; + name.used = strnlen(entity.d_name, F_directory_max_string_d); - if (flag_actions[j] & f_directory_recurse_do_flag_action_e || (recurse->flag & flag_actions[j])) { - recurse->state.status = F_okay; + recurse->state.status = f_memory_array_increase_by(f_path_separator_s.used + name.used + 1, sizeof(f_char_t), (void **) &recurse->path.string, &recurse->path.used, &recurse->path.size); - recurse->action(recurse, list[k]->array[i], flag_actions[j] | flags[k]); + if (F_status_is_error_not(recurse->state.status)) { + recurse->state.status = f_string_dynamic_append_assure(f_path_separator_s, &recurse->path); + } - if (F_status_is_error(recurse->state.status)) { - private_inline_fl_directory_do_handle(recurse, list[k]->array[i], flag_actions[j] | flags[k]); - if (F_status_is_error(recurse->state.status)) break; - } + if (F_status_is_error_not(recurse->state.status)) { + recurse->state.status = f_string_dynamic_append_nulless(name, &recurse->path); + } - // This loop is not considered a loop for breaking and continuing. - if (recurse->state.status == F_break || recurse->state.status == F_done || recurse->state.status == F_continue || F_status_set_fine(recurse->state.status) == F_interrupt) break; - } - } // for + // Guarantee NULL termination. + recurse->path.string[recurse->path.used] = 0; - if (F_status_is_error(recurse->state.status) || recurse->state.status == F_break || recurse->state.status == F_done) break; - if (recurse->state.status == F_continue) continue; - } // for + if (F_status_is_error(recurse->state.status)) { + private_inline_fl_directory_do_handle(recurse, name, f_directory_recurse_do_flag_directory_d); - if (F_status_is_error(recurse->state.status) || recurse->state.status == F_done) break; - } // for - } + if (F_status_is_error(recurse->state.status)) break; + if (recurse->state.status == F_break || recurse->state.status == F_done) break; + if (recurse->state.status == F_continue) continue; + } - if (recurse->state.status != F_done && F_status_is_error_not(recurse->state.status) && F_status_set_fine(recurse->state.status) != F_interrupt) { - for (i = 0; i < recurse->listing.directory.used; ++i) { + for (action = 0; action < 3; ++action) { if (recurse->state.interrupt) { recurse->state.interrupt((void *) &recurse->state, (void *) recurse); if (F_status_set_fine(recurse->state.status) == F_interrupt) break; } - recurse->path.used = used_original; - - recurse->state.status = f_memory_array_increase_by(f_path_separator_s.used + recurse->listing.directory.array[i].used + 1, sizeof(f_char_t), (void **) &recurse->path.string, &recurse->path.used, &recurse->path.size); - - if (F_status_is_error_not(recurse->state.status)) { - recurse->state.status = f_string_dynamic_append_assure(f_path_separator_s, &recurse->path); - } - - if (F_status_is_error_not(recurse->state.status)) { - recurse->state.status = f_string_dynamic_append_nulless(recurse->listing.directory.array[i], &recurse->path); - } - - // Guarantee NULL termination. - recurse->path.string[recurse->path.used] = 0; - used_directory = recurse->path.used; - - if (F_status_is_error_not(recurse->state.status)) { - recurse->state.status = f_directory_exists(recurse->path); - - if (recurse->state.status == F_false) { - recurse->state.status = F_status_set_error(F_directory_not); - } - } - - if (F_status_is_error(recurse->state.status)) { - private_inline_fl_directory_do_handle(recurse, recurse->listing.directory.array[i], f_directory_recurse_do_flag_directory_e); - - if (F_status_is_error(recurse->state.status) || recurse->state.status == F_break || recurse->state.status == F_done) break; - if (recurse->state.status == F_continue) continue; - } - - // Convenience and code simplification loop for processing before action, action, and after action. - for (j = 0; j < 3; ++j) { + if (flag_actions[action]) { + recurse->state.status = F_okay; - if (flag_actions[j] & f_directory_recurse_do_flag_action_e) { - recurse->state.status = F_okay; + if ((flag & f_directory_recurse_do_flag_directory_d) && (flag_actions[action] & f_directory_recurse_do_flag_action_d)) { + used_directory = recurse->path.used; if (recurse->depth < recurse->depth_max) { ++recurse->depth; @@ -202,40 +136,48 @@ extern "C" { --recurse->depth; } + if (F_status_is_error(recurse->state.status)) { + private_inline_fl_directory_do_handle(recurse, name, flag_actions[action] | flag); + if (F_status_is_error(recurse->state.status)) break; + } + // This loop is not considered a loop for breaking and continuing. if (recurse->state.status == F_break || recurse->state.status == F_done || recurse->state.status == F_continue || F_status_set_fine(recurse->state.status) == F_interrupt) break; // Reset the path after operating on child directories. recurse->path.used = used_directory; recurse->path.string[recurse->path.used] = 0; + recurse->state.status = F_okay; - recurse->action(recurse, recurse->listing.directory.array[i], f_directory_recurse_do_flag_action_e | f_directory_recurse_do_flag_directory_e); - - if (F_status_is_error(recurse->state.status)) { - private_inline_fl_directory_do_handle(recurse, recurse->listing.directory.array[i], f_directory_recurse_do_flag_action_e | f_directory_recurse_do_flag_directory_e); - } - - // This loop is not considered a loop for breaking and continuing. - if (recurse->state.status == F_break || recurse->state.status == F_done || recurse->state.status == F_continue || F_status_set_fine(recurse->state.status) == F_interrupt) break; + recurse->action(recurse, name, f_directory_recurse_do_flag_action_d | flag); } else { - if (recurse->flag & flag_actions[j]) { - recurse->action(recurse, recurse->listing.directory.array[i], flag_actions[j] | f_directory_recurse_do_flag_directory_e); + recurse->action(recurse, name, flag_actions[action] | flag); + } - if (F_status_is_error(recurse->state.status)) { - private_inline_fl_directory_do_handle(recurse, recurse->listing.directory.array[i], flag_actions[j] | f_directory_recurse_do_flag_directory_e); - } - } + if (F_status_is_error(recurse->state.status)) { + private_inline_fl_directory_do_handle(recurse, name, flag_actions[action] | flag); + if (F_status_is_error(recurse->state.status)) break; } - if (F_status_is_error(recurse->state.status) || recurse->state.status == F_break || recurse->state.status == F_done || F_status_set_fine(recurse->state.status) == F_interrupt) break; - if (recurse->state.status == F_continue) continue; - } // for + // This loop is not considered a loop for breaking and continuing. + if (recurse->state.status == F_break || recurse->state.status == F_done || recurse->state.status == F_continue || F_status_set_fine(recurse->state.status) == F_interrupt) break; + } + } // for + + if (F_status_is_error(recurse->state.status) || recurse->state.status == F_break || recurse->state.status == F_done) break; + if (recurse->state.status == F_continue) continue; + } // for - if (F_status_is_error(recurse->state.status) || recurse->state.status == F_done) break; + recurse->state.status = f_directory_stream_close(stream); + if (F_status_is_error(recurse->state.status)) { + private_inline_fl_directory_do_handle(recurse, recurse->path, f_directory_recurse_do_flag_clean_d | f_directory_recurse_do_flag_path_list_d); + if (F_status_is_error(recurse->state.status)) return; + + if (recurse->state.status != F_done) { recurse->state.status = F_okay; - } // for + } } recurse->path.used = used_original; @@ -243,24 +185,15 @@ extern "C" { if (recurse->path.used < recurse->path.size) { recurse->path.string[recurse->path.used] = 0; } - - // Only the directory is to be freed because all others are preserved between recursions. - f_memory_arrays_resize(0, sizeof(f_string_dynamic_t), (void **) &recurse->listing.directory.array, &recurse->listing.directory.used, &recurse->listing.directory.size, &f_string_dynamics_delete_callback); - - recurse->listing.directory.array = directories_original.array; - recurse->listing.directory.used = directories_original.used; - recurse->listing.directory.size = directories_original.size; } #endif // !defined(_di_fl_directory_do_) #if !defined(_di_fl_directory_do_) || !defined(_di_fl_directory_list_) - f_status_t private_fl_directory_list(const f_string_static_t path, int (*filter)(const struct dirent *), int (*sort)(const struct dirent **, const struct dirent **), const bool dereference, f_directory_listing_t * const listing) { - - struct dirent **entity = 0; + f_status_t private_fl_directory_list(const f_string_static_t path, f_directory_filter_call_t filter, f_directory_compare_call_t sort, const bool dereference, f_directory_listing_t * const listing) { - f_status_t status = F_okay; + f_directory_entity_t **entity = 0; - DIR *parent = opendir(path.string); + const f_directory_stream_t parent = opendir(path.string); if (!parent) { if (errno == ENOMEM) return F_status_set_error(F_memory_not); @@ -276,10 +209,14 @@ extern "C" { const f_file_t directory = macro_f_file_t_initialize_id(dirfd(parent)); if (directory.id < 0) { - closedir(parent); - if (errno == EINVAL) return F_status_set_error(F_directory_stream); - if (errno == ENOTSUP) return F_status_set_error(F_directory_support_not); + // Save errno before calling another function that might alter it. + const int err = errno; + + f_directory_stream_close(parent); + + if (err == EINVAL) return F_status_set_error(F_directory_stream); + if (err == ENOTSUP) return F_status_set_error(F_directory_support_not); return F_status_set_error(F_directory_descriptor); } @@ -287,15 +224,20 @@ extern "C" { const size_t length = scandir(path.string, &entity, filter, sort); if (length == -1) { - closedir(parent); - if (errno == ENOMEM) return F_status_set_error(F_memory_not); + // Save errno before calling another function that might alter it. + const int err = errno; + + f_directory_stream_close(parent); + + if (err == ENOMEM) return F_status_set_error(F_memory_not); return F_status_set_error(F_failure); } f_string_static_t name_directory = f_string_static_t_initialize; f_string_dynamics_t *names = 0; + f_status_t status = F_okay; struct stat file_stat; int mode = 0; size_t i = 0; @@ -359,13 +301,13 @@ extern "C" { f_memory_resize(1, 0, sizeof(f_char_t *), (void **) & entity[i]); } // for - closedir(parent); + f_directory_stream_close(parent); for (; i < length; ++i) { f_memory_resize(1, 0, sizeof(f_char_t *), (void **) & entity[i]); } // for - f_memory_resize(1, 0, sizeof(struct dirent *), (void **) & entity); + f_memory_resize(1, 0, sizeof(f_directory_entity_t *), (void **) & entity); if (F_status_is_error(status)) return status; if (!length) return F_directory_empty; diff --git a/level_1/fl_directory/c/private-directory.h b/level_1/fl_directory/c/private-directory.h index 2ca010e..4f0de69 100644 --- a/level_1/fl_directory/c/private-directory.h +++ b/level_1/fl_directory/c/private-directory.h @@ -88,12 +88,14 @@ extern "C" { * @param path * Filesystem path to the directory. * @param filter - * A filter function of the form: int xxx(const struct direct *). - * Set to 0 to not use (NULL). + * (optional) A filter function. + * + * Set to NULL to disable. * @param sort - * A sort function of the form: int xxx(const struct direct *, const struct direct *). - * Set to 0 to not use (NULL). + * (optional) A sort function. * There are two pre-made libc functions available for this: alphasort() and versionsort(). + * + * Set to NULL to disable. * @param dereference * Set to TRUE to dereference symlinks (often is what is desired). * Set to FALSE to operate on the symlink itself. @@ -125,7 +127,7 @@ extern "C" { * @see fl_directory_list() */ #if !defined(_di_fl_directory_do_) || !defined(_di_fl_directory_list_) - extern f_status_t private_fl_directory_list(const f_string_static_t path, int (*filter)(const struct dirent *), int (*sort)(const struct dirent **, const struct dirent **), const bool dereference, f_directory_listing_t * const listing) F_attribute_visibility_internal_d; + extern f_status_t private_fl_directory_list(const f_string_static_t path, f_directory_filter_call_t filter, f_directory_compare_call_t sort, const bool dereference, f_directory_listing_t * const listing) F_attribute_visibility_internal_d; #endif // !defined(_di_fl_directory_do_) || !defined(_di_fl_directory_list_) /** diff --git a/level_3/fake/c/main/build.c b/level_3/fake/c/main/build.c index 2ace0c0..c936a44 100644 --- a/level_3/fake/c/main/build.c +++ b/level_3/fake/c/main/build.c @@ -181,7 +181,7 @@ extern "C" { main->cache_recurse_do.handle = &fake_do_copy_handle; main->cache_recurse_do.state.custom = (void *) &local; main->cache_recurse_do.state.code = fake_state_code_local_d; - main->cache_recurse_do.flag = f_directory_recurse_do_flag_after_e | f_directory_recurse_do_flag_before_e | f_directory_recurse_do_flag_top_e | f_directory_recurse_do_flag_top_after_e | f_directory_recurse_do_flag_top_before_e; + main->cache_recurse_do.flag = f_directory_recurse_do_flag_before_after_d; main->cache_recurse_do.mode = mode; fake_string_dynamic_reset(&main->cache_recurse_do.path); diff --git a/level_3/fake/c/main/fake/do.c b/level_3/fake/c/main/fake/do.c index 70a8715..d7b4808 100644 --- a/level_3/fake/c/main/fake/do.c +++ b/level_3/fake/c/main/fake/do.c @@ -27,16 +27,16 @@ extern "C" { f_string_map_t * const map = (f_string_map_t *) local->custom_1; - if (flag & f_directory_recurse_do_flag_top_before_e) { + if (!recurse->depth && (flag & f_directory_recurse_do_flag_before_d)) { if (recurse->state.code & fake_state_code_clone_d) { fake_print_verbose_cloning(&local->main->program.message, *recurse->path_top, map->key); - recurse->state.status = f_file_clone(*recurse->path_top, map->key, F_file_default_size_write_d, f_file_stat_flag_group_e | f_file_stat_flag_owner_e | (f_directory_recurse_do_flag_dereference_e ? 0 : f_file_stat_flag_reference_e)); + recurse->state.status = f_file_clone(*recurse->path_top, map->key, F_file_default_size_write_d, f_file_stat_flag_group_e | f_file_stat_flag_owner_e | (f_directory_recurse_do_flag_dereference_d ? 0 : f_file_stat_flag_reference_e)); } else { fake_print_verbose_copying(&local->main->program.message, *recurse->path_top, map->key); - recurse->state.status = f_file_copy(*recurse->path_top, map->key, recurse->mode, F_file_default_size_write_d, f_directory_recurse_do_flag_dereference_e ? 0 : f_file_stat_flag_reference_e); + recurse->state.status = f_file_copy(*recurse->path_top, map->key, recurse->mode, F_file_default_size_write_d, f_directory_recurse_do_flag_dereference_d ? 0 : f_file_stat_flag_reference_e); } if (F_status_is_error(recurse->state.status)) { @@ -68,8 +68,8 @@ extern "C" { return; } - if (flag & f_directory_recurse_do_flag_before_e) { - if ((flag & f_directory_recurse_do_flag_directory_e) && (flag & f_directory_recurse_do_flag_action_e)) { + if (flag & f_directory_recurse_do_flag_before_d) { + if ((flag & f_directory_recurse_do_flag_directory_d) && (flag & f_directory_recurse_do_flag_action_d)) { // Push the directory name on the path stack (the destination path is expected to be pre-populated). recurse->state.status = f_memory_array_increase_by(f_path_separator_s.used + name.used + 1, sizeof(f_char_t), (void **) &recurse->path_cache.string, &recurse->path_cache.used, &recurse->path_cache.size); @@ -90,12 +90,12 @@ extern "C" { if (recurse->state.code & fake_state_code_clone_d) { fake_print_verbose_cloning(&local->main->program.message, recurse->path, recurse->path_cache); - recurse->state.status = f_file_clone(recurse->path, recurse->path_cache, F_file_default_size_write_d, f_file_stat_flag_group_e | f_file_stat_flag_owner_e | (f_directory_recurse_do_flag_dereference_e ? 0 : f_file_stat_flag_reference_e)); + recurse->state.status = f_file_clone(recurse->path, recurse->path_cache, F_file_default_size_write_d, f_file_stat_flag_group_e | f_file_stat_flag_owner_e | (f_directory_recurse_do_flag_dereference_d ? 0 : f_file_stat_flag_reference_e)); } else { fake_print_verbose_copying(&local->main->program.message, recurse->path, recurse->path_cache); - recurse->state.status = f_file_copy(recurse->path, recurse->path_cache, recurse->mode, F_file_default_size_write_d, f_directory_recurse_do_flag_dereference_e ? 0 : f_file_stat_flag_reference_e); + recurse->state.status = f_file_copy(recurse->path, recurse->path_cache, recurse->mode, F_file_default_size_write_d, f_directory_recurse_do_flag_dereference_d ? 0 : f_file_stat_flag_reference_e); } if (F_status_is_error(recurse->state.status)) { @@ -111,8 +111,8 @@ extern "C" { return; } - if (flag & (f_directory_recurse_do_flag_after_e | f_directory_recurse_do_flag_top_after_e)) { - if ((flag & f_directory_recurse_do_flag_directory_e) && (flag & f_directory_recurse_do_flag_action_e)) { + if (!recurse->depth && (flag & f_directory_recurse_do_flag_after_d)) { + if ((flag & f_directory_recurse_do_flag_directory_d) && (flag & f_directory_recurse_do_flag_action_d)) { // Pop the current path off of the path stack. if (F_status_is_error_not(recurse->state.status)) { @@ -150,18 +150,18 @@ extern "C" { if (recurse->state.code & fake_state_code_clone_d) { fake_print_verbose_cloning(&local->main->program.message, recurse->path, map->value); - recurse->state.status = f_file_clone(recurse->path, map->value, F_file_default_size_write_d, f_file_stat_flag_group_e | f_file_stat_flag_owner_e | (f_directory_recurse_do_flag_dereference_e ? 0 : f_file_stat_flag_reference_e)); + recurse->state.status = f_file_clone(recurse->path, map->value, F_file_default_size_write_d, f_file_stat_flag_group_e | f_file_stat_flag_owner_e | (f_directory_recurse_do_flag_dereference_d ? 0 : f_file_stat_flag_reference_e)); } else { fake_print_verbose_copying(&local->main->program.message, recurse->path, map->value); - recurse->state.status = f_file_copy(recurse->path, map->value, recurse->mode, F_file_default_size_write_d, f_directory_recurse_do_flag_dereference_e ? 0 : f_file_stat_flag_reference_e); + recurse->state.status = f_file_copy(recurse->path, map->value, recurse->mode, F_file_default_size_write_d, f_directory_recurse_do_flag_dereference_d ? 0 : f_file_stat_flag_reference_e); } if (F_status_is_error(recurse->state.status)) { local->main->setting.state.status = recurse->state.status; - fake_print_error_file(&local->main->program.error, (recurse->state.code & fake_state_code_clone_d) ? macro_fake_f(f_file_clone) : macro_fake_f(f_file_copy), map->value, f_file_operation_create_s, (flag & f_directory_recurse_do_flag_directory_e) ? fll_error_file_type_directory_e : fll_error_file_type_file_e); + fake_print_error_file(&local->main->program.error, (recurse->state.code & fake_state_code_clone_d) ? macro_fake_f(f_file_clone) : macro_fake_f(f_file_copy), map->value, f_file_operation_create_s, (flag & f_directory_recurse_do_flag_directory_d) ? fll_error_file_type_directory_e : fll_error_file_type_file_e); // Save the error status for when the error message is printed. *((f_status_t *) local->custom_2) = recurse->state.status; diff --git a/level_3/fake/c/main/make/operate_process_type.c b/level_3/fake/c/main/make/operate_process_type.c index 8b9b918..98388b4 100644 --- a/level_3/fake/c/main/make/operate_process_type.c +++ b/level_3/fake/c/main/make/operate_process_type.c @@ -217,7 +217,7 @@ extern "C" { main->cache_recurse_do.handle = &fake_do_copy_handle; main->cache_recurse_do.state.custom = (void *) &local; main->cache_recurse_do.state.code = fake_state_code_local_d; - main->cache_recurse_do.flag = f_directory_recurse_do_flag_top_e | f_directory_recurse_do_flag_before_e | f_directory_recurse_do_flag_after_e; + main->cache_recurse_do.flag = f_directory_recurse_do_flag_before_after_d; if (clone) { main->cache_recurse_do.state.code |= fake_state_code_clone_d; @@ -305,10 +305,10 @@ extern "C" { } else if (main->setting.state.status == F_false) { if (clone) { - main->setting.state.status = f_file_clone(main->cache_arguments.array[i], main->cache_map.key, F_file_default_size_write_d, f_file_stat_flag_group_e | f_file_stat_flag_owner_e | (f_directory_recurse_do_flag_dereference_e ? 0 : f_file_stat_flag_reference_e)); + main->setting.state.status = f_file_clone(main->cache_arguments.array[i], main->cache_map.key, F_file_default_size_write_d, f_file_stat_flag_group_e | f_file_stat_flag_owner_e | (f_directory_recurse_do_flag_dereference_d ? 0 : f_file_stat_flag_reference_e)); } else { - main->setting.state.status = f_file_copy(main->cache_arguments.array[i], main->cache_map.key, main->cache_recurse_do.mode, F_file_default_size_write_d, f_directory_recurse_do_flag_dereference_e ? 0 : f_file_stat_flag_reference_e); + main->setting.state.status = f_file_copy(main->cache_arguments.array[i], main->cache_map.key, main->cache_recurse_do.mode, F_file_default_size_write_d, f_directory_recurse_do_flag_dereference_d ? 0 : f_file_stat_flag_reference_e); } if (F_status_is_error(main->setting.state.status)) { -- 1.8.3.1