]> Kevux Git Server - fll/commitdiff
Bugfix: The -t/--total in iki_read is confusing and allow for --total with --whole.
authorKevin Day <Kevin@kevux.org>
Sun, 8 Dec 2024 01:55:01 +0000 (19:55 -0600)
committerKevin Day <Kevin@kevux.org>
Sun, 8 Dec 2024 03:32:25 +0000 (21:32 -0600)
The `--total` parameter should print the total number of IKI Variables.
The `--line` parameter is selecting based on the line as if the `--whole` parameter is based (even when it is not).
This makes little sense when in the `--content` that is the default behavior.

This solves part of that confusion by focusing on the `--total` parameter.

Using the `--whole` should also print the total number of lines rather than total number of Variables.

I will need to follow this up with runtime tests.
There are none at this time so a separate commit is needed to add all of the appropriate tests.

level_3/iki_read/c/common.h
level_3/iki_read/c/iki_read.c
level_3/iki_read/c/private-read.c

index 68260b5a42c2dab7a0c4ec4865dd21a73b6589b7..0cdd8de4e914e1947e656f10a1811b027e3eeca7 100644 (file)
@@ -69,7 +69,6 @@ extern "C" {
     iki_read_mode_content_e = 1,
     iki_read_mode_literal_e,
     iki_read_mode_object_e,
-    iki_read_mode_total_e,
   };
 #endif // _di_iki_read_defines_
 
index 6fff74b0c357a5d4c3dd0b21ad7c27cb706ade2c..ac0a14c839e6af3e1a72dee511439f3f892485b0 100644 (file)
@@ -119,6 +119,19 @@ extern "C" {
     fl_print_format("  The %[%r%r%]", file.stream, context.set.notable, f_console_symbol_long_enable_s, iki_read_long_substitute_s, context.set.notable);
     fl_print_format(" option takes priority over the %[%r%r%] option when matching the same Variable.%r%r", file.stream, context.set.notable, f_console_symbol_long_enable_s, iki_read_long_replace_s, context.set.notable, f_string_eol_s, f_string_eol_s);
 
+    fl_print_format("  Using both %[%r%r%]", file.stream, context.set.notable, f_console_symbol_long_enable_s, iki_read_long_total_s, context.set.notable);
+    fl_print_format(" and %[%r%r%]", file.stream, context.set.notable, f_console_symbol_long_enable_s, iki_read_long_whole_s, context.set.notable);
+    fl_print_format(" will result in a total representing the number of lines rather than number of Variables.%r", file.stream, f_string_eol_s);
+
+    fl_print_format("  Using all three of %[%r%r%]", file.stream, context.set.notable, f_console_symbol_long_enable_s, iki_read_long_total_s, context.set.notable);
+    fl_print_format(", %[%r%r%]", file.stream, context.set.notable, f_console_symbol_long_enable_s, iki_read_long_whole_s, context.set.notable);
+    fl_print_format(", and %[%r%r%]", file.stream, context.set.notable, f_console_symbol_long_enable_s, iki_read_long_line_s, context.set.notable);
+    fl_print_format(" will result in a total number of Variables at the given line in the whole file.%r", file.stream, f_string_eol_s);
+
+    fl_print_format("  Using %[%r%r%]", file.stream, context.set.notable, f_console_symbol_long_enable_s, iki_read_long_total_s, context.set.notable);
+    fl_print_format(" with %[%r%r%]", file.stream, context.set.notable, f_console_symbol_long_enable_s, iki_read_long_name_s, context.set.notable);
+    fl_print_format(" will result in a total number of Variables matching the Vocabulary name.%r%r", file.stream, f_string_eol_s, f_string_eol_s);
+
     fl_print_format("  The default behavior is to only display Content portion of the IKI Variable.%r%r", file.stream, f_string_eol_s, f_string_eol_s);
 
     funlockfile(file.stream);
@@ -423,35 +436,14 @@ extern "C" {
           status = F_status_set_error(F_parameter);
         }
 
-        if (main->parameters.array[iki_read_parameter_total_e].result == f_console_result_found_e) {
-          if (main->error.verbosity != f_console_verbosity_quiet_e) {
-            fll_program_parameter_long_print_cannot_use_with(main->error, iki_read_long_object_s, iki_read_long_total_s);
-          }
-
-          status = F_status_set_error(F_parameter);
-        }
-
         data.mode = iki_read_mode_object_e;
       }
-      else if (main->parameters.array[iki_read_parameter_total_e].result == f_console_result_found_e) {
-        data.mode = iki_read_mode_total_e;
-      }
       else {
 
         // This is the default behavior, so there is no reason to check for the -c/--content parameter.
         data.mode = iki_read_mode_content_e;
       }
 
