]> Kevux Git Server - controller/commitdiff
Progress: Continue migrating the project.
authorKevin Day <Kevin@kevux.org>
Sat, 6 Jul 2024 05:19:58 +0000 (00:19 -0500)
committerKevin Day <Kevin@kevux.org>
Sat, 6 Jul 2024 05:19:58 +0000 (00:19 -0500)
This gets the last of the print functions moved into the print directories and files.

Additional organizational changes may come in the future but for now I am considering the print format re-organization to be complete.

sources/c/main/entry/action.c
sources/c/main/print/error/entry/action.c
sources/c/main/print/error/entry/action.h

index 02e809eadc7a837c383f89b3e887774e048727d7..7aaf080b2de2046b68a092b3159d5fb783aa6bf6 100644 (file)
@@ -179,39 +179,7 @@ extern "C" {
       if (main->thread.cache.content_actions.array[i].used < at_least || main->thread.cache.content_actions.array[i].used > at_most) {
         action->status = controller_status_simplify_error(F_parameter);
 
-        if (main->program.error.verbosity > f_console_verbosity_quiet_e) {
-          f_thread_mutex_lock(&main->thread.lock.print);
-
-          f_file_stream_lock(main->program.error.to);
-
-          fl_print_format("%r%[%QThe %r Item Action '%]", main->program.error.to, f_string_eol_s, main->program.error.context, main->program.error.prefix, entry->flag & controller_entry_flag_is_e ? controller_entry_s : controller_exit_s, main->program.error.context);
-          fl_print_format(f_string_format_Q_single_s.string, main->program.error.to, main->program.error.notable, main->thread.cache.action.name_action, main->program.error.notable);
-          fl_print_format("%[' requires ", main->program.error.to, main->program.error.context);
-
-          if (at_least == at_most) {
-            f_print_terminated("exactly ", main->program.error.to);
-          }
-
-          fl_print_format("%]%[%un%]", main->program.error.to, main->program.error.context, main->program.error.notable, at_least, main->program.error.notable);
-
-          if (action->type == controller_entry_action_type_consider_e || controller_entry_action_type_is_rule(action->type)) {
-            fl_print_format("%[ or more parameters.%]%r", main->program.error.to, main->program.error.context, main->program.error.context, f_string_eol_s);
-          }
-          else {
-            if (at_least == at_most) {
-              fl_print_format("%[ parameters.%]%r", main->program.error.to, main->program.error.context, main->program.error.context, f_string_eol_s);
-            }
-            else {
-              fl_print_format("%[ to %]", main->program.error.to, main->program.error.context, main->program.error.context);
-              fl_print_format("%[%un%]", main->program.error.to, main->program.error.notable, at_most, main->program.error.notable);
-              fl_print_format("%[ parameters.%]%r", main->program.error.to, main->program.error.context, main->program.error.context, f_string_eol_s);
-            }
-          }
-
-          f_file_stream_unlock(main->program.error.to);
-
-          f_thread_mutex_unlock(&main->thread.lock.print);
-        }
+        controller_print_error_entry_action_requires_range(&main->program.error, &main->thread.cache.action, entry->flag & controller_entry_flag_is_e, main->thread.cache.action.name_action, at_least, at_most, action->type);
       }
       else {
         action->status = F_okay;
@@ -295,9 +263,7 @@ extern "C" {
                 status_action = action->status;
               }
 
-              if (main->program.error.verbosity > f_console_verbosity_quiet_e) {
-                fll_print_format("%r%[%QThe %r Item Action must not have an empty string for a path (the first parameter).%]%r", main->program.error.to, f_string_eol_s, main->program.error.context, main->program.error.prefix, entry->flag & controller_entry_flag_is_e ? controller_entry_s : controller_exit_s, main->program.error.context, f_string_eol_s);
-              }
+              controller_print_error_entry_action_parameter_empty(&main->program.error, &main->thread.cache.action, entry->flag & controller_entry_flag_is_e, "first parameter");
             }
 
             if (action->parameters.array[1].used) {
@@ -322,17 +288,7 @@ extern "C" {
               }
               else {
                 if (f_compare_dynamic(action->parameters.array[1], main->thread.cache.buffer_path) == F_equal_to_not) {
-                  if (main->program.error.verbosity > f_console_verbosity_quiet_e) {
-                    f_file_stream_lock(main->program.error.to);
-
-                    fl_print_format("%r%[%QThe %r Item Action second parameter '%]", main->program.error.to, f_string_eol_s, main->program.error.context, main->program.error.prefix, entry->flag & controller_entry_flag_is_e ? controller_entry_s : controller_exit_s, main->program.error.context);
-                    fl_print_format(f_string_format_Q_single_s.string, main->program.error.to, main->program.error.notable, action->parameters.array[1], main->program.error.notable);
-                    fl_print_format("%[' must be a base path name, such as '%]", main->program.error.to, main->program.error.context, main->program.error.context);
-                    fl_print_format(f_string_format_Q_single_s.string, main->program.error.to, main->program.error.notable, main->thread.cache.buffer_path, main->program.error.notable);
-                    fl_print_format(f_string_format_sentence_end_quote_s.string, main->program.error.to, main->program.error.context, main->program.error.context, f_string_eol_s);
-
-                    f_file_stream_unlock(main->program.error.to);
-                  }
+                  controller_print_error_entry_action_parameter_second_base(&main->program.error, &main->thread.cache.action, entry->flag & controller_entry_flag_is_e, action->parameters.array[1], main->thread.cache.buffer_path);
 
                   action->status = controller_status_simplify_error(F_parameter);
 
@@ -349,9 +305,7 @@ extern "C" {
                 status_action = action->status;
               }
 
-              if (main->program.error.verbosity > f_console_verbosity_quiet_e) {
-                fll_print_format("%r%[%QThe %r Item Action must not have an empty string for a rule name (the second parameter).%]", main->program.error.to, f_string_eol_s, main->program.error.context, main->program.error.prefix, entry->flag & controller_entry_flag_is_e ? controller_entry_s : controller_exit_s, main->program.error.context, f_string_eol_s);
-              }
+              controller_print_error_entry_action_parameter_empty(&main->program.error, &main->thread.cache.action, entry->flag & controller_entry_flag_is_e, "second parameter");
             }
 
             for (j = 2; j < action->parameters.used; ++j) {
@@ -374,21 +328,7 @@ extern "C" {
                   }
                 }
 
-                if (main->program.error.verbosity > f_console_verbosity_quiet_e) {
-                  f_file_stream_lock(main->program.error.to);
-
-                  fl_print_format("%r%[%QThe %r Item Action third parameter (and beyond) must be one of '%]", main->program.error.to, f_string_eol_s, main->program.error.context, main->program.error.prefix, entry->flag & controller_entry_flag_is_e ? controller_entry_s : controller_exit_s, main->program.error.context);
-                  fl_print_format(f_string_format_r_single_s.string, main->program.error.to, main->program.error.notable, controller_asynchronous_s, main->program.error.notable);
-                  fl_print_format("%[', '%]", main->program.error.to, main->program.error.context, main->program.error.context);
-                  fl_print_format(f_string_format_r_single_s.string, main->program.error.to, main->program.error.notable, controller_require_s, main->program.error.notable);
-                  fl_print_format("%[', or '%]", main->program.error.to, main->program.error.context, main->program.error.context);
-                  fl_print_format(f_string_format_r_single_s.string, main->program.error.to, main->program.error.notable, controller_wait_s, main->program.error.notable);
-                  fl_print_format("%[' but instead has '%]", main->program.error.to, main->program.error.context, main->program.error.context);
-                  fl_print_format(f_string_format_Q_single_s.string, main->program.error.to, main->program.error.notable, action->parameters.array[j], main->program.error.notable);
-                  fl_print_format(f_string_format_sentence_end_quote_s.string, main->program.error.to, main->program.error.context, main->program.error.context, f_string_eol_s);
-
-                  f_file_stream_unlock(main->program.error.to);
-                }
+                controller_print_error_entry_action_invalid_allow_3(&main->program.error, &main->thread.cache.action, entry->flag & controller_entry_flag_is_e, "third parameter (and beyond)", action->parameters.array[j], controller_asynchronous_s, controller_require_s, controller_wait_s);
               }
             } // for
           }
