]> Kevux Git Server - fll/commitdiff
Bugfix: correctly calculate end-- with UTF-8 and use correct function name
authorKevin Day <thekevinday@gmail.com>
Wed, 22 Apr 2020 03:50:15 +0000 (22:50 -0500)
committerKevin Day <thekevinday@gmail.com>
Wed, 22 Apr 2020 03:50:15 +0000 (22:50 -0500)
When walking back from the end of the string and handling possible UTF-8 characters, the byte width needs to be properly handled.

The functions in these projects are fl_ and not f_.

Includes minor code cleanup.

level_1/fl_string/c/private-string.c
level_1/fl_string/c/string.c
level_1/fl_string/c/string.h
level_1/fl_utf/c/private-utf.c

index c151feb40866729b037a580f753f32c04f530852..f46b5b73a4136552b9ab40df6231dbd5c5bd513e 100644 (file)
@@ -186,9 +186,7 @@ extern "C" {
       f_macro_string_dynamic_resize(status, (*result), size);
     }
 
-    if (f_status_is_error(status)) {
-      return status;
-    }
+    if (f_status_is_error(status)) return status;
 
     memcpy(result->string, string + start, size);
     result->used = size;
@@ -213,9 +211,7 @@ extern "C" {
       f_macro_string_dynamic_resize(status, (*result), size);
     }
 
-    if (f_status_is_error(status)) {
-      return status;
-    }
+    if (f_status_is_error(status)) return status;
 
     f_string_length begin = start;
     f_string_length end = stop;
@@ -225,7 +221,7 @@ extern "C" {
     // skip past leading whitespace.
     for (; begin <= end; begin += width) {
       // skip past NULL.
-      while (begin < size && string[begin] == f_string_eos) begin++;
+      while (begin < end && string[begin] == f_string_eos) begin++;
       if (begin > end) break;
 
       status = f_utf_is_whitespace(string + begin, (end - begin) + 1);
@@ -239,14 +235,17 @@ extern "C" {
 
       if (status == f_false) break;
 
-      width = f_macro_utf_byte_width_is(string[begin]);
+      width = f_macro_utf_byte_width(string[begin]);
     } // for
 
     for (; end > begin; end--) {
       // skip past NULL.
+      while (end > begin && string[end] == f_string_eos) end--;
       if (string[end] == f_string_eos) continue;
       if (end == begin) break;
 
+      // each UTF-8 character of width 8 is an incomplete part.
+      // go left until either width is 0 (ascii, or > 1) to determine the character.
       for (;;) {
         width = f_macro_utf_byte_width_is(string[end]);
         if (width == 1) {
@@ -269,6 +268,8 @@ extern "C" {
       }
 
       if (status == f_false) break;
+
+      width = f_macro_utf_byte_width(string[end]);
     } // for
 
     memcpy(result->string, string + begin, (end - begin) + 1);
index 514c95c961bed58dffe11d64add2080a462ea8c5..49790465b6b013de92613396c8415a1bdae6365a 100644 (file)
@@ -27,8 +27,8 @@ extern "C" {
   }
 #endif // _di_fl_string_compare_trim_
 
-#ifndef _di_f_string_dynamic_compare_
-  f_return_status f_string_dynamic_compare(const f_string_dynamic string1, const f_string_dynamic string2) {
+#ifndef _di_fl_string_dynamic_compare_
+  f_return_status fl_string_dynamic_compare(const f_string_dynamic string1, const f_string_dynamic string2) {
     #ifndef _di_level_1_parameter_checking_
       if (string1.used <= 0) return f_status_set_error(f_invalid_parameter);
       if (string2.used <= 0) return f_status_set_error(f_invalid_parameter);
@@ -36,10 +36,10 @@ extern "C" {
 
     return private_fl_string_compare(string1.string, string2.string, 0, 0, string1.used, string2.used);
   }
-#endif // _di_f_string_dynamic_compare_
+#endif // _di_fl_string_dynamic_compare_
 
-#ifndef _di_f_string_dynamic_compare_trim_
-  f_return_status f_string_dynamic_compare_trim(const f_string_dynamic string1, const f_string_dynamic string2) {
+#ifndef _di_fl_string_dynamic_compare_trim_
+  f_return_status fl_string_dynamic_compare_trim(const f_string_dynamic string1, const f_string_dynamic string2) {
     #ifndef _di_level_1_parameter_checking_
       if (string1.used <= 0) return f_status_set_error(f_invalid_parameter);
       if (string2.used <= 0) return f_status_set_error(f_invalid_parameter);
@@ -47,7 +47,7 @@ extern "C" {
 
     return private_fl_string_compare_trim(string1.string, string2.string, 0, 0, string1.used, string2.used);
   }
-#endif // _di_f_string_dynamic_compare_trim_
+#endif // _di_fl_string_dynamic_compare_trim_
 
 #ifndef _di_fl_string_dynamic_partial_compare_
   f_return_status fl_string_dynamic_partial_compare(const f_string_dynamic string1, const f_string_dynamic string2, const f_string_location offset1, const f_string_location offset2) {
index c44da945671df506e6f7bff0fcb9b4772cdb7bfe..81434fe12c085bfa3a900b1e43209386eb5d2b86 100644 (file)
@@ -114,9 +114,9 @@ extern "C" {
  * @see fl_string_dynamic_partial_compare()
  * @see fl_string_dynamic_partial_compare_trim()
  */
-#ifndef _di_f_string_dynamic_compare_
-  extern f_return_status f_string_dynamic_compare(const f_string_dynamic string1, const f_string_dynamic string2);
-#endif // _di_f_string_dynamic_compare_
+#ifndef _di_fl_string_dynamic_compare_
+  extern f_return_status fl_string_dynamic_compare(const f_string_dynamic string1, const f_string_dynamic string2);
+#endif // _di_fl_string_dynamic_compare_
 
 /**
  * Compare two strings, similar to strncmp().
@@ -140,9 +140,9 @@ extern "C" {
  * @see fl_string_dynamic_partial_compare()
  * @see fl_string_dynamic_partial_compare_trim()
  */
-#ifndef _di_f_string_dynamic_compare_trim_
-  extern f_return_status f_string_dynamic_compare_trim(const f_string_dynamic string1, const f_string_dynamic string2);
-#endif // _di_f_string_dynamic_compare_trim_
+#ifndef _di_fl_string_dynamic_compare_trim_
+  extern f_return_status fl_string_dynamic_compare_trim(const f_string_dynamic string1, const f_string_dynamic string2);
+#endif // _di_fl_string_dynamic_compare_trim_
 
 /**
  * Compare two strings, similar to strncmp(), but restricted to the given ranges.
index 51779eaed3ae1b67213f954e9c4130728697a0a7..68d79ca76b30907042e18a346ba49de30eb43e6b 100644 (file)
@@ -166,9 +166,7 @@ extern "C" {
       f_macro_string_dynamic_resize(status, (*result), size);
     }
 
-    if (f_status_is_error(status)) {
-      return status;
-    }
+    if (f_status_is_error(status)) return status;
 
     memcpy(result->string, string + start, size);
     result->used = size;
@@ -193,9 +191,7 @@ extern "C" {
       f_macro_string_dynamic_resize(status, (*result), size);
     }
 
-    if (f_status_is_error(status)) {
-      return status;
-    }
+    if (f_status_is_error(status)) return status;
 
     f_utf_string_length begin = start;
     f_utf_string_length end = stop;