From 722a22a0e0edd5e27813a22a8b3c8c7ddcce38b9 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Fri, 27 Jun 2025 21:42:53 +0100 Subject: [PATCH] core: stringstream: update stringstream to support b_stream --- core/include/blue/core/stringstream.h | 6 ++++- core/stringstream.c | 39 ++++++++++++++++++++++++--- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/core/include/blue/core/stringstream.h b/core/include/blue/core/stringstream.h index b19a8da..7d46590 100644 --- a/core/include/blue/core/stringstream.h +++ b/core/include/blue/core/stringstream.h @@ -1,11 +1,13 @@ #ifndef BLUELIB_CORE_STRINGSTREAM_H_ #define BLUELIB_CORE_STRINGSTREAM_H_ -#include #include +#include +#include #include typedef struct b_stringstream { + b_stream ss_base; char *ss_buf; size_t ss_len; size_t ss_max; @@ -18,6 +20,8 @@ typedef struct b_stringstream { BLUE_API void b_stringstream_begin(b_stringstream *strv, char *buf, size_t max); BLUE_API void b_stringstream_begin_dynamic(b_stringstream *strv); +BLUE_API size_t b_stringstream_get_length(const b_stringstream *strv); + BLUE_API void b_stringstream_push_indent(b_stringstream *strv, int indent); BLUE_API void b_stringstream_pop_indent(b_stringstream *strv); diff --git a/core/stringstream.c b/core/stringstream.c index 6b00850..83c9660 100644 --- a/core/stringstream.c +++ b/core/stringstream.c @@ -4,26 +4,53 @@ #include #include -void b_stringstream_begin(b_stringstream *ss, char *buf, size_t max) +static b_status ss_builder_push_string( + b_stringstream *ss, const char *s, size_t len); + +enum b_status stream_write( + struct b_stream *stream, const unsigned char *buf, size_t count, + size_t *nr_written) +{ + struct b_stringstream *s = (struct b_stringstream *)stream; + + enum b_status status = ss_builder_push_string(s, (const char *)buf, count); + + stream->s_cursor += *nr_written; + + return status; +} + +void b_stringstream_begin(struct b_stringstream *ss, char *buf, size_t max) { memset(ss, 0x0, sizeof *ss); + ss->ss_base.s_mode = B_STREAM_WRITE | Z__B_STREAM_STATIC; + ss->ss_base.s_write = stream_write; + ss->ss_buf = buf; ss->ss_max = max; ss->ss_len = 0; ss->ss_alloc = 0; } -void b_stringstream_begin_dynamic(b_stringstream *ss) +void b_stringstream_begin_dynamic(struct b_stringstream *ss) { memset(ss, 0x0, sizeof *ss); + ss->ss_base.s_mode = B_STREAM_WRITE | Z__B_STREAM_STATIC; + ss->ss_base.s_write = stream_write; + ss->ss_buf = NULL; ss->ss_max = 0; ss->ss_len = 0; ss->ss_alloc = 1; } +size_t b_stringstream_get_length(const struct b_stringstream *strv) +{ + return strv->ss_len; +} + static int current_indent(struct b_stringstream *ss) { if (!ss->ss_istack || !ss->ss_istack_size) { @@ -45,8 +72,12 @@ static void __formatter_putchar(struct b_stringstream *ss, char c) ss->ss_max = ss->ss_len + 8; } - ss->ss_buf[ss->ss_len++] = c; - ss->ss_buf[ss->ss_len] = '\0'; + if (ss->ss_len < ss->ss_max - 1) { + ss->ss_buf[ss->ss_len] = c; + ss->ss_buf[ss->ss_len + 1] = '\0'; + } + + ss->ss_len++; } static void formatter_putchar(struct b_stringstream *f, char c)