@@ -400,15 +340,7 @@ extern "C" {
                 status_action = action->status;
               }
 
-              if (main->program.error.verbosity > f_console_verbosity_quiet_e) {
-                f_file_stream_lock(main->program.error.to);
-
-                fl_print_format("%r%[%QThe %r Item Action may not specify the reserved item '%]", main->program.error.to, f_string_eol_s, main->program.error.context, main->program.error.prefix, entry->flag & controller_entry_flag_is_e ? controller_entry_s : controller_exit_s, main->program.error.context);
-                fl_print_format(f_string_format_r_single_s.string, main->program.error.to, main->program.error.notable, controller_main_s, main->program.error.notable);
-                fl_print_format(f_string_format_sentence_end_quote_s.string, main->program.error.to, main->program.error.context, main->program.error.context, f_string_eol_s);
-
-                f_file_stream_unlock(main->program.error.to);
-              }
+              controller_print_error_entry_action_unsupported_reserve(&main->program.error, &main->thread.cache.action, entry->flag & controller_entry_flag_is_e, controller_main_s);
             }
           }
           else if (action->type == controller_entry_action_type_timeout_e) {
@@ -429,21 +361,7 @@ extern "C" {
                 status_action = action->status;
               }
 
-              if (main->program.error.verbosity > f_console_verbosity_quiet_e) {
-                f_file_stream_lock(main->program.error.to);
-
-                fl_print_format("%r%[%QThe %r Item Action must have one of '%]", main->program.error.to, f_string_eol_s, main->program.error.context, main->program.error.prefix, entry->flag & controller_entry_flag_is_e ? controller_entry_s : controller_exit_s, main->program.error.context);
-                fl_print_format(f_string_format_r_single_s.string, main->program.error.to, main->program.error.notable, controller_kill_s, main->program.error.notable);
-                fl_print_format("%[', '%]", main->program.error.to, main->program.error.context, main->program.error.context);
-                fl_print_format(f_string_format_r_single_s.string, main->program.error.to, main->program.error.notable, controller_start_s, main->program.error.notable);
-                fl_print_format("%[', or '%]", main->program.error.to, main->program.error.context, main->program.error.context);
-                fl_print_format(f_string_format_r_single_s.string, main->program.error.to, main->program.error.notable, controller_stop_s, main->program.error.notable);
-                fl_print_format("%[' but instead has '%]", main->program.error.to, main->program.error.context, main->program.error.context);
-                fl_print_format(f_string_format_Q_single_s.string, main->program.error.to, main->program.error.notable, action->parameters.array[0], main->program.error.notable);
-                fl_print_format(f_string_format_sentence_end_quote_s.string, main->program.error.to, main->program.error.context, main->program.error.context, f_string_eol_s);
-
-                f_file_stream_unlock(main->program.error.to);
-              }
+              controller_print_error_entry_action_invalid_allow_3(&main->program.error, &main->thread.cache.action, entry->flag & controller_entry_flag_is_e, 0, action->parameters.array[0], controller_kill_s, controller_start_s, controller_stop_s);
             }
 
             if (action->status == F_okay) {
@@ -486,7 +404,7 @@ extern "C" {
               else {
                 action->status = controller_status_simplify_error(F_support_not);
 
-                controller_print_error_entry_action_invalid_allow_1(&main->program.error, &main->thread.cache.action, entry->flag & controller_entry_flag_is_e, action->parameters.array[0], controller_wait_s);
+                controller_print_error_entry_action_invalid_allow_1(&main->program.error, &main->thread.cache.action, entry->flag & controller_entry_flag_is_e, 0, action->parameters.array[0], controller_wait_s);
               }
             }
           }
