From: Kevin Day Date: Mon, 19 Jun 2023 19:42:19 +0000 (-0500) Subject: Feature: Add list support for directory recurse processing. X-Git-Url: https://git.kevux.org/?a=commitdiff_plain;h=8e7b1035cd0b87b79df4afc32e9e0ab006ebd776;p=fll Feature: Add list support for directory recurse processing. The fl_directory_do() now provides support for the callback to handle the directory list process. --- diff --git a/level_0/f_directory/c/directory/common.h b/level_0/f_directory/c/directory/common.h index 4a79b0e..39ddce7 100644 --- a/level_0/f_directory/c/directory/common.h +++ b/level_0/f_directory/c/directory/common.h @@ -111,6 +111,7 @@ extern "C" { * - after: Perform this action after recursion befo a single directory path. * - before: Perform this action before recursion on a single directory path. * - dereference: Dereference symbolic links rather than operating on the link itself. + * - list: Perform this action after directory listing is loaded. * - top: Operate on top-most directory, or for the callback parameter, designate that this is the top path. * * For the actiona and handle callback parameter: @@ -132,18 +133,19 @@ extern "C" { f_directory_recurse_do_flag_after_e = 0x1, f_directory_recurse_do_flag_before_e = 0x2, f_directory_recurse_do_flag_dereference_e = 0x4, - f_directory_recurse_do_flag_top_e = 0x8, + f_directory_recurse_do_flag_list_e = 0x8, + f_directory_recurse_do_flag_top_e = 0x10, // For the action callback parameter. - f_directory_recurse_do_flag_block_e = 0x10, - f_directory_recurse_do_flag_character_e = 0x20, - f_directory_recurse_do_flag_directory_e = 0x40, - f_directory_recurse_do_flag_fifo_e = 0x80, - f_directory_recurse_do_flag_link_e = 0x100, - f_directory_recurse_do_flag_path_e = 0x200, - f_directory_recurse_do_flag_regular_e = 0x400, - f_directory_recurse_do_flag_socket_e = 0x800, - f_directory_recurse_do_flag_unknown_e = 0x1000, + f_directory_recurse_do_flag_block_e = 0x20, + f_directory_recurse_do_flag_character_e = 0x40, + f_directory_recurse_do_flag_directory_e = 0x80, + f_directory_recurse_do_flag_fifo_e = 0x100, + f_directory_recurse_do_flag_link_e = 0x200, + f_directory_recurse_do_flag_path_e = 0x400, + f_directory_recurse_do_flag_regular_e = 0x800, + f_directory_recurse_do_flag_socket_e = 0x1000, + f_directory_recurse_do_flag_unknown_e = 0x2000, }; // enum #endif // _di_f_directory_recurse_do_flag_e_ diff --git a/level_0/f_directory/c/directory/type.h b/level_0/f_directory/c/directory/type.h index 94af61e..4eb516e 100644 --- a/level_0/f_directory/c/directory/type.h +++ b/level_0/f_directory/c/directory/type.h @@ -122,7 +122,7 @@ extern "C" { * - F_done: Immedately return as success but do nothing else in this recursion. * * The action parameters are: - * - recurse: Must be of type f_directory_recurse_do_t and represents this data. + * - recurse: Must be of type f_directory_recurse_do_t and represents this data. Must not be NULL. * - name: The name of the file or directory the action is being performed on (does not have the parent directory path) (may be empty at the top level). * - flag: A flag representing the particular action being performed. * diff --git a/level_1/fl_directory/c/private-directory.c b/level_1/fl_directory/c/private-directory.c index 0e756ba..335569b 100644 --- a/level_1/fl_directory/c/private-directory.c +++ b/level_1/fl_directory/c/private-directory.c @@ -31,7 +31,7 @@ extern "C" { recurse->state.status = private_fl_directory_list(recurse->path, 0, 0, recurse->flag & f_directory_recurse_do_flag_dereference_e, &recurse->listing); if (F_status_is_error(recurse->state.status)) { - private_inline_fl_directory_do_handle(recurse, f_string_empty_s, f_directory_recurse_do_flag_path_e); + private_inline_fl_directory_do_handle(recurse, f_string_empty_s, f_directory_recurse_do_flag_list_e | f_directory_recurse_do_flag_path_e); // Only the directory is to be freed because all others are preserved between recursions. if (F_status_is_error(recurse->state.status)) { @@ -47,6 +47,19 @@ extern "C" { recurse->state.status = F_none; + if (recurse->flag & f_directory_recurse_do_flag_list_e) { + recurse->action((void *) recurse, recurse->path, f_directory_recurse_do_flag_list_e); + + if (F_status_is_error(recurse->state.status)) { + private_inline_fl_directory_do_handle(recurse, recurse->path, f_directory_recurse_do_flag_list_e); + if (F_status_is_error(recurse->state.status)) return; + } + + if (recurse->state.status != F_done && F_status_is_error_not(recurse->state.status)) { + recurse->state.status = F_none; + } + } + f_number_unsigned_t i = 0; uint8_t j = 0; const f_number_unsigned_t used_original = recurse->path.used; @@ -67,7 +80,7 @@ extern "C" { f_directory_recurse_do_flag_unknown_e, }; - { + if (recurse->state.status != F_done && F_status_is_error_not(recurse->state.status)) { f_string_dynamics_t * const list[] = { &recurse->listing.block, &recurse->listing.character,