-      if (main->parameters.array[iki_read_parameter_whole_e].result == f_console_result_found_e) {
-        if (main->parameters.array[iki_read_parameter_total_e].result == f_console_result_found_e) {
-          if (main->error.verbosity != f_console_verbosity_quiet_e) {
-            fll_program_parameter_long_print_cannot_use_with(main->error, iki_read_long_whole_s, iki_read_long_total_s);
-          }
-
-          status = F_status_set_error(F_parameter);
-        }
-      }
-
       if (F_status_is_error(status)) {
         if (main->error.verbosity != f_console_verbosity_quiet_e) {
           fll_print_dynamic_raw(f_string_eol_s, main->error.to.stream);
index 229cde7faa304232e47fac00af87c45ba9e86236..53a4e017f38f04447c50145d05b01ec910dd5e9f 100644 (file)
@@ -41,15 +41,13 @@ extern "C" {
     f_status_t status = F_none;
     f_iki_data_t iki_data = f_iki_data_t_initialize;
 
-    if (data->main->parameters.array[iki_read_parameter_whole_e].result == f_console_result_found_e) {
+    if (data->main->parameters.array[iki_read_parameter_whole_e].result == f_console_result_found_e && data->main->parameters.array[iki_read_parameter_total_e].result == f_console_result_none_e) {
       f_string_range_t buffer_range = macro_f_string_range_t_initialize2(data->buffer.used);
 
       status = iki_read_process_at(data, &buffer_range);
 
       if (status == F_true) {
-        if (buffer_range.start > data->buffer.used) {
-          return F_data_not;
-        }
+        if (buffer_range.start > data->buffer.used) return F_data_not;
       }
       else if (status == F_data_not) {
         return F_data_not;
@@ -65,8 +63,19 @@ extern "C" {
         status = iki_read_process_buffer_ranges_whole(data, buffer_range, &iki_data, &iki_data.vocabulary);
       }
     }
-    else if (data->mode == iki_read_mode_total_e) {
-      status = iki_read_process_buffer_total(data, &iki_data);
+    else if (data->main->parameters.array[iki_read_parameter_total_e].result == f_console_result_found_e && data->main->parameters.array[iki_read_parameter_whole_e].result == f_console_result_found_e) {
+      if (data->main->parameters.array[iki_read_parameter_line_e].result == f_console_result_additional_e) {
+        status = iki_read_process_buffer_total(data, &iki_data);
+      }
+      else {
+        f_number_unsigned_t total = 0;
+
+        for (f_number_unsigned_t i = 0; i < data->buffer.used; ++i) {
+          if (data->buffer.string[i] == f_string_eol_s.string[0]) ++total;
+        } // for
+
+        fll_print_format("%ul%r", data->main->output.to.stream, total, f_string_eol_s);
+      }
     }
     else {
       f_string_range_t buffer_range = macro_f_string_range_t_initialize2(data->buffer.used);
@@ -101,8 +110,6 @@ extern "C" {
 
     f_status_t status = F_none;
 
-    bool unmatched = F_true;
-
     {
       f_state_t state = macro_f_state_t_initialize(iki_read_common_allocation_large_d, iki_read_common_allocation_small_d, 0, 0, &fll_program_standard_signal_state, 0, (void *) data->main, 0);
 
@@ -115,11 +122,25 @@ extern "C" {
       return status;
     }
 
-    for (f_array_length_t i = 0; i < iki_data->delimits.used; ++i) {
+    if (data->main->parameters.array[iki_read_parameter_total_e].result == f_console_result_found_e && data->main->parameters.array[iki_read_parameter_name_e].result == f_console_result_none_e) {
+      if (data->main->parameters.array[iki_read_parameter_at_e].result == f_console_result_additional_e) {
+        fll_print_format("%ul%r", data->main->output.to.stream, data->at < iki_data->variable.used ? 1 : 0, f_string_eol_s);
+      }
+      else {
+        fll_print_format("%ul%r", data->main->output.to.stream, iki_data->variable.used, f_string_eol_s);
+      }
+
+      return F_none;
+    }
+
+    f_array_length_t i = 0;
+
+    for (; i < iki_data->delimits.used; ++i) {
       data->buffer.string[iki_data->delimits.array[i]] = f_iki_syntax_placeholder_s.string[0];
     } // for
 
     const bool content_only = data->mode == iki_read_mode_content_e;
+    bool unmatched = F_true;
 
     iki_read_substitution_t replacements[iki_data->variable.used];
     iki_read_substitution_t wraps[iki_data->variable.used];
@@ -131,7 +152,7 @@ extern "C" {
     memset(reassignments, 0, sizeof(iki_read_substitutions_t) * iki_data->variable.used);
     memset(substitutionss, 0, sizeof(iki_read_substitutions_t) * iki_data->variable.used);
 
-    if (data->mode == iki_read_mode_literal_e || data->mode == iki_read_mode_content_e) {
+    if (data->mode == iki_read_mode_literal_e || (data->mode == iki_read_mode_content_e && data->main->parameters.array[iki_read_parameter_total_e].result == f_console_result_none_e)) {
       status = iki_read_replacements_identify(data, &iki_data->vocabulary, replacements);
 
       if (F_status_is_error(status)) {
@@ -157,9 +178,7 @@ extern "C" {
       if (F_status_is_error(status)) {
         fll_error_print(data->main->error, F_status_set_fine(status), "iki_read_substitutions_identify", F_true);
 
-        f_array_length_t i = 0;
-
-        for (; i < iki_data->variable.used; ++i) {
+        for (i = 0; i < iki_data->variable.used; ++i) {
           macro_iki_read_substitutions_t_delete_simple(reassignments[i]);
         } // for
 
@@ -175,12 +194,12 @@ extern "C" {
       f_string_dynamic_t name = f_string_dynamic_t_initialize;
 
       f_array_length_t index = 0;
-      f_array_length_t i = 0;
       f_array_length_t j = 0;
       f_array_length_t matches = 0;
+
       buffer_range->start = 0;
 
-      for (; i < data->main->parameters.array[iki_read_parameter_name_e].values.used; ++i) {
+      for (i = 0; i < data->main->parameters.array[iki_read_parameter_name_e].values.used; ++i) {
 
         index = data->main->parameters.array[iki_read_parameter_name_e].values.array[i];
         name.used = 0;
@@ -190,14 +209,12 @@ extern "C" {
         if (F_status_is_error(status)) {
           fll_error_print(data->main->error, F_status_set_fine(status), "f_string_dynamic_append_nulless", F_true);
 
-          f_array_length_t i = 0;
-
-          for (; i < iki_data->variable.used; ++i) {
-            macro_iki_read_substitutions_t_delete_simple(reassignments[i]);
+          for (j = 0; j < iki_data->variable.used; ++j) {
+            macro_iki_read_substitutions_t_delete_simple(reassignments[j]);
           } // for
 
-          for (i = 0; i < iki_data->variable.used; ++i) {
-            macro_iki_read_substitutions_t_delete_simple(substitutionss[i]);
+          for (j = 0; j < iki_data->variable.used; ++j) {
+            macro_iki_read_substitutions_t_delete_simple(substitutionss[j]);
           } // for
 
           f_string_dynamic_resize(0, &name);
@@ -220,20 +237,34 @@ extern "C" {
               if (matches++ != data->at) continue;
             }
 
-            if (replacements[j].replace.used || wraps[j].replace.used || wraps[j].with.used || substitutionss[j].used || reassignments[j].used) {
-              iki_read_substitutions_print(data, *iki_data, *ranges, replacements[j], wraps[j], substitutionss[j], reassignments[j], j, content_only);
+            if (data->main->parameters.array[iki_read_parameter_total_e].result == f_console_result_found_e) {
+              if (data->main->parameters.array[iki_read_parameter_at_e].result == f_console_result_none_e) {
+                ++matches;
+              }
             }
             else {
-              f_print_dynamic_partial(data->buffer, ranges->array[j], data->main->output.to.stream);
+              if (replacements[j].replace.used || wraps[j].replace.used || wraps[j].with.used || substitutionss[j].used || reassignments[j].used) {
+                iki_read_substitutions_print(data, *iki_data, *ranges, replacements[j], wraps[j], substitutionss[j], reassignments[j], j, content_only);
+              }
+              else {
+                f_print_dynamic_partial(data->buffer, ranges->array[j], data->main->output.to.stream);
+              }
+
+              f_print_dynamic_raw(f_string_eol_s, data->main->output.to.stream);
             }
-
-            f_print_dynamic_raw(f_string_eol_s, data->main->output.to.stream);
           }
         } // for
 
         funlockfile(data->main->output.to.stream);
       } // for
 
+      if (data->main->parameters.array[iki_read_parameter_total_e].result == f_console_result_found_e) {
+        fll_print_format("%ul%r", data->main->output.to.stream,
+          data->main->parameters.array[iki_read_parameter_at_e].result == f_console_result_additional_e
+            ? data->at < matches ? 1 : 0
+            : matches, f_string_eol_s);
+      }
+
       f_string_dynamic_resize(0, &name);
 
       if (unmatched) {
@@ -268,7 +299,7 @@ extern "C" {
       else {
         flockfile(data->main->output.to.stream);
 
-        for (f_array_length_t i = 0; i < ranges->used; ++i) {
+        for (i = 0; i < ranges->used; ++i) {
 
           if (replacements[i].replace.used || wraps[i].replace.used || wraps[i].with.used || substitutionss[i].used || reassignments[i].used) {
             iki_read_substitutions_print(data, *iki_data, *ranges, replacements[i], wraps[i], substitutionss[i], reassignments[i], i, content_only);
@@ -289,9 +320,7 @@ extern "C" {
       status = F_data_not;
     }
 
-    f_array_length_t i = 0;
-
-    for (; i < iki_data->variable.used; ++i) {
+    for (i = 0; i < iki_data->variable.used; ++i) {
       macro_iki_read_substitutions_t_delete_simple(reassignments[i]);
     } // for