Skip to content

Commit

Permalink
Merge remote-tracking branch 'gitlab/main'
Browse files Browse the repository at this point in the history
  • Loading branch information
ravi688 committed May 14, 2024
2 parents 2130182 + 3f6ad23 commit 101fdab
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 6 deletions.
20 changes: 18 additions & 2 deletions include/renderer/string_builder.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,17 @@ BEGIN_CPP_COMPATIBLE
RENDERER_API string_builder_t* string_builder_create(memory_allocator_t* allocator, u32 capacity);
RENDERER_API void string_builder_destroy(string_builder_t* builder);

/* returns the internal string buffer */
/* returns the internal string buffer
* NOTE: if you want null terminated string, then explicitly call string_builder_append_null(),
* or use string_builder_get_str_null() which guarantees null termination regardless of calling string_builder_append_null() */
RENDERER_API char* string_builder_get_str(string_builder_t* builder);
/* returns the internal string buffer, but guaranteed null terminataion */
RENDERER_API char* string_builder_get_str_null(string_builder_t* builder);

/* appends the formatted string to the internal character buffer */
/* appends the formatted string to the internal character buffer considering the current level of indentation */
RENDERER_API void string_builder_append(string_builder_t* builder, const char* const format, ...);
/* stiches the formatted string to the internal character buffer without considering the current level of indentation */
RENDERER_API void string_builder_stitch(string_builder_t* builder, const char* const format, ...);
static CAN_BE_UNUSED_FUNCTION INLINE_IF_RELEASE_MODE void string_builder_append_builder(string_builder_t* builder, string_builder_t* _builder)
{
string_builder_append(builder, string_builder_get_str(_builder));
Expand All @@ -59,10 +65,20 @@ static CAN_BE_UNUSED_FUNCTION INLINE_IF_RELEASE_MODE void string_builder_append_
string_builder_append_builder(builder, _builder);
string_builder_destroy(_builder);
}
static CAN_BE_UNUSED_FUNCTION INLINE_IF_RELEASE_MODE void string_builder_stitch_builder(string_builder_t* builder, string_builder_t* _builder)
{
string_builder_stitch(builder, string_builder_get_str(_builder));
}
static CAN_BE_UNUSED_FUNCTION INLINE_IF_RELEASE_MODE void string_builder_stitch_builder_destroy(string_builder_t* builder, string_builder_t* _builder)
{
string_builder_stitch_builder(builder, _builder);
string_builder_destroy(_builder);
}

/* appends null termination character, sometimes we don't need to append that so lets keep it explicit not default */
RENDERER_API void string_builder_append_null(string_builder_t* builder);
RENDERER_API void string_builder_append_newline(string_builder_t* builder);
RENDERER_API void string_builder_stitch_newline(string_builder_t* builder);

/* increments the indentation for the subsequent calls to string_builder_append() */
RENDERER_API void string_builder_increment_indentation(string_builder_t* builder);
Expand Down
8 changes: 4 additions & 4 deletions source/renderer/event.c
Original file line number Diff line number Diff line change
Expand Up @@ -344,11 +344,11 @@ static void subscription_dump(memory_allocator_t* allocator, subscription_t* sub
string_builder_append(builder, ".handler = %s (%p)\n", subscription->invocation_data.handler.handler_str, subscription->invocation_data.handler.handler);
string_builder_append(builder, ".handler_data = %p\n", subscription->invocation_data.handler_data);
string_builder_append(builder, ".wait_bits = ");
string_builder_append_builder_destroy(builder, signal_bits_to_string(allocator, subscription->invocation_data.wait_bits));
string_builder_append_newline(builder);
string_builder_stitch_builder_destroy(builder, signal_bits_to_string(allocator, subscription->invocation_data.wait_bits));
string_builder_stitch_newline(builder);
string_builder_append(builder, ".signal_bits = ");
string_builder_append_builder_destroy(builder, signal_bits_to_string(allocator, subscription->invocation_data.signal_bits));
string_builder_append_newline(builder);
string_builder_stitch_builder_destroy(builder, signal_bits_to_string(allocator, subscription->invocation_data.signal_bits));
string_builder_stitch_newline(builder);
string_builder_append(builder, ".handle = %llu\n", subscription->handle);
string_builder_decrement_indentation(builder);
string_builder_append(builder, "}\n");
Expand Down
47 changes: 47 additions & 0 deletions source/renderer/string_builder.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,35 @@ RENDERER_API void string_builder_append(string_builder_t* builder, const char* c
buf_pop_pseudo(&builder->string_buffer, 1);
}

RENDERER_API void string_builder_stitch(string_builder_t* builder, const char* const format, ...)
{
MEM_CHECK(builder);

va_list args;

/* get the required size of the format string */
va_start(args, format);
u32 required_size = vsnprintf(NULL, 0, format, args);
va_end(args);

/* if nothing to write, return */
if(required_size == 0)
return;

AUTO index = buf_get_element_count(&builder->string_buffer);
buf_push_pseudo(&builder->string_buffer, required_size + 1);
void* ptr = buf_get_ptr_at(&builder->string_buffer, index);

/* format the string and put that into the buffer */
va_start(args, format);
CAN_BE_UNUSED_VARIABLE u32 written_size = vsnprintf(CAST_TO(char*, ptr), required_size + 1, format, args);
_debug_assert__(written_size == required_size);
va_end(args);

/* pop out the null character */
buf_pop_pseudo(&builder->string_buffer, 1);
}

RENDERER_API void string_builder_append_null(string_builder_t* builder)
{
buf_push_null(&builder->string_buffer);
Expand All @@ -95,6 +124,11 @@ RENDERER_API void string_builder_append_newline(string_builder_t* builder)
buf_push_char(&builder->indentation_buffer, '\n');
}

RENDERER_API void string_builder_stitch_newline(string_builder_t* builder)
{
buf_push_char(&builder->string_buffer, '\n');
}

RENDERER_API void string_builder_increment_indentation(string_builder_t* builder)
{
buf_push_char(&builder->indentation_buffer, '\t');
Expand All @@ -107,6 +141,19 @@ RENDERER_API void string_builder_decrement_indentation(string_builder_t* builder

RENDERER_API char* string_builder_get_str(string_builder_t* builder)
{
if(buf_get_element_count(&builder->string_buffer) == 0)
return "";
return CAST_TO(char*, buf_get_ptr(&builder->string_buffer));
}

RENDERER_API char* string_builder_get_str_null(string_builder_t* builder)
{
if(buf_get_element_count(&builder->string_buffer) == 0)
return "";
char ch;
buf_peek(&builder->string_buffer, &ch);
if(ch != 0)
buf_push_char(&builder->string_buffer, 0);
return CAST_TO(char*, buf_get_ptr(&builder->string_buffer));
}

Expand Down

0 comments on commit 101fdab

Please sign in to comment.