]> Kevux Git Server - kevux-tools/commitdiff
Progress: Continue working on completing the remove program.
authorKevin Day <Kevin@kevux.org>
Sat, 18 Jan 2025 23:08:20 +0000 (17:08 -0600)
committerKevin Day <Kevin@kevux.org>
Sat, 18 Jan 2025 23:08:20 +0000 (17:08 -0600)
Clean up the code a bit and fix some obvious mistakes.
Problems with the parameters are now fixed.

Start organizing and fixing the simulate.
Added some strings that may or may not be needed and will be removed if the future if it turns out they are not needed.

Add and use the process_operate_file_simulate() function.
The process_operate_file() shouldn't be called within simulate.

Do some work regarding directories and the empty state.

Additional flags are added.
Add flag bits to designate that if the remove flag bit is set then it should be ignored.
It is ignored as do not remove or it is ignored as do not remove then throw an error.
Using a bit like this allows for the rest of the code to only care about when it should add the remove flag.
Only in cases that explicitly prevent removal should the remove not and remove fail flags be set.

sources/c/program/kevux/tools/remove/main/common.c
sources/c/program/kevux/tools/remove/main/common/define.h
sources/c/program/kevux/tools/remove/main/common/string.c
sources/c/program/kevux/tools/remove/main/common/string.h
sources/c/program/kevux/tools/remove/main/common/type.h
sources/c/program/kevux/tools/remove/main/operate.c
sources/c/program/kevux/tools/remove/main/operate.h
sources/c/program/kevux/tools/remove/main/print/simulate.c

index 95c768d0dac39c7d23baa5a9b5a656f21081151f..82a4b9b10e7af47e5c96dfaec2c93eda7bd1e900 100644 (file)
@@ -49,7 +49,7 @@ extern "C" {
 
     if (!main) return;
 
-    main->setting.flag -= main->setting.flag & kt_remove_main_flag_option_used_d;
+    main->setting.flag &= ~kt_remove_main_flag_option_used_d;
 
     main->setting.state.step_small = kt_remove_allocation_console_d;
 
@@ -261,14 +261,7 @@ extern "C" {
 
       for (uint8_t p = 0; p < 3; ++p) {
 
-        // kt_remove_parameter_accessed_e, kt_remove_parameter_changed_e, kt_remove_parameter_updated_e, needs additional parameters, ==, <, <=, >, >=, <>.
-        if (parameters[p]->result & f_console_result_found_e) {
-          main->setting.state.status = F_status_set_error(F_parameter);
-
-          kt_remove_print_error_parameter_missing_value_requires_amount(&main->program.error, f_console_symbol_long_normal_s, longs[p], 2);
-
-          return;
-        }
+        if (!(parameters[p]->result & f_console_result_found_e)) continue;
 
         if (parameters[p]->result & f_console_result_value_e) {
           total_locations = parameters[p]->locations.used;
@@ -360,371 +353,378 @@ extern "C" {
           }
 
           main->setting.flag |= kt_remove_main_flag_option_used_d;
-        } // for
-      }
+        }
+        else {
+          main->setting.state.status = F_status_set_error(F_parameter);
+
+          kt_remove_print_error_parameter_missing_value_requires_amount(&main->program.error, f_console_symbol_long_normal_s, longs[p], 2);
+
+          return;
+        }
+      } // for
     }
 
