core: stream: add utf-8 awareness to b_stream interface

b_stream can now read/write utf-8 encoded data, and will do so unless
the stream is in binary mode.

b_stream will also report an error it encounters invalid utf-8 data
(unless binary mode is enabled).
This commit is contained in:
2025-10-25 00:02:33 +01:00
parent f6f49faf97
commit a429e76721
2 changed files with 101 additions and 24 deletions

View File

@@ -1,6 +1,7 @@
#ifndef BLUE_CORE_STREAM_H_
#define BLUE_CORE_STREAM_H_
#include <blue/core/encoding.h>
#include <blue/core/macros.h>
#include <blue/core/misc.h>
#include <blue/core/status.h>
@@ -40,7 +41,7 @@ B_TYPE_CLASS_DECLARATION_BEGIN(b_stream)
b_status (*s_close)(b_stream *);
b_status (*s_seek)(b_stream *, long long, b_stream_seek_origin);
b_status (*s_tell)(const b_stream *, size_t *);
b_status (*s_getc)(b_stream *, int *);
b_status (*s_getc)(b_stream *, b_wchar *);
b_status (*s_read)(b_stream *, unsigned char *, size_t, size_t *);
b_status (*s_write)(b_stream *, const unsigned char *, size_t, size_t *);
b_status (*s_reserve)(b_stream *, size_t);
@@ -69,7 +70,7 @@ BLUE_API size_t b_stream_cursor(const b_stream *stream);
BLUE_API b_status b_stream_push_indent(b_stream *stream, int indent);
BLUE_API b_status b_stream_pop_indent(b_stream *stream);
BLUE_API b_status b_stream_read_char(b_stream *stream, int *c);
BLUE_API b_status b_stream_read_char(b_stream *stream, b_wchar *c);
BLUE_API b_status b_stream_read_bytes(
b_stream *stream, void *buf, size_t count, size_t *nr_read);
@@ -82,7 +83,7 @@ BLUE_API b_status b_stream_read_all_bytes(
BLUE_API b_status b_stream_read_all_bytes_s(
b_stream *src, b_stream *dest, b_stream_buffer *buffer, size_t *nr_read);
BLUE_API b_status b_stream_write_char(b_stream *stream, char c);
BLUE_API b_status b_stream_write_char(b_stream *stream, b_wchar c);
BLUE_API b_status b_stream_write_string(
b_stream *stream, const char *s, size_t *nr_written);