]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
ply-utils: Add ply_utf8_string_get_substring_range () to split UTF-8 strings at a...
authorn3rdopolis <bluescreen_avenger@verizon.net>
Mon, 20 Mar 2023 02:39:12 +0000 (22:39 -0400)
committernerdopolis <bluescreen_avenger@verizon.net>
Wed, 31 May 2023 23:43:49 +0000 (19:43 -0400)
src/libply/ply-utils.c
src/libply/ply-utils.h

index ed6b054a6668525c53d3e0c5e3e4183d0f5947ea..6968a96c90bda2f159cc4b51efbafc241cbe558d 100644 (file)
@@ -776,6 +776,39 @@ ply_utf8_string_get_length (const char *string,
         return count;
 }
 
+char *
+ply_utf8_string_get_substring (const char *string,
+                               size_t      offset,
+                               size_t      range)
+{
+        int charlen;
+        size_t utf8_char_count = 0;
+        size_t utf8_byte_offset = 0, utf8_byte_range = 0;
+        ssize_t range_max;
+
+        range_max = strlen (string) + 1;
+
+        while (utf8_char_count < offset && range_max >= 0) {
+                charlen = ply_utf8_character_get_size (string + utf8_byte_offset, range_max);
+                if (charlen <= 0) break;
+                utf8_char_count++;
+                utf8_byte_offset += charlen;
+                range_max -= charlen;
+        }
+
+        utf8_char_count = 0;
+
+        while (utf8_char_count <= range && range_max >= 0) {
+                charlen = ply_utf8_character_get_size (string + utf8_byte_offset + utf8_byte_range, range_max);
+                if (charlen <= 0) break;
+                utf8_char_count++;
+                utf8_byte_range += charlen;
+                range_max -= charlen;
+        }
+
+        return strndup (string + utf8_byte_offset, utf8_byte_range);
+}
+
 char *
 ply_get_process_command_line (pid_t pid)
 {
index 09507e0934d75fa1398ebd290de2d45d5c8e307f..8e0fa4dceb1ff0caf31238616245a9e9fb01e7eb 100644 (file)
@@ -116,6 +116,9 @@ int ply_utf8_character_get_size (const char *string,
                                  size_t      n);
 int ply_utf8_string_get_length (const char *string,
                                 size_t      n);
+char *ply_utf8_string_get_substring (const char *string,
+                                     size_t      offset,
+                                     size_t      range);
 
 char *ply_get_process_command_line (pid_t pid);
 pid_t ply_get_process_parent_pid (pid_t pid);