-    // kt_remove_parameter_group_e, needs additional parameters (group).
     if (main->program.parameters.array[kt_remove_parameter_empty_e].result & f_console_result_found_e) {
-      main->setting.state.status = F_status_set_error(F_parameter);
-
-      kt_remove_print_error_parameter_missing_value_requires_amount(&main->program.error, f_console_symbol_long_normal_s, kt_remove_long_empty_s, 1);
+      if (main->program.parameters.array[kt_remove_parameter_empty_e].result & f_console_result_value_e) {
+        total_arguments = main->program.parameters.array[kt_remove_parameter_empty_e].values.used;
 
-      return;
-    }
+        if (main->program.parameters.array[kt_remove_parameter_empty_e].locations.used != total_arguments) {
+          main->setting.state.status = F_status_set_error(F_parameter);
 
-    if (main->program.parameters.array[kt_remove_parameter_empty_e].result & f_console_result_value_e) {
-      total_arguments = main->program.parameters.array[kt_remove_parameter_empty_e].values.used;
+          kt_remove_print_error_parameter_missing_value_requires_amount(&main->program.error, f_console_symbol_long_normal_s, kt_remove_long_empty_s, 1);
 
-      if (main->program.parameters.array[kt_remove_parameter_empty_e].locations.used != total_arguments) {
-        main->setting.state.status = F_status_set_error(F_parameter);
+          return;
+        }
 
-        kt_remove_print_error_parameter_missing_value_requires_amount(&main->program.error, f_console_symbol_long_normal_s, kt_remove_long_empty_s, 1);
+        index = main->program.parameters.array[kt_remove_parameter_empty_e].values.array[total_arguments - 1];
 
-        return;
-      }
+        if (f_compare_dynamic(kt_remove_not_s, main->program.parameters.arguments.array[index]) == F_equal_to) {
+          main->setting.flag |= kt_remove_main_flag_empty_not_d;
 
-      index = main->program.parameters.array[kt_remove_parameter_empty_e].values.array[total_arguments - 1];
+          if (main->setting.flag & kt_remove_main_flag_empty_not_fail_d) {
+            main->setting.flag -= kt_remove_main_flag_empty_not_fail_d;
+          }
 
-      if (f_compare_dynamic(kt_remove_not_s, main->program.parameters.arguments.array[index]) == F_equal_to) {
-        main->setting.flag |= kt_remove_main_flag_empty_not_d;
+          if (main->setting.flag & kt_remove_main_flag_empty_only_d) {
+            main->setting.flag -= kt_remove_main_flag_empty_only_d;
+          }
 
-        if (main->setting.flag & kt_remove_main_flag_empty_not_fail_d) {
-          main->setting.flag -= kt_remove_main_flag_empty_not_fail_d;
+          if (main->setting.flag & kt_remove_main_flag_empty_only_fail_d) {
+            main->setting.flag -= kt_remove_main_flag_empty_only_fail_d;
+          }
         }
+        else if (f_compare_dynamic(kt_remove_not_fail_s, main->program.parameters.arguments.array[index]) == F_equal_to) {
+          main->setting.flag |= kt_remove_main_flag_empty_not_fail_d;
 
-        if (main->setting.flag & kt_remove_main_flag_empty_only_d) {
-          main->setting.flag -= kt_remove_main_flag_empty_only_d;
-        }
+          if (main->setting.flag & kt_remove_main_flag_empty_not_d) {
+            main->setting.flag -= kt_remove_main_flag_empty_not_d;
+          }
 
-        if (main->setting.flag & kt_remove_main_flag_empty_only_fail_d) {
-          main->setting.flag -= kt_remove_main_flag_empty_only_fail_d;
-        }
-      }
-      else if (f_compare_dynamic(kt_remove_not_fail_s, main->program.parameters.arguments.array[index]) == F_equal_to) {
-        main->setting.flag |= kt_remove_main_flag_empty_not_fail_d;
+          if (main->setting.flag & kt_remove_main_flag_empty_only_d) {
+            main->setting.flag -= kt_remove_main_flag_empty_only_d;
+          }
 
-        if (main->setting.flag & kt_remove_main_flag_empty_not_d) {
-          main->setting.flag -= kt_remove_main_flag_empty_not_d;
+          if (main->setting.flag & kt_remove_main_flag_empty_only_fail_d) {
+            main->setting.flag -= kt_remove_main_flag_empty_only_fail_d;
+          }
         }
+        else if (f_compare_dynamic(kt_remove_only_s, main->program.parameters.arguments.array[index]) == F_equal_to) {
+          main->setting.flag |= kt_remove_main_flag_empty_only_d;
 
-        if (main->setting.flag & kt_remove_main_flag_empty_only_d) {
-          main->setting.flag -= kt_remove_main_flag_empty_only_d;
-        }
+          if (main->setting.flag & kt_remove_main_flag_empty_not_d) {
+            main->setting.flag -= kt_remove_main_flag_empty_not_d;
+          }
 
-        if (main->setting.flag & kt_remove_main_flag_empty_only_fail_d) {
-          main->setting.flag -= kt_remove_main_flag_empty_only_fail_d;
-        }
-      }
-      else if (f_compare_dynamic(kt_remove_only_s, main->program.parameters.arguments.array[index]) == F_equal_to) {
-        main->setting.flag |= kt_remove_main_flag_empty_only_d;
+          if (main->setting.flag & kt_remove_main_flag_empty_not_fail_d) {
+            main->setting.flag -= kt_remove_main_flag_empty_not_fail_d;
+          }
 
-        if (main->setting.flag & kt_remove_main_flag_empty_not_d) {
-          main->setting.flag -= kt_remove_main_flag_empty_not_d;
+          if (main->setting.flag & kt_remove_main_flag_empty_only_fail_d) {
+            main->setting.flag -= kt_remove_main_flag_empty_only_fail_d;
+          }
         }
+        else if (f_compare_dynamic(kt_remove_only_fail_s, main->program.parameters.arguments.array[index]) == F_equal_to) {
+          main->setting.flag |= kt_remove_main_flag_empty_only_fail_d;
 
-        if (main->setting.flag & kt_remove_main_flag_empty_not_fail_d) {
-          main->setting.flag -= kt_remove_main_flag_empty_not_fail_d;
-        }
+          if (main->setting.flag & kt_remove_main_flag_empty_not_d) {
+            main->setting.flag -= kt_remove_main_flag_empty_not_d;
+          }
 
-        if (main->setting.flag & kt_remove_main_flag_empty_only_fail_d) {
-          main->setting.flag -= kt_remove_main_flag_empty_only_fail_d;
-        }
-      }
-      else if (f_compare_dynamic(kt_remove_only_fail_s, main->program.parameters.arguments.array[index]) == F_equal_to) {
-        main->setting.flag |= kt_remove_main_flag_empty_only_fail_d;
+          if (main->setting.flag & kt_remove_main_flag_empty_not_fail_d) {
+            main->setting.flag -= kt_remove_main_flag_empty_not_fail_d;
+          }
 
-        if (main->setting.flag & kt_remove_main_flag_empty_not_d) {
-          main->setting.flag -= kt_remove_main_flag_empty_not_d;
+          if (main->setting.flag & kt_remove_main_flag_empty_only_d) {
+            main->setting.flag -= kt_remove_main_flag_empty_only_d;
+          }
         }
+        else {
+          main->setting.state.status = F_status_set_error(F_parameter);
 
-        if (main->setting.flag & kt_remove_main_flag_empty_not_fail_d) {
-          main->setting.flag -= kt_remove_main_flag_empty_not_fail_d;
-        }
+          kt_remove_print_error_parameter_unknown_value(&main->program.error, f_console_symbol_long_normal_s, kt_remove_long_empty_s, main->program.parameters.arguments.array[index]);
 
-        if (main->setting.flag & kt_remove_main_flag_empty_only_d) {
-          main->setting.flag -= kt_remove_main_flag_empty_only_d;
+          return;
         }
+
+        main->setting.flag |= kt_remove_main_flag_option_used_d;
       }
       else {
         main->setting.state.status = F_status_set_error(F_parameter);
 
-        kt_remove_print_error_parameter_unknown_value(&main->program.error, f_console_symbol_long_normal_s, kt_remove_long_empty_s, main->program.parameters.arguments.array[index]);
+        kt_remove_print_error_parameter_missing_value_requires_amount(&main->program.error, f_console_symbol_long_normal_s, kt_remove_long_empty_s, 1);
 
         return;
       }
-
-      main->setting.flag |= kt_remove_main_flag_option_used_d;
     }
 
-    // kt_remove_parameter_group_e, needs additional parameters (gid).
     if (main->program.parameters.array[kt_remove_parameter_group_e].result & f_console_result_found_e) {
-      main->setting.state.status = F_status_set_error(F_parameter);
-
-      kt_remove_print_error_parameter_missing_value_requires_amount(&main->program.error, f_console_symbol_long_normal_s, kt_remove_long_group_s, 1);
-
-      return;
-    }
-
-    if (main->program.parameters.array[kt_remove_parameter_group_e].result & f_console_result_value_e) {
-      total_arguments = main->program.parameters.array[kt_remove_parameter_group_e].values.used;
-
-      if (main->program.parameters.array[kt_remove_parameter_group_e].locations.used != total_arguments) {
-        main->setting.state.status = F_status_set_error(F_parameter);
-
-        kt_remove_print_error_parameter_missing_value_requires_amount(&main->program.error, f_console_symbol_long_normal_s, kt_remove_long_group_s, 1);
-
-        return;
-      }
-
-      main->setting.state.status = f_memory_array_increase_by(total_arguments, sizeof(uint32_t), (void **) &main->setting.groups.array, &main->setting.groups.used, &main->setting.groups.size);
+      if (main->program.parameters.array[kt_remove_parameter_group_e].result & f_console_result_value_e) {
+        total_arguments = main->program.parameters.array[kt_remove_parameter_group_e].values.used;
 
-      if (F_status_is_error(main->setting.state.status)) {
-        kt_remove_print_error(&main->program.error, macro_kt_remove_f(f_memory_array_increase_by));
-
-        return;
-      }
+        if (main->program.parameters.array[kt_remove_parameter_group_e].locations.used != total_arguments) {
+          main->setting.state.status = F_status_set_error(F_parameter);
 
-      for (i = 0; i < total_arguments; ++i) {
+          kt_remove_print_error_parameter_missing_value_requires_amount(&main->program.error, f_console_symbol_long_normal_s, kt_remove_long_group_s, 1);
 
-        index = main->program.parameters.array[kt_remove_parameter_group_e].values.array[i];
+          return;
+        }
 
-        main->setting.groups.array[main->setting.groups.used] = kt_remove_get_id_group(main, main->program.parameters.arguments.array[index]);
+        main->setting.state.status = f_memory_array_increase_by(total_arguments, sizeof(uint32_t), (void **) &main->setting.groups.array, &main->setting.groups.used, &main->setting.groups.size);
 
         if (F_status_is_error(main->setting.state.status)) {
-          kt_remove_print_error(&main->program.error, macro_kt_remove_f(kt_remove_get_id_group));
+          kt_remove_print_error(&main->program.error, macro_kt_remove_f(f_memory_array_increase_by));
 
           return;
         }
 
-        ++main->setting.groups.used;
-      } // for
+        for (i = 0; i < total_arguments; ++i) {
 
-      main->setting.flag |= kt_remove_main_flag_group_d;
-      main->setting.flag |= kt_remove_main_flag_option_used_d;
-    }
+          index = main->program.parameters.array[kt_remove_parameter_group_e].values.array[i];
 
-    // kt_remove_parameter_mode_e, needs additional parameters (modes, match parameters).
-    if (main->program.parameters.array[kt_remove_parameter_mode_e].result & f_console_result_found_e) {
-      main->setting.state.status = F_status_set_error(F_parameter);
+          main->setting.groups.array[main->setting.groups.used] = kt_remove_get_id_group(main, main->program.parameters.arguments.array[index]);
 
-      kt_remove_print_error_parameter_missing_value_requires_amount(&main->program.error, f_console_symbol_long_normal_s, kt_remove_long_mode_s, 2);
+          if (F_status_is_error(main->setting.state.status)) {
+            kt_remove_print_error(&main->program.error, macro_kt_remove_f(kt_remove_get_id_group));
 
-      return;
-    }
+            return;
+          }
 
-    if (main->program.parameters.array[kt_remove_parameter_mode_e].result & f_console_result_value_e) {
-      total_locations = main->program.parameters.array[kt_remove_parameter_mode_e].locations.used;
-      total_arguments = main->program.parameters.array[kt_remove_parameter_mode_e].values.used;
+          ++main->setting.groups.used;
+        } // for
 
-      if (total_locations * 2 != total_arguments) {
+        main->setting.flag |= kt_remove_main_flag_group_d;
+        main->setting.flag |= kt_remove_main_flag_option_used_d;
+      }
+      else {
         main->setting.state.status = F_status_set_error(F_parameter);
 
-        kt_remove_print_error_parameter_missing_value_requires_amount(&main->program.error, f_console_symbol_long_normal_s, kt_remove_long_mode_s, 2);
+        kt_remove_print_error_parameter_missing_value_requires_amount(&main->program.error, f_console_symbol_long_normal_s, kt_remove_long_group_s, 1);
 
         return;
       }
+    }
 
-      if (main->setting.modes.used + total_locations > main->setting.modes.size) {
-        main->setting.state.status = kt_remove_modes_resize(main->setting.modes.size + (total_locations - main->setting.modes.size), &main->setting.modes);
+    if (main->program.parameters.array[kt_remove_parameter_mode_e].result & f_console_result_found_e) {
+      if (main->program.parameters.array[kt_remove_parameter_mode_e].result & f_console_result_value_e) {
+        total_locations = main->program.parameters.array[kt_remove_parameter_mode_e].locations.used;
+        total_arguments = main->program.parameters.array[kt_remove_parameter_mode_e].values.used;
 
-        if (F_status_is_error(main->setting.state.status)) {
-          kt_remove_print_error(&main->program.error, macro_kt_remove_f(kt_remove_modes_resize));
+        if (total_locations * 2 != total_arguments) {
+          main->setting.state.status = F_status_set_error(F_parameter);
+
+          kt_remove_print_error_parameter_missing_value_requires_amount(&main->program.error, f_console_symbol_long_normal_s, kt_remove_long_mode_s, 2);
 
           return;
         }
-      }
 
-      uint8_t enumerations[] = {
-        kt_remove_flag_mode_different_d,
-        kt_remove_flag_mode_same_d,
-        kt_remove_flag_mode_similar_d,
-        kt_remove_flag_mode_not_d,
-        kt_remove_flag_mode_different_d,
-        kt_remove_flag_mode_same_d,
-        kt_remove_flag_mode_similar_d,
-        kt_remove_flag_mode_not_d,
-      };
+        if (main->setting.modes.used + total_locations > main->setting.modes.size) {
+          main->setting.state.status = kt_remove_modes_resize(main->setting.modes.size + (total_locations - main->setting.modes.size), &main->setting.modes);
 
-      f_string_static_t strings[] = {
-        kt_remove_mode_symbol_different_s,
-        kt_remove_mode_symbol_same_s,
-        kt_remove_mode_symbol_similar_s,
-        kt_remove_mode_symbol_not_s,
-        kt_remove_mode_word_different_s,
-        kt_remove_mode_word_same_s,
-        kt_remove_mode_word_similar_s,
-        kt_remove_mode_word_not_s,
-      };
+          if (F_status_is_error(main->setting.state.status)) {
+            kt_remove_print_error(&main->program.error, macro_kt_remove_f(kt_remove_modes_resize));
 
-      for (i = 0; i < total_locations; i += 2) {
+            return;
+          }
+        }
 
-        index = main->program.parameters.array[kt_remove_parameter_mode_e].values.array[i];
+        uint8_t enumerations[] = {
+          kt_remove_flag_mode_different_d,
+          kt_remove_flag_mode_same_d,
+          kt_remove_flag_mode_similar_d,
+          kt_remove_flag_mode_not_d,
+          kt_remove_flag_mode_different_d,
+          kt_remove_flag_mode_same_d,
+          kt_remove_flag_mode_similar_d,
+          kt_remove_flag_mode_not_d,
+        };
 
-        main->setting.modes.array[main->setting.modes.used].type = 0;
+        f_string_static_t strings[] = {
+          kt_remove_mode_symbol_different_s,
+          kt_remove_mode_symbol_same_s,
+          kt_remove_mode_symbol_similar_s,
+          kt_remove_mode_symbol_not_s,
+          kt_remove_mode_word_different_s,
+          kt_remove_mode_word_same_s,
+          kt_remove_mode_word_similar_s,
+          kt_remove_mode_word_not_s,
+        };
 
-        for (j = 0; j < 8; ++j) {
+        for (i = 0; i < total_locations; i += 2) {
 
-          if (f_compare_dynamic(main->program.parameters.arguments.array[index], strings[j]) == F_equal_to) {
-            main->setting.modes.array[main->setting.modes.used].type = enumerations[j];
+          index = main->program.parameters.array[kt_remove_parameter_mode_e].values.array[i];
 
-            index2 = main->program.parameters.array[kt_remove_parameter_mode_e].values.array[i + 1];
+          main->setting.modes.array[main->setting.modes.used].type = 0;
 
-            main->setting.modes.array[main->setting.modes.used].mode = kt_remove_get_mode(main, main->program.parameters.arguments.array[index2]);
-            if (F_status_is_error(main->setting.state.status)) return;
+          for (j = 0; j < 8; ++j) {
 
-            ++main->setting.modes.used;
+            if (f_compare_dynamic(main->program.parameters.arguments.array[index], strings[j]) == F_equal_to) {
+              main->setting.modes.array[main->setting.modes.used].type = enumerations[j];
 
-            break;
-          }
-        } // for
+              index2 = main->program.parameters.array[kt_remove_parameter_mode_e].values.array[i + 1];
 
-        if (j == 8) {
-          main->setting.state.status = F_status_set_error(F_parameter);
-
-          kt_remove_print_error_parameter_unknown_value(&main->program.error, f_console_symbol_long_normal_s, kt_remove_long_mode_s, main->program.parameters.arguments.array[index]);
+              main->setting.modes.array[main->setting.modes.used].mode = kt_remove_get_mode(main, main->program.parameters.arguments.array[index2]);
+              if (F_status_is_error(main->setting.state.status)) return;
 
-          return;
-        }
-      } // for
+              ++main->setting.modes.used;
 
-      main->setting.flag |= kt_remove_main_flag_mode_d;
-      main->setting.flag |= kt_remove_main_flag_option_used_d;
-    }
+              break;
+            }
+          } // for
 
-    // kt_remove_parameter_user_e, needs additional parameters.
-    if (main->program.parameters.array[kt_remove_parameter_user_e].result & f_console_result_found_e) {
-      main->setting.state.status = F_status_set_error(F_parameter);
+          if (j == 8) {
+            main->setting.state.status = F_status_set_error(F_parameter);
 
-      kt_remove_print_error_parameter_missing_value_requires_amount(&main->program.error, f_console_symbol_long_normal_s, kt_remove_long_user_s, 1);
+            kt_remove_print_error_parameter_unknown_value(&main->program.error, f_console_symbol_long_normal_s, kt_remove_long_mode_s, main->program.parameters.arguments.array[index]);
 
-      return;
-    }
-
-    if (main->program.parameters.array[kt_remove_parameter_user_e].result & f_console_result_value_e) {
-      total_arguments = main->program.parameters.array[kt_remove_parameter_user_e].values.used;
+            return;
+          }
+        } // for
 
-      if (main->program.parameters.array[kt_remove_parameter_user_e].locations.used != total_arguments) {
+        main->setting.flag |= kt_remove_main_flag_mode_d;
+        main->setting.flag |= kt_remove_main_flag_option_used_d;
+      }
+      else {
         main->setting.state.status = F_status_set_error(F_parameter);
 
-        kt_remove_print_error_parameter_missing_value_requires_amount(&main->program.error, f_console_symbol_long_normal_s, kt_remove_long_user_s, 1);
+        kt_remove_print_error_parameter_missing_value_requires_amount(&main->program.error, f_console_symbol_long_normal_s, kt_remove_long_mode_s, 2);
 
         return;
       }
+    }
 
-      main->setting.state.status = f_memory_array_increase_by(total_arguments, sizeof(uint32_t), (void **) &main->setting.users.array, &main->setting.users.used, &main->setting.users.size);
-
-      if (F_status_is_error(main->setting.state.status)) {
-        kt_remove_print_error(&main->program.error, macro_kt_remove_f(f_memory_array_increase_by));
+    if (main->program.parameters.array[kt_remove_parameter_user_e].result & f_console_result_found_e) {
+      if (main->program.parameters.array[kt_remove_parameter_user_e].result & f_console_result_value_e) {
+        total_arguments = main->program.parameters.array[kt_remove_parameter_user_e].values.used;
 
-        return;
-      }
+        if (main->program.parameters.array[kt_remove_parameter_user_e].locations.used != total_arguments) {
+          main->setting.state.status = F_status_set_error(F_parameter);
 
-      for (i = 0; i < total_arguments; ++i) {
+          kt_remove_print_error_parameter_missing_value_requires_amount(&main->program.error, f_console_symbol_long_normal_s, kt_remove_long_user_s, 1);
 
-        index = main->program.parameters.array[kt_remove_parameter_user_e].values.array[i];
+          return;
+        }
 
-        main->setting.users.array[main->setting.users.used] = kt_remove_get_id_user(main, main->program.parameters.arguments.array[index]);
+        main->setting.state.status = f_memory_array_increase_by(total_arguments, sizeof(uint32_t), (void **) &main->setting.users.array, &main->setting.users.used, &main->setting.users.size);
 
         if (F_status_is_error(main->setting.state.status)) {
-          kt_remove_print_error(&main->program.error, macro_kt_remove_f(kt_remove_get_id_user));
+          kt_remove_print_error(&main->program.error, macro_kt_remove_f(f_memory_array_increase_by));
 
           return;
         }
 
-        ++main->setting.users.used;
-      } // for
+        for (i = 0; i < total_arguments; ++i) {
 
-      main->setting.flag |= kt_remove_main_flag_user_d;
-      main->setting.flag |= kt_remove_main_flag_option_used_d;
-    }
+          index = main->program.parameters.array[kt_remove_parameter_user_e].values.array[i];
 
-    // kt_remove_parameter_prompt_e, needs additional parameters (all, follow, once).
-    if (main->program.parameters.array[kt_remove_parameter_prompt_e].result & f_console_result_found_e) {
-      main->setting.state.status = F_status_set_error(F_parameter);
+          main->setting.users.array[main->setting.users.used] = kt_remove_get_id_user(main, main->program.parameters.arguments.array[index]);
 
-      kt_remove_print_error_parameter_missing_value_requires_amount(&main->program.error, f_console_symbol_long_normal_s, kt_remove_long_prompt_s, 1);
+          if (F_status_is_error(main->setting.state.status)) {
+            kt_remove_print_error(&main->program.error, macro_kt_remove_f(kt_remove_get_id_user));
 
-      return;
-    }
+            return;
+          }
 
-    if (main->program.parameters.array[kt_remove_parameter_prompt_e].result & f_console_result_value_e) {
-      total_arguments = main->program.parameters.array[kt_remove_parameter_prompt_e].values.used;
+          ++main->setting.users.used;
+        } // for
 
-      if (main->program.parameters.array[kt_remove_parameter_prompt_e].locations.used != total_arguments) {
+        main->setting.flag |= kt_remove_main_flag_user_d;
+        main->setting.flag |= kt_remove_main_flag_option_used_d;
+      }
+      else {
         main->setting.state.status = F_status_set_error(F_parameter);
 
-        kt_remove_print_error_parameter_missing_value_requires_amount(&main->program.error, f_console_symbol_long_normal_s, kt_remove_long_prompt_s, 1);
+        kt_remove_print_error_parameter_missing_value_requires_amount(&main->program.error, f_console_symbol_long_normal_s, kt_remove_long_user_s, 1);
 
         return;
       }
+    }
 
-      index = main->program.parameters.array[kt_remove_parameter_prompt_e].values.array[total_arguments - 1];
+    if (main->program.parameters.array[kt_remove_parameter_prompt_e].result & f_console_result_found_e) {
+      if (main->program.parameters.array[kt_remove_parameter_prompt_e].result & f_console_result_value_e) {
+        total_arguments = main->program.parameters.array[kt_remove_parameter_prompt_e].values.used;
 
-      if (f_compare_dynamic(kt_remove_all_s, main->program.parameters.arguments.array[index]) == F_equal_to) {
-        main->setting.flag |= kt_remove_main_flag_prompt_each_d;
+        if (main->program.parameters.array[kt_remove_parameter_prompt_e].locations.used != total_arguments) {
+          main->setting.state.status = F_status_set_error(F_parameter);
 
-        if (main->setting.flag & kt_remove_main_flag_prompt_follow_d) {
-          main->setting.flag -= kt_remove_main_flag_prompt_follow_d;
-        }
+          kt_remove_print_error_parameter_missing_value_requires_amount(&main->program.error, f_console_symbol_long_normal_s, kt_remove_long_prompt_s, 1);
 
-        if (main->setting.flag & kt_remove_main_flag_prompt_once_d) {
-          main->setting.flag -= kt_remove_main_flag_prompt_once_d;
+          return;
         }
 
-        if (main->setting.flag & kt_remove_main_flag_prompt_never_d) {
-          main->setting.flag -= kt_remove_main_flag_prompt_never_d;
-        }
-      }
-      else if (f_compare_dynamic(kt_remove_follow_s, main->program.parameters.arguments.array[index]) == F_equal_to) {
-        main->setting.flag |= kt_remove_main_flag_prompt_follow_d;
+        index = main->program.parameters.array[kt_remove_parameter_prompt_e].values.array[total_arguments - 1];
 
-        if (main->setting.flag & kt_remove_main_flag_prompt_each_d) {
-          main->setting.flag -= kt_remove_main_flag_prompt_each_d;
-        }
+        if (f_compare_dynamic(kt_remove_all_s, main->program.parameters.arguments.array[index]) == F_equal_to) {
+          main->setting.flag |= kt_remove_main_flag_prompt_each_d;
 
-        if (main->setting.flag & kt_remove_main_flag_prompt_once_d) {
-          main->setting.flag -= kt_remove_main_flag_prompt_once_d;
-        }
+          if (main->setting.flag & kt_remove_main_flag_prompt_follow_d) {
+            main->setting.flag -= kt_remove_main_flag_prompt_follow_d;
+          }
 
-        if (main->setting.flag & kt_remove_main_flag_prompt_never_d) {
-          main->setting.flag -= kt_remove_main_flag_prompt_never_d;
-        }
-      }
-      else if (f_compare_dynamic(kt_remove_once_s, main->program.parameters.arguments.array[index]) == F_equal_to) {
-        main->setting.flag |= kt_remove_main_flag_prompt_once_d;
+          if (main->setting.flag & kt_remove_main_flag_prompt_once_d) {
+            main->setting.flag -= kt_remove_main_flag_prompt_once_d;
+          }
 
-        if (main->setting.flag & kt_remove_main_flag_prompt_each_d) {
-          main->setting.flag -= kt_remove_main_flag_prompt_each_d;
+          if (main->setting.flag & kt_remove_main_flag_prompt_never_d) {
+            main->setting.flag -= kt_remove_main_flag_prompt_never_d;
+          }
         }
+        else if (f_compare_dynamic(kt_remove_follow_s, main->program.parameters.arguments.array[index]) == F_equal_to) {
+          main->setting.flag |= kt_remove_main_flag_prompt_follow_d;
 
-        if (main->setting.flag & kt_remove_main_flag_prompt_follow_d) {
-          main->setting.flag -= kt_remove_main_flag_prompt_follow_d;
-        }
+          if (main->setting.flag & kt_remove_main_flag_prompt_each_d) {
+            main->setting.flag -= kt_remove_main_flag_prompt_each_d;
+          }
 
-        if (main->setting.flag & kt_remove_main_flag_prompt_never_d) {
-          main->setting.flag -= kt_remove_main_flag_prompt_never_d;
+          if (main->setting.flag & kt_remove_main_flag_prompt_once_d) {
+            main->setting.flag -= kt_remove_main_flag_prompt_once_d;
+          }
+
+          if (main->setting.flag & kt_remove_main_flag_prompt_never_d) {
+            main->setting.flag -= kt_remove_main_flag_prompt_never_d;
+          }
         }
-      }
-      else if (f_compare_dynamic(kt_remove_never_s, main->program.parameters.arguments.array[index]) == F_equal_to) {
-        main->setting.flag |= kt_remove_main_flag_prompt_never_d;
+        else if (f_compare_dynamic(kt_remove_once_s, main->program.parameters.arguments.array[index]) == F_equal_to) {
+          main->setting.flag |= kt_remove_main_flag_prompt_once_d;
+
+          if (main->setting.flag & kt_remove_main_flag_prompt_each_d) {
+            main->setting.flag -= kt_remove_main_flag_prompt_each_d;
+          }
+
+          if (main->setting.flag & kt_remove_main_flag_prompt_follow_d) {
+            main->setting.flag -= kt_remove_main_flag_prompt_follow_d;
+          }
 
-        if (main->setting.flag & kt_remove_main_flag_prompt_each_d) {
-          main->setting.flag -= kt_remove_main_flag_prompt_each_d;
+          if (main->setting.flag & kt_remove_main_flag_prompt_never_d) {
+            main->setting.flag -= kt_remove_main_flag_prompt_never_d;
+          }
         }
+        else if (f_compare_dynamic(kt_remove_never_s, main->program.parameters.arguments.array[index]) == F_equal_to) {
+          main->setting.flag |= kt_remove_main_flag_prompt_never_d;
+
+          if (main->setting.flag & kt_remove_main_flag_prompt_each_d) {
+            main->setting.flag -= kt_remove_main_flag_prompt_each_d;
+          }
 
-        if (main->setting.flag & kt_remove_main_flag_prompt_follow_d) {
-          main->setting.flag -= kt_remove_main_flag_prompt_follow_d;
+          if (main->setting.flag & kt_remove_main_flag_prompt_follow_d) {
+            main->setting.flag -= kt_remove_main_flag_prompt_follow_d;
+          }
+
+          if (main->setting.flag & kt_remove_main_flag_prompt_once_d) {
+            main->setting.flag -= kt_remove_main_flag_prompt_once_d;
+          }
         }
+        else {
+          main->setting.state.status = F_status_set_error(F_parameter);
+
+          kt_remove_print_error_parameter_unknown_value(&main->program.error, f_console_symbol_long_normal_s, kt_remove_long_prompt_s, main->program.parameters.arguments.array[index]);
 
-        if (main->setting.flag & kt_remove_main_flag_prompt_once_d) {
-          main->setting.flag -= kt_remove_main_flag_prompt_once_d;
+          return;
         }
       }
       else {
         main->setting.state.status = F_status_set_error(F_parameter);
 
-        kt_remove_print_error_parameter_unknown_value(&main->program.error, f_console_symbol_long_normal_s, kt_remove_long_prompt_s, main->program.parameters.arguments.array[index]);
+        kt_remove_print_error_parameter_missing_value_requires_amount(&main->program.error, f_console_symbol_long_normal_s, kt_remove_long_prompt_s, 1);
 
         return;
       }
@@ -758,7 +758,7 @@ extern "C" {
 
     // Load all remaining files as static strings (setting size to 0).
     if (main->program.parameters.remaining.used) {
-      main->setting.state.status = f_memory_array_increase_by(main->program.parameters.remaining.used, sizeof(uint32_t), (void **) &main->setting.files.array, &main->setting.files.used, &main->setting.files.size);
+      main->setting.state.status = f_memory_array_increase_by(main->program.parameters.remaining.used, sizeof(f_string_dynamic_t), (void **) &main->setting.files.array, &main->setting.files.used, &main->setting.files.size);
 
       if (F_status_is_error(main->setting.state.status)) {
         kt_remove_print_error(&main->program.error, macro_kt_remove_f(f_memory_array_increase_by));
index 36317ba338b81e8e96c717a4aee640dd7a456091..ccdf62364468e49ae0b8760f1409295c20403bb0 100644 (file)
@@ -143,18 +143,26 @@ extern "C" {
  * Flags associated with performing an operation on a file.
  *
  * kt_remove_flag_file_operate_*_d:
- *   - none:      No flags set.
- *   - directory: Is a directory.
- *   - follow:    Follow the symbolic link.
- *   - recurse:   Perform recursively (only on directories).
- *   - remove:    Perform remove.
+ *   - none:            No flags set.
+ *   - directory:       Is a directory.
+ *   - empty:           Is an empty directory.
+ *   - follow:          Follow the symbolic link.
+ *   - recurse:         Perform recursively (only on directories).
+ *   - 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.
  */
 #ifndef _di_kt_remove_flag_file_operate_d_
-  #define kt_remove_flag_file_operate_none_d      0x0
-  #define kt_remove_flag_file_operate_directory_d 0x1
-  #define kt_remove_flag_file_operate_follow_d    0x2
-  #define kt_remove_flag_file_operate_recurse_d   0x4
-  #define kt_remove_flag_file_operate_remove_d    0x8
+  #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_recurse_d         0x8
+  #define kt_remove_flag_file_operate_remove_d          0x10
+  #define kt_remove_flag_file_operate_remove_fail_d     0x20
+  #define kt_remove_flag_file_operate_remove_not_d      0x40
+  #define kt_remove_flag_file_operate_remove_not_fail_d 0x60
 #endif // _di_kt_remove_flag_file_operate_d_
 
 /**
@@ -209,7 +217,7 @@ extern "C" {
  *   - help:                   Print help.
  *   - link:                   Remove by file type: link.
  *   - mode:                   Remove by mode.
- *   - option_used:            This gets set when when certain options are specified to toggle the default match detection boolean during removal of each file.
+ *   - option_used:            Designates that type match options are in use, overriding the default behavior.
  *   - prompt_all:             Helper flag representing all prompt flag bits.
  *   - prompt_each:            Operate in interactive mode, prompting for every file.
  *   - prompt_follow:          Operate in interactive mode: prompting for every link that is being followed.
index f61ebc359d5eaed07c746d1220279e073743929c..2702cab14ee9267d4cd86f2ec0364e182cd88947 100644 (file)
@@ -14,6 +14,7 @@ extern "C" {
 
 #ifndef _di_kt_remove_s_
   const f_string_static_t kt_remove_all_s = macro_f_string_static_t_initialize_1(KT_REMOVE_all_s, 0, KT_REMOVE_all_s_length);
+  const f_string_static_t kt_remove_empty_s = macro_f_string_static_t_initialize_1(KT_REMOVE_empty_s, 0, KT_REMOVE_empty_s_length);
   const f_string_static_t kt_remove_follow_s = macro_f_string_static_t_initialize_1(KT_REMOVE_follow_s, 0, KT_REMOVE_follow_s_length);
   const f_string_static_t kt_remove_force_s = macro_f_string_static_t_initialize_1(KT_REMOVE_force_s, 0, KT_REMOVE_force_s_length);
   const f_string_static_t kt_remove_ignore_s = macro_f_string_static_t_initialize_1(KT_REMOVE_ignore_s, 0, KT_REMOVE_ignore_s_length);
@@ -25,11 +26,13 @@ extern "C" {
   const f_string_static_t kt_remove_once_s = macro_f_string_static_t_initialize_1(KT_REMOVE_once_s, 0, KT_REMOVE_once_s_length);
   const f_string_static_t kt_remove_only_s = macro_f_string_static_t_initialize_1(KT_REMOVE_only_s, 0, KT_REMOVE_only_s_length);
   const f_string_static_t kt_remove_only_fail_s = macro_f_string_static_t_initialize_1(KT_REMOVE_only_fail_s, 0, KT_REMOVE_only_fail_s_length);
+  const f_string_static_t kt_remove_prompt_s = macro_f_string_static_t_initialize_1(KT_REMOVE_prompt_s, 0, KT_REMOVE_prompt_s_length);
   const f_string_static_t kt_remove_recurse_s = macro_f_string_static_t_initialize_1(KT_REMOVE_recurse_s, 0, KT_REMOVE_recurse_s_length);
   const f_string_static_t kt_remove_remove_s = macro_f_string_static_t_initialize_1(KT_REMOVE_remove_s, 0, KT_REMOVE_remove_s_length);
   const f_string_static_t kt_remove_root_s = macro_f_string_static_t_initialize_1(KT_REMOVE_root_s, 0, KT_REMOVE_root_s_length);
   const f_string_static_t kt_remove_today_s = macro_f_string_static_t_initialize_1(KT_REMOVE_today_s, 0, KT_REMOVE_today_s_length);
   const f_string_static_t kt_remove_tomorrow_s = macro_f_string_static_t_initialize_1(KT_REMOVE_tomorrow_s, 0, KT_REMOVE_tomorrow_s_length);
+  const f_string_static_t kt_remove_tree_s = macro_f_string_static_t_initialize_1(KT_REMOVE_tree_s, 0, KT_REMOVE_tree_s_length);
   const f_string_static_t kt_remove_yes_s = macro_f_string_static_t_initialize_1(KT_REMOVE_yes_s, 0, KT_REMOVE_yes_s_length);
   const f_string_static_t kt_remove_yesterday_s = macro_f_string_static_t_initialize_1(KT_REMOVE_yesterday_s, 0, KT_REMOVE_yesterday_s_length);
 #endif // _di_kt_remove_s_
index 5d69f82c1da4abe54eaad0a8760b6e6bed2455ca..dc30427eee3b34ff13c684f6359cfc1cbca635f7 100644 (file)
@@ -70,6 +70,7 @@ extern "C" {
  */
 #ifndef _di_kt_remove_s_
   #define KT_REMOVE_all_s       "all"
+  #define KT_REMOVE_empty_s     "empty"
   #define KT_REMOVE_follow_s    "follow"
   #define KT_REMOVE_force_s     "force"
   #define KT_REMOVE_ignore_s    "ignore"
@@ -81,15 +82,18 @@ extern "C" {
   #define KT_REMOVE_once_s      "once"
   #define KT_REMOVE_only_s      "only"
   #define KT_REMOVE_only_fail_s "only_fail"
+  #define KT_REMOVE_prompt_s    "prompt"
   #define KT_REMOVE_recurse_s   "recurse"
   #define KT_REMOVE_remove_s    "remove"
   #define KT_REMOVE_root_s      "root"
   #define KT_REMOVE_today_s     "today"
   #define KT_REMOVE_tomorrow_s  "tomorrow"
+  #define KT_REMOVE_tree_s      "tree"
   #define KT_REMOVE_yes_s       "yes"
   #define KT_REMOVE_yesterday_s "yesterday"
 
   #define KT_REMOVE_all_s_length       3
+  #define KT_REMOVE_empty_s_length     5
   #define KT_REMOVE_follow_s_length    6
   #define KT_REMOVE_force_s_length     5
   #define KT_REMOVE_ignore_s_length    6
@@ -101,15 +105,18 @@ extern "C" {
   #define KT_REMOVE_once_s_length      4
   #define KT_REMOVE_only_s_length      4
   #define KT_REMOVE_only_fail_s_length 9
+  #define KT_REMOVE_prompt_s_length    6
   #define KT_REMOVE_recurse_s_length   7
   #define KT_REMOVE_remove_s_length    6
   #define KT_REMOVE_root_s_length      4
   #define KT_REMOVE_today_s_length     5
   #define KT_REMOVE_tomorrow_s_length  8
+  #define KT_REMOVE_tree_s_length      4
   #define KT_REMOVE_yes_s_length       3
   #define KT_REMOVE_yesterday_s_length 9
 
   extern const f_string_static_t kt_remove_all_s;
+  extern const f_string_static_t kt_remove_empty_s;
   extern const f_string_static_t kt_remove_follow_s;
   extern const f_string_static_t kt_remove_force_s;
   extern const f_string_static_t kt_remove_ignore_s;
@@ -121,11 +128,13 @@ extern "C" {
   extern const f_string_static_t kt_remove_once_s;
   extern const f_string_static_t kt_remove_only_s;
   extern const f_string_static_t kt_remove_only_fail_s;
+  extern const f_string_static_t kt_remove_prompt_s;
   extern const f_string_static_t kt_remove_recurse_s;
   extern const f_string_static_t kt_remove_remove_s;
   extern const f_string_static_t kt_remove_root_s;
   extern const f_string_static_t kt_remove_today_s;
   extern const f_string_static_t kt_remove_tomorrow_s;
+  extern const f_string_static_t kt_remove_tree_s;
   extern const f_string_static_t kt_remove_yes_s;
   extern const f_string_static_t kt_remove_yesterday_s;
 #endif // _di_kt_remove_s_
index 721561fe736e0be223e2546d603c778194d4a5e7..bcda40bc877f4cfd632bf10ade34e3e2ffedb534 100644 (file)
@@ -154,9 +154,10 @@ extern "C" {
  * groups:   An array of Group IDs (gid_t) represented via an unsigned 32-bit integer.
  * users:    An array of Group IDs (uid_t) represented via an unsigned 32-bit integer.
  *
- * process_help:         Process help (generally printing help).
- * process_normal:       Process normally (data from parameters and files).
- * process_operate_file: Process an individual file, returning F_done to designate handled, and F_okay for letting parent continue handling.
+ * process_help:                  Process help (generally printing help).
+ * process_normal:                Process normally (data from parameters and files).
+ * process_operate_file:          Process an individual file, returning F_done to designate handled, and F_okay for letting parent continue handling.
+ * process_operate_file_simulate: Simulate process of an individual file, returning F_done to designate handled, and F_okay for letting parent continue handling.
  */
 #ifndef _di_kt_remove_setting_t_
   typedef struct {
@@ -183,6 +184,7 @@ extern "C" {
     f_status_t (*process_help)(void * const main);
     void (*process_normal)(void * const main);
     void (*process_operate_file)(void * const main, const f_string_static_t path, const struct stat statistics, uint8_t * const flag);
+    void (*process_operate_file_simulate)(void * const main, const f_string_static_t path, const struct stat statistics, uint8_t * const flag);
   } kt_remove_setting_t;
 
   #define kt_remove_setting_t_initialize \
@@ -204,6 +206,7 @@ extern "C" {
       0, \
       0, \
       0, \
+      0, \
     }
 #endif // _di_kt_remove_setting_t_
 
index c6c7fd57ee41d0984c149f111535dbeb373e56d4..114d6dbd84908cd27d1d0fdd1239dda2fbd1921e 100644 (file)
@@ -38,8 +38,8 @@ extern "C" {
 #ifndef _di_kt_remove_operate_file_directory_
   void kt_remove_operate_file_directory(kt_remove_main_t * const main, const f_string_static_t path, const uint8_t flag) {
 
-    if (!(flag & kt_remove_flag_file_operate_remove_d)) {
-      main->setting.state.status = F_no;
+    if (!(flag & kt_remove_flag_file_operate_remove_d) || flag & kt_remove_flag_file_operate_remove_not_fail_d) {
+      main->setting.state.status = (flag & kt_remove_flag_file_operate_remove_fail_d) ? F_status_set_error(F_no) : F_no;
 
       return;
     }
@@ -261,7 +261,6 @@ extern "C" {
       }
     }
 
-
     if (macro_f_file_type_is_directory(statistics.st_mode)) {
       flag |= kt_remove_flag_file_operate_directory_d;
 
@@ -354,63 +353,83 @@ extern "C" {
       if (i < main->setting.modes.used) {
         flag |= kt_remove_flag_file_operate_remove_d;
       }
+    }
 
-      if (main->setting.flag & kt_remove_main_flag_recurse_d) {
-        flag |= kt_remove_flag_file_operate_recurse_d;
-      }
+    if (flag & kt_remove_flag_file_operate_directory_d) {
+      flag |= kt_remove_flag_file_operate_recurse_d;
 
-      if (main->setting.flag & kt_remove_main_flag_force_d) {
-        flag |= kt_remove_flag_file_operate_remove_d;
-      }
+      main->setting.state.status = f_directory_empty(path);
+      if (F_status_is_error(main->setting.state.status)) return flag;
 
-      // Trigger the callback to make any modifications before simulating or performing the removal.
-      if (main->setting.process_operate_file) {
-        main->setting.state.status = F_okay;
+      if (main->setting.state.status) {
+        flag |= kt_remove_flag_file_operate_empty_d;
+      }
 
-        main->setting.process_operate_file((void *) main, path, statistics, &flag);
-        if (F_status_is_error(main->setting.state.status)) return flag;
+      if (main->setting.flag & kt_remove_main_flag_empty_all_d) {
+        if (main->setting.state.status) {
+          if (main->setting.flag & kt_remove_main_flag_empty_not_fail_d) {
+            flag |= kt_remove_flag_file_operate_remove_fail_d;
+          }
+          else if (main->setting.flag & kt_remove_main_flag_empty_not_d) {
+            flag |= kt_remove_flag_file_operate_remove_not_d;
+          }
+        }
+        else {
+          if (main->setting.flag & kt_remove_main_flag_empty_only_fail_d) {
+            flag |= kt_remove_flag_file_operate_remove_fail_d;
+          }
+          else if (main->setting.flag & kt_remove_main_flag_empty_only_d || !(main->setting.flag & kt_remove_main_flag_recurse_d)) {
+            flag |= kt_remove_flag_file_operate_remove_not_d;
+          }
+        }
+      }
+      else if (!main->setting.state.status) {
+        if (!(main->setting.flag & kt_remove_main_flag_recurse_d)) {
+          flag |= kt_remove_flag_file_operate_remove_not_d;
+        }
+      }
 
-        if (main->setting.state.status == F_done) {
-          main->setting.state.status = F_okay;
+      main->setting.state.status = F_okay;
 
-          return flag;
-        }
+      if (main->setting.flag & kt_remove_main_flag_tree_d) {
+        // @todo handle simulate for this.
       }
 
+      // @todo call a similate fl_directory_do() or move this into the kt_remove_operate_file_directory() process.
+    }
+
+    if (main->setting.process_operate_file_simulate) {
       main->setting.state.status = F_okay;
+
+      main->setting.process_operate_file_simulate((void *) main, path, statistics, &flag);
+      if (F_status_is_error(main->setting.state.status)) return flag;
+
+      if (main->setting.state.status == F_done) {
+        main->setting.state.status = F_okay;
+
+        return flag;
+      }
     }
 
     if (main->setting.flag & kt_remove_main_flag_force_d) {
       kt_remove_print_simulate_operate_boolean(&main->program.output, kt_remove_force_s, F_true);
+
+      flag |= kt_remove_flag_file_operate_remove_d;
     }
 
     if (flag & kt_remove_flag_file_operate_directory_d) {
-      kt_remove_print_simulate_operate_boolean(&main->program.output, kt_remove_recurse_s, flag & kt_remove_flag_file_operate_recurse_d);
-
-      if (main->setting.flag & kt_remove_main_flag_empty_all_d) {
-        // @todo handle simulate for this.
-        // 1. print the particular empty flags set.
-        // 2. determine if, when a directory, is empty or not.
-        // 3. print the empty or not state.
-      }
-
-      // Recurse effectively forces tree.
-      if (main->setting.flag & kt_remove_main_flag_recurse_d) {
-        // @todo handle simulate for this.
-        // @todo consider not following "rm" and having recurse not act like "--force" is specified.
-      }
-      else if (main->setting.flag & kt_remove_main_flag_tree_d) {
-        // @todo handle simulate for this.
-      }
-
-      // @todo call a similate fl_directory_do() or move this into the kt_remove_operate_file_directory() process.
+      kt_remove_print_simulate_operate_boolean(&main->program.output, kt_remove_recurse_s, main->setting.flag & kt_remove_main_flag_recurse_d);
     }
 
+    // @todo not boolean, set prompt of yes/no based on conditions, however, if kt_remove_main_flag_prompt_each_d is set, then its always prompt.
     if (main->setting.flag & kt_remove_main_flag_prompt_each_d) {
-      // @todo handle simulate for this.
+      //kt_remove_print_simulate_operate_boolean(&main->program.output, kt_remove_prompt_s, flag & kt_remove_main_flag_prompt_each_d);
     }
 
-    kt_remove_print_simulate_operate_boolean(&main->program.output, kt_remove_remove_s, flag & kt_remove_flag_file_operate_remove_d);
+    // @todo determine if this path is part of a delete tree path.
+    //kt_remove_print_simulate_operate_boolean(&main->program.output, kt_remove_tree_s, main->setting.flag & kt_remove_main_flag_tree_d);
+
+    kt_remove_print_simulate_operate_boolean(&main->program.output, kt_remove_remove_s, (flag & kt_remove_flag_file_operate_remove_d) && !(flag & kt_remove_flag_file_operate_remove_not_fail_d));
 
     main->setting.state.status = F_okay;
 
@@ -421,8 +440,8 @@ extern "C" {
 #ifndef _di_kt_remove_operate_file_normal_
   void kt_remove_operate_file_normal(kt_remove_main_t * const main, const f_string_static_t path, const uint8_t flag) {
 
-    if (!(flag & kt_remove_flag_file_operate_remove_d)) {
-      main->setting.state.status = F_no;
+    if (!(flag & kt_remove_flag_file_operate_remove_d) || flag & kt_remove_flag_file_operate_remove_not_fail_d) {
+      main->setting.state.status = (flag & kt_remove_flag_file_operate_remove_fail_d) ? F_status_set_error(F_no) : F_no;
 
       return;
     }
index 4f8c1d44ca34a7b242d0d26a39f8e1ca5e4c66bf..7472293b682ca26eb95e6e2ecc843ebf59e837b1 100644 (file)
@@ -21,8 +21,11 @@ extern "C" {
  *   Must not be NULL.
  *
  *   This alters main.setting.state.status:
- *     F_okay on success.
- *     F_data_not on success but file is an empty string.
+ *     F_yes on success and file remove.
+ *     F_no on success and file not removed.
+ *     F_data_not on success but path is an empty string.
+ *
+ *     F_no (with error bit set) on file not removed due to failure.
  *
  *     Errors (with error bit) from: f_string_dynamic_append().
  *
@@ -55,9 +58,11 @@ extern "C" {
  *   Must not be NULL.
  *
  *   This alters main.setting.state.status:
- *     F_no on success but file is not to be removed.
- *     F_yes on success and file is removed.
+ *     F_yes on success and file remove.
+ *     F_no on success and file not removed.
+ *     F_data_not on success but path is an empty string.
  *
+ *     F_no (with error bit) on failure and file is not to be removed or cannot be removed.
  *     F_recurse (with error bit) on max recursion depth reached.
  *
  *     Errors (with error bit) from: f_file_remove().
@@ -127,6 +132,8 @@ extern "C" {
  *     F_no on success but file is not to be removed.
  *     F_yes on success and file is removed.
  *
+ *     F_no (with error bit) on failure and file is not to be removed or cannot be removed.
+ *
  *     Errors (with error bit) from: f_file_link_read().
  *     Errors (with error bit) from: f_file_remove().
  * @param path
index 4012ed5577b183335c758ab088a485b431e0ef42..112b5c53cdc9912d5fc05e7e7d20f00e73d73eac 100644 (file)
@@ -13,9 +13,11 @@ extern "C" {
 
     if (!(main->setting.flag & kt_remove_main_flag_simulate_d)) return;
 
+    main->setting.state.status = F_okay;
+
     f_file_stream_lock(print->to);
 
-    fl_print_format("%[Files to Remove%]:%r", print->to, print->set->title, print->set->title, f_string_eol_s);
+    fl_print_format("%r%[Files to Remove%]:%r", print->to, f_string_eol_s, print->set->title, print->set->title, f_string_eol_s);
 
     for (f_number_unsigned_t i = 0; i < main->setting.files.used; ++i) {
       fl_print_format("  %Q%r", print->to, main->setting.files.array[i], f_string_eol_s);