]> Kevux Git Server - fll/commitdiff
Progress: start getting FSS, as well as other programs, more consistent.
authorKevin Day <thekevinday@gmail.com>
Mon, 21 Sep 2020 05:19:07 +0000 (00:19 -0500)
committerKevin Day <thekevinday@gmail.com>
Mon, 21 Sep 2020 05:19:07 +0000 (00:19 -0500)
I ended up liking how I made iki_write better than how I made the fss write functions.
Work began to make these more similar and consistent and I stumbled on some other things that need to be centralized.

This would be the verbosity options and parameter decision making.
This includes related changes.

I also noticed that I started working on the "++status" parameter idea but left it very incomplete.
This formalizes the basic plan where I will instead have a "++status_in" and a "++status_out".
This should be very useful for having programs return status codes as well as read those via environment variables given than the status code the Linux code uses reserves the higher order bits for process signals.
It would be too risky and likely buggy to mix my internal status code system with the standard Linux signal/error status code design.
A sting can be read very easily in an environment variable and converted to the appropriate uint16_t digit.

The work in regards to making FSS and other programs more consistent is incompletely and will likely result in uncompilable code with this commit.

31 files changed:
level_0/f_console/c/console-common.h
level_3/byte_dump/c/byte_dump.c
level_3/byte_dump/c/byte_dump.h
level_3/fake/c/fake.c
level_3/fake/c/fake.h
level_3/firewall/c/firewall.c
level_3/firewall/c/firewall.h
level_3/fss_basic_list_read/c/fss_basic_list_read.c
level_3/fss_basic_list_read/c/fss_basic_list_read.h
level_3/fss_basic_list_write/c/fss_basic_list_write.c
level_3/fss_basic_list_write/c/fss_basic_list_write.h
level_3/fss_basic_read/c/fss_basic_read.c
level_3/fss_basic_read/c/fss_basic_read.h
level_3/fss_basic_write/c/fss_basic_write.c
level_3/fss_basic_write/c/fss_basic_write.h
level_3/fss_extended_list_read/c/fss_extended_list_read.c
level_3/fss_extended_list_read/c/fss_extended_list_read.h
level_3/fss_extended_read/c/fss_extended_read.c
level_3/fss_extended_read/c/fss_extended_read.h
level_3/fss_extended_write/c/fss_extended_write.c
level_3/fss_extended_write/c/fss_extended_write.h
level_3/fss_status_code/c/fss_status_code.c
level_3/fss_status_code/c/fss_status_code.h
level_3/iki_read/c/iki_read.c
level_3/iki_read/c/iki_read.h
level_3/iki_write/c/iki_write.c
level_3/iki_write/c/iki_write.h
level_3/init/c/init.c
level_3/init/c/init.h
level_3/status_code/c/status_code.c
level_3/status_code/c/status_code.h

