core: stringstream: update stringstream to support b_stream

This commit is contained in:
2025-06-27 21:42:53 +01:00
parent 49310eff2c
commit 722a22a0e0
2 changed files with 40 additions and 5 deletions

View File

@@ -1,11 +1,13 @@
#ifndef BLUELIB_CORE_STRINGSTREAM_H_ #ifndef BLUELIB_CORE_STRINGSTREAM_H_
#define BLUELIB_CORE_STRINGSTREAM_H_ #define BLUELIB_CORE_STRINGSTREAM_H_
#include <blue/core/status.h>
#include <blue/core/misc.h> #include <blue/core/misc.h>
#include <blue/core/status.h>
#include <blue/core/stream.h>
#include <stddef.h> #include <stddef.h>
typedef struct b_stringstream { typedef struct b_stringstream {
b_stream ss_base;
char *ss_buf; char *ss_buf;
size_t ss_len; size_t ss_len;
size_t ss_max; 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(b_stringstream *strv, char *buf, size_t max);
BLUE_API void b_stringstream_begin_dynamic(b_stringstream *strv); 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_push_indent(b_stringstream *strv, int indent);
BLUE_API void b_stringstream_pop_indent(b_stringstream *strv); BLUE_API void b_stringstream_pop_indent(b_stringstream *strv);

View File

@@ -4,26 +4,53 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
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); 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_buf = buf;
ss->ss_max = max; ss->ss_max = max;
ss->ss_len = 0; ss->ss_len = 0;
ss->ss_alloc = 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); 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_buf = NULL;
ss->ss_max = 0; ss->ss_max = 0;
ss->ss_len = 0; ss->ss_len = 0;
ss->ss_alloc = 1; 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) static int current_indent(struct b_stringstream *ss)
{ {
if (!ss->ss_istack || !ss->ss_istack_size) { 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_max = ss->ss_len + 8;
} }
ss->ss_buf[ss->ss_len++] = c; if (ss->ss_len < ss->ss_max - 1) {
ss->ss_buf[ss->ss_len] = '\0'; 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) static void formatter_putchar(struct b_stringstream *f, char c)