From dc48ab8b4018d1c1cc45cafaafbdac0e3d7726fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Mon, 8 Jun 2026 14:15:28 +0200 Subject: [PATCH] fpi-byte-reader: Add support to read and get/peek GBytes --- doc/libfprint-2-sections.txt | 4 +++ libfprint/fpi-byte-reader.c | 49 ++++++++++++++++++++++++++++++++++++ libfprint/fpi-byte-reader.h | 43 +++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+) diff --git a/doc/libfprint-2-sections.txt b/doc/libfprint-2-sections.txt index 995ad50d..52ddb426 100644 --- a/doc/libfprint-2-sections.txt +++ b/doc/libfprint-2-sections.txt @@ -139,8 +139,10 @@ fpi_assemble_lines FpiByteReader FpiByteReader fpi_byte_reader_new +fpi_byte_reader_new_bytes fpi_byte_reader_free fpi_byte_reader_init +fpi_byte_reader_init_bytes fpi_byte_reader_peek_sub_reader fpi_byte_reader_get_sub_reader fpi_byte_reader_set_pos @@ -148,6 +150,8 @@ fpi_byte_reader_get_pos fpi_byte_reader_get_remaining fpi_byte_reader_get_size fpi_byte_reader_skip +fpi_byte_reader_get_bytes +fpi_byte_reader_peek_bytes fpi_byte_reader_get_uint8 fpi_byte_reader_get_int8 fpi_byte_reader_peek_uint8 diff --git a/libfprint/fpi-byte-reader.c b/libfprint/fpi-byte-reader.c index 23bc5e7c..15918256 100644 --- a/libfprint/fpi-byte-reader.c +++ b/libfprint/fpi-byte-reader.c @@ -65,6 +65,31 @@ fpi_byte_reader_new (const guint8 * data, guint size) return ret; } +/** + * fpi_byte_reader_new_bytes: (skip) + * @bytes: (in) (transfer none): a #GBytes instance from which the + * #FpiByteReader should read + * + * Create a new #FpiByteReader instance, which will read from @bytes. + * + * Free-function: fpi_byte_reader_free + * + * Returns: (transfer full): a new #FpiByteReader instance + */ +FpiByteReader * +fpi_byte_reader_new_bytes (GBytes * bytes) +{ + const guint8 *data; + gsize size = 0; + + g_return_val_if_fail (bytes != NULL, NULL); + + data = g_bytes_get_data (bytes, &size); + g_return_val_if_fail (size <= G_MAXUINT, NULL); + + return fpi_byte_reader_new (data, (guint) size); +} + /** * fpi_byte_reader_free: * @reader: (in) (transfer full): a #FpiByteReader instance @@ -100,6 +125,30 @@ fpi_byte_reader_init (FpiByteReader * reader, const guint8 * data, guint size) reader->byte = 0; } +/** + * fpi_byte_reader_init_bytes: + * @reader: a #FpiByteReader instance + * @bytes: (in) (transfer none): a #GBytes instance from which + * the #FpiByteReader should read + * + * Initializes a #FpiByteReader instance to read from @bytes. This function + * can be called on already initialized instances. + */ +FpiByteReader * +fpi_byte_reader_init_bytes (FpiByteReader * reader, GBytes * bytes) +{ + g_return_val_if_fail (reader != NULL, NULL); + g_return_val_if_fail (bytes != NULL, NULL); + + gsize size = 0; + const guint8 *data = g_bytes_get_data (bytes, &size); + + g_return_val_if_fail (size <= G_MAXUINT, NULL); + fpi_byte_reader_init (reader, data, (guint) size); + + return reader; +} + /** * fpi_byte_reader_peek_sub_reader: (skip) * @reader: an existing and initialized #FpiByteReader instance diff --git a/libfprint/fpi-byte-reader.h b/libfprint/fpi-byte-reader.h index c4e64d20..05a3989e 100644 --- a/libfprint/fpi-byte-reader.h +++ b/libfprint/fpi-byte-reader.h @@ -50,6 +50,7 @@ typedef struct { FpiByteReader * fpi_byte_reader_new (const guint8 *data, guint size) G_GNUC_MALLOC; +FpiByteReader * fpi_byte_reader_new_bytes (GBytes *bytes) G_GNUC_MALLOC; void fpi_byte_reader_free (FpiByteReader *reader); @@ -57,6 +58,9 @@ void fpi_byte_reader_free (FpiByteReader *reader); void fpi_byte_reader_init (FpiByteReader *reader, const guint8 *data, guint size); +FpiByteReader * fpi_byte_reader_init_bytes (FpiByteReader *reader, GBytes *bytes); + + gboolean fpi_byte_reader_peek_sub_reader (FpiByteReader * reader, FpiByteReader * sub_reader, guint size); @@ -220,6 +224,13 @@ gboolean fpi_byte_reader_get_data (FpiByteReader * reader, guint s gboolean fpi_byte_reader_peek_data (const FpiByteReader * reader, guint size, const guint8 ** val); + +GBytes * fpi_byte_reader_get_bytes (FpiByteReader *reader, guint size); + + +GBytes * fpi_byte_reader_peek_bytes (const FpiByteReader *reader, guint size); + + #define fpi_byte_reader_dup_string(reader,str) \ fpi_byte_reader_dup_string_utf8(reader,str) @@ -642,6 +653,34 @@ fpi_byte_reader_peek_data_inline (const FpiByteReader * reader, guint size, cons return TRUE; } +static inline GBytes * +fpi_byte_reader_peek_bytes_inline (const FpiByteReader *reader, guint size) +{ + const guint8 *data; + + g_return_val_if_fail (reader != NULL, NULL); + + if (G_UNLIKELY (size > reader->size || fpi_byte_reader_get_remaining_unchecked (reader) < size)) + return NULL; + + data = fpi_byte_reader_peek_data_unchecked (reader); + return g_bytes_new_static (data, size); +} + +static inline GBytes * +fpi_byte_reader_get_bytes_inline (FpiByteReader *reader, guint size) +{ + const guint8 *data; + + g_return_val_if_fail (reader != NULL, NULL); + + if (G_UNLIKELY (size > reader->size || fpi_byte_reader_get_remaining_unchecked (reader) < size)) + return NULL; + + data = fpi_byte_reader_get_data_unchecked (reader, size); + return g_bytes_new_static (data, size); +} + static inline guint fpi_byte_reader_get_pos_inline (const FpiByteReader * reader) { @@ -672,6 +711,10 @@ fpi_byte_reader_skip_inline (FpiByteReader * reader, guint nbytes) G_LIKELY(fpi_byte_reader_peek_data_inline(reader,size,val)) #define fpi_byte_reader_skip(reader,nbytes) \ G_LIKELY(fpi_byte_reader_skip_inline(reader,nbytes)) +#define fpi_byte_reader_get_bytes(reader,size) \ + fpi_byte_reader_get_bytes_inline(reader,size) +#define fpi_byte_reader_peek_bytes(reader,size) \ + fpi_byte_reader_peek_bytes_inline(reader,size) #endif /* FPI_BYTE_READER_DISABLE_INLINES */