core: stringstream: update stringstream to support b_stream
This commit is contained in:
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user