]> Kevux Git Server - fll/commitdiff
Update: Fix string length calculation and report when no changes for fll_program...
authorKevin Day <thekevinday@gmail.com>
Sat, 2 May 2020 04:51:35 +0000 (23:51 -0500)
committerKevin Day <thekevinday@gmail.com>
Sat, 2 May 2020 04:51:35 +0000 (23:51 -0500)
Both fl_string_rip and fl_string_rip_trim use include ranges and not lengths.
Record the start length to identify if there were changes and return f_no_data when there are not changes.

level_2/fll_program/c/program.c
level_2/fll_program/c/program.h

index 3fb05b054633e0f4825b1b58763e5b273ca2c6a2..654502d71a0d2c838393ef68f98c32d85a14d705 100644 (file)
@@ -161,6 +161,7 @@ extern "C" {
     f_status status = f_none;
 
     f_string_length length = 0;
+    f_string_length start = destination->used;
 
     for (f_string_length i = 0; i < additional.used; i++) {
       length = strnlen(argv[additional.array[i]], f_console_max_size);
@@ -172,6 +173,10 @@ extern "C" {
       }
     } // for
 
+    if (status == f_none && start == destination->used) {
+      return f_no_data;
+    }
+
     return status;
   }
 #endif // _di_fll_program_parameter_additional_mash_
@@ -186,22 +191,28 @@ extern "C" {
 
     f_status status = f_none;
 
+    f_string_length length = 0;
+    f_string_length start = destination->used;
     f_string_dynamic ripped = f_string_dynamic_initialize;
 
     for (f_string_length i = 0; i < additional.used; i++) {
-      status = fl_string_rip_trim(argv[additional.array[i]], 0, strnlen(argv[additional.array[i]], f_console_max_size), &ripped);
-
-      if (f_status_is_error(status)) {
-        f_macro_string_dynamic_delete_simple(ripped);
-        return status;
-      }
+      length = strnlen(argv[additional.array[i]], f_console_max_size);
 
-      if (ripped.used > 0) {
-        status = fl_string_dynamic_mash(glue, glue_length, ripped, destination);
+      if (length > 0) {
+        status = fl_string_rip_trim(argv[additional.array[i]], 0, length - 1, &ripped);
 
         if (f_status_is_error(status)) {
           f_macro_string_dynamic_delete_simple(ripped);
-          return f_status_set_error(f_string_too_large);
+          return status;
+        }
+
+        if (ripped.used > 0) {
+          status = fl_string_dynamic_mash(glue, glue_length, ripped, destination);
+
+          if (f_status_is_error(status)) {
+            f_macro_string_dynamic_delete_simple(ripped);
+            return f_status_set_error(f_string_too_large);
+          }
         }
       }
     } // for
@@ -210,6 +221,10 @@ extern "C" {
       f_macro_string_dynamic_delete(status, ripped);
     }
 
+    if (status == f_none && start == destination->used) {
+      return f_no_data;
+    }
+
     return status;
   }
 #endif // _di_fll_program_parameter_additional_mash_trim_
@@ -223,28 +238,39 @@ extern "C" {
 
     f_status status = f_none;
 
+    f_string_length length = 0;
+    f_string_length start = result->used;
+
     for (f_string_length i = 0; i < additional.used; i++) {
-      f_string_dynamic ripped = f_string_dynamic_initialize;
+      length = strnlen(argv[additional.array[i]], f_console_max_size);
 
-      status = fl_string_rip(argv[additional.array[i]], 0, strnlen(argv[additional.array[i]], f_console_max_size), &ripped);
+      if (length > 0) {
+        f_string_dynamic ripped = f_string_dynamic_initialize;
 
-      if (f_status_is_error(status)) return status;
+        status = fl_string_rip(argv[additional.array[i]], 0, length - 1, &ripped);
 
-      if (status == f_no_data) {
-        status = f_none;
-      }
-      else {
-        if (result->used >= result->size) {
-          f_macro_string_dynamics_resize(status, (*result), result->size + f_console_default_allocation_step);
+        if (f_status_is_error(status)) return status;
 
-          if (f_status_is_error(status)) return status;
+        if (status == f_no_data) {
+          status = f_none;
         }
+        else {
+          if (result->used >= result->size) {
+            f_macro_string_dynamics_resize(status, (*result), result->size + f_console_default_allocation_step);
 
-        result->array[result->used] = ripped;
-        result->used++;
+            if (f_status_is_error(status)) return status;
+          }
+
+          result->array[result->used] = ripped;
+          result->used++;
+        }
       }
     } // for
 
+    if (status == f_none && start == result->used) {
+      return f_no_data;
+    }
+
     return status;
   }
 #endif // _di_fll_program_parameter_additional_rip_
@@ -257,29 +283,39 @@ extern "C" {
     #endif // _di_level_2_parameter_checking_
 
     f_status status = f_none;
+    f_string_length length = 0;
+    f_string_length start = result->used;
 
     for (f_string_length i = 0; i < additional.used; i++) {
-      f_string_dynamic ripped = f_string_dynamic_initialize;
+      length = strnlen(argv[additional.array[i]], f_console_max_size);
 
-      status = fl_string_rip_trim(argv[additional.array[i]], 0, strnlen(argv[additional.array[i]], f_console_max_size), &ripped);
+      if (length > 0) {
+        f_string_dynamic ripped = f_string_dynamic_initialize;
 
-      if (f_status_is_error(status)) return status;
+        status = fl_string_rip_trim(argv[additional.array[i]], 0, length - 1, &ripped);
 
-      if (status == f_no_data) {
-        status = f_none;
-      }
-      else {
-        if (result->used >= result->size) {
-          f_macro_string_dynamics_resize(status, (*result), result->size + f_console_default_allocation_step);
+        if (f_status_is_error(status)) return status;
 
-          if (f_status_is_error(status)) return status;
+        if (status == f_no_data) {
+          status = f_none;
         }
+        else {
+          if (result->used >= result->size) {
+            f_macro_string_dynamics_resize(status, (*result), result->size + f_console_default_allocation_step);
 
-        result->array[result->used] = ripped;
-        result->used++;
+            if (f_status_is_error(status)) return status;
+          }
+
+          result->array[result->used] = ripped;
+          result->used++;
+        }
       }
     } // for
 
+    if (status == f_none && start == result->used) {
+      return f_no_data;
+    }
+
     return status;
   }
 #endif // _di_fll_program_parameter_additional_rip_trim_
index 68c55b7f0bcd535dfd9e6867e2674db940fc01a5..aaa637be854f8a610dc2926c0d41ecf80daecf9d 100644 (file)
@@ -175,6 +175,7 @@ extern "C" {
  *
  * @return
  *   f_none on success.
+ *   f_no_data if nothing to rip, no allocations or reallocations are performed.
  *   f_string_max_size (with error bit) if the combined string is too large.
  *   f_invalid_parameter (with error bit) if a parameter is invalid.
  *   f_error_allocation (with error bit) on memory allocation error.
@@ -201,6 +202,7 @@ extern "C" {
  *
  * @return
  *   f_none on success.
+ *   f_no_data if nothing to rip, no allocations or reallocations are performed.
  *   f_string_max_size (with error bit) if the combined string is too large.
  *   f_invalid_parameter (with error bit) if a parameter is invalid.
  *   f_error_allocation (with error bit) on memory allocation error.