From d803f2b96d871f50543a9dc7651d931d7255d3eb Mon Sep 17 00:00:00 2001 From: Kevin Day Date: Tue, 22 Apr 2025 21:47:54 -0500 Subject: [PATCH] Progress: Continue working on completing the remove program. Remove no longer used flags and code. Add recurse flags. The statistics cache ended up not being used. Remove it entirely and the related code adding to the cache. The tree mode is now updated to be in line with the latest functionality.. Ensure that the simulate is not printed twice for the top level directory being recursed. This is done by adding an additional "simulate not" flag that is then passed to simulate printing functions as appropriate. This is only needed for cases where the recursion is enabled. --- .../kevux/tools/remove/main/common/define.h | 112 ++++++++++++--------- .../program/kevux/tools/remove/main/common/type.h | 4 - .../c/program/kevux/tools/remove/main/operate.c | 45 ++------- .../c/program/kevux/tools/remove/main/operate.h | 4 +- .../c/program/kevux/tools/remove/main/preprocess.c | 67 ++++++------ .../c/program/kevux/tools/remove/main/preprocess.h | 6 +- .../kevux/tools/remove/main/print/simulate.c | 48 ++++----- .../kevux/tools/remove/main/print/simulate.h | 32 +++--- sources/c/program/kevux/tools/remove/main/remove.c | 13 +-- 9 files changed, 155 insertions(+), 176 deletions(-) diff --git a/sources/c/program/kevux/tools/remove/main/common/define.h b/sources/c/program/kevux/tools/remove/main/common/define.h index 6b95d8a..d902fde 100644 --- a/sources/c/program/kevux/tools/remove/main/common/define.h +++ b/sources/c/program/kevux/tools/remove/main/common/define.h @@ -19,9 +19,6 @@ extern "C" { /** * The program defines. * - * Leap Year: - * - If can be evenly divided by 4, then this is a leap year. (@fixme relocate or move "Leap Year" comments where appropriate - * * kt_remove_poll_*_d: * - timeout: The time in milliseconds to block, waiting for a poll response. * @@ -78,22 +75,6 @@ extern "C" { #endif // _di_kt_remove_allocation_d_ /** - * Flags associated with performing an operation on a file. - * - * kt_remove_flag_simulate_*_d: - * - none: No flags set, simulate disabled, no "is" value. - * - is_a: Print simulate message related to "is a ". - * - is_a_file: Helper used to print both simulate messages related to "is a " and "a file". - * - is_file: Print simulate message related to "a file". - */ -#ifndef _di_kt_remove_flag_file_simulate_d_ - #define kt_remove_flag_simulate_none_d 0x0 - #define kt_remove_flag_simulate_is_a_d 0x1 - #define kt_remove_flag_simulate_is_a_file_d 0x3 - #define kt_remove_flag_simulate_is_file_d 0x2 -#endif // _di_kt_remove_flag_file_code_d_ - -/** * A set of flags used internally in the convert process. * * These are generally used during parsing of Time and EpochTime strings. @@ -119,6 +100,11 @@ extern "C" { /** * Flags associated with a datetime. * + * Leap Year Notes: + * - If a Unix Timestamp can be evenly divided by 4, then this is a leap year. + * - Except, years that can be evenly divided by 100 but not evenly divided 400. + * - Any year that can be evenly divided by 400, even if 100, are still leap years. + * * kt_remove_flag_date_*_d: * - none: No flags set. * - equal: Perform equal to on date, '==' or 'equal'. @@ -166,36 +152,34 @@ extern "C" { * Flags associated with performing an operation on a file. * * kt_remove_flag_file_operate_*_d: - * - none: No flags set. - * - child: This is a child of a file for some other file recurse operation process. - * - directory: Is a directory. - * - directory_parent: Helper used to designate directory and parent being set. - * - empty: Is an empty directory. - * - follow: Follow the symbolic link. - * - link: The file being operated on is a link or is a followed link. - * - missing: The file is not found. - * - parent: This is a parent of a file for some other file tree operation process. - * - processed: This path is already processed. - * - remove: Perform remove. - * - remove_fail: Cannot perform remove due to failure. - * - remove_not: Do not remove, but not a failure. - * - remove_not_fail: Helper used to designate both remove_fail and remove_not being set. + * - none: No flags set. + * - directory: Is a directory. + * - empty: Is an empty directory. + * - follow: Follow the symbolic link. + * - link: The file being operated on is a link or is a followed link. + * - missing: The file is not found. + * - parent: This is a parent of a file for some other file tree operation process. + * - processed: This path is already processed. + * - remove: Perform remove. + * - remove_fail: Cannot perform remove due to failure. + * - remove_not: Do not remove, but not a failure. + * - remove_not_fail: Helper used to designate both remove_fail and remove_not being set. + * - simulate_not: Simulate printing is explicitly disabled for the specific file. */ #ifndef _di_kt_remove_flag_file_operate_d_ - #define kt_remove_flag_file_operate_none_d 0x0 - #define kt_remove_flag_file_operate_child_d 0x1 - #define kt_remove_flag_file_operate_directory_d 0x2 - #define kt_remove_flag_file_operate_directory_parent_d 0x42 - #define kt_remove_flag_file_operate_empty_d 0x4 - #define kt_remove_flag_file_operate_follow_d 0x8 - #define kt_remove_flag_file_operate_link_d 0x10 - #define kt_remove_flag_file_operate_missing_d 0x20 - #define kt_remove_flag_file_operate_parent_d 0x40 - #define kt_remove_flag_file_operate_processed_d 0x80 - #define kt_remove_flag_file_operate_remove_d 0x100 - #define kt_remove_flag_file_operate_remove_fail_d 0x200 - #define kt_remove_flag_file_operate_remove_not_d 0x400 - #define kt_remove_flag_file_operate_remove_not_fail_d 0x600 + #define kt_remove_flag_file_operate_none_d 0x0 + #define kt_remove_flag_file_operate_directory_d 0x1 + #define kt_remove_flag_file_operate_empty_d 0x2 + #define kt_remove_flag_file_operate_follow_d 0x4 + #define kt_remove_flag_file_operate_link_d 0x8 + #define kt_remove_flag_file_operate_missing_d 0x10 + #define kt_remove_flag_file_operate_parent_d 0x20 + #define kt_remove_flag_file_operate_processed_d 0x40 + #define kt_remove_flag_file_operate_remove_d 0x80 + #define kt_remove_flag_file_operate_remove_fail_d 0x100 + #define kt_remove_flag_file_operate_remove_not_d 0x200 + #define kt_remove_flag_file_operate_remove_not_fail_d 0x300 + #define kt_remove_flag_file_operate_simulate_not_d 0x400 #endif // _di_kt_remove_flag_file_operate_d_ /** @@ -217,6 +201,40 @@ extern "C" { #endif // _di_kt_remove_flag_mode_d_ /** + * A set of flags used internally in the directory recursion process. + * + * kt_remove_flag_recurse_*_d: + * - none: No directory recursion being performed. + * - normal: Normal directory recursion. + * - normal_parent: Helper flag representing both normal and parent flags being set. + * - parent: Directory recursion, representing the parent directory being recursed. + * - top: Path is a top level (before any potential recursion is performed). + */ +#ifndef _di_kt_remove_flag_recurse_d_ + #define kt_remove_flag_recurse_none_d 0x0 + #define kt_remove_flag_recurse_normal_d 0x1 + #define kt_remove_flag_recurse_normal_parent_d 0x3 + #define kt_remove_flag_recurse_parent_d 0x2 + #define kt_remove_flag_recurse_top_d 0x4 +#endif // _di_kt_remove_flag_recurse_d_ + +/** + * Flags associated with performing an operation on a file. + * + * kt_remove_flag_simulate_*_d: + * - none: No flags set, simulate disabled, no "is" value. + * - is_a: Print simulate message related to "is a ". + * - is_a_file: Helper used to print both simulate messages related to "is a " and "a file". + * - is_file: Print simulate message related to "a file". + */ +#ifndef _di_kt_remove_flag_file_simulate_d_ + #define kt_remove_flag_simulate_none_d 0x0 + #define kt_remove_flag_simulate_is_a_d 0x1 + #define kt_remove_flag_simulate_is_a_file_d 0x3 + #define kt_remove_flag_simulate_is_file_d 0x2 +#endif // _di_kt_remove_flag_file_code_d_ + +/** * Flags passed to the main function or program. * * kt_remove_main_flag_*_d: diff --git a/sources/c/program/kevux/tools/remove/main/common/type.h b/sources/c/program/kevux/tools/remove/main/common/type.h index 4fa8641..67d4a38 100644 --- a/sources/c/program/kevux/tools/remove/main/common/type.h +++ b/sources/c/program/kevux/tools/remove/main/common/type.h @@ -140,8 +140,6 @@ extern "C" { /** * The program cache. * - * statistics: The statistics of the parent directory before recursion takes place. - * * polls: An array of poll structures. * * buffer: The generic buffer. @@ -155,7 +153,6 @@ extern "C" { */ #ifndef _di_kt_remove_cache_t_ typedef struct { - struct stat statistics; f_polls_t polls; f_string_dynamic_t buffer; @@ -170,7 +167,6 @@ extern "C" { #define kt_remove_cache_t_initialize \ { \ - { 0 }, \ f_polls_t_initialize, \ f_string_dynamic_t_initialize, \ f_string_dynamic_t_initialize, \ diff --git a/sources/c/program/kevux/tools/remove/main/operate.c b/sources/c/program/kevux/tools/remove/main/operate.c index 6fcac43..4485f4a 100644 --- a/sources/c/program/kevux/tools/remove/main/operate.c +++ b/sources/c/program/kevux/tools/remove/main/operate.c @@ -67,7 +67,7 @@ extern "C" { main->setting.state.status = kt_remove_operate_file_prompt(main, path, flag_operate); if (F_status_is_error(main->setting.state.status)) return main->setting.state.status; - return (flag_operate & kt_remove_flag_file_operate_directory_d) && !recurse + return (flag_operate & kt_remove_flag_file_operate_directory_d) && !(recurse & kt_remove_flag_recurse_normal_d) ? kt_remove_operate_directory(main, path, flag_operate) : !(main->setting.flag & kt_remove_main_flag_simulate_d) ? kt_remove_operate_remove(main, path, flag_operate) @@ -81,7 +81,7 @@ extern "C" { #ifndef _di_kt_remove_operate_file_parent_ void kt_remove_operate_file_parent(kt_remove_main_t * const main, const f_string_static_t path) { - if (!main) return; + if (!main || macro_kt_remove_signal_check(&main->program, &main->setting.state)) return; if (!path.used) { main->setting.state.status = F_data_not; @@ -89,14 +89,10 @@ extern "C" { return; } - if (macro_kt_remove_signal_check(&main->program, &main->setting.state)) return; - - // @todo update this function, the related kt_remove_operate_file() has newer practices that need to be reflected here. - /* - const uint32_t flag_operate = kt_remove_preprocess_file(main, path, 0, recurse); + const uint32_t flag_operate = kt_remove_preprocess_file(main, path, kt_remove_flag_file_operate_parent_d, kt_remove_flag_recurse_none_d); - if (F_status_is_error(main->setting.state.status)) return main->setting.state.status; - if (flag_operate & kt_remove_flag_file_operate_processed_d) return F_no; + if (F_status_is_error(main->setting.state.status)) return; + if (flag_operate & kt_remove_flag_file_operate_processed_d) return; if (flag_operate & kt_remove_flag_file_operate_missing_d) { if (!(main->setting.flag & kt_remove_main_flag_force_simulate_d)) { @@ -104,34 +100,15 @@ extern "C" { kt_remove_print_error_file(&main->program.error, macro_kt_remove_f(kt_remove_preprocess_file), path, f_file_operation_delete_s, fll_error_file_type_file_e); - return main->setting.state.status; + return; } } else if (main->setting.state.status != F_skip) { main->setting.state.status = kt_remove_operate_file_prompt(main, path, flag_operate); - if (F_status_is_error(main->setting.state.status)) return main->setting.state.status; - - return !(main->setting.flag & kt_remove_main_flag_simulate_d) - ? kt_remove_operate_remove(main, path, flag_operate) - : F_no; - }*/ - - const uint32_t flag_operate = kt_remove_preprocess_file(main, path, kt_remove_flag_file_operate_parent_d, F_false); - - if (!kt_remove_operate_shall_remove(flag_operate) || (main->setting.flag & kt_remove_main_flag_simulate_d)) return; - - if (F_status_is_error_not(main->setting.state.status) && !(flag_operate & kt_remove_flag_file_operate_processed_d)) { - main->setting.state.status = F_okay; - - main->setting.state.status = kt_remove_operate_remove(main, path, flag_operate); if (F_status_is_error(main->setting.state.status)) return; - } - if (F_status_is_error_not(main->setting.state.status)) { - kt_remove_operate_memory_save(main, path, flag_operate); - - if (F_status_is_error(main->setting.state.status)) { - kt_remove_print_error_file(&main->program.error, macro_kt_remove_f(kt_remove_operate_memory_save), path, f_file_operation_process_s, fll_error_file_type_path_e); + if (!(main->setting.flag & kt_remove_main_flag_simulate_d)) { + kt_remove_operate_remove(main, path, flag_operate); } } @@ -363,11 +340,7 @@ extern "C" { kt_remove_main_t * const main = (kt_remove_main_t *) recurse->state.custom; - if (main->setting.flag & kt_remove_main_flag_simulate_d) { - f_print_dynamic(f_string_eol_s, main->program.output.to); - } - - recurse->state.status = kt_remove_operate_file(main, recurse->path, F_true); + recurse->state.status = kt_remove_operate_file(main, recurse->path, recurse->depth ? kt_remove_flag_recurse_normal_d : kt_remove_flag_recurse_normal_parent_d); if (F_status_is_error_not(recurse->state.status)) { recurse->state.status = F_okay; diff --git a/sources/c/program/kevux/tools/remove/main/operate.h b/sources/c/program/kevux/tools/remove/main/operate.h index 9d4e393..06bc16c 100644 --- a/sources/c/program/kevux/tools/remove/main/operate.h +++ b/sources/c/program/kevux/tools/remove/main/operate.h @@ -62,8 +62,8 @@ extern "C" { * This should always be FALSE if calling from within a fl_directory_do() callback. * This is because fl_directory_do() handles directory traversal and processing. * @param recurse - * If F_true, then this function is being called during directory recursion. - * If F_false, then this function is being called outside of directory recursion. + * One of the kt_remove_flag_recurse_*_d flags. + * Set to kt_remove_flag_recurse_none_d when this function is being called outside of directory recursion. * * @return * F_yes on success and removed. diff --git a/sources/c/program/kevux/tools/remove/main/preprocess.c b/sources/c/program/kevux/tools/remove/main/preprocess.c index 8c987b3..3f4337e 100644 --- a/sources/c/program/kevux/tools/remove/main/preprocess.c +++ b/sources/c/program/kevux/tools/remove/main/preprocess.c @@ -35,7 +35,7 @@ extern "C" { main->setting.state.status = f_file_is(path, F_file_type_link_d, F_false); if (F_status_is_error(main->setting.state.status)) { - kt_remove_print_simulate_operate_file(&main->program.output, path, flag_operate); + kt_remove_print_simulate_operate_file(&main->program.output, flag_out, path); remove_print_warning_file_reason(&main->program.warning, path, kt_remove_print_reason_stat_fail_s); @@ -47,12 +47,12 @@ extern "C" { } } else if (exists == F_false || F_status_is_error(exists)) { - kt_remove_print_simulate_operate_file(&main->program.output, path, flag_operate); + kt_remove_print_simulate_operate_file(&main->program.output, flag_out, path); - kt_remove_print_simulate_operate_file_exists(&main->program.output, path, flag_out, exists); + kt_remove_print_simulate_operate_file_exists(&main->program.output, flag_out, path, exists); if (exists == F_false) { - kt_remove_print_simulate_operate_boolean(&main->program.output, kt_remove_ignore_s, main->setting.flag & kt_remove_main_flag_force_d); + kt_remove_print_simulate_operate_boolean(&main->program.output, flag_out, kt_remove_ignore_s, main->setting.flag & kt_remove_main_flag_force_d); return kt_remove_flag_file_operate_missing_d; } @@ -68,34 +68,29 @@ extern "C" { flag_out |= kt_remove_flag_file_operate_follow_d; } - if (recurse == 0x2) { - memcpy(&statistics, &main->cache.statistics, sizeof(struct stat)); - } - else { - main->setting.state.status = f_file_stat(path, main->setting.flag & kt_remove_main_flag_follow_d, &statistics); + main->setting.state.status = f_file_stat(path, main->setting.flag & kt_remove_main_flag_follow_d, &statistics); - if (F_status_is_error(main->setting.state.status)) { - kt_remove_print_simulate_operate_file(&main->program.output, path, flag_operate); + if (F_status_is_error(main->setting.state.status)) { + kt_remove_print_simulate_operate_file(&main->program.output, flag_out, path); - kt_remove_print_simulate_operate_file_exists(&main->program.output, path, flag_out, F_false); + kt_remove_print_simulate_operate_file_exists(&main->program.output, flag_out, path, F_false); - remove_print_warning_file_reason(&main->program.warning, path, kt_remove_print_reason_stat_fail_s); + remove_print_warning_file_reason(&main->program.warning, path, kt_remove_print_reason_stat_fail_s); - return flag_out; - } + return flag_out; } if (macro_f_file_type_is_directory(statistics.st_mode)) { flag_out |= kt_remove_flag_file_operate_directory_d; + } - if (!recurse) { - memcpy(&main->cache.statistics, &statistics, sizeof(struct stat)); - } + if ((flag_out & kt_remove_flag_file_operate_directory_d) && (main->setting.flag & kt_remove_main_flag_recurse_d) && (recurse & kt_remove_flag_recurse_top_d)) { + flag_out |= kt_remove_flag_file_operate_simulate_not_d; } - kt_remove_print_simulate_operate_file(&main->program.output, path, flag_operate); + kt_remove_print_simulate_operate_file(&main->program.output, flag_out, path); - kt_remove_print_simulate_operate_file_exists(&main->program.output, path, flag_out, exists); + kt_remove_print_simulate_operate_file_exists(&main->program.output, flag_out, path, exists); } if (!(main->setting.flag & kt_remove_main_flag_root_d)) { @@ -131,7 +126,7 @@ extern "C" { if (statistics.st_uid == (uid_t) main->setting.users.array[i]) break; } // for - kt_remove_print_simulate_operate_id(&main->program.output, (f_number_unsigned_t) statistics.st_uid, F_true); + kt_remove_print_simulate_operate_id(&main->program.output, flag_out, (f_number_unsigned_t) statistics.st_uid, F_true); if (i < main->setting.users.used) { flag_out |= kt_remove_flag_file_operate_remove_d; @@ -139,7 +134,7 @@ extern "C" { } if (main->setting.flag & kt_remove_main_flag_same_d) { - kt_remove_print_simulate_operate_boolean(&main->program.output, kt_remove_same_s, statistics.st_uid == geteuid()); + kt_remove_print_simulate_operate_boolean(&main->program.output, flag_out, kt_remove_same_s, statistics.st_uid == geteuid()); if (statistics.st_uid == geteuid()) { flag_out |= kt_remove_flag_file_operate_remove_d; @@ -147,7 +142,7 @@ extern "C" { } if (main->setting.flag & kt_remove_main_flag_different_d) { - kt_remove_print_simulate_operate_boolean(&main->program.output, kt_remove_different_s, statistics.st_uid != geteuid()); + kt_remove_print_simulate_operate_boolean(&main->program.output, flag_out, kt_remove_different_s, statistics.st_uid != geteuid()); if (statistics.st_uid != geteuid()) { flag_out |= kt_remove_flag_file_operate_remove_d; @@ -161,7 +156,7 @@ extern "C" { if (statistics.st_gid == (gid_t) main->setting.groups.array[i]) break; } // for - kt_remove_print_simulate_operate_id(&main->program.output, (f_number_unsigned_t) statistics.st_gid, F_false); + kt_remove_print_simulate_operate_id(&main->program.output, flag_out, (f_number_unsigned_t) statistics.st_gid, F_false); if (i < main->setting.groups.used) { flag_out |= kt_remove_flag_file_operate_remove_d; @@ -185,7 +180,7 @@ extern "C" { kt_remove_flag_mode_not_d, }; - kt_remove_print_simulate_operate_mode(&main->program.output, (f_number_unsigned_t) mode, f_string_empty_s); + kt_remove_print_simulate_operate_mode(&main->program.output, flag_out, (f_number_unsigned_t) mode, f_string_empty_s); for (i = 0; i < main->setting.modes.used; ++i) { @@ -209,7 +204,7 @@ extern "C" { for (uint8_t j = 0; j < 4; ++j) { if (main->setting.modes.array[i].type == types[j]) { - kt_remove_print_simulate_operate_mode(&main->program.output, (f_number_unsigned_t) main->setting.modes.array[i].mode, modes[j]); + kt_remove_print_simulate_operate_mode(&main->program.output, flag_out, (f_number_unsigned_t) main->setting.modes.array[i].mode, modes[j]); break; } @@ -233,7 +228,7 @@ extern "C" { if (F_status_is_error(main->setting.state.status)) return flag_out; if (main->setting.state.status == F_true || main->setting.state.status == F_false) { - kt_remove_print_simulate_operate_boolean(&main->program.output, kt_remove_empty_s, main->setting.state.status); + kt_remove_print_simulate_operate_boolean(&main->program.output, flag_out, kt_remove_empty_s, main->setting.state.status); if (main->setting.state.status == F_true) { flag_out |= kt_remove_flag_file_operate_empty_d; @@ -274,29 +269,29 @@ extern "C" { } if (flag_out & kt_remove_flag_file_operate_directory_d) { - kt_remove_print_simulate_operate_boolean(&main->program.output, kt_remove_recurse_s, (main->setting.flag & kt_remove_main_flag_recurse_d) && !(flag_operate & kt_remove_flag_file_operate_parent_d)); + kt_remove_print_simulate_operate_boolean(&main->program.output, flag_out, kt_remove_recurse_s, (main->setting.flag & kt_remove_main_flag_recurse_d) && !(flag_operate & kt_remove_flag_file_operate_parent_d)); } if (main->setting.flag & kt_remove_main_flag_tree_d) { - kt_remove_print_simulate_operate_boolean(&main->program.output, kt_remove_parent_s, flag_operate & kt_remove_flag_file_operate_parent_d); + kt_remove_print_simulate_operate_boolean(&main->program.output, flag_out, kt_remove_parent_s, flag_operate & kt_remove_flag_file_operate_parent_d); } if (main->setting.flag & kt_remove_main_flag_prompt_all_d) { if (main->setting.flag & (kt_remove_main_flag_prompt_each_d | kt_remove_main_flag_prompt_never_d)) { - kt_remove_print_simulate_operate_boolean(&main->program.output, kt_remove_prompt_s, main->setting.flag & kt_remove_main_flag_prompt_each_d); + kt_remove_print_simulate_operate_boolean(&main->program.output, flag_out, kt_remove_prompt_s, main->setting.flag & kt_remove_main_flag_prompt_each_d); } else if (main->setting.flag & kt_remove_main_flag_prompt_follow_d) { - kt_remove_print_simulate_operate_boolean(&main->program.output, kt_remove_prompt_s, (main->setting.flag & kt_remove_main_flag_follow_d) && (flag_out & kt_remove_flag_file_operate_link_d)); + kt_remove_print_simulate_operate_boolean(&main->program.output, flag_out, kt_remove_prompt_s, (main->setting.flag & kt_remove_main_flag_follow_d) && (flag_out & kt_remove_flag_file_operate_link_d)); } else if (main->setting.flag & kt_remove_main_flag_prompt_once_d) { - kt_remove_print_simulate_operate_boolean(&main->program.output, kt_remove_prompt_s, !(main->setting.prompt)); + kt_remove_print_simulate_operate_boolean(&main->program.output, flag_out, kt_remove_prompt_s, !(main->setting.prompt)); } } - kt_remove_print_simulate_operate_boolean(&main->program.output, kt_remove_remove_s, kt_remove_operate_shall_remove(flag_out)); + kt_remove_print_simulate_operate_boolean(&main->program.output, flag_out, kt_remove_remove_s, kt_remove_operate_shall_remove(flag_out)); // Only apply tree operations on non-child paths when the tree flag is set. - if ((main->setting.flag & kt_remove_main_flag_tree_d) && !(flag_operate & kt_remove_flag_file_operate_child_d) && !recurse) { + if ((main->setting.flag & kt_remove_main_flag_tree_d) && !(recurse & kt_remove_flag_recurse_normal_d)) { f_range_t range = macro_f_range_t_initialize_2(path.used); if (range.stop > range.start) { @@ -594,7 +589,7 @@ extern "C" { } if (name_type.used) { - kt_remove_print_simulate_operate_date(&main->program.output, names[i], result, times[i], dates[i]->array[j], name_type); + kt_remove_print_simulate_operate_date(&main->program.output, flag_operate, names[i], result, times[i], dates[i]->array[j], name_type); break; } @@ -622,7 +617,7 @@ extern "C" { } if (is || (main->setting.flag & type) && !(main->setting.flag & ignore)) { - kt_remove_print_simulate_operate_boolean(&main->program.output, name, is); + kt_remove_print_simulate_operate_boolean(&main->program.output, *flag_out, name, is); } } #endif // _di_kt_remove_preprocess_file_type_ diff --git a/sources/c/program/kevux/tools/remove/main/preprocess.h b/sources/c/program/kevux/tools/remove/main/preprocess.h index 2cd6666..886da8c 100644 --- a/sources/c/program/kevux/tools/remove/main/preprocess.h +++ b/sources/c/program/kevux/tools/remove/main/preprocess.h @@ -34,10 +34,8 @@ extern "C" { * @param flag_operate * The operate file specific flags from kt_remove_flag_file_operate_*_e. * @param recurse - * If F_true as 0x1, then this function is being called during directory recursion. - * If F_true as 0x2, then this function is being called during directory recursion and it represents the parent directory being recursed. - * If F_true as 0x3, then this function is being called during directory recursion and it represents the parent tree directories are being recursed. - * If F_false, then this function is being called outside of directory recursion. + * One of the kt_remove_flag_recurse_*_d flags. + * Set to kt_remove_flag_recurse_none_d when this function is being called outside of directory recursion. * * @return * The resulting flags determined by the pre-process. diff --git a/sources/c/program/kevux/tools/remove/main/print/simulate.c b/sources/c/program/kevux/tools/remove/main/print/simulate.c index 16b40cc..dacc16c 100644 --- a/sources/c/program/kevux/tools/remove/main/print/simulate.c +++ b/sources/c/program/kevux/tools/remove/main/print/simulate.c @@ -21,8 +21,6 @@ extern "C" { fl_print_format(" %Q%r", print->to, main->setting.files.array[i], f_string_eol_s); } // for - f_print_dynamic(f_string_eol_s, print->to); - f_file_stream_unlock(print->to); return F_okay; @@ -30,13 +28,13 @@ extern "C" { #endif // _di_kt_remove_print_simulate_operate_ #ifndef _di_kt_remove_print_simulate_operate_boolean_ - f_status_t kt_remove_print_simulate_operate_boolean(fl_print_t * const print, const f_string_static_t name, const uint8_t yes) { + f_status_t kt_remove_print_simulate_operate_boolean(fl_print_t * const print, const uint32_t flag_operate, const f_string_static_t name, const uint8_t yes) { if (!print || !print->custom) return F_status_set_error(F_output_not); kt_remove_main_t * const main = (kt_remove_main_t *) print->custom; - if (!(main->setting.flag & kt_remove_main_flag_simulate_d)) return F_output_not; + if (!(main->setting.flag & kt_remove_main_flag_simulate_d) || (flag_operate & kt_remove_flag_file_operate_simulate_not_d)) return F_output_not; fll_print_format(" %r %r%r", print->to, name, yes ? kt_remove_yes_s : kt_remove_no_s, f_string_eol_s); @@ -45,13 +43,13 @@ extern "C" { #endif // _di_kt_remove_print_simulate_operate_boolean_ #ifndef _di_kt_remove_print_simulate_operate_date_ - f_status_t kt_remove_print_simulate_operate_date(fl_print_t * const print, const f_string_static_t name, const uint8_t yes, const f_time_spec_t time, const kt_remove_date_t date, const f_string_static_t type) { + f_status_t kt_remove_print_simulate_operate_date(fl_print_t * const print, const uint32_t flag_operate, const f_string_static_t name, const uint8_t yes, const f_time_spec_t time, const kt_remove_date_t date, const f_string_static_t type) { if (!print || !print->custom) return F_status_set_error(F_output_not); kt_remove_main_t * const main = (kt_remove_main_t *) print->custom; - if (!(main->setting.flag & kt_remove_main_flag_simulate_d)) return F_output_not; + if (!(main->setting.flag & kt_remove_main_flag_simulate_d) || (flag_operate & kt_remove_flag_file_operate_simulate_not_d)) return F_output_not; const f_number_unsigned_t match_year = kt_remove_time_year_unix_epoch_d + (time.tv_sec / kt_remove_time_seconds_in_year_d); const f_number_unsigned_t match_second = time.tv_sec % kt_remove_time_seconds_in_year_d; @@ -72,38 +70,28 @@ extern "C" { #endif // _di_kt_remove_print_simulate_operate_date_ #ifndef _di_kt_remove_print_simulate_operate_file_ - f_status_t kt_remove_print_simulate_operate_file(fl_print_t * const print, const f_string_static_t path, const uint32_t flag) { + f_status_t kt_remove_print_simulate_operate_file(fl_print_t * const print, const uint32_t flag_operate, const f_string_static_t path) { if (!print || !print->custom) return F_status_set_error(F_output_not); kt_remove_main_t * const main = (kt_remove_main_t *) print->custom; - if (!(main->setting.flag & kt_remove_main_flag_simulate_d)) return F_output_not; + if (!(main->setting.flag & kt_remove_main_flag_simulate_d) || (flag_operate & kt_remove_flag_file_operate_simulate_not_d)) return F_output_not; - fll_print_format( - "%r%[Remove '%Q'%]:%r", - print->to, - flag & kt_remove_flag_file_operate_child_d - ? f_string_eol_s - : f_string_empty_s, - print->set->notable, - path, - print->set->notable, - f_string_eol_s - ); + fll_print_format("%r%[Remove '%Q'%]:%r", print->to, f_string_eol_s, print->set->notable, path, print->set->notable, f_string_eol_s); return F_okay; } #endif // _di_kt_remove_print_simulate_operate_file_ #ifndef _di_kt_remove_print_simulate_operate_file_exists_ - f_status_t kt_remove_print_simulate_operate_file_exists(fl_print_t * const print, const f_string_static_t path, const uint32_t flag, const f_status_t exists) { + f_status_t kt_remove_print_simulate_operate_file_exists(fl_print_t * const print, const uint32_t flag_operate, const f_string_static_t path, const f_status_t exists) { if (!print || !print->custom) return F_status_set_error(F_output_not); kt_remove_main_t * const main = (kt_remove_main_t *) print->custom; - if (!(main->setting.flag & kt_remove_main_flag_simulate_d)) return F_output_not; + if (!(main->setting.flag & kt_remove_main_flag_simulate_d) || (flag_operate & kt_remove_flag_file_operate_simulate_not_d)) return F_output_not; if (F_status_is_error(exists)) { fl_print_format(" file_access_failure %ui%r", print->to, F_status_set_fine(exists), f_string_eol_s); @@ -111,7 +99,7 @@ extern "C" { return F_status_set_error(F_output_not); } - if (flag & kt_remove_flag_file_operate_link_d) { + if (flag_operate & kt_remove_flag_file_operate_link_d) { main->cache.buffer.used = 0; const f_status_t status = f_file_link_read(path, F_false, &main->cache.buffer); @@ -137,9 +125,13 @@ extern "C" { #endif // _di_kt_remove_print_simulate_operate_file_exists_ #ifndef _di_kt_remove_print_simulate_operate_id_ - f_status_t kt_remove_print_simulate_operate_id(fl_print_t * const print, const f_number_unsigned_t id, const uint8_t is_user) { + f_status_t kt_remove_print_simulate_operate_id(fl_print_t * const print, const uint32_t flag_operate, const f_number_unsigned_t id, const uint8_t is_user) { - if (!print) return F_status_set_error(F_output_not); + if (!print || !print->custom) return F_status_set_error(F_output_not); + + kt_remove_main_t * const main = (kt_remove_main_t *) print->custom; + + if (!(main->setting.flag & kt_remove_main_flag_simulate_d) || (flag_operate & kt_remove_flag_file_operate_simulate_not_d)) return F_output_not; fll_print_format(" %r %un%r", print->to, is_user ? kt_remove_user_s : kt_remove_group_s, id, f_string_eol_s); @@ -148,9 +140,13 @@ extern "C" { #endif // _di_kt_remove_print_simulate_operate_id_ #ifndef _di_kt_remove_print_simulate_operate_mode_ - f_status_t kt_remove_print_simulate_operate_mode(fl_print_t * const print, const f_number_unsigned_t mode, const f_string_static_t match) { + f_status_t kt_remove_print_simulate_operate_mode(fl_print_t * const print, const uint32_t flag_operate, const f_number_unsigned_t mode, const f_string_static_t match) { + + if (!print || !print->custom) return F_status_set_error(F_output_not); + + kt_remove_main_t * const main = (kt_remove_main_t *) print->custom; - if (!print) return F_status_set_error(F_output_not); + if (!(main->setting.flag & kt_remove_main_flag_simulate_d) || (flag_operate & kt_remove_flag_file_operate_simulate_not_d)) return F_output_not; if (match.used) { fll_print_format(" mode_matched %Q %@03un%r", print->to, match, mode, f_string_eol_s); diff --git a/sources/c/program/kevux/tools/remove/main/print/simulate.h b/sources/c/program/kevux/tools/remove/main/print/simulate.h index f31235e..1e2d608 100644 --- a/sources/c/program/kevux/tools/remove/main/print/simulate.h +++ b/sources/c/program/kevux/tools/remove/main/print/simulate.h @@ -53,6 +53,8 @@ extern "C" { * Must not be NULL. * * This does not alter print.custom.setting.state.status. + * @param flag_operate + * The operate file specific flags from kt_remove_flag_file_operate_*_e. * @param name * The name to be associated with the boolean value. * @param yes @@ -66,7 +68,7 @@ extern "C" { * F_output_not (with error bit) if setting is NULL. */ #ifndef _di_kt_remove_print_simulate_operate_boolean_ - extern f_status_t kt_remove_print_simulate_operate_boolean(fl_print_t * const print, const f_string_static_t name, const uint8_t yes); + extern f_status_t kt_remove_print_simulate_operate_boolean(fl_print_t * const print, const uint32_t flag_operate, const f_string_static_t name, const uint8_t yes); #endif // _di_kt_remove_print_simulate_operate_boolean_ /** @@ -82,6 +84,8 @@ extern "C" { * Must not be NULL. * * This does not alter print.custom.setting.state.status. + * @param flag_operate + * The operate file specific flags from kt_remove_flag_file_operate_*_e. * @param name * The name to be associated with the boolean value. * @param yes @@ -101,7 +105,7 @@ extern "C" { * F_output_not (with error bit) if setting is NULL. */ #ifndef _di_kt_remove_print_simulate_operate_date_ - extern f_status_t kt_remove_print_simulate_operate_date(fl_print_t * const print, const f_string_static_t name, const uint8_t yes, const f_time_spec_t time, const kt_remove_date_t date, const f_string_static_t type); + extern f_status_t kt_remove_print_simulate_operate_date(fl_print_t * const print, const uint32_t flag_operate, const f_string_static_t name, const uint8_t yes, const f_time_spec_t time, const kt_remove_date_t date, const f_string_static_t type); #endif // _di_kt_remove_print_simulate_operate_date_ /** @@ -117,11 +121,10 @@ extern "C" { * Must not be NULL. * * This does not alter print.custom.setting.state.status. + * @param flag_operate + * The operate file specific flags from kt_remove_flag_file_operate_*_e. * @param path * The path to the file to operate on. - * @param flag - * The file operate flags associated with the file. - * The kt_remove_flag_file_operate_link_d is of specific interest here. * * @return * F_okay on success. @@ -130,7 +133,7 @@ extern "C" { * F_output_not (with error bit) if setting is NULL. */ #ifndef _di_kt_remove_print_simulate_operate_file_ - extern f_status_t kt_remove_print_simulate_operate_file(fl_print_t * const print, const f_string_static_t path, const uint32_t flag); + extern f_status_t kt_remove_print_simulate_operate_file(fl_print_t * const print, const uint32_t flag_operate, const f_string_static_t path); #endif // _di_kt_remove_print_simulate_operate_file_ /** @@ -146,11 +149,12 @@ extern "C" { * Must not be NULL. * * This does not alter print.custom.setting.state.status. + * @param flag_operate + * The operate file specific flags from kt_remove_flag_file_operate_*_e. + * + * The kt_remove_flag_file_operate_link_d is of specific interest here. * @param path * The path to the file to operate on. - * @param flag - * The file operate flags associated with the file. - * The kt_remove_flag_file_operate_link_d is of specific interest here. * @param exists * The status from the f_file_exists(). * Where F_true means file exists, F_false means file does not exist, and error bit set designates an error. @@ -162,7 +166,7 @@ extern "C" { * F_output_not (with error bit) if setting is NULL. */ #ifndef _di_kt_remove_print_simulate_operate_file_exists_ - extern f_status_t kt_remove_print_simulate_operate_file_exists(fl_print_t * const print, const f_string_static_t path, const uint32_t flag, const f_status_t exists); + extern f_status_t kt_remove_print_simulate_operate_file_exists(fl_print_t * const print, const uint32_t flag_operate, const f_string_static_t path, const f_status_t exists); #endif // _di_kt_remove_print_simulate_operate_file_exists_ /** @@ -178,6 +182,8 @@ extern "C" { * Must not be NULL. * * This does not alter print.custom.setting.state.status. + * @param flag_operate + * The operate file specific flags from kt_remove_flag_file_operate_*_e. * @param id * The user or group ID. * @param is_user @@ -191,7 +197,7 @@ extern "C" { * F_output_not (with error bit) if setting is NULL. */ #ifndef _di_kt_remove_print_simulate_operate_id_ - extern f_status_t kt_remove_print_simulate_operate_id(fl_print_t * const print, const f_number_unsigned_t id, const uint8_t is_user); + extern f_status_t kt_remove_print_simulate_operate_id(fl_print_t * const print, const uint32_t flag_operate, const f_number_unsigned_t id, const uint8_t is_user); #endif // _di_kt_remove_print_simulate_operate_id_ /** @@ -207,6 +213,8 @@ extern "C" { * Must not be NULL. * * This does not alter print.custom.setting.state.status. + * @param flag_operate + * The operate file specific flags from kt_remove_flag_file_operate_*_e. * @param mode * The mode of the file. * @param match @@ -220,7 +228,7 @@ extern "C" { * F_output_not (with error bit) if setting is NULL. */ #ifndef _di_kt_remove_print_simulate_operate_mode_ - extern f_status_t kt_remove_print_simulate_operate_mode(fl_print_t * const print, const f_number_unsigned_t mode, const f_string_static_t match); + extern f_status_t kt_remove_print_simulate_operate_mode(fl_print_t * const print, const uint32_t flag_operate, const f_number_unsigned_t mode, const f_string_static_t match); #endif // _di_kt_remove_print_simulate_operate_mode_ #ifdef __cplusplus diff --git a/sources/c/program/kevux/tools/remove/main/remove.c b/sources/c/program/kevux/tools/remove/main/remove.c index cd21383..7fc96d5 100644 --- a/sources/c/program/kevux/tools/remove/main/remove.c +++ b/sources/c/program/kevux/tools/remove/main/remove.c @@ -65,13 +65,12 @@ extern "C" { for (; i < main->setting.files.used; ++i) { - main->setting.state.status = kt_remove_operate_file(main, main->setting.files.array[i], F_false); - - if ((main->setting.flag & kt_remove_main_flag_simulate_d) && i + 1 < main->setting.files.used && (F_status_is_error_not(main->setting.state.status) || F_status_set_fine(main->setting.state.status) == F_interrupt)) { - f_print_dynamic(f_string_eol_s, main->program.output.to); - } + main->setting.state.status = kt_remove_operate_file(main, main->setting.files.array[i], kt_remove_flag_recurse_top_d); if (F_status_is_error(main->setting.state.status)) { + if (F_status_set_fine(main->setting.state.status) == F_interrupt) { + f_print_dynamic(f_string_eol_s, main->program.output.to); + } // If told to skip all, then do not return as an error. if (F_status_set_fine(main->setting.state.status) == F_skip) { @@ -85,10 +84,6 @@ extern "C" { if (main->cache.tree.used) { for (i = 0; i < main->cache.tree.used; ++i) { - if (main->setting.flag & kt_remove_main_flag_simulate_d) { - f_print_dynamic(f_string_eol_s, main->program.output.to); - } - kt_remove_operate_file_parent(main, main->cache.tree.array[i]); if (F_status_is_error(main->setting.state.status)) return; } // for -- 1.8.3.1