add object module from corelib

This commit is contained in:
2024-10-24 19:24:54 +01:00
parent 7eb0fc5581
commit fa6ebe6a84
38 changed files with 5606 additions and 24 deletions

View File

@@ -1,3 +1,3 @@
include(../cmake/Templates.cmake)
add_bluelib_module(core)
add_bluelib_module(NAME core)

View File

@@ -9,21 +9,22 @@ typedef struct b_stringstream {
size_t ss_len;
size_t ss_max;
unsigned char ss_alloc;
int *ss_istack;
int ss_add_indent;
size_t ss_istack_ptr, ss_istack_size;
} b_stringstream;
extern void b_stringstream_begin(b_stringstream *strv, char *buf, size_t max);
extern void b_stringstream_begin_dynamic(b_stringstream *strv);
extern void b_stringstream_push_indent(b_stringstream *strv, int indent);
extern void b_stringstream_pop_indent(b_stringstream *strv);
extern b_status b_stringstream_add(b_stringstream *strv, const char *str);
extern b_status b_stringstream_addf(
b_stringstream *strv,
const char *format,
...);
extern b_status b_stringstream_addf(b_stringstream *strv, const char *format, ...);
extern b_status b_stringstream_addv(b_stringstream *strv, const char **strs);
extern b_status b_stringstream_addvl(
b_stringstream *strv,
const char **strs,
size_t count);
b_stringstream *strv, const char **strs, size_t count);
extern b_status b_stringstream_add_many(b_stringstream *strv, ...);
extern char *b_stringstream_end(b_stringstream *strv);

View File

@@ -20,28 +20,91 @@ void b_stringstream_begin_dynamic(b_stringstream *ss)
ss->ss_alloc = 1;
}
static b_status ss_builder_push_string(b_stringstream *ss, const char *s, size_t len)
static int current_indent(struct b_stringstream *ss)
{
if (ss->ss_len + len >= ss->ss_max && ss->ss_alloc == 1) {
char *new_buf = realloc(ss->ss_buf, ss->ss_len + len + 1);
if (!ss->ss_istack || !ss->ss_istack_size) {
return 0;
}
return ss->ss_istack[ss->ss_istack_ptr];
}
static void __formatter_putchar(struct b_stringstream *ss, char c)
{
if (ss->ss_len + 1 >= ss->ss_max && ss->ss_alloc == 1) {
char *new_buf = realloc(ss->ss_buf, ss->ss_len + 8);
if (!new_buf) {
return B_ERR_NO_MEMORY;
return;
}
ss->ss_buf = new_buf;
ss->ss_max = ss->ss_len + len + 1;
ss->ss_max = ss->ss_len + 8;
}
for (size_t i = 0; i < len; i++) {
if (ss->ss_len < ss->ss_max) {
ss->ss_buf[ss->ss_len++] = s[i];
ss->ss_buf[ss->ss_len] = 0;
ss->ss_buf[ss->ss_len++] = c;
ss->ss_buf[ss->ss_len] = '\0';
}
static void formatter_putchar(struct b_stringstream *f, char c)
{
if (f->ss_add_indent && c != '\n') {
int indent = current_indent(f);
for (int i = 0; i < indent; i++) {
__formatter_putchar(f, ' ');
__formatter_putchar(f, ' ');
}
f->ss_add_indent = 0;
}
__formatter_putchar(f, c);
if (c == '\n') {
f->ss_add_indent = 1;
}
}
static b_status ss_builder_push_string(b_stringstream *ss, const char *s, size_t len)
{
for (size_t i = 0; i < len; i++) {
formatter_putchar(ss, s[i]);
}
return B_SUCCESS;
}
void b_stringstream_push_indent(struct b_stringstream *ss, int indent)
{
if (!ss->ss_istack) {
ss->ss_istack = calloc(4, sizeof(int));
ss->ss_istack_size = 4;
ss->ss_istack_ptr = 0;
}
if (ss->ss_istack_ptr + 1 > ss->ss_istack_size) {
int *buf = realloc(
ss->ss_istack, (ss->ss_istack_size + 4) * sizeof(int));
if (!buf) {
return;
}
ss->ss_istack = buf;
ss->ss_istack_size += 4;
}
int cur_indent = ss->ss_istack[ss->ss_istack_ptr];
ss->ss_istack[++ss->ss_istack_ptr] = cur_indent + indent;
}
void b_stringstream_pop_indent(b_stringstream *strv)
{
if (!strv->ss_istack || !strv->ss_istack_size || !strv->ss_istack_ptr) {
return;
}
strv->ss_istack_ptr--;
}
b_status b_stringstream_add(struct b_stringstream *ss, const char *str)
{
return ss_builder_push_string(ss, str, strlen(str));
@@ -109,10 +172,11 @@ char *b_stringstream_end(b_stringstream *ss)
{
char *out = ss->ss_buf;
ss->ss_alloc = 0;
ss->ss_len = 0;
ss->ss_max = 0;
ss->ss_buf = NULL;
if (ss->ss_istack) {
free(ss->ss_istack);
}
memset(ss, 0x0, sizeof *ss);
return out;
}