index a5dc61bb131bd6bfa8eda0ad84148e0f715ac55d..5a9047331fa6e02c58dcf1085e4085703c443929 100644 (file)
@@ -68,8 +68,12 @@ extern "C" {
  * It is acceptable for any of these options, when specified multiple times, for that number of times to represent the "level".
  * For example, a "+D +D" means more debug output than simply "+D".
  *
- * The following options are subjective in interpretation but are expected to follow the general interpretation:
+ * The verbosity interpretation used as the default for many of the level 3 programs in this process, is to treat verbosity modes as a scale from quiet to debug with quiet as the least verbose and debug as the most verbose.
+ * This is not stricly a requirement, but expect level 3 projects to work this way.
+ *
+ * The following options are subjective in interpretation of the verbosity but are expected to be follow the general interpretation:
  * - debug: Enable debugging, which will likely increase output verbosity.
+ * - normal: Use normal printing (don't use debug/quiet/verbose).
  * - quiet: Decrease verbosity, print less, in some use cases this could mean printing nothing.
  * - verbose: Increase verbosity, print more, in some use cases this could mean printing just about everything.
  *
@@ -81,50 +85,62 @@ extern "C" {
  * - version: Should always print only the version number, no colors, but what represents the version number is undefined by this project.
  *
  * The following options are for special purposes:
- * - status: Represents the return status code from another program.
- *           Because it is associated with the status from another program, its structure is very subjective.
- *           The only expectation is that it somehow communicates the fss status codes.
- *           Example of complex use: "failed_program_name:error:123".
- *           Example of simple use: "123".
+ * - status_in: Is intended to accept the name of an environment variable in which to read the status from.
+ * - status_out: Is intended to accept the name of an environment variable in which to ride the status to.
+ *
+ * In the case of "status_in" and "status_out", the environment variable will store a string representing the base-10 unsigned 16-bit status code.
+ * - In the case of "status_in" the environment variable is being read in, which means that it should be the status from some previous execution.
+ * - In the case of "status_out" the environment variable is being written to, which means that it should store the status this program exits with.
+ *   - To avoid problems with the status code after a program is forcibly killed, the status_out environment variable should be cleared at program start.
  */
 #ifndef _di_f_standard_console_parameters_
-  #define f_console_standard_short_dark     "d"
-  #define f_console_standard_short_debug    "D"
-  #define f_console_standard_short_help     "h"
-  #define f_console_standard_short_light    "l"
-  #define f_console_standard_short_no_color "n"
-  #define f_console_standard_short_quiet    "q"
-  #define f_console_standard_short_verbose  "V"
-  #define f_console_standard_short_version  "v"
-
-  #define f_console_standard_short_dark_length     1
-  #define f_console_standard_short_debug_length    1
-  #define f_console_standard_short_help_length     1
-  #define f_console_standard_short_light_length    1
-  #define f_console_standard_short_no_color_length 1
-  #define f_console_standard_short_quiet_length    1
-  #define f_console_standard_short_verbose_length  1
-  #define f_console_standard_short_version_length  1
-
-  #define f_console_standard_long_dark     "dark"
-  #define f_console_standard_long_debug    "debug"
-  #define f_console_standard_long_help     "help"
-  #define f_console_standard_long_light    "light"
-  #define f_console_standard_long_no_color "no_color"
-  #define f_console_standard_long_status   "status"
-  #define f_console_standard_long_quiet    "quiet"
-  #define f_console_standard_long_verbose  "verbose"
-  #define f_console_standard_long_version  "version"
-
-  #define f_console_standard_long_dark_length     4
-  #define f_console_standard_long_debug_length    5
-  #define f_console_standard_long_help_length     4
-  #define f_console_standard_long_light_length    5
-  #define f_console_standard_long_no_color_length 8
-  #define f_console_standard_long_status_length   6
-  #define f_console_standard_long_quiet_length    5
-  #define f_console_standard_long_verbose_length  7
-  #define f_console_standard_long_version_length  7
+  #define f_console_standard_short_dark       "d"
+  #define f_console_standard_short_debug      "D"
+  #define f_console_standard_short_help       "h"
+  #define f_console_standard_short_light      "l"
+  #define f_console_standard_short_no_color   "n"
+  #define f_console_standard_short_normal     "N"
+  #define f_console_standard_short_quiet      "q"
+  #define f_console_standard_short_status_in  "s"
+  #define f_console_standard_short_status_out "S"
+  #define f_console_standard_short_verbose    "V"
+  #define f_console_standard_short_version    "v"
+
+  #define f_console_standard_short_dark_length       1
+  #define f_console_standard_short_debug_length      1
+  #define f_console_standard_short_help_length       1
+  #define f_console_standard_short_light_length      1
+  #define f_console_standard_short_no_color_length   1
+  #define f_console_standard_short_normal_length     1
+  #define f_console_standard_short_quiet_length      1
+  #define f_console_standard_short_status_in_length  1
+  #define f_console_standard_short_status_out_length 1
+  #define f_console_standard_short_verbose_length    1
+  #define f_console_standard_short_version_length    1
+
+  #define f_console_standard_long_dark       "dark"
+  #define f_console_standard_long_debug      "debug"
+  #define f_console_standard_long_help       "help"
+  #define f_console_standard_long_light      "light"
+  #define f_console_standard_long_no_color   "no_color"
+  #define f_console_standard_long_normal     "normal"
+  #define f_console_standard_long_quiet      "quiet"
+  #define f_console_standard_long_status_in  "status_in"
+  #define f_console_standard_long_status_out "status_out"
+  #define f_console_standard_long_verbose    "verbose"
+  #define f_console_standard_long_version    "version"
+
+  #define f_console_standard_long_dark_length       4
+  #define f_console_standard_long_debug_length      5
+  #define f_console_standard_long_help_length       4
+  #define f_console_standard_long_light_length      5
+  #define f_console_standard_long_no_color_length   8
+  #define f_console_standard_long_normal_length     6
+  #define f_console_standard_long_quiet_length      5
+  #define f_console_standard_long_status_in_length  9
+  #define f_console_standard_long_status_out_length 10
+  #define f_console_standard_long_verbose_length    7
+  #define f_console_standard_long_version_length    7
 #endif // _di_f_standard_console_parameters_
 
 /**
@@ -225,6 +241,8 @@ extern "C" {
   } f_console_parameter_t;
 
   #define f_console_parameter_t_initialize(symbol_short, symbol_long, symbol_other, has_additional, type_value) { symbol_short, symbol_long, symbol_other, has_additional, type_value, f_console_result_none, 0, 0, 0, f_string_lengths_t_initialize, f_string_lengths_t_initialize }
+
+  #define f_macro_console_parameter_t_initialize(symbol_short, symbol_long, symbol_other, has_additional, type_value, result, total, location, location_sub, locations, additional) { symbol_short, symbol_long, symbol_other, has_additional, type_value, result, total, location, location_sub, locations, additional }
 #endif // _di_f_console_parameter_t_
 
 /**
@@ -244,6 +262,8 @@ extern "C" {
   } f_console_parameters_t;
 
   #define f_console_parameters_t_initialize { 0, 0 }
+
+  #define f_macro_console_parameters_t_initialize(parameter, used) { parameter, used }
 #endif // _di_f_console_parameters_t_
 
 /**
@@ -265,6 +285,8 @@ extern "C" {
   } f_console_parameter_ids_t;
 
   #define f_console_parameter_ids_t_initialize { 0, 0 }
+
+  #define f_macro_console_parameter_ids_t_initialize(id, used) { id, used }
 #endif // _di_f_console_parameter_id_t_
 
 /**
@@ -280,6 +302,10 @@ extern "C" {
 
     const f_string_t *argv;
   } f_console_arguments_t;
+
+  #define f_console_arguments_t_initialize { 0, 0 }
+
+  #define f_macro_console_arguments_t_initialize(argc, argv) { argc, argv }
 #endif // _di_f_console_arguments_t_
 
 #ifdef __cplusplus
index 0797cb3a8acb896300a28d48f399fe7c66283141..79d779155493a1e45316c739186fae6ad3b4c5e3 100644 (file)
@@ -10,11 +10,15 @@ extern "C" {
 
     fll_program_print_help_header(context, byte_dump_name_long, byte_dump_version);
 
-    fll_program_print_help_option(context, f_console_standard_short_help, f_console_standard_long_help, f_console_symbol_short_enable, f_console_symbol_long_enable, "       Print this help message.");
-    fll_program_print_help_option(context, f_console_standard_short_light, f_console_standard_long_light, f_console_symbol_short_disable, f_console_symbol_long_disable, "      Output using colors that show up better on light backgrounds.");
-    fll_program_print_help_option(context, f_console_standard_short_dark, f_console_standard_long_dark, f_console_symbol_short_disable, f_console_symbol_long_disable, "       Output using colors that show up better on dark backgrounds.");
-    fll_program_print_help_option(context, f_console_standard_short_no_color, f_console_standard_long_no_color, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Do not output in color.");
-    fll_program_print_help_option(context, f_console_standard_short_version, f_console_standard_long_version, f_console_symbol_short_disable, f_console_symbol_long_disable, "    Print only the version number.");
+    fll_program_print_help_option(context, f_console_standard_short_help, f_console_standard_long_help, f_console_symbol_short_enable, f_console_symbol_long_enable, "    Print this help message.");
+    fll_program_print_help_option(context, f_console_standard_short_dark, f_console_standard_long_dark, f_console_symbol_short_disable, f_console_symbol_long_disable, "    Output using colors that show up better on dark backgrounds.");
+    fll_program_print_help_option(context, f_console_standard_short_light, f_console_standard_long_light, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Output using colors that show up better on light backgrounds.");
+    fll_program_print_help_option(context, f_console_standard_short_no_color, f_console_standard_long_no_color, f_console_symbol_short_disable, f_console_symbol_long_disable, "Do not output in color.");
+    fll_program_print_help_option(context, f_console_standard_short_quiet, f_console_standard_long_quiet, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Decrease verbosity beyond normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_normal, f_console_standard_long_normal, f_console_symbol_short_disable, f_console_symbol_long_disable, "  Set verbosity to normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_verbose, f_console_standard_long_verbose, f_console_symbol_short_disable, f_console_symbol_long_disable, " Increase verbosity beyond normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_debug, f_console_standard_long_debug, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Enable debugging, inceasing verbosity beyond normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_version, f_console_standard_long_version, f_console_symbol_short_disable, f_console_symbol_long_disable, " Print only the version number.");
 
     printf("%c", f_string_eol[0]);
 
@@ -74,15 +78,12 @@ extern "C" {
     f_status_t status = F_none;
 
     {
-      const f_console_parameters_t parameters = { data->parameters, byte_dump_total_parameters };
-      f_console_parameter_ids_t choices = f_console_parameter_ids_t_initialize;
+      const f_console_parameters_t parameters = f_macro_console_parameters_t_initialize(data->parameters, byte_dump_total_parameters);
 
       // Identify priority of color parameters.
       {
         f_console_parameter_id_t ids[3] = { byte_dump_parameter_no_color, byte_dump_parameter_light, byte_dump_parameter_dark };
-
-        choices.id = ids;
-        choices.used = 3;
+        const f_console_parameter_ids_t choices = f_macro_console_parameter_ids_t_initialize(ids, 3);
 
         status = fll_program_parameter_process(arguments, parameters, choices, F_true, &data->remaining, &data->context);
 
@@ -94,13 +95,38 @@ extern "C" {
         status = F_none;
       }
 
+      // Identify priority of verbosity related parameters.
+      {
+        f_console_parameter_id_t ids[4] = { byte_dump_parameter_verbosity_quiet, byte_dump_parameter_verbosity_normal, byte_dump_parameter_verbosity_verbose, byte_dump_parameter_verbosity_debug };
+        f_console_parameter_id_t choice = 0;
+        const f_console_parameter_ids_t choices = f_macro_console_parameter_ids_t_initialize(ids, 4);
+
+        status = f_console_parameter_prioritize_right(parameters, choices, &choice);
+
+        if (F_status_is_error(status)) {
+          byte_dump_delete_data(data);
+          return status;
+        }
+
+        if (choice == byte_dump_parameter_verbosity_quiet) {
+          data->verbosity = f_console_verbosity_quiet;
+        }
+        else if (choice == byte_dump_parameter_verbosity_normal) {
+          data->verbosity = f_console_verbosity_normal;
+        }
+        else if (choice == byte_dump_parameter_verbosity_verbose) {
+          data->verbosity = f_console_verbosity_verbose;
+        }
+        else if (choice == byte_dump_parameter_verbosity_debug) {
+          data->verbosity = f_console_verbosity_debug;
+        }
+      }
+
       // Identify priority of mode parameters.
       {
         f_console_parameter_id_t ids[5] = { byte_dump_parameter_hexidecimal, byte_dump_parameter_duodecimal, byte_dump_parameter_octal, byte_dump_parameter_binary, byte_dump_parameter_decimal };
         f_console_parameter_id_t choice = byte_dump_parameter_hexidecimal;
-
-        choices.id = ids;
-        choices.used = 5;
+        const f_console_parameter_ids_t choices = f_macro_console_parameter_ids_t_initialize(ids, 5);
 
         status = f_console_parameter_prioritize_right(parameters, choices, &choice);
 
@@ -130,9 +156,7 @@ extern "C" {
       {
         f_console_parameter_id_t ids[3] = { byte_dump_parameter_normal, byte_dump_parameter_simple, byte_dump_parameter_classic };
         f_console_parameter_id_t choice = byte_dump_parameter_normal;
-
-        choices.id = ids;
-        choices.used = 3;
+        const f_console_parameter_ids_t choices = f_macro_console_parameter_ids_t_initialize(ids, 3);
 
         status = f_console_parameter_prioritize_right(parameters, choices, &choice);
 
@@ -151,17 +175,25 @@ extern "C" {
           data->presentation = byte_dump_presentation_classic;
         }
       }
-    }
 
-    status = F_none;
+      status = F_none;
+    }
 
     if (data->parameters[byte_dump_parameter_help].result == f_console_result_found) {
       byte_dump_print_help(data->context);
+
+      byte_dump_delete_data(data);
+      return F_none;
     }
-    else if (data->parameters[byte_dump_parameter_version].result == f_console_result_found) {
+
+    if (data->parameters[byte_dump_parameter_version].result == f_console_result_found) {
       fll_program_print_version(byte_dump_version);
+
+      byte_dump_delete_data(data);
+      return F_none;
     }
-    else if (data->remaining.used > 0 || data->process_pipe) {
+
+    if (data->remaining.used > 0 || data->process_pipe) {
       if (data->parameters[byte_dump_parameter_width].result == f_console_result_found) {
         fl_color_print(f_type_error, data->context.set.error, "ERROR: The parameter '");
         fl_color_print(f_type_error, data->context.set.notable, "%s%s", f_console_symbol_long_enable, byte_dump_long_width);
index 9a369af52a8c835225a5c6d53681edb8505315b4..88617a7790f4c0e994e170504ff22a89230c9a1a 100644 (file)
@@ -153,6 +153,10 @@ extern "C" {
     byte_dump_parameter_light,
     byte_dump_parameter_dark,
     byte_dump_parameter_no_color,
+    byte_dump_parameter_verbosity_quiet,
+    byte_dump_parameter_verbosity_normal,
+    byte_dump_parameter_verbosity_verbose,
+    byte_dump_parameter_verbosity_debug,
     byte_dump_parameter_version,
 
     byte_dump_parameter_binary,
@@ -179,6 +183,10 @@ extern "C" {
       f_console_parameter_t_initialize(f_console_standard_short_light, f_console_standard_long_light, 0, 0, f_console_type_inverse), \
       f_console_parameter_t_initialize(f_console_standard_short_dark, f_console_standard_long_dark, 0, 0, f_console_type_inverse), \
       f_console_parameter_t_initialize(f_console_standard_short_no_color, f_console_standard_long_no_color, 0, 0, f_console_type_inverse), \
+      f_console_parameter_t_initialize(f_console_standard_short_quiet, f_console_standard_long_quiet, 0, 0, f_console_type_inverse), \
+      f_console_parameter_t_initialize(f_console_standard_short_normal, f_console_standard_long_normal, 0, 0, f_console_type_inverse), \
+      f_console_parameter_t_initialize(f_console_standard_short_verbose, f_console_standard_long_verbose, 0, 0, f_console_type_inverse), \
+      f_console_parameter_t_initialize(f_console_standard_short_debug, f_console_standard_long_debug, 0, 0, f_console_type_inverse), \
       f_console_parameter_t_initialize(f_console_standard_short_version, f_console_standard_long_version, 0, 0, f_console_type_inverse), \
       f_console_parameter_t_initialize(byte_dump_short_binary, byte_dump_long_binary, 0, 0, f_console_type_normal), \
       f_console_parameter_t_initialize(byte_dump_short_decimal, byte_dump_long_decimal, 0, 0, f_console_type_normal), \
@@ -195,7 +203,7 @@ extern "C" {
       f_console_parameter_t_initialize(0, byte_dump_long_classic, 0, 0, f_console_type_normal), \
     }
 
-  #define byte_dump_total_parameters 18
+  #define byte_dump_total_parameters 22
 #endif // _di_byte_dump_defines_
 
 #ifndef _di_byte_dump_data_t_
@@ -205,6 +213,8 @@ extern "C" {
     f_string_lengths_t remaining;
     bool process_pipe;
 
+    uint8_t verbosity;
+
     uint64_t first;
     uint64_t last;
     uint8_t  width;
@@ -219,6 +229,7 @@ extern "C" {
       byte_dump_console_parameter_t_initialize, \
       f_string_lengths_t_initialize, \
       F_false, \
+      f_console_verbosity_normal, \
       0, \
       0, \
       8, \
index 2cfba46082aacfe4fa2c6b580161167cde4874c5..afaa554d10f81c876ef0ad77f0296c9a7a1aca89 100644 (file)
@@ -16,11 +16,13 @@ extern "C" {
     fll_program_print_help_header(context, fake_name_long, fake_version);
 
     fll_program_print_help_option(context, f_console_standard_short_help, f_console_standard_long_help, f_console_symbol_short_enable, f_console_symbol_long_enable, "    Print this help message.");
-    fll_program_print_help_option(context, f_console_standard_short_light, f_console_standard_long_light, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Output using colors that show up better on light backgrounds.");
     fll_program_print_help_option(context, f_console_standard_short_dark, f_console_standard_long_dark, f_console_symbol_short_disable, f_console_symbol_long_disable, "    Output using colors that show up better on dark backgrounds.");
+    fll_program_print_help_option(context, f_console_standard_short_light, f_console_standard_long_light, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Output using colors that show up better on light backgrounds.");
     fll_program_print_help_option(context, f_console_standard_short_no_color, f_console_standard_long_no_color, f_console_symbol_short_disable, f_console_symbol_long_disable, "Do not output in color.");
     fll_program_print_help_option(context, f_console_standard_short_quiet, f_console_standard_long_quiet, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Decrease verbosity beyond normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_normal, f_console_standard_long_normal, f_console_symbol_short_disable, f_console_symbol_long_disable, "  Set verbosity to normal output.");
     fll_program_print_help_option(context, f_console_standard_short_verbose, f_console_standard_long_verbose, f_console_symbol_short_disable, f_console_symbol_long_disable, " Increase verbosity beyond normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_debug, f_console_standard_long_debug, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Enable debugging, inceasing verbosity beyond normal output.");
     fll_program_print_help_option(context, f_console_standard_short_version, f_console_standard_long_version, f_console_symbol_short_disable, f_console_symbol_long_disable, " Print only the version number.");
 
     printf("%c", f_string_eol[0]);
@@ -101,15 +103,12 @@ extern "C" {
     f_status_t status = F_none;
 
     {
-      const f_console_parameters_t parameters = { data->parameters, fake_total_parameters };
+      const f_console_parameters_t parameters = f_macro_console_parameters_t_initialize(data->parameters, fake_total_parameters);
 
       // Load all parameters and identify priority of color parameters.
       {
         f_console_parameter_id_t ids[3] = { fake_parameter_no_color, fake_parameter_light, fake_parameter_dark };
-        f_console_parameter_ids_t choices = f_console_parameter_ids_t_initialize;
-
-        choices.id = ids;
-        choices.used = 3;
+        const f_console_parameter_ids_t choices = f_macro_console_parameter_ids_t_initialize(ids, 3);
 
         status = fll_program_parameter_process(arguments, parameters, choices, F_true, &data->remaining, &data->context);
 
@@ -122,12 +121,9 @@ extern "C" {
 
       // Identify priority of verbosity related parameters.
       {
-        f_console_parameter_id_t ids[3] = { fake_parameter_quiet, fake_parameter_verbose, fake_parameter_debug };
-        f_console_parameter_ids_t choices = f_console_parameter_ids_t_initialize;
+        f_console_parameter_id_t ids[4] = { fake_parameter_quiet, fake_parameter_normal, fake_parameter_verbose, fake_parameter_debug };
         f_console_parameter_id_t choice = 0;
-
-        choices.id = ids;
-        choices.used = 3;
+        const f_console_parameter_ids_t choices = f_macro_console_parameter_ids_t_initialize(ids, 4);
 
         status = f_console_parameter_prioritize_right(parameters, choices, &choice);
 
@@ -140,6 +136,9 @@ extern "C" {
         if (choice == fake_parameter_quiet) {
           data->verbosity = f_console_verbosity_quiet;
         }
+        else if (choice == fake_parameter_normal) {
+          data->verbosity = f_console_verbosity_normal;
+        }
         else if (choice == fake_parameter_verbose) {
           data->verbosity = f_console_verbosity_verbose;
         }
@@ -235,11 +234,19 @@ extern "C" {
 
     if (data->parameters[fake_parameter_help].result == f_console_result_found) {
       fake_print_help(data->context);
+
+      fake_delete_data(data);
+      return F_none;
     }
-    else if (data->parameters[fake_parameter_version].result == f_console_result_found) {
+
+    if (data->parameters[fake_parameter_version].result == f_console_result_found) {
       fll_program_print_version(fake_version);
+
+      fake_delete_data(data);
+      return F_none;
     }
-    else if (operations_length) {
+
+    if (operations_length) {
       bool validate_parameter_directories = F_true;
 
       status = fake_process_console_parameters(arguments, data);
index d57ba1cc10bcaf913e8b55c8160ef361bfcaafcc..6bc3dc7016ea70b4926c8e15ec9e50ac5162f512 100644 (file)
@@ -300,6 +300,7 @@ extern "C" {
     fake_parameter_dark,
     fake_parameter_debug,
     fake_parameter_no_color,
+    fake_parameter_normal,
     fake_parameter_quiet,
     fake_parameter_verbose,
     fake_parameter_version,
@@ -335,6 +336,7 @@ extern "C" {
       f_console_parameter_t_initialize(f_console_standard_short_dark, f_console_standard_long_dark, 0, 0, f_console_type_inverse), \
       f_console_parameter_t_initialize(f_console_standard_short_debug, f_console_standard_long_debug, 0, 0, f_console_type_inverse), \
       f_console_parameter_t_initialize(f_console_standard_short_no_color, f_console_standard_long_no_color, 0, 0, f_console_type_inverse), \
+      f_console_parameter_t_initialize(f_console_standard_short_normal, f_console_standard_long_normal, 0, 0, f_console_type_inverse), \
       f_console_parameter_t_initialize(f_console_standard_short_quiet, f_console_standard_long_quiet, 0, 0, f_console_type_inverse), \
       f_console_parameter_t_initialize(f_console_standard_short_verbose, f_console_standard_long_verbose, 0, 0, f_console_type_inverse), \
       f_console_parameter_t_initialize(f_console_standard_short_version, f_console_standard_long_version, 0, 0, f_console_type_inverse), \
@@ -359,7 +361,7 @@ extern "C" {
       f_console_parameter_t_initialize(0, 0, fake_other_operation_skeleton, 0, f_console_type_other), \
     }
 
-  #define fake_total_parameters 27
+  #define fake_total_parameters 28
 #endif // _di_fake_defines_
 
 #ifndef _di_fake_data_t_
@@ -368,11 +370,13 @@ extern "C" {
 
     f_string_lengths_t remaining;
     bool process_pipe;
+
+    uint8_t verbosity;
+    uint8_t operation;
+
     mode_t umask;
     f_signal_t signal;
 
-    uint8_t operation;
-    uint8_t verbosity;
 
     f_string_dynamics_t define;
     f_string_dynamic_t fakefile;
@@ -435,10 +439,10 @@ extern "C" {
       fake_console_parameter_t_initialize, \
       f_string_lengths_t_initialize, \
       F_false, \
+      f_console_verbosity_normal, \
       0, \
-      f_signal_t_initialize, \
       0, \
-      f_console_verbosity_normal, \
+      f_signal_t_initialize, \
       f_string_dynamics_t_initialize, \
       f_string_dynamic_t_initialize, \
       f_string_dynamics_t_initialize, \
index 8030ae90fc52f7946976102ca2fecf6c3a391c54..d197c3e3bfc9e3ea29be263a706aeec08a06851e 100644 (file)
@@ -17,9 +17,13 @@ extern "C" {
     fll_program_print_help_header(context, firewall_name_long, firewall_version);
 
     fll_program_print_help_option(context, f_console_standard_short_help, f_console_standard_long_help, f_console_symbol_short_enable, f_console_symbol_long_enable, "    Print this help message.");
-    fll_program_print_help_option(context, f_console_standard_short_light, f_console_standard_long_light, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Output using colors that show up better on light backgrounds.");
     fll_program_print_help_option(context, f_console_standard_short_dark, f_console_standard_long_dark, f_console_symbol_short_disable, f_console_symbol_long_disable, "    Output using colors that show up better on dark backgrounds.");
+    fll_program_print_help_option(context, f_console_standard_short_light, f_console_standard_long_light, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Output using colors that show up better on light backgrounds.");
     fll_program_print_help_option(context, f_console_standard_short_no_color, f_console_standard_long_no_color, f_console_symbol_short_disable, f_console_symbol_long_disable, "Do not output in color.");
+    fll_program_print_help_option(context, f_console_standard_short_quiet, f_console_standard_long_quiet, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Decrease verbosity beyond normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_normal, f_console_standard_long_normal, f_console_symbol_short_disable, f_console_symbol_long_disable, "  Set verbosity to normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_verbose, f_console_standard_long_verbose, f_console_symbol_short_disable, f_console_symbol_long_disable, " Increase verbosity beyond normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_debug, f_console_standard_long_debug, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Enable debugging, inceasing verbosity beyond normal output.");
     fll_program_print_help_option(context, f_console_standard_short_version, f_console_standard_long_version, f_console_symbol_short_disable, f_console_symbol_long_disable, " Print only the version number.");
 
     #ifdef _en_firewall_debug_
@@ -61,8 +65,8 @@ extern "C" {
 
     {
       f_console_parameter_id_t ids[3] = { firewall_parameter_no_color, firewall_parameter_light, firewall_parameter_dark };
-      const f_console_parameter_ids_t choices = { ids, 3 };
-      const f_console_parameters_t parameters = { data->parameters, firewall_total_parameters };
+      const f_console_parameter_ids_t choices = f_macro_console_parameter_ids_t_initialize(ids, 3);
+      const f_console_parameters_t parameters = f_macro_console_parameters_t_initialize(data->parameters, firewall_total_parameters);
 
       status = fll_program_parameter_process(arguments, parameters, choices, F_true, &data->remaining, &data->context);
 
@@ -76,403 +80,359 @@ extern "C" {
 
     if (data->parameters[firewall_parameter_help].result == f_console_result_found) {
       firewall_print_help(data->context);
+
+      firewall_delete_data(data);
+      return F_none;
     }
-    else if (data->parameters[firewall_parameter_version].result == f_console_result_found) {
+
+    if (data->parameters[firewall_parameter_version].result == f_console_result_found) {
       fll_program_print_version(firewall_version);
+
+      firewall_delete_data(data);
+      return F_none;
     }
-    else {
-      // now determine which command was placed first
-      bool found_command = F_false;
-      unsigned int command = 0;
 
-      if (data->parameters[firewall_parameter_command_start].result == f_console_result_found) {
-        command = firewall_parameter_command_start;
-        found_command = F_true;
-      }
+    // now determine which command was placed first
+    bool found_command = F_false;
+    unsigned int command = 0;
 
-      if (data->parameters[firewall_parameter_command_stop].result == f_console_result_found) {
-        if (found_command) {
-          if (data->parameters[command].additional.array[0] > data->parameters[firewall_parameter_command_stop].additional.array[0]) {
-            command = firewall_parameter_command_stop;
-          }
-        }
-        else {
+    if (data->parameters[firewall_parameter_command_start].result == f_console_result_found) {
+      command = firewall_parameter_command_start;
+      found_command = F_true;
+    }
+
+    if (data->parameters[firewall_parameter_command_stop].result == f_console_result_found) {
+      if (found_command) {
+        if (data->parameters[command].additional.array[0] > data->parameters[firewall_parameter_command_stop].additional.array[0]) {
           command = firewall_parameter_command_stop;
-          found_command = F_true;
         }
       }
+      else {
+        command = firewall_parameter_command_stop;
+        found_command = F_true;
+      }
+    }
 
-      if (data->parameters[firewall_parameter_command_restart].result == f_console_result_found) {
-        if (found_command) {
-          if (data->parameters[command].additional.array[0] > data->parameters[firewall_parameter_command_restart].additional.array[0]) {
-            command = firewall_parameter_command_restart;
-          }
-        }
-        else {
+    if (data->parameters[firewall_parameter_command_restart].result == f_console_result_found) {
+      if (found_command) {
+        if (data->parameters[command].additional.array[0] > data->parameters[firewall_parameter_command_restart].additional.array[0]) {
           command = firewall_parameter_command_restart;
-          found_command = F_true;
         }
       }
+      else {
+        command = firewall_parameter_command_restart;
+        found_command = F_true;
+      }
+    }
 
-      if (data->parameters[firewall_parameter_command_lock].result == f_console_result_found) {
-        if (found_command) {
-          if (data->parameters[command].additional.array[0] > data->parameters[firewall_parameter_command_lock].additional.array[0]) {
-            command = firewall_parameter_command_lock;
-          }
-        }
-        else {
+    if (data->parameters[firewall_parameter_command_lock].result == f_console_result_found) {
+      if (found_command) {
+        if (data->parameters[command].additional.array[0] > data->parameters[firewall_parameter_command_lock].additional.array[0]) {
           command = firewall_parameter_command_lock;
-          found_command = F_true;
         }
       }
+      else {
+        command = firewall_parameter_command_lock;
+        found_command = F_true;
+      }
+    }
 
-      if (data->parameters[firewall_parameter_command_show].result == f_console_result_found) {
-        if (found_command) {
-          if (data->parameters[command].additional.array[0] > data->parameters[firewall_parameter_command_show].additional.array[0]) {
-            command = firewall_parameter_command_show;
-          }
-        }
-        else {
+    if (data->parameters[firewall_parameter_command_show].result == f_console_result_found) {
+      if (found_command) {
+        if (data->parameters[command].additional.array[0] > data->parameters[firewall_parameter_command_show].additional.array[0]) {
           command = firewall_parameter_command_show;
-          found_command = F_true;
         }
       }
+      else {
+        command = firewall_parameter_command_show;
+        found_command = F_true;
+      }
+    }
 
-      if (found_command) {
-        firewall_local_data_t local = firewall_local_data_t_initialize;
-        firewall_reserved_chains_t reserved = firewall_reserved_chains_t_initialize;
-        f_string_range_t input = f_string_range_t_initialize;
-
-        if (command == firewall_parameter_command_show) {
-          // Warning: these are hardcoded print commands (I am not certain how I am going to implement external 'show' rules as the default-firewall setting file is the wrong place to put this)
-          bool show_nat = F_true;
-          bool show_mangle = F_true;
-          bool show_ports = F_true;
-
-          f_string_dynamics_t parameters = f_string_dynamics_t_initialize;
-          int return_code = 0;
-
-          if (data->remaining.used > 0) {
-            show_nat = F_false;
-            show_mangle = F_false;
-            show_ports = F_false;
-
-            f_string_length_t counter = 0;
-
-            for (; counter < data->remaining.used; counter++) {
-
-              if (strncmp("nat", arguments.argv[data->remaining.array[counter]], 4) != 0) {
-                if (strncmp("mangle",  arguments.argv[data->remaining.array[counter]], 7) != 0) {
-                  if (strncmp("ports",  arguments.argv[data->remaining.array[counter]], 6) != 0) {
-                    fl_color_print_line(f_type_warning, data->context.set.warning, "WARNING: '%s' is not a valid show option", arguments.argv[data->remaining.array[counter]]);
-                  }
-                  else {
-                    show_ports = F_true;
-                  }
-                }
-                else {
-                  show_mangle = F_true;
-                }
-              }
-              else {
-                show_nat = F_true;
-              }
-            } // for
-          }
-
-          f_macro_string_dynamics_resize(status, parameters, 7);
-
-          if (F_status_is_error(status)) {
-            fl_color_print_line(f_type_error, data->context.set.error, "CRITICAL ERROR: Unable to allocate memory.");
-            firewall_delete_local_data(&local);
-            firewall_delete_data(data);
-            return status;
-          }
+    if (found_command) {
+      firewall_local_data_t local = firewall_local_data_t_initialize;
+      firewall_reserved_chains_t reserved = firewall_reserved_chains_t_initialize;
+      f_string_range_t input = f_string_range_t_initialize;
 
-          if (show_nat) {
-            fl_color_print(f_type_output, data->context.set.standout, "=========================== ");
-            fl_color_print(f_type_output, data->context.set.title, "NAT");
-            fl_color_print_line(f_type_output, data->context.set.standout, " ============================");
-            fflush(f_type_output);
+      if (command == firewall_parameter_command_show) {
+        // Warning: these are hardcoded print commands (I am not certain how I am going to implement external 'show' rules as the default-firewall setting file is the wrong place to put this)
+        bool show_nat = F_true;
+        bool show_mangle = F_true;
+        bool show_ports = F_true;
 
-            parameters.used = 6;
+        f_string_dynamics_t parameters = f_string_dynamics_t_initialize;
+        int return_code = 0;
 
-            parameters.array[0].string = (f_string_t) "-x";
-            parameters.array[1].string = (f_string_t) "-v";
-            parameters.array[2].string = (f_string_t) "-t";
-            parameters.array[3].string = (f_string_t) "nat";
-            parameters.array[4].string = (f_string_t) "--numeric";
-            parameters.array[5].string = (f_string_t) "--list";
+        if (data->remaining.used > 0) {
+          show_nat = F_false;
+          show_mangle = F_false;
+          show_ports = F_false;
 
-            parameters.array[0].used = 2;
-            parameters.array[1].used = 2;
-            parameters.array[2].used = 2;
-            parameters.array[3].used = 3;
-            parameters.array[4].used = 9;
-            parameters.array[5].used = 6;
+          f_string_length_t counter = 0;
 
-            status = fll_execute_program((f_string_t) firewall_tool_iptables, parameters, 0, &return_code);
+          for (; counter < data->remaining.used; counter++) {
 
-            fprintf(f_type_output, "\n");
-            fflush(f_type_output);
-          }
+            if (strncmp("nat", arguments.argv[data->remaining.array[counter]], 4) != 0) {
+              if (strncmp("mangle",  arguments.argv[data->remaining.array[counter]], 7) != 0) {
+                if (strncmp("ports",  arguments.argv[data->remaining.array[counter]], 6) != 0) {
+                  fl_color_print_line(f_type_warning, data->context.set.warning, "WARNING: '%s' is not a valid show option", arguments.argv[data->remaining.array[counter]]);
+                }
+                else {
+                  show_ports = F_true;
+                }
+              }
+              else {
+                show_mangle = F_true;
+              }
+            }
+            else {
+              show_nat = F_true;
+            }
+          } // for
+        }
 
-          if (F_status_is_error_not(status) && show_mangle) {
-            fl_color_print(f_type_output, data->context.set.standout, "========================== ");
-            fl_color_print(f_type_output, data->context.set.title, "MANGLE");
-            fl_color_print_line(f_type_output, data->context.set.standout, " ==========================");
-            fflush(f_type_output);
+        f_macro_string_dynamics_resize(status, parameters, 7);
 
-            parameters.used = 6;
+        if (F_status_is_error(status)) {
+          fl_color_print_line(f_type_error, data->context.set.error, "CRITICAL ERROR: Unable to allocate memory.");
+          firewall_delete_local_data(&local);
+          firewall_delete_data(data);
+          return status;
+        }
 
-            parameters.array[0].string = (f_string_t) "-x";
-            parameters.array[1].string = (f_string_t) "-v";
-            parameters.array[2].string = (f_string_t) "-t";
-            parameters.array[3].string = (f_string_t) "mangle";
-            parameters.array[4].string = (f_string_t) "--numeric";
-            parameters.array[5].string = (f_string_t) "--list";
+        if (show_nat) {
+          fl_color_print(f_type_output, data->context.set.standout, "=========================== ");
+          fl_color_print(f_type_output, data->context.set.title, "NAT");
+          fl_color_print_line(f_type_output, data->context.set.standout, " ============================");
+          fflush(f_type_output);
 
-            parameters.array[0].used = 2;
-            parameters.array[1].used = 2;
-            parameters.array[2].used = 2;
-            parameters.array[3].used = 6;
-            parameters.array[4].used = 9;
-            parameters.array[5].used = 6;
+          parameters.used = 6;
 
-            status = fll_execute_program((f_string_t) firewall_tool_iptables, parameters, 0, &return_code);
+          parameters.array[0].string = (f_string_t) "-x";
+          parameters.array[1].string = (f_string_t) "-v";
+          parameters.array[2].string = (f_string_t) "-t";
+          parameters.array[3].string = (f_string_t) "nat";
+          parameters.array[4].string = (f_string_t) "--numeric";
+          parameters.array[5].string = (f_string_t) "--list";
 
-            fprintf(f_type_output, "\n");
-            fflush(f_type_output);
-          }
+          parameters.array[0].used = 2;
+          parameters.array[1].used = 2;
+          parameters.array[2].used = 2;
+          parameters.array[3].used = 3;
+          parameters.array[4].used = 9;
+          parameters.array[5].used = 6;
 
-          if (F_status_is_error_not(status) && show_ports) {
-            fl_color_print(f_type_output, data->context.set.standout, "========================== ");
-            fl_color_print(f_type_output, data->context.set.title, "FILTER");
-            fl_color_print_line(f_type_output, data->context.set.standout, " ==========================");
-            fflush(f_type_output);
+          status = fll_execute_program((f_string_t) firewall_tool_iptables, parameters, 0, &return_code);
 
-            parameters.used = 4;
+          fprintf(f_type_output, "\n");
+          fflush(f_type_output);
+        }
 
-            parameters.array[0].string = (f_string_t) "-x";
-            parameters.array[1].string = (f_string_t) "-v";
-            parameters.array[2].string = (f_string_t) "--numeric";
-            parameters.array[3].string = (f_string_t) "--list";
+        if (F_status_is_error_not(status) && show_mangle) {
+          fl_color_print(f_type_output, data->context.set.standout, "========================== ");
+          fl_color_print(f_type_output, data->context.set.title, "MANGLE");
+          fl_color_print_line(f_type_output, data->context.set.standout, " ==========================");
+          fflush(f_type_output);
 
-            parameters.array[0].used = 2;
-            parameters.array[1].used = 2;
-            parameters.array[2].used = 9;
-            parameters.array[3].used = 6;
+          parameters.used = 6;
 
-            status = fll_execute_program((f_string_t) firewall_tool_iptables, parameters, 0, &return_code);
+          parameters.array[0].string = (f_string_t) "-x";
+          parameters.array[1].string = (f_string_t) "-v";
+          parameters.array[2].string = (f_string_t) "-t";
+          parameters.array[3].string = (f_string_t) "mangle";
+          parameters.array[4].string = (f_string_t) "--numeric";
+          parameters.array[5].string = (f_string_t) "--list";
 
-            fprintf(f_type_output, "\n");
-            fflush(f_type_output);
-          }
+          parameters.array[0].used = 2;
+          parameters.array[1].used = 2;
+          parameters.array[2].used = 2;
+          parameters.array[3].used = 6;
+          parameters.array[4].used = 9;
+          parameters.array[5].used = 6;
 
-          if (F_status_is_error(status)) {
-            status = F_status_set_fine(status);
+          status = fll_execute_program((f_string_t) firewall_tool_iptables, parameters, 0, &return_code);
 
-            if (status == F_memory_allocation || status == F_memory_reallocation) {
-              fl_color_print_line(f_type_error, data->context.set.error, "CRITICAL ERROR: Unable to allocate memory.");
-            }
-            else {
-              fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Failed to perform requested %s operation:", firewall_tool_iptables);
-              fprintf(f_type_error, "  ");
+          fprintf(f_type_output, "\n");
+          fflush(f_type_output);
+        }
 
-              f_string_length_t i = 0;
+        if (F_status_is_error_not(status) && show_ports) {
+          fl_color_print(f_type_output, data->context.set.standout, "========================== ");
+          fl_color_print(f_type_output, data->context.set.title, "FILTER");
+          fl_color_print_line(f_type_output, data->context.set.standout, " ==========================");
+          fflush(f_type_output);
 
-              fl_color_print_code(f_type_error, data->context.error);
+          parameters.used = 4;
 
-              fprintf(f_type_error, "%s ", firewall_tool_iptables);
-              for (; i < parameters.used; i++) {
-                fprintf(f_type_error, "%s ", parameters.array[i].string);
-              } // for
+          parameters.array[0].string = (f_string_t) "-x";
+          parameters.array[1].string = (f_string_t) "-v";
+          parameters.array[2].string = (f_string_t) "--numeric";
+          parameters.array[3].string = (f_string_t) "--list";
 
-              fl_color_print_code(f_type_error, data->context.reset);
-              fprintf(f_type_error, "\n");
-            }
+          parameters.array[0].used = 2;
+          parameters.array[1].used = 2;
+          parameters.array[2].used = 9;
+          parameters.array[3].used = 6;
 
-            status = F_status_set_error(status);
-          }
+          status = fll_execute_program((f_string_t) firewall_tool_iptables, parameters, 0, &return_code);
 
-          parameters.array[0].string = 0;
-          parameters.array[1].string = 0;
-          parameters.array[2].string = 0;
-          parameters.array[3].string = 0;
-          parameters.array[4].string = 0;
-          parameters.array[5].string = 0;
-          parameters.array[6].string = 0;
-          parameters.array[0].used = 0;
-          parameters.array[1].used = 0;
-          parameters.array[2].used = 0;
-          parameters.array[3].used = 0;
-          parameters.array[4].used = 0;
-          parameters.array[5].used = 0;
-          parameters.array[6].used = 0;
-
-          f_macro_string_dynamics_t_delete_simple( parameters);
-          firewall_delete_local_data(&local);
-          firewall_delete_data(data);
-          return status;
+          fprintf(f_type_output, "\n");
+          fflush(f_type_output);
         }
 
-        // load all network devices
-        status = f_directory_list((f_string_t) network_devices, 0, alphasort, &data->devices);
-
         if (F_status_is_error(status)) {
           status = F_status_set_fine(status);
 
           if (status == F_memory_allocation || status == F_memory_reallocation) {
             fl_color_print_line(f_type_error, data->context.set.error, "CRITICAL ERROR: Unable to allocate memory.");
           }
-          else if (status == F_data_not) {
-            fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Could not find any network devices");
-          }
-          else if (status == F_failure) {
-            fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Failed to read the device directory '%s'", network_devices);
-          }
-
-          firewall_delete_local_data(&local);
-          firewall_delete_data(data);
-          return F_status_set_error(status);
-        }
-
-        // remove "lo" (loopback) from the device listing
-        {
-          f_string_length_t i = 0;
+          else {
+            fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Failed to perform requested %s operation:", firewall_tool_iptables);
+            fprintf(f_type_error, "  ");
 
-          for (; i < data->devices.used; i++) {
-            if (fl_string_compare((f_string_t) firewall_device_loop, data->devices.array[i].string, firewall_device_loop_length + 1, data->devices.array[i].used) == F_equal_to) {
-              f_string_dynamic_t swap_string = data->devices.array[i];
+            f_string_length_t i = 0;
 
-              data->devices.used--;
+            fl_color_print_code(f_type_error, data->context.error);
 
-              for (; i < data->devices.used; i++) {
-                data->devices.array[i] = data->devices.array[i+1];
-              } // for
-
-              data->devices.array[data->devices.used] = swap_string;
-            }
-          } // for
-        }
-
-        if (command == firewall_parameter_command_stop || command == firewall_parameter_command_restart || command == firewall_parameter_command_lock) {
-          status = firewall_buffer_rules(network_path firewall_file_other, F_false, &local, data);
+            fprintf(f_type_error, "%s ", firewall_tool_iptables);
+            for (; i < parameters.used; i++) {
+              fprintf(f_type_error, "%s ", parameters.array[i].string);
+            } // for
 
-          if (F_status_is_error(status)) {
-            firewall_delete_local_data(&local);
-            firewall_delete_data(data);
-            return status;
+            fl_color_print_code(f_type_error, data->context.reset);
+            fprintf(f_type_error, "\n");
           }
 
-          {
-            f_array_length_t i = 0;
-            f_string_length_t length = 0;
+          status = F_status_set_error(status);
+        }
 
-            for (; i < local.chain_objects.used; i++) {
-              length = local.chain_objects.array[i].stop - local.chain_objects.array[i].start + 1;
+        parameters.array[0].string = 0;
+        parameters.array[1].string = 0;
+        parameters.array[2].string = 0;
+        parameters.array[3].string = 0;
+        parameters.array[4].string = 0;
+        parameters.array[5].string = 0;
+        parameters.array[6].string = 0;
+        parameters.array[0].used = 0;
+        parameters.array[1].used = 0;
+        parameters.array[2].used = 0;
+        parameters.array[3].used = 0;
+        parameters.array[4].used = 0;
+        parameters.array[5].used = 0;
+        parameters.array[6].used = 0;
+
+        f_macro_string_dynamics_t_delete_simple( parameters);
+        firewall_delete_local_data(&local);
+        firewall_delete_data(data);
+        return status;
+      }
 
-              if (!reserved.has_stop && fl_string_compare((f_string_t) firewall_group_stop, local.buffer.string + local.chain_objects.array[i].start, firewall_group_stop_length, length) == F_equal_to) {
-                reserved.stop_at = i;
-                reserved.has_stop = F_true;
-              }
-              else if (!reserved.has_lock && fl_string_compare((f_string_t) firewall_group_lock, local.buffer.string + local.chain_objects.array[i].start, firewall_group_lock_length, length) == F_equal_to) {
-                reserved.lock_at = i;
-                reserved.has_lock = F_true;
-              }
-            } // for
-          }
+      // load all network devices
+      status = f_directory_list((f_string_t) network_devices, 0, alphasort, &data->devices);
 
-          if (command == firewall_parameter_command_lock) {
-            if (reserved.has_lock) {
-              status = firewall_delete_chains(*data);
+      if (F_status_is_error(status)) {
+        status = F_status_set_fine(status);
 
-              if (F_status_is_error_not(status)) {
-                status = firewall_default_lock(*data);
-              }
+        if (status == F_memory_allocation || status == F_memory_reallocation) {
+          fl_color_print_line(f_type_error, data->context.set.error, "CRITICAL ERROR: Unable to allocate memory.");
+        }
+        else if (status == F_data_not) {
+          fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Could not find any network devices");
+        }
+        else if (status == F_failure) {
+          fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Failed to read the device directory '%s'", network_devices);
+        }
 
-              if (F_status_is_error(status)) {
-                firewall_delete_local_data(&local);
-                firewall_delete_data(data);
-                return status;
-              }
+        firewall_delete_local_data(&local);
+        firewall_delete_data(data);
+        return F_status_set_error(status);
+      }
 
-              local.is_main = F_false;
-              local.is_stop = F_false;
-              local.is_lock = F_true;
-              local.chain = reserved.lock_at;
+      // remove "lo" (loopback) from the device listing
+      {
+        f_string_length_t i = 0;
 
-              input.start = local.chain_contents.array[reserved.lock_at].array[0].start;
-              input.stop = local.chain_contents.array[reserved.lock_at].array[0].stop;
+        for (; i < data->devices.used; i++) {
+          if (fl_string_compare((f_string_t) firewall_device_loop, data->devices.array[i].string, firewall_device_loop_length + 1, data->devices.array[i].used) == F_equal_to) {
+            f_string_dynamic_t swap_string = data->devices.array[i];
 
-              status = firewall_process_rules(&input, &local, data);
+            data->devices.used--;
 
-              firewall_delete_local_data(&local);
-              firewall_delete_data(data);
-              return status;
-            }
-            else {
-              fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Failed to perform lock request because the lock instructions are missing from: %s.", network_path firewall_file_other);
+            for (; i < data->devices.used; i++) {
+              data->devices.array[i] = data->devices.array[i+1];
+            } // for
 
-              firewall_delete_local_data(&local);
-              firewall_delete_data(data);
-              return F_status_set_error(F_data);
-            }
+            data->devices.array[data->devices.used] = swap_string;
           }
+        } // for
+      }
 
-          if (command == firewall_parameter_command_stop || command == firewall_parameter_command_restart) {
-            if (reserved.has_stop) {
-              status = firewall_delete_chains(*data);
+      if (command == firewall_parameter_command_stop || command == firewall_parameter_command_restart || command == firewall_parameter_command_lock) {
+        status = firewall_buffer_rules(network_path firewall_file_other, F_false, &local, data);
 
-              if (F_status_is_error_not(status)) {
-                status = firewall_default_lock(*data);
-              }
+        if (F_status_is_error(status)) {
+          firewall_delete_local_data(&local);
+          firewall_delete_data(data);
+          return status;
+        }
 
-              if (F_status_is_error(status)) {
-                firewall_delete_local_data(&local);
-                firewall_delete_data(data);
-                return status;
-              }
+        {
+          f_array_length_t i = 0;
+          f_string_length_t length = 0;
 
-              local.is_global = F_true;
-              local.is_main = F_false;
-              local.is_stop = F_true;
-              local.is_lock = F_false;
-              local.chain = reserved.stop_at;
+          for (; i < local.chain_objects.used; i++) {
+            length = local.chain_objects.array[i].stop - local.chain_objects.array[i].start + 1;
 
-              input.start = local.chain_contents.array[reserved.stop_at].array[0].start;
-              input.stop = local.chain_contents.array[reserved.stop_at].array[0].stop;
+            if (!reserved.has_stop && fl_string_compare((f_string_t) firewall_group_stop, local.buffer.string + local.chain_objects.array[i].start, firewall_group_stop_length, length) == F_equal_to) {
+              reserved.stop_at = i;
+              reserved.has_stop = F_true;
+            }
+            else if (!reserved.has_lock && fl_string_compare((f_string_t) firewall_group_lock, local.buffer.string + local.chain_objects.array[i].start, firewall_group_lock_length, length) == F_equal_to) {
+              reserved.lock_at = i;
+              reserved.has_lock = F_true;
+            }
+          } // for
+        }
 
-              status = firewall_process_rules(&input, &local, data);
+        if (command == firewall_parameter_command_lock) {
+          if (reserved.has_lock) {
+            status = firewall_delete_chains(*data);
 
-              if (F_status_is_error(status) || command == firewall_parameter_command_stop) {
-                firewall_delete_local_data(&local);
-                firewall_delete_data(data);
-                return status;
-              }
+            if (F_status_is_error_not(status)) {
+              status = firewall_default_lock(*data);
             }
-            else {
-              fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Failed to perform stop request because the lock instructions are missing from: %s.", network_path firewall_file_other);
 
+            if (F_status_is_error(status)) {
               firewall_delete_local_data(&local);
               firewall_delete_data(data);
-              return F_status_set_error(F_data);
+              return status;
             }
-          }
 
-          firewall_delete_local_data(&local);
-        }
+            local.is_main = F_false;
+            local.is_stop = F_false;
+            local.is_lock = F_true;
+            local.chain = reserved.lock_at;
 
-        if (command == firewall_parameter_command_start || command == firewall_parameter_command_restart) {
-          status = firewall_buffer_rules(network_path firewall_file_first, F_false, &local, data);
+            input.start = local.chain_contents.array[reserved.lock_at].array[0].start;
+            input.stop = local.chain_contents.array[reserved.lock_at].array[0].stop;
+
+            status = firewall_process_rules(&input, &local, data);
 
-          if (F_status_is_error(status)) {
             firewall_delete_local_data(&local);
             firewall_delete_data(data);
             return status;
           }
+          else {
+            fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Failed to perform lock request because the lock instructions are missing from: %s.", network_path firewall_file_other);
 
-          if (command == firewall_parameter_command_start) {
+            firewall_delete_local_data(&local);
+            firewall_delete_data(data);
+            return F_status_set_error(F_data);
+          }
+        }
+
+        if (command == firewall_parameter_command_stop || command == firewall_parameter_command_restart) {
+          if (reserved.has_stop) {
             status = firewall_delete_chains(*data);
 
             if (F_status_is_error_not(status)) {
@@ -484,29 +444,15 @@ extern "C" {
               firewall_delete_data(data);
               return status;
             }
-          }
-
-          status = firewall_create_custom_chains(&reserved, &local, data);
-
-          if (F_status_is_error(status)) {
-            firewall_delete_local_data(&local);
-            firewall_delete_data(data);
-            return status;
-          }
-
-          f_array_length_t i = 0;
-
-          local.is_global = F_true;
-          local.is_stop = F_false;
-          local.is_lock = F_false;
 
-          while (i < local.chain_contents.used) {
-
-            input.start = local.chain_contents.array[i].array[0].start;
-            input.stop = local.chain_contents.array[i].array[0].stop;
+            local.is_global = F_true;
+            local.is_main = F_false;
+            local.is_stop = F_true;
+            local.is_lock = F_false;
+            local.chain = reserved.stop_at;
 
-            local.is_main = reserved.has_main && i == reserved.main_at ? F_true : F_false;
-            local.chain = i;
+            input.start = local.chain_contents.array[reserved.stop_at].array[0].start;
+            input.stop = local.chain_contents.array[reserved.stop_at].array[0].stop;
 
             status = firewall_process_rules(&input, &local, data);
 
@@ -515,118 +461,139 @@ extern "C" {
               firewall_delete_data(data);
               return status;
             }
+          }
+          else {
+            fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Failed to perform stop request because the lock instructions are missing from: %s.", network_path firewall_file_other);
+
+            firewall_delete_local_data(&local);
+            firewall_delete_data(data);
+            return F_status_set_error(F_data);
+          }
+        }
 
-            i++;
-          } // while
+        firewall_delete_local_data(&local);
+      }
+
+      if (command == firewall_parameter_command_start || command == firewall_parameter_command_restart) {
+        status = firewall_buffer_rules(network_path firewall_file_first, F_false, &local, data);
 
+        if (F_status_is_error(status)) {
           firewall_delete_local_data(&local);
+          firewall_delete_data(data);
+          return status;
+        }
 
-          for (i = 0; i < data->devices.used; i++) {
-            local.device = i;
+        if (command == firewall_parameter_command_start) {
+          status = firewall_delete_chains(*data);
 
-            {
-              f_string_dynamic_t file_path = f_string_dynamic_t_initialize;
+          if (F_status_is_error_not(status)) {
+            status = firewall_default_lock(*data);
+          }
 
-              f_macro_string_dynamic_t_resize(status, file_path, network_path_length + data->devices.array[i].used + firewall_file_suffix_length + 1);
+          if (F_status_is_error(status)) {
+            firewall_delete_local_data(&local);
+            firewall_delete_data(data);
+            return status;
+          }
+        }
 
-              if (F_status_is_error(status)) {
-                fl_color_print_line(f_type_error, data->context.set.error, "CRITICAL ERROR: Unable to allocate memory.");
-                firewall_delete_local_data(&local);
-                firewall_delete_data(data);
-                return status;
-              }
+        status = firewall_create_custom_chains(&reserved, &local, data);
+
+        if (F_status_is_error(status)) {
+          firewall_delete_local_data(&local);
+          firewall_delete_data(data);
+          return status;
+        }
 
-              memcpy((void *)file_path.string, network_path, network_path_length);
-              memcpy((void *)(file_path.string + network_path_length), data->devices.array[i].string, data->devices.array[i].used);
-              memcpy((void *)(file_path.string + network_path_length + data->devices.array[i].used), firewall_file_suffix, firewall_file_suffix_length);
+        f_array_length_t i = 0;
 
-              file_path.used = network_path_length + data->devices.array[i].used + firewall_file_suffix_length;
-              file_path.string[file_path.used] = 0;
+        local.is_global = F_true;
+        local.is_stop = F_false;
+        local.is_lock = F_false;
 
-              status = firewall_buffer_rules(file_path.string, F_true, &local, data);
+        while (i < local.chain_contents.used) {
 
-              f_macro_string_dynamic_t_delete_simple(file_path);
-            }
+          input.start = local.chain_contents.array[i].array[0].start;
+          input.stop = local.chain_contents.array[i].array[0].stop;
 
-            if (F_status_is_error(status)) {
-              status = F_status_set_fine(status);
+          local.is_main = reserved.has_main && i == reserved.main_at ? F_true : F_false;
+          local.chain = i;
 
-              firewall_delete_local_data(&local);
+          status = firewall_process_rules(&input, &local, data);
 
-              if (status == F_file_found_not || status == F_file_open || status == F_file_descriptor || status == FL_fss_found_object_content_not) {
-                status = F_status_set_error(status);
-                continue;
-              }
+          if (F_status_is_error(status) || command == firewall_parameter_command_stop) {
+            firewall_delete_local_data(&local);
+            firewall_delete_data(data);
+            return status;
+          }
 
-              firewall_delete_data(data);
-              return F_status_set_error(status);
-            }
+          i++;
+        } // while
+
+        firewall_delete_local_data(&local);
+
+        for (i = 0; i < data->devices.used; i++) {
+          local.device = i;
 
-            status = firewall_create_custom_chains(&reserved, &local, data);
+          {
+            f_string_dynamic_t file_path = f_string_dynamic_t_initialize;
+
+            f_macro_string_dynamic_t_resize(status, file_path, network_path_length + data->devices.array[i].used + firewall_file_suffix_length + 1);
 
             if (F_status_is_error(status)) {
+              fl_color_print_line(f_type_error, data->context.set.error, "CRITICAL ERROR: Unable to allocate memory.");
               firewall_delete_local_data(&local);
               firewall_delete_data(data);
               return status;
             }
 
-            f_array_length_t j = 0;
+            memcpy((void *)file_path.string, network_path, network_path_length);
+            memcpy((void *)(file_path.string + network_path_length), data->devices.array[i].string, data->devices.array[i].used);
+            memcpy((void *)(file_path.string + network_path_length + data->devices.array[i].used), firewall_file_suffix, firewall_file_suffix_length);
 
-            local.is_global = F_false;
-            local.is_stop = F_false;
-            local.is_lock = F_false;
+            file_path.used = network_path_length + data->devices.array[i].used + firewall_file_suffix_length;
+            file_path.string[file_path.used] = 0;
 
-            for (; j < local.chain_contents.used; j++) {
+            status = firewall_buffer_rules(file_path.string, F_true, &local, data);
 
-              input.start = local.chain_contents.array[j].array[0].start;
-              input.stop = local.chain_contents.array[j].array[0].stop;
-
-              local.is_main = reserved.has_main && j == reserved.main_at ? F_true : F_false;
-              local.chain = j;
-
-              status = firewall_process_rules(&input, &local, data);
+            f_macro_string_dynamic_t_delete_simple(file_path);
+          }
 
-              if (F_status_is_error(status) || command == firewall_parameter_command_stop) {
-                firewall_delete_local_data(&local);
-                firewall_delete_data(data);
-                return status;
-              }
-            } // for
+          if (F_status_is_error(status)) {
+            status = F_status_set_fine(status);
 
             firewall_delete_local_data(&local);
-          } // for
 
-          status = firewall_buffer_rules(network_path firewall_file_last, F_false, &local, data);
+            if (status == F_file_found_not || status == F_file_open || status == F_file_descriptor || status == FL_fss_found_object_content_not) {
+              status = F_status_set_error(status);
+              continue;
+            }
 
-          if (F_status_is_error(status)) {
-            firewall_delete_local_data(&local);
             firewall_delete_data(data);
-            return status;
+            return F_status_set_error(status);
           }
 
           status = firewall_create_custom_chains(&reserved, &local, data);
 
           if (F_status_is_error(status)) {
-            f_status_t status2 = F_none;
-
-            firewall_macro_delete_fss_buffers(status2, local.buffer, local.chain_objects, local.chain_contents)
+            firewall_delete_local_data(&local);
             firewall_delete_data(data);
             return status;
           }
 
-          i = 0;
+          f_array_length_t j = 0;
 
-          local.is_global = F_true;
+          local.is_global = F_false;
           local.is_stop = F_false;
           local.is_lock = F_false;
 
-          while (i < local.chain_contents.used) {
+          for (; j < local.chain_contents.used; j++) {
 
-            input.start = local.chain_contents.array[i].array[0].start;
-            input.stop = local.chain_contents.array[i].array[0].stop;
+            input.start = local.chain_contents.array[j].array[0].start;
+            input.stop = local.chain_contents.array[j].array[0].stop;
 
-            local.is_main = reserved.has_main && i == reserved.main_at ? F_true : F_false;
-            local.chain = i;
+            local.is_main = reserved.has_main && j == reserved.main_at ? F_true : F_false;
+            local.chain = j;
 
             status = firewall_process_rules(&input, &local, data);
 
@@ -635,18 +602,61 @@ extern "C" {
               firewall_delete_data(data);
               return status;
             }
+          } // for
+
+          firewall_delete_local_data(&local);
+        } // for
 
-            i++;
-          } // while
+        status = firewall_buffer_rules(network_path firewall_file_last, F_false, &local, data);
+
+        if (F_status_is_error(status)) {
+          firewall_delete_local_data(&local);
+          firewall_delete_data(data);
+          return status;
         }
 
-        // cleanup
-        firewall_delete_local_data(&local);
-      }
-      else {
-        fl_color_print_line(f_type_error, data->context.set.error, "ERROR: You did not pass a command");
-        status = F_status_set_error(F_parameter);
+        status = firewall_create_custom_chains(&reserved, &local, data);
+
+        if (F_status_is_error(status)) {
+          f_status_t status2 = F_none;
+
+          firewall_macro_delete_fss_buffers(status2, local.buffer, local.chain_objects, local.chain_contents)
+          firewall_delete_data(data);
+          return status;
+        }
+
+        i = 0;
+
+        local.is_global = F_true;
+        local.is_stop = F_false;
+        local.is_lock = F_false;
+
+        while (i < local.chain_contents.used) {
+
+          input.start = local.chain_contents.array[i].array[0].start;
+          input.stop = local.chain_contents.array[i].array[0].stop;
+
+          local.is_main = reserved.has_main && i == reserved.main_at ? F_true : F_false;
+          local.chain = i;
+
+          status = firewall_process_rules(&input, &local, data);
+
+          if (F_status_is_error(status) || command == firewall_parameter_command_stop) {
+            firewall_delete_local_data(&local);
+            firewall_delete_data(data);
+            return status;
+          }
+
+          i++;
+        } // while
       }
+
+      // cleanup
+      firewall_delete_local_data(&local);
+    }
+    else {
+      fl_color_print_line(f_type_error, data->context.set.error, "ERROR: You did not pass a command");
+      status = F_status_set_error(F_parameter);
     }
 
     firewall_delete_data(data);
index 88947c3bd4c7750f703e79d1cbd439ebcb775e7b..a4bb6e9bc3add68436e1509bdc90b6d7989ebbd9 100644 (file)
@@ -279,9 +279,12 @@ extern "C" {
   typedef struct {
     f_console_parameter_t parameters[firewall_total_parameters];
 
-    f_string_dynamics_t chains;
     f_string_lengths_t remaining;
     bool process_pipe;
+
+    uint8_t verbosity;
+
+    f_string_dynamics_t chains;
     f_string_dynamics_t devices;
 
     f_color_context_t context;
@@ -290,9 +293,10 @@ extern "C" {
   #define firewall_data_t_initialize \
     { \
       firewall_console_parameter_t_initialize, \
-      f_string_dynamics_t_initialize, \
       f_string_lengths_t_initialize, \
       F_false, \
+      f_console_verbosity_normal, \
+      f_string_dynamics_t_initialize, \
       f_string_dynamics_t_initialize, \
       f_color_context_t_initialize, \
     }
index 31c47bf5239c1b7d8d6ef98291b4e5787c8e5258..9bcfa58d3064126172876cfb8aba34d1ffe06486 100644 (file)
@@ -11,9 +11,13 @@ extern "C" {
     fll_program_print_help_header(context, fss_basic_list_read_name_long, fss_basic_list_read_version);
 
     fll_program_print_help_option(context, f_console_standard_short_help, f_console_standard_long_help, f_console_symbol_short_enable, f_console_symbol_long_enable, "    Print this help message.");
-    fll_program_print_help_option(context, f_console_standard_short_light, f_console_standard_long_light, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Output using colors that show up better on light backgrounds.");
     fll_program_print_help_option(context, f_console_standard_short_dark, f_console_standard_long_dark, f_console_symbol_short_disable, f_console_symbol_long_disable, "    Output using colors that show up better on dark backgrounds.");
+    fll_program_print_help_option(context, f_console_standard_short_light, f_console_standard_long_light, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Output using colors that show up better on light backgrounds.");
     fll_program_print_help_option(context, f_console_standard_short_no_color, f_console_standard_long_no_color, f_console_symbol_short_disable, f_console_symbol_long_disable, "Do not output in color.");
+    fll_program_print_help_option(context, f_console_standard_short_quiet, f_console_standard_long_quiet, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Decrease verbosity beyond normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_normal, f_console_standard_long_normal, f_console_symbol_short_disable, f_console_symbol_long_disable, "  Set verbosity to normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_verbose, f_console_standard_long_verbose, f_console_symbol_short_disable, f_console_symbol_long_disable, " Increase verbosity beyond normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_debug, f_console_standard_long_debug, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Enable debugging, inceasing verbosity beyond normal output.");
     fll_program_print_help_option(context, f_console_standard_short_version, f_console_standard_long_version, f_console_symbol_short_disable, f_console_symbol_long_disable, " Print only the version number.");
 
     printf("%c", f_string_eol[0]);
@@ -129,7 +133,7 @@ extern "C" {
     {
       f_console_parameter_id_t ids[3] = { fss_basic_list_read_parameter_no_color, fss_basic_list_read_parameter_light, fss_basic_list_read_parameter_dark };
       const f_console_parameter_ids_t choices = { ids, 3 };
-      const f_console_parameters_t parameters = { data->parameters, fss_basic_list_read_total_parameters };
+      const f_console_parameters_t parameters = f_macro_console_parameters_t_initialize(data->parameters, fss_basic_list_read_total_parameters);
 
       status = fll_program_parameter_process(arguments, parameters, choices, F_true, &data->remaining, &data->context);
 
@@ -143,11 +147,19 @@ extern "C" {
 
     if (data->parameters[fss_basic_list_read_parameter_help].result == f_console_result_found) {
       fss_basic_list_read_print_help(data->context);
+
+      fss_basic_list_read_delete_data(data);
+      return status;
     }
-    else if (data->parameters[fss_basic_list_read_parameter_version].result == f_console_result_found) {
+
+    if (data->parameters[fss_basic_list_read_parameter_version].result == f_console_result_found) {
       fll_program_print_version(fss_basic_list_read_version);
+
+      fss_basic_list_read_delete_data(data);
+      return status;
     }
-    else if (data->remaining.used > 0 || data->process_pipe) {
+
+    if (data->remaining.used > 0 || data->process_pipe) {
       if (data->parameters[fss_basic_list_read_parameter_at].result == f_console_result_found) {
         fl_color_print(f_type_error, data->context.set.error, "ERROR: The parameter '");
         fl_color_print(f_type_error, data->context.set.notable, "%s%s", f_console_symbol_long_enable, fss_basic_list_read_long_at);
index 971120fc1ebd56f20b56aa42752dbdf630f04b15..b273479a0b5ccad9705685a39fdf3026b64e1d00 100644 (file)
@@ -124,12 +124,15 @@ extern "C" {
   typedef struct {
     f_console_parameter_t parameters[fss_basic_list_read_total_parameters];
 
+    f_string_lengths_t remaining;
+    bool process_pipe;
+
+    uint8_t verbosity;
+
     f_string_dynamic_t buffer;
     f_fss_objects_t objects;
     f_fss_contents_t contents;
     f_string_quantity_t quantity;
-    f_string_lengths_t remaining;
-    bool process_pipe;
 
     f_color_context_t context;
   } fss_basic_list_read_data_t;
@@ -137,12 +140,13 @@ extern "C" {
   #define fss_basic_list_read_data_t_initialize \
     { \
       fss_basic_list_read_console_parameter_t_initialize, \
+      f_string_lengths_t_initialize, \
+      F_false, \
+      f_console_verbosity_normal, \
       f_string_dynamic_t_initialize, \
       f_fss_objects_t_initialize, \
       f_fss_contents_t_initialize, \
       f_string_quantity_t_initialize, \
-      f_string_lengths_t_initialize, \
-      F_false, \
       f_color_context_t_initialize, \
     }
 #endif // _di_fss_basic_list_read_data_t_
index 4811088441c745300090646ac29f0c9b81cecd08..2a7e386086fcd3d0aebb864a9ffa0517f71b4620 100644 (file)
@@ -10,17 +10,23 @@ extern "C" {
     fll_program_print_help_header(context, fss_basic_list_write_name_long, fss_basic_list_write_version);
 
     fll_program_print_help_option(context, f_console_standard_short_help, f_console_standard_long_help, f_console_symbol_short_enable, f_console_symbol_long_enable, "    Print this help message.");
-    fll_program_print_help_option(context, f_console_standard_short_light, f_console_standard_long_light, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Output using colors that show up better on light backgrounds.");
     fll_program_print_help_option(context, f_console_standard_short_dark, f_console_standard_long_dark, f_console_symbol_short_disable, f_console_symbol_long_disable, "    Output using colors that show up better on dark backgrounds.");
+    fll_program_print_help_option(context, f_console_standard_short_light, f_console_standard_long_light, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Output using colors that show up better on light backgrounds.");
     fll_program_print_help_option(context, f_console_standard_short_no_color, f_console_standard_long_no_color, f_console_symbol_short_disable, f_console_symbol_long_disable, "Do not output in color.");
+    fll_program_print_help_option(context, f_console_standard_short_quiet, f_console_standard_long_quiet, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Decrease verbosity beyond normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_normal, f_console_standard_long_normal, f_console_symbol_short_disable, f_console_symbol_long_disable, "  Set verbosity to normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_verbose, f_console_standard_long_verbose, f_console_symbol_short_disable, f_console_symbol_long_disable, " Increase verbosity beyond normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_debug, f_console_standard_long_debug, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Enable debugging, inceasing verbosity beyond normal output.");
     fll_program_print_help_option(context, f_console_standard_short_version, f_console_standard_long_version, f_console_symbol_short_disable, f_console_symbol_long_disable, " Print only the version number.");
 
     printf("%c", f_string_eol[0]);
 
+    fll_program_print_help_option(context, fss_basic_list_write_short_content, fss_basic_list_write_long_content, f_console_symbol_short_enable, f_console_symbol_long_enable, " The content to output.");
+    fll_program_print_help_option(context, fss_basic_list_write_short_double, fss_basic_list_write_long_double, f_console_symbol_short_enable, f_console_symbol_long_enable, " Use double quotes (default).");
     fll_program_print_help_option(context, fss_basic_list_write_short_file, fss_basic_list_write_long_file, f_console_symbol_short_enable, f_console_symbol_long_enable, "   Specify a file to send output to.");
-    fll_program_print_help_option(context, fss_basic_list_write_short_object, fss_basic_list_write_long_object, f_console_symbol_short_enable, f_console_symbol_long_enable, " Write an object instead of content.");
-    fll_program_print_help_option(context, fss_basic_list_write_short_partial, fss_basic_list_write_long_partial, f_console_symbol_short_enable, f_console_symbol_long_enable, "Do not output the final end of object or end of content character.");
-    fll_program_print_help_option(context, fss_basic_list_write_short_string, fss_basic_list_write_long_string, f_console_symbol_short_enable, f_console_symbol_long_enable, " Specify a string to convert.");
+    fll_program_print_help_option(context, fss_basic_list_write_short_object, fss_basic_list_write_long_object, f_console_symbol_short_enable, f_console_symbol_long_enable, " The object to output.");
+    fll_program_print_help_option(context, fss_basic_list_write_short_partial, fss_basic_list_write_long_partial, f_console_symbol_short_enable, f_console_symbol_long_enable, "Do not output end of object/content character.");
+    fll_program_print_help_option(context, fss_basic_list_write_short_single, fss_basic_list_write_long_single, f_console_symbol_short_enable, f_console_symbol_long_enable, " Use single quotes.");
 
     fll_program_print_help_usage(context, fss_basic_list_write_name, "");
 
@@ -34,10 +40,11 @@ extern "C" {
 
     {
       f_console_parameter_id_t ids[3] = { fss_basic_list_write_parameter_no_color, fss_basic_list_write_parameter_light, fss_basic_list_write_parameter_dark };
-      const f_console_parameter_ids_t choices = { ids, 3 };
-      const f_console_parameters_t parameters = { data->parameters, fss_basic_list_write_total_parameters };
+      const f_console_parameter_ids_t choices = f_macro_console_parameter_ids_t_initialize(ids, 3);
+      const f_console_parameters_t parameters = f_macro_console_parameters_t_initialize(data->parameters, fss_basic_list_write_total_parameters);
 
       status = fll_program_parameter_process(arguments, parameters, choices, F_true, &data->remaining, &data->context);
+
       if (F_status_is_error(status)) {
         fss_basic_list_write_delete_data(data);
         return F_status_set_error(status);
@@ -48,189 +55,195 @@ extern "C" {
 
     if (data->parameters[fss_basic_list_write_parameter_help].result == f_console_result_found) {
       fss_basic_list_write_print_help(data->context);
+
+      fss_basic_list_write_delete_data(data);
+      return status;
     }
-    else if (data->parameters[fss_basic_list_write_parameter_version].result == f_console_result_found) {
+
+    if (data->parameters[fss_basic_list_write_parameter_version].result == f_console_result_found) {
       fll_program_print_version(fss_basic_list_write_version);
+
+      fss_basic_list_write_delete_data(data);
+      return status;
     }
-    else {
-      f_array_length_t counter = 0;
-      bool object = (data->parameters[fss_basic_list_write_parameter_object].result == f_console_result_found);
 
-      f_string_dynamic_t buffer = f_string_dynamic_t_initialize;
-      f_string_range_t range = f_string_range_t_initialize;
+    f_array_length_t counter = 0;
+    bool object = (data->parameters[fss_basic_list_write_parameter_object].result == f_console_result_found);
 
-      if (data->process_pipe) {
-        f_file_t file = f_file_t_initialize;
-        f_string_dynamic_t input = f_string_dynamic_t_initialize;
+    f_string_dynamic_t buffer = f_string_dynamic_t_initialize;
+    f_string_range_t range = f_string_range_t_initialize;
 
-        file.id = f_type_descriptor_input;
+    if (data->process_pipe) {
+      f_file_t file = f_file_t_initialize;
+      f_string_dynamic_t input = f_string_dynamic_t_initialize;
 
-        status = f_file_read(file, &input);
+      file.id = f_type_descriptor_input;
 
-        if (F_status_is_error(status)) {
-          status = F_status_set_fine(status);
+      status = f_file_read(file, &input);
 
-          if (status == F_parameter) {
-            fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: Invalid parameter when calling f_file_open()");
-          }
-          else if (status == F_file_found_not) {
-            fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Unable to find the file '%s'", "-");
-          }
-          else if (status == F_file_open) {
-            fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Unable to open the file '%s'", "-");
-          }
-          else if (status == F_file_descriptor) {
-            fl_color_print_line(f_type_error, data->context.set.error, "ERROR: File descriptor error while trying to open the file '%s'", "-");
-          }
-          else {
-            fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: An unhandled error (%u) has occurred while calling f_file_open()", status);
-          }
+      if (F_status_is_error(status)) {
+        status = F_status_set_fine(status);
 
-          f_macro_string_dynamic_t_delete_simple(buffer);
-          f_macro_string_dynamic_t_delete_simple(input);
-          fss_basic_list_write_delete_data(data);
-          return F_status_set_error(status);
+        if (status == F_parameter) {
+          fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: Invalid parameter when calling f_file_open()");
+        }
+        else if (status == F_file_found_not) {
+          fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Unable to find the file '%s'", "-");
+        }
+        else if (status == F_file_open) {
+          fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Unable to open the file '%s'", "-");
+        }
+        else if (status == F_file_descriptor) {
+          fl_color_print_line(f_type_error, data->context.set.error, "ERROR: File descriptor error while trying to open the file '%s'", "-");
+        }
+        else {
+          fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: An unhandled error (%u) has occurred while calling f_file_open()", status);
         }
 
-        if (input.used) {
-          range.start = 0;
-          range.stop = input.used - 1;
+        f_macro_string_dynamic_t_delete_simple(buffer);
+        f_macro_string_dynamic_t_delete_simple(input);
+        fss_basic_list_write_delete_data(data);
+        return F_status_set_error(status);
+      }
 
-          if (object) {
-            status = fl_fss_basic_list_object_write(input, &range, &buffer);
+      if (input.used) {
+        range.start = 0;
+        range.stop = input.used - 1;
 
-            if (F_status_is_error(status) || status == F_data_not_stop || status == F_data_not_eos || status == F_data_not_eol) {
-              f_macro_string_dynamic_t_delete_simple(buffer);
-              f_macro_string_dynamic_t_delete_simple(input);
-              fss_basic_list_write_delete_data(data);
-              return F_status_set_error(status);
-            }
+        if (object) {
+          status = fl_fss_basic_list_object_write(input, &range, &buffer);
 
-            // this should remove both the closing newline and the colon.
-            if (data->parameters[fss_basic_list_write_parameter_partial].result == f_console_result_found) {
-              buffer.used -= 2;
-            }
+          if (F_status_is_error(status) || status == F_data_not_stop || status == F_data_not_eos || status == F_data_not_eol) {
+            f_macro_string_dynamic_t_delete_simple(buffer);
+            f_macro_string_dynamic_t_delete_simple(input);
+            fss_basic_list_write_delete_data(data);
+            return F_status_set_error(status);
           }
-          else {
-            status = fl_fss_basic_list_content_write(input, &range, &buffer);
-
-            if (F_status_is_error(status) || status == F_data_not_stop || status == F_data_not_eos || status == F_data_not_eol) {
-              f_macro_string_dynamic_t_delete_simple(buffer);
-              f_macro_string_dynamic_t_delete_simple(input);
-              fss_basic_list_write_delete_data(data);
-              return F_status_set_error(status);
-            }
-
-            if (data->parameters[fss_basic_list_write_parameter_partial].result == f_console_result_found) {
-              buffer.used--;
-            }
+
+          // this should remove both the closing newline and the colon.
+          if (data->parameters[fss_basic_list_write_parameter_partial].result == f_console_result_found) {
+            buffer.used -= 2;
           }
         }
+        else {
+          status = fl_fss_basic_list_content_write(input, &range, &buffer);
+
+          if (F_status_is_error(status) || status == F_data_not_stop || status == F_data_not_eos || status == F_data_not_eol) {
+            f_macro_string_dynamic_t_delete_simple(buffer);
+            f_macro_string_dynamic_t_delete_simple(input);
+            fss_basic_list_write_delete_data(data);
+            return F_status_set_error(status);
+          }
 
-        f_macro_string_dynamic_t_delete_simple(input);
+          if (data->parameters[fss_basic_list_write_parameter_partial].result == f_console_result_found) {
+            buffer.used--;
+          }
+        }
       }
-      else if (data->parameters[fss_basic_list_write_parameter_string].result == f_console_result_additional) {
-        f_string_dynamic_t input = f_string_dynamic_t_initialize;
 
-        input.string = arguments.argv[data->parameters[fss_basic_list_write_parameter_string].additional.array[0]];
-        input.used = strlen(input.string);
+      f_macro_string_dynamic_t_delete_simple(input);
+    }
+    else if (data->parameters[fss_basic_list_write_parameter_string].result == f_console_result_additional) {
+      f_string_dynamic_t input = f_string_dynamic_t_initialize;
 
-        if (input.used) {
-          range.start = 0;
-          range.stop = input.used - 1;
+      input.string = arguments.argv[data->parameters[fss_basic_list_write_parameter_string].additional.array[0]];
+      input.used = strlen(input.string);
 
-          if (object) {
-            status = fl_fss_basic_list_object_write(input, &range, &buffer);
+      if (input.used) {
+        range.start = 0;
+        range.stop = input.used - 1;
 
-            if (F_status_is_error(status) || status == F_data_not_stop || status == F_data_not_eos || status == F_data_not_eol) {
-              f_macro_string_dynamic_t_delete_simple(buffer);
-              fss_basic_list_write_delete_data(data);
-              return F_status_set_error(status);
-            }
+        if (object) {
+          status = fl_fss_basic_list_object_write(input, &range, &buffer);
 
-            // this should remove both the closing newline and the colon.
-            if (data->parameters[fss_basic_list_write_parameter_partial].result == f_console_result_found) {
-              buffer.used -= 2;
-            }
+          if (F_status_is_error(status) || status == F_data_not_stop || status == F_data_not_eos || status == F_data_not_eol) {
+            f_macro_string_dynamic_t_delete_simple(buffer);
+            fss_basic_list_write_delete_data(data);
+            return F_status_set_error(status);
           }
-          else {
-            status = fl_fss_basic_list_content_write(input, &range, &buffer);
-
-            if (F_status_is_error(status) || status == F_data_not_stop || status == F_data_not_eos || status == F_data_not_eol) {
-              f_macro_string_dynamic_t_delete_simple(buffer);
-              fss_basic_list_write_delete_data(data);
-              return F_status_set_error(status);
-            }
-
-            if (data->parameters[fss_basic_list_write_parameter_partial].result == f_console_result_found) {
-              buffer.used--;
-            }
+
+          // this should remove both the closing newline and the colon.
+          if (data->parameters[fss_basic_list_write_parameter_partial].result == f_console_result_found) {
+            buffer.used -= 2;
           }
         }
+        else {
+          status = fl_fss_basic_list_content_write(input, &range, &buffer);
 
-        status = F_none;
+          if (F_status_is_error(status) || status == F_data_not_stop || status == F_data_not_eos || status == F_data_not_eol) {
+            f_macro_string_dynamic_t_delete_simple(buffer);
+            fss_basic_list_write_delete_data(data);
+            return F_status_set_error(status);
+          }
+
+          if (data->parameters[fss_basic_list_write_parameter_partial].result == f_console_result_found) {
+            buffer.used--;
+          }
+        }
       }
 
-      if (data->parameters[fss_basic_list_write_parameter_file].result == f_console_result_additional) {
-        f_file_t output = f_file_t_initialize;
+      status = F_none;
+    }
 
-        output.flag = f_file_flag_append_wo;
+    if (data->parameters[fss_basic_list_write_parameter_file].result == f_console_result_additional) {
+      f_file_t output = f_file_t_initialize;
 
-        status = f_file_open(arguments.argv[data->parameters[fss_basic_list_write_parameter_file].additional.array[0]], 0, &output);
+      output.flag = f_file_flag_append_wo;
 
-        if (F_status_is_error(status)) {
-          status = F_status_set_fine(status);
+      status = f_file_open(arguments.argv[data->parameters[fss_basic_list_write_parameter_file].additional.array[0]], 0, &output);
 
-          f_file_close(&output.id);
+      if (F_status_is_error(status)) {
+        status = F_status_set_fine(status);
 
-          if (status == F_parameter) {
-            fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: Invalid parameter when calling f_file_open()");
-          }
-          else if (status == F_file_found_not) {
-            fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Unable to find the file '%s'", arguments.argv[data->parameters[fss_basic_list_write_parameter_file].additional.array[0]]);
-          }
-          else if (status == F_file_open) {
-            fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Unable to open the file '%s'", arguments.argv[data->parameters[fss_basic_list_write_parameter_file].additional.array[0]]);
-          }
-          else if (status == F_file_descriptor) {
-            fl_color_print_line(f_type_error, data->context.set.error, "ERROR: File descriptor error while trying to open the file '%s'", arguments.argv[data->parameters[fss_basic_list_write_parameter_file].additional.array[0]]);
-          }
-          else {
-            fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: An unhandled error (%u) has occurred while calling f_file_open()", status);
-          }
+        f_file_close(&output.id);
 
-          f_macro_string_dynamic_t_delete_simple(buffer);
-          fss_basic_list_write_delete_data(data);
-          return F_status_set_error(status);
+        if (status == F_parameter) {
+          fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: Invalid parameter when calling f_file_open()");
+        }
+        else if (status == F_file_found_not) {
+          fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Unable to find the file '%s'", arguments.argv[data->parameters[fss_basic_list_write_parameter_file].additional.array[0]]);
+        }
+        else if (status == F_file_open) {
+          fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Unable to open the file '%s'", arguments.argv[data->parameters[fss_basic_list_write_parameter_file].additional.array[0]]);
+        }
+        else if (status == F_file_descriptor) {
+          fl_color_print_line(f_type_error, data->context.set.error, "ERROR: File descriptor error while trying to open the file '%s'", arguments.argv[data->parameters[fss_basic_list_write_parameter_file].additional.array[0]]);
+        }
+        else {
+          fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: An unhandled error (%u) has occurred while calling f_file_open()", status);
         }
 
-        status = f_file_write(output, buffer, 0);
-        f_file_close(&output.id);
+        f_macro_string_dynamic_t_delete_simple(buffer);
+        fss_basic_list_write_delete_data(data);
+        return F_status_set_error(status);
+      }
 
-        if (F_status_is_error(status)) {
-          status = F_status_set_fine(status);
+      status = f_file_write(output, buffer, 0);
+      f_file_close(&output.id);
 
-          if (status == F_parameter) {
-            fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: Invalid parameter when calling f_file_write()");
-          }
-          else if (status == F_file_write) {
-            fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Unable to write to the file '%s'", arguments.argv[data->parameters[fss_basic_list_write_parameter_file].additional.array[0]]);
-          }
-          else {
-            fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: An unhandled error (%u) has occurred while calling f_file_write()", status);
-          }
+      if (F_status_is_error(status)) {
+        status = F_status_set_fine(status);
 
-          f_macro_string_dynamic_t_delete_simple(buffer);
-          fss_basic_list_write_delete_data(data);
-          return F_status_set_error(status);
+        if (status == F_parameter) {
+          fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: Invalid parameter when calling f_file_write()");
+        }
+        else if (status == F_file_write) {
+          fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Unable to write to the file '%s'", arguments.argv[data->parameters[fss_basic_list_write_parameter_file].additional.array[0]]);
+        }
+        else {
+          fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: An unhandled error (%u) has occurred while calling f_file_write()", status);
         }
-      }
-      else {
-        f_print_dynamic(f_type_output, buffer);
-      }
 
-      f_macro_string_dynamic_t_delete_simple(buffer);
+        f_macro_string_dynamic_t_delete_simple(buffer);
+        fss_basic_list_write_delete_data(data);
+        return F_status_set_error(status);
+      }
     }
+    else {
+      f_print_dynamic(f_type_output, buffer);
+    }
+
+    f_macro_string_dynamic_t_delete_simple(buffer);
 
     fss_basic_list_write_delete_data(data);
     return status;
index 356c93c1acef11667ff50531b483d1abb0da38c7..3d2fc3f7628981b895292991c83b9d1c3acda972 100644 (file)
@@ -53,15 +53,19 @@ extern "C" {
 #endif // _di_fss_basic_list_write_name_
 
 #ifndef _di_fss_basic_list_write_defines_
-  #define fss_basic_list_write_short_object  "o"
+  #define fss_basic_list_write_short_content "c"
+  #define fss_basic_list_write_short_double  "d"
   #define fss_basic_list_write_short_file    "f"
-  #define fss_basic_list_write_short_string  "s"
+  #define fss_basic_list_write_short_object  "o"
   #define fss_basic_list_write_short_partial "p"
+  #define fss_basic_list_write_short_single  "s"
 
-  #define fss_basic_list_write_long_object  "object"
+  #define fss_basic_list_write_long_content "content"
+  #define fss_basic_list_write_long_double  "double"
   #define fss_basic_list_write_long_file    "file"
-  #define fss_basic_list_write_long_string  "string"
+  #define fss_basic_list_write_long_object  "object"
   #define fss_basic_list_write_long_partial "partial"
+  #define fss_basic_list_write_long_single  "single"
 
   enum {
     fss_basic_list_write_parameter_help,
@@ -70,10 +74,12 @@ extern "C" {
     fss_basic_list_write_parameter_no_color,
     fss_basic_list_write_parameter_version,
 
+    fss_basic_list_write_parameter_content,
+    fss_basic_list_write_parameter_double,
     fss_basic_list_write_parameter_file,
     fss_basic_list_write_parameter_object,
     fss_basic_list_write_parameter_partial,
-    fss_basic_list_write_parameter_string,
+    fss_basic_list_write_parameter_single,
   };
 
   #define fss_basic_list_write_console_parameter_t_initialize \
@@ -83,13 +89,15 @@ extern "C" {
       f_console_parameter_t_initialize(f_console_standard_short_dark, f_console_standard_long_dark, 0, F_false, f_console_type_inverse), \
       f_console_parameter_t_initialize(f_console_standard_short_no_color, f_console_standard_long_no_color, 0, F_false, f_console_type_inverse), \
       f_console_parameter_t_initialize(f_console_standard_short_version, f_console_standard_long_version, 0, F_false, f_console_type_inverse), \
+      f_console_parameter_t_initialize(fss_basic_list_write_short_content, fss_basic_list_write_long_content, 0, F_true, f_console_type_normal), \
+      f_console_parameter_t_initialize(fss_basic_list_write_short_double, fss_basic_list_write_long_double, 0, F_true, f_console_type_normal), \
       f_console_parameter_t_initialize(fss_basic_list_write_short_file, fss_basic_list_write_long_file, 0, F_true, f_console_type_normal), \
       f_console_parameter_t_initialize(fss_basic_list_write_short_object, fss_basic_list_write_long_object, 0, F_false, f_console_type_normal), \
       f_console_parameter_t_initialize(fss_basic_list_write_short_partial, fss_basic_list_write_long_partial, 0, F_true, f_console_type_normal), \
-      f_console_parameter_t_initialize(fss_basic_list_write_short_string, fss_basic_list_write_long_string, 0, F_true, f_console_type_normal), \
+      f_console_parameter_t_initialize(fss_basic_list_write_short_single, fss_basic_list_write_long_single, 0, F_true, f_console_type_normal), \
     }
 
-  #define fss_basic_list_write_total_parameters 9
+  #define fss_basic_list_write_total_parameters 11
 #endif // _di_fss_basic_list_write_defines_
 
 #ifndef _di_fss_basic_list_write_data_t_
@@ -99,6 +107,8 @@ extern "C" {
     f_string_lengths_t remaining;
     bool process_pipe;
 
+    uint8_t verbosity;
+
     f_color_context_t context;
   } fss_basic_list_write_data_t;
 
@@ -107,6 +117,7 @@ extern "C" {
       fss_basic_list_write_console_parameter_t_initialize, \
       f_string_lengths_t_initialize, \
       F_false, \
+      f_console_verbosity_normal, \
       f_color_context_t_initialize, \
     }
 #endif // _di_fss_basic_list_write_data_t_
index df6ac9c1dc034048dd4cd6e47056cfa1b625f2f8..31b4294f8b33fef2aadfd9e8536d7665dee9e6e9 100644 (file)
@@ -11,9 +11,13 @@ extern "C" {
     fll_program_print_help_header(context, fss_basic_read_name_long, fss_basic_read_version);
 
     fll_program_print_help_option(context, f_console_standard_short_help, f_console_standard_long_help, f_console_symbol_short_enable, f_console_symbol_long_enable, "    Print this help message.");
-    fll_program_print_help_option(context, f_console_standard_short_light, f_console_standard_long_light, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Output using colors that show up better on light backgrounds.");
     fll_program_print_help_option(context, f_console_standard_short_dark, f_console_standard_long_dark, f_console_symbol_short_disable, f_console_symbol_long_disable, "    Output using colors that show up better on dark backgrounds.");
+    fll_program_print_help_option(context, f_console_standard_short_light, f_console_standard_long_light, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Output using colors that show up better on light backgrounds.");
     fll_program_print_help_option(context, f_console_standard_short_no_color, f_console_standard_long_no_color, f_console_symbol_short_disable, f_console_symbol_long_disable, "Do not output in color.");
+    fll_program_print_help_option(context, f_console_standard_short_quiet, f_console_standard_long_quiet, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Decrease verbosity beyond normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_normal, f_console_standard_long_normal, f_console_symbol_short_disable, f_console_symbol_long_disable, "  Set verbosity to normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_verbose, f_console_standard_long_verbose, f_console_symbol_short_disable, f_console_symbol_long_disable, " Increase verbosity beyond normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_debug, f_console_standard_long_debug, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Enable debugging, inceasing verbosity beyond normal output.");
     fll_program_print_help_option(context, f_console_standard_short_version, f_console_standard_long_version, f_console_symbol_short_disable, f_console_symbol_long_disable, " Print only the version number.");
 
     printf("%c", f_string_eol[0]);
@@ -128,8 +132,8 @@ extern "C" {
 
     {
       f_console_parameter_id_t ids[3] = { fss_basic_read_parameter_no_color, fss_basic_read_parameter_light, fss_basic_read_parameter_dark };
-      const f_console_parameter_ids_t choices = { ids, 3 };
-      const f_console_parameters_t parameters = { data->parameters, fss_basic_read_total_parameters };
+      const f_console_parameter_ids_t choices = f_macro_console_parameter_ids_t_initialize(ids, 3);
+      const f_console_parameters_t parameters = f_macro_console_parameters_t_initialize(data->parameters, fss_basic_read_total_parameters);
 
       status = fll_program_parameter_process(arguments, parameters, choices, F_true, &data->remaining, &data->context);
 
@@ -143,11 +147,19 @@ extern "C" {
 
     if (data->parameters[fss_basic_read_parameter_help].result == f_console_result_found) {
       fss_basic_read_print_help(data->context);
+
+      fss_basic_read_delete_data(data);
+      return status;
     }
-    else if (data->parameters[fss_basic_read_parameter_version].result == f_console_result_found) {
+
+    if (data->parameters[fss_basic_read_parameter_version].result == f_console_result_found) {
       fll_program_print_version(fss_basic_read_version);
+
+      fss_basic_read_delete_data(data);
+      return status;
     }
-    else if (data->remaining.used > 0 || data->process_pipe) {
+
+    if (data->remaining.used > 0 || data->process_pipe) {
       if (data->parameters[fss_basic_read_parameter_at].result == f_console_result_found) {
         fl_color_print(f_type_error, data->context.set.error, "ERROR: The parameter '");
         fl_color_print(f_type_error, data->context.set.notable, "%s%s", f_console_symbol_long_enable, fss_basic_read_long_at);
index 4a50a3705a9a7257a21821173d03da57c2bd11a3..2b2df2a322ab7940fcd852346ca773a42170e788 100644 (file)
@@ -124,12 +124,15 @@ extern "C" {
   typedef struct {
     f_console_parameter_t parameters[fss_basic_read_total_parameters];
 
+    f_string_lengths_t remaining;
+    bool process_pipe;
+
+    uint8_t verbosity;
+
     f_string_dynamic_t buffer;
     f_fss_objects_t objects;
     f_fss_contents_t contents;
     f_string_quantity_t quantity;
-    f_string_lengths_t remaining;
-    bool process_pipe;
 
     f_color_context_t context;
   } fss_basic_read_data_t;
@@ -137,12 +140,13 @@ extern "C" {
   #define fss_basic_read_data_t_initialize \
     { \
       fss_basic_read_console_parameter_t_initialize, \
+      f_string_lengths_t_initialize, \
+      F_false, \
+      f_console_verbosity_normal, \
       f_string_dynamic_t_initialize, \
       f_fss_objects_t_initialize, \
       f_fss_contents_t_initialize, \
       f_string_quantity_t_initialize, \
-      f_string_lengths_t_initialize, \
-      F_false, \
       f_color_context_t_initialize, \
     }
 #endif // _di_fss_basic_read_data_t_
index 787cd7761a5359ecfa2244c7ba6211797c5246d5..9157a7ef1e9d07101d48117ccfac44663822be79 100644 (file)
@@ -10,17 +10,23 @@ extern "C" {
     fll_program_print_help_header(context, fss_basic_write_name_long, fss_basic_write_version);
 
     fll_program_print_help_option(context, f_console_standard_short_help, f_console_standard_long_help, f_console_symbol_short_enable, f_console_symbol_long_enable, "    Print this help message.");
-    fll_program_print_help_option(context, f_console_standard_short_light, f_console_standard_long_light, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Output using colors that show up better on light backgrounds.");
     fll_program_print_help_option(context, f_console_standard_short_dark, f_console_standard_long_dark, f_console_symbol_short_disable, f_console_symbol_long_disable, "    Output using colors that show up better on dark backgrounds.");
+    fll_program_print_help_option(context, f_console_standard_short_light, f_console_standard_long_light, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Output using colors that show up better on light backgrounds.");
     fll_program_print_help_option(context, f_console_standard_short_no_color, f_console_standard_long_no_color, f_console_symbol_short_disable, f_console_symbol_long_disable, "Do not output in color.");
+    fll_program_print_help_option(context, f_console_standard_short_quiet, f_console_standard_long_quiet, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Decrease verbosity beyond normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_normal, f_console_standard_long_normal, f_console_symbol_short_disable, f_console_symbol_long_disable, "  Set verbosity to normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_verbose, f_console_standard_long_verbose, f_console_symbol_short_disable, f_console_symbol_long_disable, " Increase verbosity beyond normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_debug, f_console_standard_long_debug, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Enable debugging, inceasing verbosity beyond normal output.");
     fll_program_print_help_option(context, f_console_standard_short_version, f_console_standard_long_version, f_console_symbol_short_disable, f_console_symbol_long_disable, " Print only the version number.");
 
     printf("%c", f_string_eol[0]);
 
+    fll_program_print_help_option(context, fss_basic_write_short_content, fss_basic_write_long_content, f_console_symbol_short_enable, f_console_symbol_long_enable, " The content to output.");
+    fll_program_print_help_option(context, fss_basic_write_short_double, fss_basic_write_long_double, f_console_symbol_short_enable, f_console_symbol_long_enable, " Use double quotes (default).");
     fll_program_print_help_option(context, fss_basic_write_short_file, fss_basic_write_long_file, f_console_symbol_short_enable, f_console_symbol_long_enable, "   Specify a file to send output to.");
-    fll_program_print_help_option(context, fss_basic_write_short_object, fss_basic_write_long_object, f_console_symbol_short_enable, f_console_symbol_long_enable, " Write an object instead of content.");
-    fll_program_print_help_option(context, fss_basic_write_short_partial, fss_basic_write_long_partial, f_console_symbol_short_enable, f_console_symbol_long_enable, "Do not output the final end of object or end of content character.");
-    fll_program_print_help_option(context, fss_basic_write_short_string, fss_basic_write_long_string, f_console_symbol_short_enable, f_console_symbol_long_enable, " Specify a string to convert.");
+    fll_program_print_help_option(context, fss_basic_write_short_object, fss_basic_write_long_object, f_console_symbol_short_enable, f_console_symbol_long_enable, " The object to output.");
+    fll_program_print_help_option(context, fss_basic_write_short_partial, fss_basic_write_long_partial, f_console_symbol_short_enable, f_console_symbol_long_enable, "Do not output end of object/content character.");
+    fll_program_print_help_option(context, fss_basic_write_short_single, fss_basic_write_long_single, f_console_symbol_short_enable, f_console_symbol_long_enable, " Use single quotes.");
 
     fll_program_print_help_usage(context, fss_basic_write_name, "");
 
@@ -34,8 +40,8 @@ extern "C" {
 
     {
       f_console_parameter_id_t ids[3] = { fss_basic_write_parameter_no_color, fss_basic_write_parameter_light, fss_basic_write_parameter_dark };
-      const f_console_parameter_ids_t choices = { ids, 3 };
-      const f_console_parameters_t parameters = { data->parameters, fss_basic_write_total_parameters };
+      const f_console_parameter_ids_t choices = f_macro_console_parameter_ids_t_initialize(ids, 3);
+      const f_console_parameters_t parameters = f_macro_console_parameters_t_initialize(data->parameters, fss_basic_write_total_parameters);
 
       status = fll_program_parameter_process(arguments, parameters, choices, F_true, &data->remaining, &data->context);
 
@@ -49,178 +55,184 @@ extern "C" {
 
     if (data->parameters[fss_basic_write_parameter_help].result == f_console_result_found) {
       fss_basic_write_print_help(data->context);
+
+      fss_basic_write_delete_data(data);
+      return status;
     }
-    else if (data->parameters[fss_basic_write_parameter_version].result == f_console_result_found) {
+
+    if (data->parameters[fss_basic_write_parameter_version].result == f_console_result_found) {
       fll_program_print_version(fss_basic_write_version);
+
+      fss_basic_write_delete_data(data);
+      return status;
     }
-    else {
-      f_array_length_t counter = 0;
-      bool object = (data->parameters[fss_basic_write_parameter_object].result == f_console_result_found);
 
-      f_string_dynamic_t buffer = f_string_dynamic_t_initialize;
-      f_string_range_t range = f_string_range_t_initialize;
+    f_array_length_t counter = 0;
+    bool object = (data->parameters[fss_basic_write_parameter_object].result == f_console_result_found);
 
-      if (data->process_pipe) {
-        f_file_t file = f_file_t_initialize;
-        f_string_dynamic_t input = f_string_dynamic_t_initialize;
+    f_string_dynamic_t buffer = f_string_dynamic_t_initialize;
+    f_string_range_t range = f_string_range_t_initialize;
 
-        file.id = f_type_descriptor_input;
+    if (data->process_pipe) {
+      f_file_t file = f_file_t_initialize;
+      f_string_dynamic_t input = f_string_dynamic_t_initialize;
 
-        status = f_file_read(file, &input);
+      file.id = f_type_descriptor_input;
 
-        if (F_status_is_error(status)) {
-          status = F_status_set_fine(status);
+      status = f_file_read(file, &input);
 
-          if (status == F_parameter) {
-            fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: Invalid parameter when calling f_file_open()");
-          }
-          else if (status == F_file_found_not) {
-            fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Unable to find the file '%s'", "-");
-          }
-          else if (status == F_file_open) {
-            fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Unable to open the file '%s'", "-");
-          }
-          else if (status == F_file_descriptor) {
-            fl_color_print_line(f_type_error, data->context.set.error, "ERROR: File descriptor error while trying to open the file '%s'", "-");
-          }
-          else {
-            fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: An unhandled error (%u) has occurred while calling f_file_open()", status);
-          }
+      if (F_status_is_error(status)) {
+        status = F_status_set_fine(status);
 
-          f_macro_string_dynamic_t_delete_simple(input);
-          fss_basic_write_delete_data(data);
-          return F_status_set_error(status);
+        if (status == F_parameter) {
+          fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: Invalid parameter when calling f_file_open()");
+        }
+        else if (status == F_file_found_not) {
+          fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Unable to find the file '%s'", "-");
+        }
+        else if (status == F_file_open) {
+          fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Unable to open the file '%s'", "-");
+        }
+        else if (status == F_file_descriptor) {
+          fl_color_print_line(f_type_error, data->context.set.error, "ERROR: File descriptor error while trying to open the file '%s'", "-");
         }
+        else {
+          fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: An unhandled error (%u) has occurred while calling f_file_open()", status);
+        }
+
+        f_macro_string_dynamic_t_delete_simple(input);
+        fss_basic_write_delete_data(data);
+        return F_status_set_error(status);
+      }
 
-        if (input.used) {
-          range.start = 0;
-          range.stop = input.used - 1;
+      if (input.used) {
+        range.start = 0;
+        range.stop = input.used - 1;
 
-          if (object) {
-            status = fl_fss_basic_object_write(input, 0, &range, &buffer);
+        if (object) {
+          status = fl_fss_basic_object_write(input, 0, &range, &buffer);
 
-            if (F_status_is_error(status) || status == F_data_not_stop || status == F_data_not_eos) {
-              f_macro_string_dynamic_t_delete_simple(buffer);
-              f_macro_string_dynamic_t_delete_simple(input);
-              fss_basic_write_delete_data(data);
-              return F_status_set_error(status);
-            }
-          }
-          else {
-            status = fl_fss_basic_content_write(input, &range, &buffer);
-
-            if (F_status_is_error(status) || status == F_data_not_stop || status == F_data_not_eos) {
-              f_macro_string_dynamic_t_delete_simple(buffer);
-              f_macro_string_dynamic_t_delete_simple(input);
-              fss_basic_write_delete_data(data);
-              return F_status_set_error(status);
-            }
+          if (F_status_is_error(status) || status == F_data_not_stop || status == F_data_not_eos) {
+            f_macro_string_dynamic_t_delete_simple(buffer);
+            f_macro_string_dynamic_t_delete_simple(input);
+            fss_basic_write_delete_data(data);
+            return F_status_set_error(status);
           }
-
-          if (data->parameters[fss_basic_write_parameter_partial].result == f_console_result_found) {
-            buffer.used--;
+        }
+        else {
+          status = fl_fss_basic_content_write(input, &range, &buffer);
+
+          if (F_status_is_error(status) || status == F_data_not_stop || status == F_data_not_eos) {
+            f_macro_string_dynamic_t_delete_simple(buffer);
+            f_macro_string_dynamic_t_delete_simple(input);
+            fss_basic_write_delete_data(data);
+            return F_status_set_error(status);
           }
         }
 
-        f_macro_string_dynamic_t_delete_simple(input);
+        if (data->parameters[fss_basic_write_parameter_partial].result == f_console_result_found) {
+          buffer.used--;
+        }
       }
-      else if (data->parameters[fss_basic_write_parameter_string].result == f_console_result_additional) {
-        f_string_dynamic_t input = f_string_dynamic_t_initialize;
 
-        input.string = arguments.argv[data->parameters[fss_basic_write_parameter_string].additional.array[0]];
-        input.used = strnlen(input.string, f_console_length_size);
+      f_macro_string_dynamic_t_delete_simple(input);
+    }
+    else if (data->parameters[fss_basic_write_parameter_string].result == f_console_result_additional) {
+      f_string_dynamic_t input = f_string_dynamic_t_initialize;
 
-        if (input.used) {
-          range.start = 0;
-          range.stop = input.used - 1;
+      input.string = arguments.argv[data->parameters[fss_basic_write_parameter_string].additional.array[0]];
+      input.used = strnlen(input.string, f_console_length_size);
 
-          if (object) {
-            status = fl_fss_basic_object_write(input, 0, &range, &buffer);
+      if (input.used) {
+        range.start = 0;
+        range.stop = input.used - 1;
 
-            if (F_status_is_error(status) || status == F_data_not_stop || status == F_data_not_eos) {
-              f_macro_string_dynamic_t_delete_simple(buffer);
-              fss_basic_write_delete_data(data);
-              return F_status_set_error(status);
-            }
-          }
-          else {
-            status = fl_fss_basic_content_write(input, &range, &buffer);
-
-            if (F_status_is_error(status) || status == F_data_not_stop || status == F_data_not_eos) {
-              f_macro_string_dynamic_t_delete_simple(buffer);
-              fss_basic_write_delete_data(data);
-              return F_status_set_error(status);
-            }
+        if (object) {
+          status = fl_fss_basic_object_write(input, 0, &range, &buffer);
+
+          if (F_status_is_error(status) || status == F_data_not_stop || status == F_data_not_eos) {
+            f_macro_string_dynamic_t_delete_simple(buffer);
+            fss_basic_write_delete_data(data);
+            return F_status_set_error(status);
           }
+        }
+        else {
+          status = fl_fss_basic_content_write(input, &range, &buffer);
 
-          if (data->parameters[fss_basic_write_parameter_partial].result == f_console_result_found) {
-            buffer.used--;
+          if (F_status_is_error(status) || status == F_data_not_stop || status == F_data_not_eos) {
+            f_macro_string_dynamic_t_delete_simple(buffer);
+            fss_basic_write_delete_data(data);
+            return F_status_set_error(status);
           }
         }
 
-        status = F_none;
+        if (data->parameters[fss_basic_write_parameter_partial].result == f_console_result_found) {
+          buffer.used--;
+        }
       }
 
-      if (data->parameters[fss_basic_write_parameter_file].result == f_console_result_additional) {
-        f_file_t output = f_file_t_initialize;
+      status = F_none;
+    }
 
-        output.flag = f_file_flag_append_wo;
+    if (data->parameters[fss_basic_write_parameter_file].result == f_console_result_additional) {
+      f_file_t output = f_file_t_initialize;
 
-        status = f_file_open(arguments.argv[data->parameters[fss_basic_write_parameter_file].additional.array[0]], 0, &output);
+      output.flag = f_file_flag_append_wo;
 
-        if (F_status_is_error(status)) {
-          status = F_status_set_fine(status);
+      status = f_file_open(arguments.argv[data->parameters[fss_basic_write_parameter_file].additional.array[0]], 0, &output);
 
-          f_file_close(&output.id);
+      if (F_status_is_error(status)) {
+        status = F_status_set_fine(status);
 
-          if (status == F_parameter) {
-            fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: Invalid parameter when calling f_file_open()");
-          }
-          else if (status == F_file_found_not) {
-            fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Unable to find the file '%s'", arguments.argv[data->parameters[fss_basic_write_parameter_file].additional.array[0]]);
-          }
-          else if (status == F_file_open) {
-            fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Unable to open the file '%s'", arguments.argv[data->parameters[fss_basic_write_parameter_file].additional.array[0]]);
-          }
-          else if (status == F_file_descriptor) {
-            fl_color_print_line(f_type_error, data->context.set.error, "ERROR: File descriptor error while trying to open the file '%s'", arguments.argv[data->parameters[fss_basic_write_parameter_file].additional.array[0]]);
-          }
-          else {
-            fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: An unhandled error (%u) has occurred while calling f_file_open()", status);
-          }
+        f_file_close(&output.id);
 
-          f_macro_string_dynamic_t_delete_simple(buffer);
-          fss_basic_write_delete_data(data);
-          return status;
+        if (status == F_parameter) {
+          fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: Invalid parameter when calling f_file_open()");
+        }
+        else if (status == F_file_found_not) {
+          fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Unable to find the file '%s'", arguments.argv[data->parameters[fss_basic_write_parameter_file].additional.array[0]]);
+        }
+        else if (status == F_file_open) {
+          fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Unable to open the file '%s'", arguments.argv[data->parameters[fss_basic_write_parameter_file].additional.array[0]]);
+        }
+        else if (status == F_file_descriptor) {
+          fl_color_print_line(f_type_error, data->context.set.error, "ERROR: File descriptor error while trying to open the file '%s'", arguments.argv[data->parameters[fss_basic_write_parameter_file].additional.array[0]]);
+        }
+        else {
+          fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: An unhandled error (%u) has occurred while calling f_file_open()", status);
         }
 
-        status = f_file_write(output, buffer, 0);
-        f_file_close(&output.id);
+        f_macro_string_dynamic_t_delete_simple(buffer);
+        fss_basic_write_delete_data(data);
+        return status;
+      }
 
-        if (F_status_is_error(status)) {
-          status = F_status_set_fine(status);
+      status = f_file_write(output, buffer, 0);
+      f_file_close(&output.id);
 
-          if (status == F_parameter) {
-            fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: Invalid parameter when calling f_file_write()");
-          }
-          else if (status == F_file_write) {
-            fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Unable to write to the file '%s'", arguments.argv[data->parameters[fss_basic_write_parameter_file].additional.array[0]]);
-          }
-          else {
-            fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: An unhandled error (%u) has occurred while calling f_file_write()", status);
-          }
+      if (F_status_is_error(status)) {
+        status = F_status_set_fine(status);
 
-          f_macro_string_dynamic_t_delete_simple(buffer);
-          fss_basic_write_delete_data(data);
-          return F_status_set_error(status);
+        if (status == F_parameter) {
+          fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: Invalid parameter when calling f_file_write()");
+        }
+        else if (status == F_file_write) {
+          fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Unable to write to the file '%s'", arguments.argv[data->parameters[fss_basic_write_parameter_file].additional.array[0]]);
+        }
+        else {
+          fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: An unhandled error (%u) has occurred while calling f_file_write()", status);
         }
-      }
-      else {
-        f_print_dynamic(f_type_output, buffer);
-      }
 
-      f_macro_string_dynamic_t_delete_simple(buffer);
+        f_macro_string_dynamic_t_delete_simple(buffer);
+        fss_basic_write_delete_data(data);
+        return F_status_set_error(status);
+      }
     }
+    else {
+      f_print_dynamic(f_type_output, buffer);
+    }
+
+    f_macro_string_dynamic_t_delete_simple(buffer);
 
     fss_basic_write_delete_data(data);
     return status;
index bec56ef7d774890d29654925e467aaa963e3da25..609309f7c74054b54b6fa6df8c669797a38d1e45 100644 (file)
@@ -52,15 +52,19 @@ extern "C" {
 #endif // _di_fss_basic_write_name_
 
 #ifndef _di_fss_basic_write_defines_
-  #define fss_basic_write_short_object  "o"
+  #define fss_basic_write_short_content "c"
+  #define fss_basic_write_short_double  "d"
   #define fss_basic_write_short_file    "f"
-  #define fss_basic_write_short_string  "s"
+  #define fss_basic_write_short_object  "o"
   #define fss_basic_write_short_partial "p"
+  #define fss_basic_write_short_single  "s"
 
-  #define fss_basic_write_long_object  "object"
+  #define fss_basic_write_long_content "content"
+  #define fss_basic_write_long_double  "double"
   #define fss_basic_write_long_file    "file"
-  #define fss_basic_write_long_string  "string"
+  #define fss_basic_write_long_object  "object"
   #define fss_basic_write_long_partial "partial"
+  #define fss_basic_write_long_single  "single"
 
   enum {
     fss_basic_write_parameter_help,
@@ -69,10 +73,12 @@ extern "C" {
     fss_basic_write_parameter_no_color,
     fss_basic_write_parameter_version,
 
+    fss_basic_write_parameter_content,
+    fss_basic_write_parameter_double,
     fss_basic_write_parameter_file,
     fss_basic_write_parameter_object,
     fss_basic_write_parameter_partial,
-    fss_basic_write_parameter_string,
+    fss_basic_write_parameter_single,
   };
 
   #define fss_basic_write_console_parameter_t_initialize \
@@ -82,13 +88,15 @@ extern "C" {
       f_console_parameter_t_initialize(f_console_standard_short_dark, f_console_standard_long_dark, 0, F_false, f_console_type_inverse), \
       f_console_parameter_t_initialize(f_console_standard_short_no_color, f_console_standard_long_no_color, 0, F_false, f_console_type_inverse), \
       f_console_parameter_t_initialize(f_console_standard_short_version, f_console_standard_long_version, 0, F_false, f_console_type_inverse), \
+      f_console_parameter_t_initialize(fss_basic_write_short_content, fss_basic_write_long_content, 0, F_true, f_console_type_normal), \
+      f_console_parameter_t_initialize(fss_basic_write_short_double, fss_basic_write_long_double, 0, F_true, f_console_type_normal), \
       f_console_parameter_t_initialize(fss_basic_write_short_file, fss_basic_write_long_file, 0, F_true, f_console_type_normal), \
       f_console_parameter_t_initialize(fss_basic_write_short_object, fss_basic_write_long_object, 0, F_false, f_console_type_normal), \
       f_console_parameter_t_initialize(fss_basic_write_short_partial, fss_basic_write_long_partial, 0, F_true, f_console_type_normal), \
-      f_console_parameter_t_initialize(fss_basic_write_short_string, fss_basic_write_long_string, 0, F_true, f_console_type_normal), \
+      f_console_parameter_t_initialize(fss_basic_write_short_single, fss_basic_write_long_single, 0, F_true, f_console_type_normal), \
     }
 
-  #define fss_basic_write_total_parameters 9
+  #define fss_basic_write_total_parameters 11
 #endif // _di_fss_basic_write_defines_
 
 #ifndef _di_fss_basic_write_data_
@@ -98,6 +106,8 @@ extern "C" {
     f_string_lengths_t remaining;
     bool process_pipe;
 
+    uint8_t verbosity;
+
     f_color_context_t context;
   } fss_basic_write_data;
 
@@ -106,6 +116,7 @@ extern "C" {
       fss_basic_write_console_parameter_t_initialize, \
       f_string_lengths_t_initialize, \
       F_false, \
+      f_console_verbosity_normal, \
       f_color_context_t_initialize, \
     }
 #endif // _di_fss_basic_write_data_
index 625d0da87f37ab6df364e36ced772efa33ccfdb6..17efb5432952d6ce39aa808c3c6d4ab8566fd6ca 100644 (file)
@@ -11,9 +11,13 @@ extern "C" {
     fll_program_print_help_header(context, fss_extended_list_read_name_long, fss_extended_list_read_version);
 
     fll_program_print_help_option(context, f_console_standard_short_help, f_console_standard_long_help, f_console_symbol_short_enable, f_console_symbol_long_enable, "    Print this help message.");
-    fll_program_print_help_option(context, f_console_standard_short_light, f_console_standard_long_light, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Output using colors that show up better on light backgrounds.");
     fll_program_print_help_option(context, f_console_standard_short_dark, f_console_standard_long_dark, f_console_symbol_short_disable, f_console_symbol_long_disable, "    Output using colors that show up better on dark backgrounds.");
+    fll_program_print_help_option(context, f_console_standard_short_light, f_console_standard_long_light, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Output using colors that show up better on light backgrounds.");
     fll_program_print_help_option(context, f_console_standard_short_no_color, f_console_standard_long_no_color, f_console_symbol_short_disable, f_console_symbol_long_disable, "Do not output in color.");
+    fll_program_print_help_option(context, f_console_standard_short_quiet, f_console_standard_long_quiet, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Decrease verbosity beyond normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_normal, f_console_standard_long_normal, f_console_symbol_short_disable, f_console_symbol_long_disable, "  Set verbosity to normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_verbose, f_console_standard_long_verbose, f_console_symbol_short_disable, f_console_symbol_long_disable, " Increase verbosity beyond normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_debug, f_console_standard_long_debug, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Enable debugging, inceasing verbosity beyond normal output.");
     fll_program_print_help_option(context, f_console_standard_short_version, f_console_standard_long_version, f_console_symbol_short_disable, f_console_symbol_long_disable, " Print only the version number.");
 
     printf("%c", f_string_eol[0]);
@@ -128,8 +132,8 @@ extern "C" {
 
     {
       f_console_parameter_id_t ids[3] = { fss_extended_list_read_parameter_no_color, fss_extended_list_read_parameter_light, fss_extended_list_read_parameter_dark };
-      const f_console_parameter_ids_t choices = { ids, 3 };
-      const f_console_parameters_t parameters = { data->parameters, fss_extended_list_read_total_parameters };
+      const f_console_parameter_ids_t choices = f_macro_console_parameter_ids_t_initialize(ids, 3);
+      const f_console_parameters_t parameters = f_macro_console_parameters_t_initialize(data->parameters, fss_extended_list_read_total_parameters);
 
       status = fll_program_parameter_process(arguments, parameters, choices, F_true, &data->remaining, &data->context);
 
@@ -143,11 +147,19 @@ extern "C" {
 
     if (data->parameters[fss_extended_list_read_parameter_help].result == f_console_result_found) {
       fss_extended_list_read_print_help(data->context);
+
+      fss_extended_list_write_delete_data(data);
+      return F_none;
     }
-    else if (data->parameters[fss_extended_list_read_parameter_version].result == f_console_result_found) {
+
+    if (data->parameters[fss_extended_list_read_parameter_version].result == f_console_result_found) {
       fll_program_print_version(fss_extended_list_read_version);
+
+      fss_extended_list_write_delete_data(data);
+      return F_none;
     }
-    else if (data->remaining.used > 0 || data->process_pipe) {
+
+    if (data->remaining.used > 0 || data->process_pipe) {
       if (data->parameters[fss_extended_list_read_parameter_at].result == f_console_result_found) {
         fl_color_print(f_type_error, data->context.set.error, "ERROR: The parameter '");
         fl_color_print(f_type_error, data->context.set.notable, "%s%s", f_console_symbol_long_enable, fss_extended_list_read_long_at);
index af7e76fc5e4e96633392c32442341513ed87686d..9c7fed39a17124a7a0d8eb73a7106ab4f2d577ff 100644 (file)
@@ -124,11 +124,14 @@ extern "C" {
   typedef struct {
     f_console_parameter_t parameters[fss_extended_list_read_total_parameters];
 
+    f_string_lengths_t remaining;
+    bool process_pipe;
+
+    uint8_t verbosity;
+
     f_string_dynamic_t buffer;
     f_fss_nest_t nest;
     f_string_quantity_t quantity;
-    f_string_lengths_t remaining;
-    bool process_pipe;
 
     f_color_context_t context;
   } fss_extended_list_read_data_t;
@@ -136,11 +139,12 @@ extern "C" {
   #define fss_extended_list_read_data_t_initialize \
     { \
       fss_extended_list_read_console_parameter_t_initialize, \
+      f_string_lengths_t_initialize, \
+      F_false, \
+      f_console_verbosity_normal, \
       f_string_dynamic_t_initialize, \
       f_fss_nest_t_initialize, \
       f_string_quantity_t_initialize, \
-      f_string_lengths_t_initialize, \
-      F_false, \
       f_color_context_t_initialize, \
     }
 #endif // _di_fss_extended_list_read_data_t_
index 51c383e9b36f835f6250b1390fff6561e4ca4f21..790d21364d5f03fdf657cc33048265238fc96808 100644 (file)
@@ -11,9 +11,13 @@ extern "C" {
     fll_program_print_help_header(context, fss_extended_read_name_long, fss_extended_read_version);
 
     fll_program_print_help_option(context, f_console_standard_short_help, f_console_standard_long_help, f_console_symbol_short_enable, f_console_symbol_long_enable, "    Print this help message.");
-    fll_program_print_help_option(context, f_console_standard_short_light, f_console_standard_long_light, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Output using colors that show up better on light backgrounds.");
     fll_program_print_help_option(context, f_console_standard_short_dark, f_console_standard_long_dark, f_console_symbol_short_disable, f_console_symbol_long_disable, "    Output using colors that show up better on dark backgrounds.");
+    fll_program_print_help_option(context, f_console_standard_short_light, f_console_standard_long_light, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Output using colors that show up better on light backgrounds.");
     fll_program_print_help_option(context, f_console_standard_short_no_color, f_console_standard_long_no_color, f_console_symbol_short_disable, f_console_symbol_long_disable, "Do not output in color.");
+    fll_program_print_help_option(context, f_console_standard_short_quiet, f_console_standard_long_quiet, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Decrease verbosity beyond normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_normal, f_console_standard_long_normal, f_console_symbol_short_disable, f_console_symbol_long_disable, "  Set verbosity to normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_verbose, f_console_standard_long_verbose, f_console_symbol_short_disable, f_console_symbol_long_disable, " Increase verbosity beyond normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_debug, f_console_standard_long_debug, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Enable debugging, inceasing verbosity beyond normal output.");
     fll_program_print_help_option(context, f_console_standard_short_version, f_console_standard_long_version, f_console_symbol_short_disable, f_console_symbol_long_disable, " Print only the version number.");
 
     printf("%c", f_string_eol[0]);
@@ -128,8 +132,8 @@ extern "C" {
 
     {
       f_console_parameter_id_t ids[3] = { fss_extended_read_parameter_no_color, fss_extended_read_parameter_light, fss_extended_read_parameter_dark };
-      const f_console_parameter_ids_t choices = { ids, 3 };
-      const f_console_parameters_t parameters = { data->parameters, fss_extended_read_total_parameters };
+      const f_console_parameter_ids_t choices = f_macro_console_parameter_ids_t_initialize(ids, 3);
+      const f_console_parameters_t parameters = f_macro_console_parameters_t_initialize(data->parameters, fss_extended_read_total_parameters);
 
       status = fll_program_parameter_process(arguments, parameters, choices, F_true, &data->remaining, &data->context);
 
@@ -143,11 +147,19 @@ extern "C" {
 
     if (data->parameters[fss_extended_read_parameter_help].result == f_console_result_found) {
       fss_extended_read_print_help(data->context);
+
+      fss_extended_read_delete_data(data);
+      return F_none;
     }
-    else if (data->parameters[fss_extended_read_parameter_version].result == f_console_result_found) {
+
+    if (data->parameters[fss_extended_read_parameter_version].result == f_console_result_found) {
       fll_program_print_version(fss_extended_read_version);
+
+      fss_extended_read_delete_data(data);
+      return F_none;
     }
-    else if (data->remaining.used > 0 || data->process_pipe) {
+
+    if (data->remaining.used > 0 || data->process_pipe) {
       if (data->parameters[fss_extended_read_parameter_at].result == f_console_result_found) {
         fl_color_print(f_type_error, data->context.set.error, "ERROR: The parameter '");
         fl_color_print(f_type_error, data->context.set.notable, "%s%s", f_console_symbol_long_enable, fss_extended_read_long_at);
index cc374fd5e5d1d5a1ba2b767dac816e163a292a95..aa315062d194853306f16425784c4fb52e5263ab 100644 (file)
@@ -124,12 +124,15 @@ extern "C" {
   typedef struct {
     f_console_parameter_t parameters[fss_extended_read_total_parameters];
 
+    f_string_lengths_t remaining;
+    bool process_pipe;
+
+    uint8_t verbosity;
+
     f_string_dynamic_t buffer;
     f_fss_objects_t objects;
     f_fss_contents_t contents;
     f_string_quantity_t quantity;
-    f_string_lengths_t remaining;
-    bool process_pipe;
 
     f_color_context_t context;
   } fss_extended_read_data_t;
@@ -137,12 +140,13 @@ extern "C" {
   #define fss_extended_read_data_initialize \
     { \
       fss_extended_read_console_parameter_t_initialize, \
+      f_string_lengths_t_initialize, \
+      F_false, \
+      f_console_verbosity_normal, \
       f_string_dynamic_t_initialize, \
       f_fss_objects_t_initialize, \
       f_fss_contents_t_initialize, \
       f_string_quantity_t_initialize, \
-      f_string_lengths_t_initialize, \
-      F_false, \
       f_color_context_t_initialize, \
     }
 #endif // _di_fss_extended_read_data_t_
index d1d92c114cf1256ccdbc59d9c6ae34b0525913c8..03e586d574194bbeafba349caa22cd5e65e4d98f 100644 (file)
@@ -10,17 +10,23 @@ extern "C" {
     fll_program_print_help_header(context, fss_extended_write_name_long, fss_extended_write_version);
 
     fll_program_print_help_option(context, f_console_standard_short_help, f_console_standard_long_help, f_console_symbol_short_enable, f_console_symbol_long_enable, "    Print this help message.");
-    fll_program_print_help_option(context, f_console_standard_short_light, f_console_standard_long_light, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Output using colors that show up better on light backgrounds.");
     fll_program_print_help_option(context, f_console_standard_short_dark, f_console_standard_long_dark, f_console_symbol_short_disable, f_console_symbol_long_disable, "    Output using colors that show up better on dark backgrounds.");
+    fll_program_print_help_option(context, f_console_standard_short_light, f_console_standard_long_light, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Output using colors that show up better on light backgrounds.");
     fll_program_print_help_option(context, f_console_standard_short_no_color, f_console_standard_long_no_color, f_console_symbol_short_disable, f_console_symbol_long_disable, "Do not output in color.");
+    fll_program_print_help_option(context, f_console_standard_short_quiet, f_console_standard_long_quiet, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Decrease verbosity beyond normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_normal, f_console_standard_long_normal, f_console_symbol_short_disable, f_console_symbol_long_disable, "  Set verbosity to normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_verbose, f_console_standard_long_verbose, f_console_symbol_short_disable, f_console_symbol_long_disable, " Increase verbosity beyond normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_debug, f_console_standard_long_debug, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Enable debugging, inceasing verbosity beyond normal output.");
     fll_program_print_help_option(context, f_console_standard_short_version, f_console_standard_long_version, f_console_symbol_short_disable, f_console_symbol_long_disable, " Print only the version number.");
 
     printf("%c", f_string_eol[0]);
 
+    fll_program_print_help_option(context, fss_extended_write_short_content, fss_extended_write_long_content, f_console_symbol_short_enable, f_console_symbol_long_enable, " The content to output.");
+    fll_program_print_help_option(context, fss_extended_write_short_double, fss_extended_write_long_double, f_console_symbol_short_enable, f_console_symbol_long_enable, " Use double quotes (default).");
     fll_program_print_help_option(context, fss_extended_write_short_file, fss_extended_write_long_file, f_console_symbol_short_enable, f_console_symbol_long_enable, "   Specify a file to send output to.");
-    fll_program_print_help_option(context, fss_extended_write_short_object, fss_extended_write_long_object, f_console_symbol_short_enable, f_console_symbol_long_enable, " Write an object instead of content.");
-    fll_program_print_help_option(context, fss_extended_write_short_partial, fss_extended_write_long_partial, f_console_symbol_short_enable, f_console_symbol_long_enable, "Do not output the final end of object or end of content character.");
-    fll_program_print_help_option(context, fss_extended_write_short_string, fss_extended_write_long_string, f_console_symbol_short_enable, f_console_symbol_long_enable, " Specify a string to convert.");
+    fll_program_print_help_option(context, fss_extended_write_short_object, fss_extended_write_long_object, f_console_symbol_short_enable, f_console_symbol_long_enable, " The object to output.");
+    fll_program_print_help_option(context, fss_extended_write_short_partial, fss_extended_write_long_partial, f_console_symbol_short_enable, f_console_symbol_long_enable, "Do not output end of object/content character.");
+    fll_program_print_help_option(context, fss_extended_write_short_single, fss_extended_write_long_single, f_console_symbol_short_enable, f_console_symbol_long_enable, " Use single quotes.");
 
     fll_program_print_help_usage(context, fss_extended_write_name, "");
 
@@ -34,8 +40,8 @@ extern "C" {
 
     {
       f_console_parameter_id_t ids[3] = { fss_extended_write_parameter_no_color, fss_extended_write_parameter_light, fss_extended_write_parameter_dark };
-      const f_console_parameter_ids_t choices = { ids, 3 };
-      const f_console_parameters_t parameters = { data->parameters, fss_extended_write_total_parameters };
+      const f_console_parameter_ids_t choices = f_macro_console_parameter_ids_t_initialize(ids, 3);
+      const f_console_parameters_t parameters = f_macro_console_parameters_t_initialize(data->parameters, fss_extended_write_total_parameters);
 
       status = fll_program_parameter_process(arguments, parameters, choices, F_true, &data->remaining, &data->context);
 
@@ -49,145 +55,83 @@ extern "C" {
 
     if (data->parameters[fss_extended_write_parameter_help].result == f_console_result_found) {
       fss_extended_write_print_help(data->context);
+
+      fss_extended_write_delete_data(data);
+      return F_none;
     }
-    else if (data->parameters[fss_extended_write_parameter_version].result == f_console_result_found) {
+
+    if (data->parameters[fss_extended_write_parameter_version].result == f_console_result_found) {
       fll_program_print_version(fss_extended_write_version);
+
+      fss_extended_write_delete_data(data);
+      return F_none;
     }
-    else {
-      f_array_length_t counter = 0;
-      bool object = (data->parameters[fss_extended_write_parameter_object].result == f_console_result_found);
 
-      f_string_dynamic_t buffer = f_string_dynamic_t_initialize;
-      f_string_range_t range = f_string_range_t_initialize;
+    f_array_length_t counter = 0;
+    bool object = (data->parameters[fss_extended_write_parameter_object].result == f_console_result_found);
 
-      if (data->process_pipe) {
-        f_file_t file = f_file_t_initialize;
-        f_string_dynamic_t input = f_string_dynamic_t_initialize;
+    f_string_dynamic_t buffer = f_string_dynamic_t_initialize;
+    f_string_range_t range = f_string_range_t_initialize;
 
-        file.id = f_type_descriptor_input;
+    if (data->process_pipe) {
+      f_file_t file = f_file_t_initialize;
+      f_string_dynamic_t input = f_string_dynamic_t_initialize;
 
-        status = f_file_read(file, &input);
+      file.id = f_type_descriptor_input;
 
-        if (F_status_is_error(status)) {
-          status = F_status_set_fine(status);
+      status = f_file_read(file, &input);
 
-          if (status == F_parameter) {
-            fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: Invalid parameter when calling f_file_open()");
-          }
-          else if (status == F_file_found_not) {
-            fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Unable to find the file '%s'", "-");
-          }
-          else if (status == F_file_open) {
-            fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Unable to open the file '%s'", "-");
-          }
-          else if (status == F_file_descriptor) {
-            fl_color_print_line(f_type_error, data->context.set.error, "ERROR: File descriptor error while trying to open the file '%s'", "-");
-          }
-          else {
-            fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: An unhandled error (%u) has occurred while calling f_file_open()", status);
-          }
+      if (F_status_is_error(status)) {
+        status = F_status_set_fine(status);
 
-          f_macro_string_dynamic_t_delete_simple(input);
-          fss_extended_write_delete_data(data);
-          return F_status_set_error(status);
+        if (status == F_parameter) {
+          fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: Invalid parameter when calling f_file_open()");
         }
-
-        if (input.used) {
-          range.start = 0;
-          range.stop = input.used - 1;
-
-          if (object) {
-            status = fl_fss_extended_object_write(input, 0, &range, &buffer);
-
-            if (F_status_is_error(status) || status == F_data_not_stop || status == F_data_not_eos) {
-              f_macro_string_dynamic_t_delete_simple(buffer);
-              f_macro_string_dynamic_t_delete_simple(input);
-              fss_extended_write_delete_data(data);
-              return F_status_set_error(status);
-            }
-
-            if (data->parameters[fss_extended_write_parameter_partial].result == f_console_result_found) {
-              buffer.used--;
-            }
-          }
-          else {
-            status = fl_fss_extended_content_write(input, 0, &range, &buffer);
-
-            if (F_status_is_error(status) || status == F_data_not_stop || status == F_data_not_eos) {
-              f_macro_string_dynamic_t_delete_simple(buffer);
-              f_macro_string_dynamic_t_delete_simple(input);
-              fss_extended_write_delete_data(data);
-              return F_status_set_error(status);
-            }
-
-            // remove the last whitespace separator before possibly appending the newline.
-            if (buffer.used) {
-              buffer.used--;
-            }
-
-            if (data->parameters[fss_extended_write_parameter_partial].result == f_console_result_none) {
-              if (buffer.used == buffer.size) {
-                f_macro_string_dynamic_t_resize(status, buffer, buffer.used + f_fss_default_allocation_step_string);
-
-                if (F_status_is_error(status)) {
-                  f_macro_string_dynamic_t_delete_simple(buffer);
-                  f_macro_string_dynamic_t_delete_simple(input);
-                  fss_extended_write_delete_data(data);
-                  return status;
-                }
-              }
-
-              buffer.string[buffer.used] = f_fss_extended_close;
-              buffer.used++;
-            }
-          }
+        else if (status == F_file_found_not) {
+          fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Unable to find the file '%s'", "-");
+        }
+        else if (status == F_file_open) {
+          fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Unable to open the file '%s'", "-");
+        }
+        else if (status == F_file_descriptor) {
+          fl_color_print_line(f_type_error, data->context.set.error, "ERROR: File descriptor error while trying to open the file '%s'", "-");
+        }
+        else {
+          fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: An unhandled error (%u) has occurred while calling f_file_open()", status);
         }
 
         f_macro_string_dynamic_t_delete_simple(input);
+        fss_extended_write_delete_data(data);
+        return F_status_set_error(status);
       }
-      else if (data->parameters[fss_extended_write_parameter_string].result == f_console_result_additional) {
-        const f_console_parameter_t *parameter = &data->parameters[fss_extended_write_parameter_string];
-        f_string_dynamic_t input = f_string_dynamic_t_initialize;
-
-        if (object) {
-          input.string = arguments.argv[parameter->additional.array[0]];
-          input.used = strnlen(input.string, f_console_length_size);
 
-          if (input.used) {
-            range.start = 0;
-            range.stop = input.used - 1;
+      if (input.used) {
+        range.start = 0;
+        range.stop = input.used - 1;
 
-            status = fl_fss_extended_object_write(input, 0, &range, &buffer);
+        if (object) {
+          status = fl_fss_extended_object_write(input, 0, &range, &buffer);
 
-            if (F_status_is_error(status) || status == F_data_not_stop || status == F_data_not_eos) {
-              f_macro_string_dynamic_t_delete_simple(buffer);
-              fss_extended_write_delete_data(data);
-              return F_status_set_error(status);
-            }
+          if (F_status_is_error(status) || status == F_data_not_stop || status == F_data_not_eos) {
+            f_macro_string_dynamic_t_delete_simple(buffer);
+            f_macro_string_dynamic_t_delete_simple(input);
+            fss_extended_write_delete_data(data);
+            return F_status_set_error(status);
+          }
 
-            if (data->parameters[fss_extended_write_parameter_partial].result == f_console_result_found) {
-              buffer.used--;
-            }
+          if (data->parameters[fss_extended_write_parameter_partial].result == f_console_result_found) {
+            buffer.used--;
           }
         }
         else {
-          for (f_string_length_t i = 0; i < parameter->additional.used; i++) {
-            input.string = arguments.argv[parameter->additional.array[i]];
-            input.used = strnlen(input.string, f_console_length_size);
-
-            if (input.used) {
-              range.start = 0;
-              range.stop = input.used - 1;
+          status = fl_fss_extended_content_write(input, 0, &range, &buffer);
 
-              status = fl_fss_extended_content_write(input, 0, &range, &buffer);
-
-              if (F_status_is_error(status) || status == F_data_not_stop || status == F_data_not_eos) {
-                f_macro_string_dynamic_t_delete_simple(buffer);
-                fss_extended_write_delete_data(data);
-                return F_status_set_error(status);
-              }
-            }
-          } // for
+          if (F_status_is_error(status) || status == F_data_not_stop || status == F_data_not_eos) {
+            f_macro_string_dynamic_t_delete_simple(buffer);
+            f_macro_string_dynamic_t_delete_simple(input);
+            fss_extended_write_delete_data(data);
+            return F_status_set_error(status);
+          }
 
           // remove the last whitespace separator before possibly appending the newline.
           if (buffer.used) {
@@ -200,6 +144,7 @@ extern "C" {
 
               if (F_status_is_error(status)) {
                 f_macro_string_dynamic_t_delete_simple(buffer);
+                f_macro_string_dynamic_t_delete_simple(input);
                 fss_extended_write_delete_data(data);
                 return status;
               }
@@ -209,71 +154,138 @@ extern "C" {
             buffer.used++;
           }
         }
-
-        status = F_none;
       }
 
-      if (data->parameters[fss_extended_write_parameter_file].result == f_console_result_additional) {
-        f_file_t output = f_file_t_initialize;
-
-        output.flag = f_file_flag_append_wo;
+      f_macro_string_dynamic_t_delete_simple(input);
+    }
+    else if (data->parameters[fss_extended_write_parameter_string].result == f_console_result_additional) {
+      const f_console_parameter_t *parameter = &data->parameters[fss_extended_write_parameter_string];
+      f_string_dynamic_t input = f_string_dynamic_t_initialize;
 
-        status = f_file_open(arguments.argv[data->parameters[fss_extended_write_parameter_file].additional.array[0]], 0, &output);
+      if (object) {
+        input.string = arguments.argv[parameter->additional.array[0]];
+        input.used = strnlen(input.string, f_console_length_size);
 
-        if (F_status_is_error(status)) {
-          status = F_status_set_fine(status);
+        if (input.used) {
+          range.start = 0;
+          range.stop = input.used - 1;
 
-          f_file_close(&output.id);
+          status = fl_fss_extended_object_write(input, 0, &range, &buffer);
 
-          if (status == F_parameter) {
-            fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: Invalid parameter when calling f_file_open()");
-          }
-          else if (status == F_file_found_not) {
-            fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Unable to find the file '%s'", arguments.argv[data->parameters[fss_extended_write_parameter_file].additional.array[0]]);
-          }
-          else if (status == F_file_open) {
-            fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Unable to open the file '%s'", arguments.argv[data->parameters[fss_extended_write_parameter_file].additional.array[0]]);
-          }
-          else if (status == F_file_descriptor) {
-            fl_color_print_line(f_type_error, data->context.set.error, "ERROR: File descriptor error while trying to open the file '%s'", arguments.argv[data->parameters[fss_extended_write_parameter_file].additional.array[0]]);
-          }
-          else {
-            fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: An unhandled error (%u) has occurred while calling f_file_open()", status);
+          if (F_status_is_error(status) || status == F_data_not_stop || status == F_data_not_eos) {
+            f_macro_string_dynamic_t_delete_simple(buffer);
+            fss_extended_write_delete_data(data);
+            return F_status_set_error(status);
           }
 
-          f_macro_string_dynamic_t_delete_simple(buffer);
-          fss_extended_write_delete_data(data);
-          return status;
+          if (data->parameters[fss_extended_write_parameter_partial].result == f_console_result_found) {
+            buffer.used--;
+          }
         }
+      }
+      else {
+        for (f_string_length_t i = 0; i < parameter->additional.used; i++) {
+          input.string = arguments.argv[parameter->additional.array[i]];
+          input.used = strnlen(input.string, f_console_length_size);
 
-        status = f_file_write(output, buffer, 0);
-        f_file_close(&output.id);
+          if (input.used) {
+            range.start = 0;
+            range.stop = input.used - 1;
 
-        if (F_status_is_error(status)) {
-          status = F_status_set_fine(status);
+            status = fl_fss_extended_content_write(input, 0, &range, &buffer);
 
-          if (status == F_parameter) {
-            fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: Invalid parameter when calling f_file_write()");
-          }
-          else if (status == F_file_write) {
-            fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Unable to write to the file '%s'", arguments.argv[data->parameters[fss_extended_write_parameter_file].additional.array[0]]);
+            if (F_status_is_error(status) || status == F_data_not_stop || status == F_data_not_eos) {
+              f_macro_string_dynamic_t_delete_simple(buffer);
+              fss_extended_write_delete_data(data);
+              return F_status_set_error(status);
+            }
           }
-          else {
-            fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: An unhandled error (%u) has occurred while calling f_file_write()", status);
+        } // for
+
+        // remove the last whitespace separator before possibly appending the newline.
+        if (buffer.used) {
+          buffer.used--;
+        }
+
+        if (data->parameters[fss_extended_write_parameter_partial].result == f_console_result_none) {
+          if (buffer.used == buffer.size) {
+            f_macro_string_dynamic_t_resize(status, buffer, buffer.used + f_fss_default_allocation_step_string);
+
+            if (F_status_is_error(status)) {
+              f_macro_string_dynamic_t_delete_simple(buffer);
+              fss_extended_write_delete_data(data);
+              return status;
+            }
           }
 
-          f_macro_string_dynamic_t_delete_simple(buffer);
-          fss_extended_write_delete_data(data);
-          return F_status_set_error(status);
+          buffer.string[buffer.used] = f_fss_extended_close;
+          buffer.used++;
         }
       }
-      else {
-        f_print_dynamic(f_type_output, buffer);
+
+      status = F_none;
+    }
+
+    if (data->parameters[fss_extended_write_parameter_file].result == f_console_result_additional) {
+      f_file_t output = f_file_t_initialize;
+
+      output.flag = f_file_flag_append_wo;
+
+      status = f_file_open(arguments.argv[data->parameters[fss_extended_write_parameter_file].additional.array[0]], 0, &output);
+
+      if (F_status_is_error(status)) {
+        status = F_status_set_fine(status);
+
+        f_file_close(&output.id);
+
+        if (status == F_parameter) {
+          fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: Invalid parameter when calling f_file_open()");
+        }
+        else if (status == F_file_found_not) {
+          fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Unable to find the file '%s'", arguments.argv[data->parameters[fss_extended_write_parameter_file].additional.array[0]]);
+        }
+        else if (status == F_file_open) {
+          fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Unable to open the file '%s'", arguments.argv[data->parameters[fss_extended_write_parameter_file].additional.array[0]]);
+        }
+        else if (status == F_file_descriptor) {
+          fl_color_print_line(f_type_error, data->context.set.error, "ERROR: File descriptor error while trying to open the file '%s'", arguments.argv[data->parameters[fss_extended_write_parameter_file].additional.array[0]]);
+        }
+        else {
+          fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: An unhandled error (%u) has occurred while calling f_file_open()", status);
+        }
+
+        f_macro_string_dynamic_t_delete_simple(buffer);
+        fss_extended_write_delete_data(data);
+        return status;
       }
 
-      f_macro_string_dynamic_t_delete_simple(buffer);
+      status = f_file_write(output, buffer, 0);
+      f_file_close(&output.id);
+
+      if (F_status_is_error(status)) {
+        status = F_status_set_fine(status);
+
+        if (status == F_parameter) {
+          fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: Invalid parameter when calling f_file_write()");
+        }
+        else if (status == F_file_write) {
+          fl_color_print_line(f_type_error, data->context.set.error, "ERROR: Unable to write to the file '%s'", arguments.argv[data->parameters[fss_extended_write_parameter_file].additional.array[0]]);
+        }
+        else {
+          fl_color_print_line(f_type_error, data->context.set.error, "INTERNAL ERROR: An unhandled error (%u) has occurred while calling f_file_write()", status);
+        }
+
+        f_macro_string_dynamic_t_delete_simple(buffer);
+        fss_extended_write_delete_data(data);
+        return F_status_set_error(status);
+      }
+    }
+    else {
+      f_print_dynamic(f_type_output, buffer);
     }
 
+    f_macro_string_dynamic_t_delete_simple(buffer);
+
     fss_extended_write_delete_data(data);
     return status;
   }
index 7da895c8a15a47ed0874acf032944f2d07ad6b0f..bd9fcc09014f579ded77067f2257a799bd339f44 100644 (file)
@@ -52,15 +52,19 @@ extern "C" {
 #endif // _di_fss_extended_write_name_
 
 #ifndef _di_fss_extended_write_defines_
-  #define fss_extended_write_short_object  "o"
-  #define fss_extended_write_short_file    "f"
-  #define fss_extended_write_short_string  "s"
-  #define fss_extended_write_short_partial "p"
-
-  #define fss_extended_write_long_object  "object"
+  #define fss_extended_write_short_content  "c"
+  #define fss_extended_write_short_double   "d"
+  #define fss_extended_write_short_file     "f"
+  #define fss_extended_write_short_object   "o"
+  #define fss_extended_write_short_partial  "p"
+  #define fss_extended_write_short_single   "s"
+
+  #define fss_extended_write_long_content "content"
+  #define fss_extended_write_long_double  "double"
   #define fss_extended_write_long_file    "file"
-  #define fss_extended_write_long_string  "string"
+  #define fss_extended_write_long_object  "object"
   #define fss_extended_write_long_partial "partial"
+  #define fss_extended_write_long_single  "single"
 
   enum {
     fss_extended_write_parameter_help,
@@ -69,10 +73,12 @@ extern "C" {
     fss_extended_write_parameter_no_color,
     fss_extended_write_parameter_version,
 
+    fss_extended_write_parameter_content,
+    fss_extended_write_parameter_double,
     fss_extended_write_parameter_file,
     fss_extended_write_parameter_object,
     fss_extended_write_parameter_partial,
-    fss_extended_write_parameter_string,
+    fss_extended_write_parameter_single,
   };
 
   #define fss_extended_write_console_parameter_t_initialize \
@@ -82,13 +88,15 @@ extern "C" {
       f_console_parameter_t_initialize(f_console_standard_short_dark, f_console_standard_long_dark, 0, F_false, f_console_type_inverse), \
       f_console_parameter_t_initialize(f_console_standard_short_no_color, f_console_standard_long_no_color, 0, F_false, f_console_type_inverse), \
       f_console_parameter_t_initialize(f_console_standard_short_version, f_console_standard_long_version, 0, F_false, f_console_type_inverse), \
+      f_console_parameter_t_initialize(fss_extended_write_short_content, fss_extended_write_long_content, 0, F_true, f_console_type_normal), \
+      f_console_parameter_t_initialize(fss_extended_write_short_double, fss_extended_write_long_double, 0, F_true, f_console_type_normal), \
       f_console_parameter_t_initialize(fss_extended_write_short_file, fss_extended_write_long_file, 0, F_true, f_console_type_normal), \
       f_console_parameter_t_initialize(fss_extended_write_short_object, fss_extended_write_long_object, 0, F_false, f_console_type_normal), \
       f_console_parameter_t_initialize(fss_extended_write_short_partial, fss_extended_write_long_partial, 0, F_false, f_console_type_normal), \
-      f_console_parameter_t_initialize(fss_extended_write_short_string, fss_extended_write_long_string, 0, F_true, f_console_type_normal), \
+      f_console_parameter_t_initialize(fss_extended_write_short_single, fss_extended_write_long_single, 0, F_true, f_console_type_normal), \
     }
 
-  #define fss_extended_write_total_parameters 9
+  #define fss_extended_write_total_parameters 11
 #endif // _di_fss_extended_write_defines_
 
 #ifndef _di_fss_extended_write_data_t_
@@ -98,6 +106,8 @@ extern "C" {
     f_string_lengths_t remaining;
     bool process_pipe;
 
+    uint8_t verbosity;
+
     f_color_context_t context;
   } fss_extended_write_data_t;
 
@@ -106,6 +116,7 @@ extern "C" {
       fss_extended_write_console_parameter_t_initialize, \
       f_string_lengths_t_initialize, \
       F_false, \
+      f_console_verbosity_normal, \
       f_color_context_t_initialize, \
     }
 #endif // _di_fss_extended_write_data_t_
index 42f9cb079aff8de2e89d1330ec209daf960b8f72..7e082a1c8ab2a7ef7e6373b0c7a8eaa56e8ab011 100644 (file)
@@ -11,9 +11,13 @@ extern "C" {
     fll_program_print_help_header(context, fss_status_code_name_long, fss_status_code_version);
 
     fll_program_print_help_option(context, f_console_standard_short_help, f_console_standard_long_help, f_console_symbol_short_enable, f_console_symbol_long_enable, "    Print this help message.");
-    fll_program_print_help_option(context, f_console_standard_short_light, f_console_standard_long_light, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Output using colors that show up better on light backgrounds.");
     fll_program_print_help_option(context, f_console_standard_short_dark, f_console_standard_long_dark, f_console_symbol_short_disable, f_console_symbol_long_disable, "    Output using colors that show up better on dark backgrounds.");
+    fll_program_print_help_option(context, f_console_standard_short_light, f_console_standard_long_light, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Output using colors that show up better on light backgrounds.");
     fll_program_print_help_option(context, f_console_standard_short_no_color, f_console_standard_long_no_color, f_console_symbol_short_disable, f_console_symbol_long_disable, "Do not output in color.");
+    fll_program_print_help_option(context, f_console_standard_short_quiet, f_console_standard_long_quiet, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Decrease verbosity beyond normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_normal, f_console_standard_long_normal, f_console_symbol_short_disable, f_console_symbol_long_disable, "  Set verbosity to normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_verbose, f_console_standard_long_verbose, f_console_symbol_short_disable, f_console_symbol_long_disable, " Increase verbosity beyond normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_debug, f_console_standard_long_debug, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Enable debugging, inceasing verbosity beyond normal output.");
     fll_program_print_help_option(context, f_console_standard_short_version, f_console_standard_long_version, f_console_symbol_short_disable, f_console_symbol_long_disable, " Print only the version number.");
 
     printf("%c", f_string_eol[0]);
@@ -35,8 +39,8 @@ extern "C" {
 
     {
       f_console_parameter_id_t ids[3] = { fss_status_code_parameter_no_color, fss_status_code_parameter_light, fss_status_code_parameter_dark };
-      const f_console_parameter_ids_t choices = { ids, 3 };
-      const f_console_parameters_t parameters = { data->parameters, fss_status_code_total_parameters };
+      const f_console_parameter_ids_t choices = f_macro_console_parameter_ids_t_initialize(ids, 3);
+      const f_console_parameters_t parameters = f_macro_console_parameters_t_initialize(data->parameters, fss_status_code_total_parameters);
 
       status = fll_program_parameter_process(arguments, parameters, choices, F_true, &data->remaining, &data->context);
 
@@ -50,11 +54,14 @@ extern "C" {
 
     if (data->parameters[fss_status_code_parameter_help].result == f_console_result_found) {
       fss_status_code_print_help(data->context);
+
       fss_status_code_delete_data(data);
       return F_none;
     }
-    else if (data->parameters[fss_status_code_parameter_version].result == f_console_result_found) {
+
+    if (data->parameters[fss_status_code_parameter_version].result == f_console_result_found) {
       fll_program_print_version(fss_status_code_version);
+
       fss_status_code_delete_data(data);
       return F_none;
     }
index f812500c800df450832cb3b6b3acdb46de6f1ac4..5ed108341fa5c200bd487fc27ad909d72673daba 100644 (file)
@@ -100,6 +100,8 @@ extern "C" {
     f_string_lengths_t remaining;
     bool process_pipe;
 
+    uint8_t verbosity;
+
     f_color_context_t context;
   } fss_status_code_data_t;
 
@@ -108,6 +110,7 @@ extern "C" {
       fss_status_code_console_parameter_t_initialize, \
       f_string_lengths_t_initialize, \
       F_false, \
+      f_console_verbosity_normal, \
       f_color_context_t_initialize, \
     }
 #endif // _di_fss_status_code_data_t_
index fa5bda2a73aca8d025b1243fe1a1adc4f2af22fc..a9a406d1674a0d5be44bdefacc44d6f90eae5315 100644 (file)
@@ -15,7 +15,9 @@ extern "C" {
     fll_program_print_help_option(context, f_console_standard_short_light, f_console_standard_long_light, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Output using colors that show up better on light backgrounds.");
     fll_program_print_help_option(context, f_console_standard_short_no_color, f_console_standard_long_no_color, f_console_symbol_short_disable, f_console_symbol_long_disable, "Do not output in color.");
     fll_program_print_help_option(context, f_console_standard_short_quiet, f_console_standard_long_quiet, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Decrease verbosity beyond normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_normal, f_console_standard_long_normal, f_console_symbol_short_disable, f_console_symbol_long_disable, "  Set verbosity to normal output.");
     fll_program_print_help_option(context, f_console_standard_short_verbose, f_console_standard_long_verbose, f_console_symbol_short_disable, f_console_symbol_long_disable, " Increase verbosity beyond normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_debug, f_console_standard_long_debug, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Enable debugging, inceasing verbosity beyond normal output.");
     fll_program_print_help_option(context, f_console_standard_short_version, f_console_standard_long_version, f_console_symbol_short_disable, f_console_symbol_long_disable, " Print only the version number.");
 
     printf("%c", f_string_eol[0]);
@@ -92,8 +94,8 @@ extern "C" {
 
     {
       f_console_parameter_id_t ids[3] = { iki_read_parameter_no_color, iki_read_parameter_light, iki_read_parameter_dark };
-      const f_console_parameter_ids_t choices = { ids, 3 };
-      const f_console_parameters_t parameters = { data->parameters, iki_read_total_parameters };
+      const f_console_parameter_ids_t choices = f_macro_console_parameter_ids_t_initialize(ids, 3);
+      const f_console_parameters_t parameters = f_macro_console_parameters_t_initialize(data->parameters, iki_read_total_parameters);
 
       status = fll_program_parameter_process(arguments, parameters, choices, F_true, &data->remaining, &data->context);
 
@@ -115,13 +117,14 @@ extern "C" {
       iki_read_print_help(data->context);
 
       iki_read_delete_data(data);
-      return status;
+      return F_none;
     }
-    else if (data->parameters[iki_read_parameter_version].result == f_console_result_found) {
+
+    if (data->parameters[iki_read_parameter_version].result == f_console_result_found) {
       fll_program_print_version(iki_read_version);
 
       iki_read_delete_data(data);
-      return status;
+      return F_none;
     }
 
     if (data->parameters[iki_read_parameter_verbose].result == f_console_result_found) {
index ec5ca074f60a3c42d2798d8ee9bdbcb5bb5a2efa..17493550611ac89734f274d879bc479a9b6e671f 100644 (file)
@@ -231,12 +231,12 @@ extern "C" {
     f_string_lengths_t remaining;
     bool process_pipe;
 
+    uint8_t verbosity;
+    uint8_t mode;
+
     f_number_unsigned_t at;
     f_number_unsigned_t line;
 
-    uint8_t mode;
-    uint8_t verbosity;
-
     f_string_dynamic_t buffer;
 
     iki_read_substitutions_t replacements;
@@ -249,7 +249,7 @@ extern "C" {
       iki_read_console_parameter_t_initialize, \
       f_string_lengths_t_initialize, \
       F_false, \
-      0, \
+      f_console_verbosity_normal, \
       0, \
       0, \
       0, \
index 9bdc4cb486a9001a47aab1effcf85d98ae2f226e..b6d0726f2530848f43774eb5a2965b1e44d99074 100644 (file)
@@ -15,7 +15,9 @@ extern "C" {
     fll_program_print_help_option(context, f_console_standard_short_light, f_console_standard_long_light, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Output using colors that show up better on light backgrounds.");
     fll_program_print_help_option(context, f_console_standard_short_no_color, f_console_standard_long_no_color, f_console_symbol_short_disable, f_console_symbol_long_disable, "Do not output in color.");
     fll_program_print_help_option(context, f_console_standard_short_quiet, f_console_standard_long_quiet, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Decrease verbosity beyond normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_normal, f_console_standard_long_normal, f_console_symbol_short_disable, f_console_symbol_long_disable, "  Set verbosity to normal output.");
     fll_program_print_help_option(context, f_console_standard_short_verbose, f_console_standard_long_verbose, f_console_symbol_short_disable, f_console_symbol_long_disable, " Increase verbosity beyond normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_debug, f_console_standard_long_debug, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Enable debugging, inceasing verbosity beyond normal output.");
     fll_program_print_help_option(context, f_console_standard_short_version, f_console_standard_long_version, f_console_symbol_short_disable, f_console_symbol_long_disable, " Print only the version number.");
 
     printf("%c", f_string_eol[0]);
@@ -55,8 +57,8 @@ extern "C" {
 
     {
       f_console_parameter_id_t ids[3] = { iki_write_parameter_no_color, iki_write_parameter_light, iki_write_parameter_dark };
-      const f_console_parameters_t parameters = { data->parameters, iki_write_total_parameters };
-      const f_console_parameter_ids_t choices = { ids, 3 };
+      const f_console_parameter_ids_t choices = f_macro_console_parameter_ids_t_initialize(ids, 3);
+      const f_console_parameters_t parameters = f_macro_console_parameters_t_initialize(data->parameters, iki_write_total_parameters);
 
       status = fll_program_parameter_process(arguments, parameters, choices, F_true, &data->remaining, &data->context);
 
@@ -78,13 +80,14 @@ extern "C" {
       iki_write_print_help(data->context);
 
       iki_write_delete_data(data);
-      return status;
+      return F_none;
     }
-    else if (data->parameters[iki_write_parameter_version].result == f_console_result_found) {
+
+    if (data->parameters[iki_write_parameter_version].result == f_console_result_found) {
       fll_program_print_version(iki_write_version);
 
       iki_write_delete_data(data);
-      return status;
+      return F_none;
     }
 
     if (data->parameters[iki_write_parameter_verbose].result == f_console_result_found) {
@@ -104,9 +107,6 @@ extern "C" {
     else if (data->parameters[iki_write_parameter_quiet].result == f_console_result_found) {
       data->verbosity = f_console_verbosity_quiet;
     }
-    else {
-      data->verbosity = f_console_verbosity_normal;
-    }
 
     f_file_t output = f_file_t_initialize;
 
index 479bda0d6fede4f0462d3fd3d751e0af707cf54a..ab299d105d8726eb9e038135cbafe346da8bf20a 100644 (file)
@@ -129,7 +129,7 @@ extern "C" {
       iki_write_console_parameter_t_initialize, \
       f_string_lengths_t_initialize, \
       F_false, \
-      0, \
+      f_console_verbosity_normal, \
       f_string_dynamic_t_initialize, \
       f_color_context_t_initialize, \
     }
index 239c046cc343843f537a765ebd5c468d6f38c0d5..526cc8448a1890dad4ce6a7d133c68d257d6fe18 100644 (file)
@@ -29,11 +29,14 @@ extern "C" {
     fll_program_print_help_header(context, init_name_long, init_version);
 
     fll_program_print_help_option(context, f_console_standard_short_help, f_console_standard_long_help, f_console_symbol_short_enable, f_console_symbol_long_enable, "    Print this help message.");
-    fll_program_print_help_option(context, f_console_standard_short_light, f_console_standard_long_light, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Output using colors that show up better on light backgrounds.");
     fll_program_print_help_option(context, f_console_standard_short_dark, f_console_standard_long_dark, f_console_symbol_short_disable, f_console_symbol_long_disable, "    Output using colors that show up better on dark backgrounds.");
+    fll_program_print_help_option(context, f_console_standard_short_light, f_console_standard_long_light, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Output using colors that show up better on light backgrounds.");
     fll_program_print_help_option(context, f_console_standard_short_no_color, f_console_standard_long_no_color, f_console_symbol_short_disable, f_console_symbol_long_disable, "Do not output in color.");
+    fll_program_print_help_option(context, f_console_standard_short_quiet, f_console_standard_long_quiet, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Decrease verbosity beyond normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_normal, f_console_standard_long_normal, f_console_symbol_short_disable, f_console_symbol_long_disable, "  Set verbosity to normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_verbose, f_console_standard_long_verbose, f_console_symbol_short_disable, f_console_symbol_long_disable, " Increase verbosity beyond normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_debug, f_console_standard_long_debug, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Enable debugging, inceasing verbosity beyond normal output.");
     fll_program_print_help_option(context, f_console_standard_short_version, f_console_standard_long_version, f_console_symbol_short_disable, f_console_symbol_long_disable, " Print only the version number.");
-    fll_program_print_help_option(context, f_console_standard_short_debug, f_console_standard_long_debug, f_console_symbol_short_disable, f_console_symbol_long_disable, " Enable debugging.");
 
     printf("%c", f_string_eol[0]);
 
@@ -58,8 +61,8 @@ extern "C" {
 
     {
       f_console_parameter_id_t ids[3] = { init_parameter_no_color, init_parameter_light, init_parameter_dark };
-      const f_console_parameter_ids_t choices = { ids, 3 };
-      const f_console_parameters_t parameters = { data->parameters, init_total_parameters };
+      const f_console_parameter_ids_t choices = f_macro_console_parameter_ids_t_initialize(ids, 3);
+      const f_console_parameters_t parameters = f_macro_console_parameters_t_initialize(data->parameters, init_total_parameters);
 
       status = fll_program_parameter_process(arguments, parameters, choices, F_true, &data->remaining, &data->context);
 
index 7576642cecf3e7ee15e6044c2d7204bd79dcea75..e38fc9d55bc7348864605abb97d920a086032acf 100644 (file)
@@ -225,6 +225,8 @@ extern "C" {
     f_string_lengths_t remaining;
     bool process_pipe;
 
+    uint8_t verbosity;
+
     f_color_context_t context;
   } init_data_t;
 
@@ -233,6 +235,7 @@ extern "C" {
       init_console_parameter_t_initialize, \
       f_string_lengths_t_initialize, \
       F_false, \
+      f_console_verbosity_normal, \
       f_color_context_t_initialize, \
     }
 
index 28e8912068a8eb2b07a0539ce7dbdb9b35aceefc..f56af78c1aa724d05832d10e6d47d8931fde6fdd 100644 (file)
@@ -10,9 +10,13 @@ extern "C" {
     fll_program_print_help_header(context, status_code_name_long, status_code_version);
 
     fll_program_print_help_option(context, f_console_standard_short_help, f_console_standard_long_help, f_console_symbol_short_enable, f_console_symbol_long_enable, "    Print this help message.");
-    fll_program_print_help_option(context, f_console_standard_short_light, f_console_standard_long_light, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Output using colors that show up better on light backgrounds.");
     fll_program_print_help_option(context, f_console_standard_short_dark, f_console_standard_long_dark, f_console_symbol_short_disable, f_console_symbol_long_disable, "    Output using colors that show up better on dark backgrounds.");
+    fll_program_print_help_option(context, f_console_standard_short_light, f_console_standard_long_light, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Output using colors that show up better on light backgrounds.");
     fll_program_print_help_option(context, f_console_standard_short_no_color, f_console_standard_long_no_color, f_console_symbol_short_disable, f_console_symbol_long_disable, "Do not output in color.");
+    fll_program_print_help_option(context, f_console_standard_short_quiet, f_console_standard_long_quiet, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Decrease verbosity beyond normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_normal, f_console_standard_long_normal, f_console_symbol_short_disable, f_console_symbol_long_disable, "  Set verbosity to normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_verbose, f_console_standard_long_verbose, f_console_symbol_short_disable, f_console_symbol_long_disable, " Increase verbosity beyond normal output.");
+    fll_program_print_help_option(context, f_console_standard_short_debug, f_console_standard_long_debug, f_console_symbol_short_disable, f_console_symbol_long_disable, "   Enable debugging, inceasing verbosity beyond normal output.");
     fll_program_print_help_option(context, f_console_standard_short_version, f_console_standard_long_version, f_console_symbol_short_disable, f_console_symbol_long_disable, " Print only the version number.");
 
     printf("%c", f_string_eol[0]);
@@ -34,8 +38,8 @@ extern "C" {
 
     {
       f_console_parameter_id_t ids[3] = { status_code_parameter_no_color, status_code_parameter_light, status_code_parameter_dark };
-      const f_console_parameter_ids_t choices = { ids, 3 };
-      const f_console_parameters_t parameters = { data->parameters, status_code_total_parameters };
+      const f_console_parameter_ids_t choices = f_macro_console_parameter_ids_t_initialize(ids, 3);
+      const f_console_parameters_t parameters = f_macro_console_parameters_t_initialize(data->parameters, status_code_total_parameters);
 
       status = fll_program_parameter_process(arguments, parameters, choices, F_true, &data->remaining, &data->context);
 
@@ -49,14 +53,15 @@ extern "C" {
 
     if (data->parameters[status_code_parameter_help].result == f_console_result_found) {
       status_code_print_help(data->context);
-      status_code_delete_data(data);
 
+      status_code_delete_data(data);
       return F_none;
     }
-    else if (data->parameters[status_code_parameter_version].result == f_console_result_found) {
+
+    if (data->parameters[status_code_parameter_version].result == f_console_result_found) {
       fll_program_print_version(status_code_version);
-      status_code_delete_data(data);
 
+      status_code_delete_data(data);
       return F_none;
     }
 
index ec0695dade3c83630f2f7d5e5b2b5fb9b206b5a1..3cd02aaeaada9d2318e54266d07eb4342086e6be 100644 (file)
@@ -99,6 +99,8 @@ extern "C" {
     f_string_lengths_t remaining;
     bool process_pipe;
 
+    uint8_t verbosity;
+
     f_color_context_t context;
   } status_code_data_t;
 
@@ -107,6 +109,7 @@ extern "C" {
       status_code_console_parameter_t_initialize, \
       f_string_lengths_t_initialize, \
       F_false, \
+      f_console_verbosity_normal, \
       f_color_context_t_initialize, \
     }
 #endif // _di_status_code_data_t_