]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
buffer: Add APIs for editing bytes in buffer
authorRay Strode <rstrode@redhat.com>
Sun, 10 Dec 2023 15:09:37 +0000 (10:09 -0500)
committerRay Strode <rstrode@redhat.com>
Mon, 11 Dec 2023 03:13:58 +0000 (22:13 -0500)
This commit adds a few functions for getting at and
using the size, bytes, and capacity of a buffer.

This will make it easier to modify utf8 string on the side and
and update the buffer size afterward.

src/libply/ply-buffer.c
src/libply/ply-buffer.h

index 034a7b1da87ad9d38c45ccaf58b9ec7d24081e90..af37cbc99ec9e3c52151b86ae7e4d743d78c1ada 100644 (file)
@@ -224,6 +224,20 @@ ply_buffer_append_from_fd (ply_buffer_t *buffer,
                 ply_buffer_append_bytes (buffer, bytes, bytes_read);
 }
 
+void
+ply_buffer_set_bytes (ply_buffer_t *buffer,
+                      void         *bytes,
+                      size_t        number_of_bytes,
+                      size_t        capacity)
+{
+        if (buffer->data != bytes)
+                free (buffer->data);
+
+        buffer->data = bytes;
+        buffer->size = number_of_bytes;
+        buffer->capacity = capacity;
+}
+
 const char *
 ply_buffer_get_bytes (ply_buffer_t *buffer)
 {
@@ -246,6 +260,12 @@ ply_buffer_steal_bytes (ply_buffer_t *buffer)
         return bytes;
 }
 
+size_t
+ply_buffer_get_capacity (ply_buffer_t *buffer)
+{
+        return buffer->capacity;
+}
+
 size_t
 ply_buffer_get_size (ply_buffer_t *buffer)
 {
index e464007ee442bdcaab71529acfdb9da428fd8e9a..fc7f4a8966034a0f90f5d1349a1ba9edefcd4f0e 100644 (file)
@@ -44,12 +44,23 @@ __attribute__((__format__ (__printf__, 2, 3)))
 void ply_buffer_append_with_non_literal_format_string (ply_buffer_t *buffer,
                                                        const char   *format,
                                                        ...);
+void ply_buffer_set_bytes (ply_buffer_t *buffer,
+                           void         *bytes,
+                           size_t        number_of_bytes,
+                           size_t        capacity);
 void ply_buffer_remove_bytes (ply_buffer_t *buffer,
                               size_t        number_of_bytes);
 void ply_buffer_remove_bytes_at_end (ply_buffer_t *buffer,
                                      size_t        number_of_bytes);
 const char *ply_buffer_get_bytes (ply_buffer_t *buffer);
+size_t ply_buffer_get_capacity (ply_buffer_t *buffer);
 char *ply_buffer_steal_bytes (ply_buffer_t *buffer);
+#define ply_buffer_borrow_bytes(buffer, bytes, size, capacity)                    \
+        for (bool _ran = false; *bytes = (char *) ply_buffer_get_bytes (buffer),    \
+             *size = ply_buffer_get_size (buffer),                                \
+             *capacity = ply_buffer_get_capacity (buffer),                        \
+             !_ran;                                                               \
+             ply_buffer_set_bytes (buffer, *bytes, *size, *capacity), _ran = true)
 size_t ply_buffer_get_size (ply_buffer_t *buffer);
 void ply_buffer_clear (ply_buffer_t *buffer);
 #endif