From 65a7a025c5b8f68bf4a0f05edb0043b105444138 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Sun, 17 May 2026 17:08:42 +0100 Subject: [PATCH] fx: stream: add fx_stream_write_wstr --- fx/include/fx/stream.h | 2 ++ fx/stream.c | 74 +++++++++++++++++++++++++++++++++--------- 2 files changed, 60 insertions(+), 16 deletions(-) diff --git a/fx/include/fx/stream.h b/fx/include/fx/stream.h index 29706b0..d491604 100644 --- a/fx/include/fx/stream.h +++ b/fx/include/fx/stream.h @@ -97,6 +97,8 @@ FX_API fx_status fx_stream_read_all_bytes_s( FX_API fx_status fx_stream_write_char(fx_stream *stream, fx_wchar c); FX_API fx_status fx_stream_write_cstr(fx_stream *stream, const char *s, size_t *nr_written); +FX_API fx_status +fx_stream_write_wstr(fx_stream *stream, const fx_wchar *s, size_t *nr_written); FX_API fx_status fx_stream_write_bytes( fx_stream *stream, diff --git a/fx/stream.c b/fx/stream.c index 1419730..025a24f 100644 --- a/fx/stream.c +++ b/fx/stream.c @@ -612,6 +612,29 @@ static enum fx_status stream_write_cstr( return status; } +static enum fx_status stream_write_wstr( + struct stream_data *stream, + const fx_wchar *s, + size_t *nr_written) +{ + size_t i; + enum fx_status status = FX_SUCCESS; + + for (i = 0; s[i]; i++) { + status = stream_write_char(stream, s[i]); + + if (!FX_OK(status)) { + break; + } + } + + if (nr_written) { + *nr_written = i; + } + + return status; +} + static fx_stream *init_stdio_stream(FILE *fp, fx_stream_mode mode) { fx_stdio_stream *stream = fx_object_create(FX_TYPE_STDIO_STREAM); @@ -619,8 +642,9 @@ static fx_stream *init_stdio_stream(FILE *fp, fx_stream_mode mode) return NULL; } - struct fx_stdio_stream_p *p - = fx_object_get_private(stream, FX_TYPE_STDIO_STREAM); + struct fx_stdio_stream_p *p = fx_object_get_private( + stream, + FX_TYPE_STDIO_STREAM); fx_stream_cfg *cfg = fx_object_get_protected(stream, FX_TYPE_STREAM); p->s_fp = fp; cfg->s_mode = mode; @@ -657,8 +681,8 @@ static enum fx_status stream_push_indent(struct stream_data *stream, int indent) stream->s_private->s_istack_size += 4; } - int cur_indent - = stream->s_private->s_istack[stream->s_private->s_istack_ptr]; + int cur_indent = stream->s_private + ->s_istack[stream->s_private->s_istack_ptr]; stream->s_private->s_istack[++stream->s_private->s_istack_ptr] = cur_indent + indent; @@ -726,8 +750,9 @@ fx_stream_buffer *fx_stream_buffer_create_dynamic(size_t buffer_size) return NULL; } - struct fx_stream_buffer_p *p - = fx_object_get_private(buffer, FX_TYPE_STREAM_BUFFER); + struct fx_stream_buffer_p *p = fx_object_get_private( + buffer, + FX_TYPE_STREAM_BUFFER); p->p_buf = malloc(buffer_size); if (!p->p_buf) { @@ -748,8 +773,9 @@ fx_stream_buffer *fx_stream_buffer_create(void *buf, size_t len) return NULL; } - struct fx_stream_buffer_p *p - = fx_object_get_private(buffer, FX_TYPE_STREAM_BUFFER); + struct fx_stream_buffer_p *p = fx_object_get_private( + buffer, + FX_TYPE_STREAM_BUFFER); p->p_buf = buf; p->p_buf_len = len; @@ -960,6 +986,18 @@ enum fx_status fx_stream_write_cstr( STREAM_DISPATCH_VIRTUAL(stream_write_cstr, stream, s, nr_written); } +enum fx_status fx_stream_write_wstr( + fx_stream *stream, + const fx_wchar *s, + size_t *nr_written) +{ + if (IS_BSTR(stream)) { + return fx_bstr_write_wstr((fx_bstr *)stream, s, nr_written); + } + + STREAM_DISPATCH_VIRTUAL(stream_write_wstr, stream, s, nr_written); +} + enum fx_status fx_stream_write_bytes( fx_stream *stream, const void *buf, @@ -1092,8 +1130,9 @@ static enum fx_status stdio_read( size_t max, size_t *nr_read) { - struct fx_stdio_stream_p *p - = fx_object_get_private(stream, FX_TYPE_STDIO_STREAM); + struct fx_stdio_stream_p *p = fx_object_get_private( + stream, + FX_TYPE_STDIO_STREAM); enum fx_status status = FX_SUCCESS; @@ -1113,8 +1152,9 @@ static enum fx_status stdio_write( size_t count, size_t *nr_written) { - struct fx_stdio_stream_p *p - = fx_object_get_private(stream, FX_TYPE_STDIO_STREAM); + struct fx_stdio_stream_p *p = fx_object_get_private( + stream, + FX_TYPE_STDIO_STREAM); enum fx_status status = FX_SUCCESS; size_t w = fwrite(data, 1, count, p->s_fp); @@ -1132,8 +1172,9 @@ static enum fx_status stdio_seek( long long offset, fx_stream_seek_origin origin) { - struct fx_stdio_stream_p *p - = fx_object_get_private(stream, FX_TYPE_STDIO_STREAM); + struct fx_stdio_stream_p *p = fx_object_get_private( + stream, + FX_TYPE_STDIO_STREAM); int whence = 0; switch (origin) { @@ -1160,8 +1201,9 @@ static enum fx_status stdio_seek( static enum fx_status stdio_tell(const fx_stream *stream, size_t *cursor) { - struct fx_stdio_stream_p *p - = fx_object_get_private(stream, FX_TYPE_STDIO_STREAM); + struct fx_stdio_stream_p *p = fx_object_get_private( + stream, + FX_TYPE_STDIO_STREAM); long pos = ftell(p->s_fp); if (pos == -1L) {