index 6555e599d3b170dec736178e1cb6ef7c1b2e9237..e6f65ac949211a24a24cd2364cbaa5d4d8363fae 100644 (file)
@@ -49,7 +49,7 @@ extern "C" {
 #endif // _di_controller_print_error_entry_action_execution_missing_
 
 #ifndef _di_controller_print_error_entry_action_invalid_allow_1_
-  f_status_t controller_print_error_entry_action_invalid_allow_1(fl_print_t * const print, controller_cache_action_t * const action, const uint8_t is_entry, const f_string_static_t has, const f_string_static_t allow) {
+  f_status_t controller_print_error_entry_action_invalid_allow_1(fl_print_t * const print, controller_cache_action_t * const action, const uint8_t is_entry, const f_string_t message, const f_string_static_t has, const f_string_static_t allow) {
 
     if (!print || !print->custom || !action) return F_status_set_error(F_output_not);
     if (print->verbosity < f_console_verbosity_error_e) return F_output_not;
@@ -58,7 +58,14 @@ extern "C" {
 
     controller_lock_print(print->to, &main->thread);
 
-    fl_print_format("%r%[%QThe %r Item Action may only have '%]", print->to, f_string_eol_s, print->context, print->prefix, is_entry ? controller_entry_s : controller_exit_s, print->context);
+    fl_print_format("%r%[%QThe %r Item Action ", print->to, f_string_eol_s, print->context, print->prefix, is_entry ? controller_entry_s : controller_exit_s, print->context);
+
+    if (!message) {
+      fl_print_format("%S ", print->to, message);
+    }
+
+    fl_print_format("may only have one '%]", print->to, print->context);
+
     fl_print_format(f_string_format_Q_single_s.string, print->to, print->notable, allow, print->notable);
     fl_print_format("%[' but instead has '%]", print->to, print->context, print->context);
     fl_print_format(f_string_format_Q_single_s.string, print->to, print->notable, has, print->notable);
@@ -73,7 +80,7 @@ extern "C" {
 #endif // _di_controller_print_error_entry_action_invalid_allow_1_
 
 #ifndef _di_controller_print_error_entry_action_invalid_allow_3_
-  f_status_t controller_print_error_entry_action_invalid_allow_3(fl_print_t * const print, controller_cache_action_t * const action, const uint8_t is_entry, const f_string_static_t has, const f_string_static_t allow_1, const f_string_static_t allow_2, const f_string_static_t allow_3) {
+  f_status_t controller_print_error_entry_action_invalid_allow_3(fl_print_t * const print, controller_cache_action_t * const action, const uint8_t is_entry, const f_string_t message, const f_string_static_t has, const f_string_static_t allow_1, const f_string_static_t allow_2, const f_string_static_t allow_3) {
 
     if (!print || !print->custom || !action) return F_status_set_error(F_output_not);
     if (print->verbosity < f_console_verbosity_error_e) return F_output_not;
@@ -82,7 +89,13 @@ extern "C" {
 
     controller_lock_print(print->to, &main->thread);
 
-    fl_print_format("%r%[%QThe %r Item Action must have one of '%]", print->to, f_string_eol_s, print->context, print->prefix, is_entry ? controller_entry_s : controller_exit_s, print->context);
+    fl_print_format("%r%[%QThe %r Item Action ", print->to, f_string_eol_s, print->context, print->prefix, is_entry ? controller_entry_s : controller_exit_s, print->context);
+
+    if (!message) {
+      fl_print_format("%S ", print->to, message);
+    }
+
+    fl_print_format("may only have one of '%]", print->to, print->context);
     fl_print_format(f_string_format_r_single_s.string, print->to, print->notable, allow_1, print->notable);
     fl_print_format("%[', '%]", print->to, print->context, print->context);
     fl_print_format(f_string_format_r_single_s.string, print->to, print->notable, allow_2, print->notable);
@@ -100,6 +113,93 @@ extern "C" {
   }
 #endif // _di_controller_print_error_entry_action_invalid_allow_3_
 
+#ifndef _di_controller_print_error_entry_action_parameter_empty_
+  f_status_t controller_print_error_entry_action_parameter_empty(fl_print_t * const print, controller_cache_action_t * const action, const uint8_t is_entry, const f_string_t message) {
+
+    if (!print || !print->custom || !action) return F_status_set_error(F_output_not);
+    if (print->verbosity < f_console_verbosity_error_e) return F_output_not;
+
+    controller_t * const main = (controller_t *) print->custom;
+
+    controller_lock_print(print->to, &main->thread);
+
+    fl_print_format("%r%[%QThe %r Item Action %S must not be an empty string.%]", print->to, f_string_eol_s, print->context, print->prefix, is_entry ? controller_entry_s : controller_exit_s, message, print->context);
+
+    controller_print_error_entry_cache(print, action, is_entry);
+
+    controller_unlock_print_flush(print->to, &main->thread);
+
+    return F_okay;
+  }
+#endif // _di_controller_print_error_entry_action_parameter_empty_
+
+#ifndef _di_controller_print_error_entry_action_parameter_second_base_
+  f_status_t controller_print_error_entry_action_parameter_second_base(fl_print_t * const print, controller_cache_action_t * const action, const uint8_t is_entry, const f_string_static_t has, const f_string_static_t example) {
+
+    if (!print || !print->custom || !action) return F_status_set_error(F_output_not);
+    if (print->verbosity < f_console_verbosity_error_e) return F_output_not;
+
+    controller_t * const main = (controller_t *) print->custom;
+
+    controller_lock_print(print->to, &main->thread);
+
+    fl_print_format("%r%[%QThe %r Item Action second parameter '%]", print->to, f_string_eol_s, print->context, print->prefix, is_entry ? controller_entry_s : controller_exit_s, print->context);
+    fl_print_format(f_string_format_Q_single_s.string, print->to, print->notable, has, print->notable);
+    fl_print_format("%[' must be a base path name, such as '%]", print->to, print->context, print->context);
+    fl_print_format(f_string_format_Q_single_s.string, print->to, print->notable, example, print->notable);
+    fl_print_format(f_string_format_sentence_end_quote_s.string, print->to, print->context, print->context, f_string_eol_s);
+
+    controller_print_error_entry_cache(print, action, is_entry);
+
+    controller_unlock_print_flush(print->to, &main->thread);
+
+    return F_okay;
+  }
+#endif // _di_controller_print_error_entry_action_parameter_second_base_
+
+#ifndef _di_controller_print_error_entry_action_requires_range_
+  f_status_t controller_print_error_entry_action_requires_range(fl_print_t * const print, controller_cache_action_t * const action, const uint8_t is_entry, const f_string_static_t name, const f_number_unsigned_t at_least, const f_number_unsigned_t at_most, const uint8_t type) {
+
+    if (!print || !print->custom || !action) return F_status_set_error(F_output_not);
+    if (print->verbosity < f_console_verbosity_error_e) return F_output_not;
+
+    controller_t * const main = (controller_t *) print->custom;
+
+    controller_lock_print(print->to, &main->thread);
+
+    fl_print_format("%r%[%QThe %r Item Action '%]", print->to, f_string_eol_s, print->context, print->prefix, is_entry ? controller_entry_s : controller_exit_s, print->context);
+    fl_print_format(f_string_format_Q_single_s.string, print->to, print->notable, name, print->notable);
+    fl_print_format("%[' requires ", print->to, print->context);
+
+    if (at_least == at_most) {
+      f_print_terminated("exactly ", print->to);
+    }
+
+    fl_print_format(f_string_format_bracket_close_s.string, print->to, print->context);
+    fl_print_format(f_string_format_un_single_s.string, print->to, print->notable, at_least, print->notable);
+
+    if (type == controller_entry_action_type_consider_e || controller_entry_action_type_is_rule(type)) {
+      fl_print_format("%[ or more parameters.%]%r", print->to, print->context, print->context, f_string_eol_s);
+    }
+    else {
+      if (at_least == at_most) {
+        fl_print_format("%[ parameters.%]%r", print->to, print->context, print->context, f_string_eol_s);
+      }
+      else {
+        fl_print_format("%[ to %]", print->to, print->context, print->context);
+        fl_print_format(f_string_format_un_single_s.string, print->to, print->notable, at_most, print->notable);
+        fl_print_format("%[ parameters.%]%r", print->to, print->context, print->context, f_string_eol_s);
+      }
+    }
+
+    controller_print_error_entry_cache(print, action, is_entry);
+
+    controller_unlock_print_flush(print->to, &main->thread);
+
+    return F_okay;
+  }
+#endif // _di_controller_print_error_entry_action_requires_range_
+
 #ifndef _di_controller_print_error_entry_action_unsupported_number_
   f_status_t controller_print_error_entry_action_unsupported_number(fl_print_t * const print, controller_cache_action_t * const action, const uint8_t is_entry, const f_string_static_t has) {
 
@@ -122,6 +222,28 @@ extern "C" {
   }
 #endif // _di_controller_print_error_entry_action_unsupported_number_
 
+#ifndef _di_controller_print_error_entry_action_unsupported_reserve_
+  f_status_t controller_print_error_entry_action_unsupported_reserve(fl_print_t * const print, controller_cache_action_t * const action, const uint8_t is_entry, const f_string_static_t item) {
+
+    if (!print || !print->custom || !action) return F_status_set_error(F_output_not);
+    if (print->verbosity < f_console_verbosity_error_e) return F_output_not;
+
+    controller_t * const main = (controller_t *) print->custom;
+
+    controller_lock_print(print->to, &main->thread);
+
+    fl_print_format("%r%[%QThe %r Item Action may not specify the reserved item '%]", print->to, f_string_eol_s, print->context, print->prefix, is_entry ? controller_entry_s : controller_exit_s, print->context);
+    fl_print_format(f_string_format_r_single_s.string, print->to, print->notable, item, print->notable);
+    fl_print_format(f_string_format_sentence_end_quote_s.string, print->to, print->context, print->context, f_string_eol_s);
+
+    controller_print_error_entry_cache(print, action, is_entry);
+
+    controller_unlock_print_flush(print->to, &main->thread);
+
+    return F_okay;
+  }
+#endif // _di_controller_print_error_entry_action_unsupported_reserve_
+
 #ifdef __cplusplus
 } // extern "C"
 #endif
index 32ceebf601e38b042e45af7c1cfc8d6593412f90..43c7e4d2e487fa75f55e0cbf1aafe13a59d33a0e 100644 (file)
@@ -98,6 +98,10 @@ extern "C" {
  * @param is_entry
  *   If TRUE, then this loads as an entry.
  *   If FALSE, then this loads as an exit.
+ * @param message
+ *   (optional) An additional message to add.
+ *
+ *   Set to NULL to not use.
  * @param has
  *   The invalid value that is not supported.
  * @param allow
@@ -110,7 +114,7 @@ extern "C" {
  *   F_output_not (with error bit) if setting is NULL.
  */
 #ifndef _di_controller_print_error_entry_action_invalid_allow_1_
-  extern f_status_t controller_print_error_entry_action_invalid_allow_1(fl_print_t * const print, controller_cache_action_t * const action, const uint8_t is_entry, const f_string_static_t has, const f_string_static_t allow);
+  extern f_status_t controller_print_error_entry_action_invalid_allow_1(fl_print_t * const print, controller_cache_action_t * const action, const uint8_t is_entry, const f_string_t message, const f_string_static_t has, const f_string_static_t allow);
 #endif // _di_controller_print_error_entry_action_invalid_allow_1_
 
 /**
@@ -133,6 +137,10 @@ extern "C" {
  * @param is_entry
  *   If TRUE, then this loads as an entry.
  *   If FALSE, then this loads as an exit.
+ * @param message
+ *   (optional) An additional message to add.
+ *
+ *   Set to NULL to not use.
  * @param has
  *   The invalid value that is not supported.
  * @param allow_1
@@ -149,10 +157,111 @@ extern "C" {
  *   F_output_not (with error bit) if setting is NULL.
  */
 #ifndef _di_controller_print_error_entry_action_invalid_allow_3_
-  extern f_status_t controller_print_error_entry_action_invalid_allow_3(fl_print_t * const print, controller_cache_action_t * const action, const uint8_t is_entry, const f_string_static_t has, const f_string_static_t allow_1, const f_string_static_t allow_2, const f_string_static_t allow_3);
+  extern f_status_t controller_print_error_entry_action_invalid_allow_3(fl_print_t * const print, controller_cache_action_t * const action, const uint8_t is_entry, const f_string_t message, const f_string_static_t has, const f_string_static_t allow_1, const f_string_static_t allow_2, const f_string_static_t allow_3);
 #endif // _di_controller_print_error_entry_action_invalid_allow_3_
 
 /**
+ * Print an error when an Item Action parameter is empty.
+ *
+ * @param print
+ *   The output structure to print to.
+ *
+ *   This requires print.custom to be controller_t.
+ *
+ *   This does not alter print.custom.setting.state.status.
+ *
+ *   Must not be NULL.
+ * @param action
+ *   The Action cache.
+ *
+ *   Must not be NULL.
+ * @param is_entry
+ *   If TRUE, then this loads as an entry.
+ *   If FALSE, then this loads as an exit.
+ * @param message
+ *   A message describing which parameter is empty.
+ *
+ * @return
+ *   F_okay on success.
+ *   F_output_not on success, but no printing is performed.
+ *
+ *   F_output_not (with error bit) if setting is NULL.
+ */
+#ifndef _di_controller_print_error_entry_action_parameter_empty_
+  extern f_status_t controller_print_error_entry_action_parameter_empty(fl_print_t * const print, controller_cache_action_t * const action, const uint8_t is_entry, const f_string_t message);
+#endif // _di_controller_print_error_entry_action_parameter_empty_
+
+/**
+ * Print an error when an Item Action second parameter is not a base path name.
+ *
+ * @param print
+ *   The output structure to print to.
+ *
+ *   This requires print.custom to be controller_t.
+ *
+ *   This does not alter print.custom.setting.state.status.
+ *
+ *   Must not be NULL.
+ * @param action
+ *   The Action cache.
+ *
+ *   Must not be NULL.
+ * @param is_entry
+ *   If TRUE, then this loads as an entry.
+ *   If FALSE, then this loads as an exit.
+ * @param has
+ *   The second parameter value.
+ * @param example
+ *   An example of a valid base path name.
+ *
+ * @return
+ *   F_okay on success.
+ *   F_output_not on success, but no printing is performed.
+ *
+ *   F_output_not (with error bit) if setting is NULL.
+ */
+#ifndef _di_controller_print_error_entry_action_parameter_second_base_
+  extern f_status_t controller_print_error_entry_action_parameter_second_base(fl_print_t * const print, controller_cache_action_t * const action, const uint8_t is_entry, const f_string_static_t has, const f_string_static_t example);
+#endif // _di_controller_print_error_entry_action_parameter_second_base_
+
+/**
+ * Print an error when an Item Action requires a given range for the number.
+ *
+ * @param print
+ *   The output structure to print to.
+ *
+ *   This requires print.custom to be controller_t.
+ *
+ *   This does not alter print.custom.setting.state.status.
+ *
+ *   Must not be NULL.
+ * @param action
+ *   The Action cache.
+ *
+ *   Must not be NULL.
+ * @param is_entry
+ *   If TRUE, then this loads as an entry.
+ *   If FALSE, then this loads as an exit.
+ * @param name
+ *   The Action name.
+ * @param at_least
+ *   The minimum number that is allowed.
+ * @param at_most
+ *   The maximum number that is allowed.
+ * @param type
+ *   The Action type code.
+ *
+ * @return
+ *   F_okay on success.
+ *   F_output_not on success, but no printing is performed.
+ *
+ *   F_output_not (with error bit) if setting is NULL.
+ */
+#ifndef _di_controller_print_error_entry_action_requires_range_
+  extern f_status_t controller_print_error_entry_action_requires_range(fl_print_t * const print, controller_cache_action_t * const action, const uint8_t is_entry, const f_string_static_t name, const f_number_unsigned_t at_least, const f_number_unsigned_t at_most, const uint8_t type);
+#endif // _di_controller_print_error_entry_action_requires_range_
+
+/**
  * Print an error when an Item Action is not a valid number.
  *
  * @param print
@@ -183,6 +292,37 @@ extern "C" {
   extern f_status_t controller_print_error_entry_action_unsupported_number(fl_print_t * const print, controller_cache_action_t * const action, const uint8_t is_entry, const f_string_static_t has);
 #endif // _di_controller_print_error_entry_action_unsupported_number_
 
+/**
+ * Print an error when an Item Action is using a reserved item, which is not allowed.
+ *
+ * @param print
+ *   The output structure to print to.
+ *
+ *   This requires print.custom to be controller_t.
+ *
+ *   This does not alter print.custom.setting.state.status.
+ *
+ *   Must not be NULL.
+ * @param action
+ *   The Action cache.
+ *
+ *   Must not be NULL.
+ * @param is_entry
+ *   If TRUE, then this loads as an entry.
+ *   If FALSE, then this loads as an exit.
+ * @param item
+ *   The reserved item that is not allowed to be used.
+ *
+ * @return
+ *   F_okay on success.
+ *   F_output_not on success, but no printing is performed.
+ *
+ *   F_output_not (with error bit) if setting is NULL.
+ */
+#ifndef _di_controller_print_error_entry_action_unsupported_reserve_
+  extern f_status_t controller_print_error_entry_action_unsupported_reserve(fl_print_t * const print, controller_cache_action_t * const action, const uint8_t is_entry, const f_string_static_t item);
+#endif // _di_controller_print_error_entry_action_unsupported_reserve_
+
 #ifdef __cplusplus
 } // extern "C"
 #endif