feat: hectic C: generic result

This commit is contained in:
2025-04-12 15:21:33 +00:00
parent db5b88388e
commit 1f25c4fcad
4 changed files with 107 additions and 52 deletions

View File

@@ -226,10 +226,27 @@ char *string_to_debug_str__(CTX_DECLARATION, const char *name, const char *strin
return arena_strdup_fmt__(CTX(arena), "%s = %p \"%s\"", name, string, string);
}
char *number_to_debug_str__(CTX_DECLARATION, const char *name, int number) {
char *int_to_debug_str__(CTX_DECLARATION, const char *name, int number) {
return arena_strdup_fmt__(CTX(arena), "%s = %d", name, number);
}
char *float_to_debug_str__(CTX_DECLARATION, const char *name, double number) {
return arena_strdup_fmt__(CTX(arena), "%s = %f", name, number);
}
char *size_t_to_debug_str__(CTX_DECLARATION, const char *name, size_t number) {
return arena_strdup_fmt__(CTX(arena), "%s = %zu", name, number);
}
char *ptr_to_debug_str__(CTX_DECLARATION, const char *name, void *ptr) {
return arena_strdup_fmt__(CTX(arena), "%s = %p", name, ptr);
}
char *char_to_debug_str__(CTX_DECLARATION, const char *name, char c) {
return arena_strdup_fmt__(CTX(arena), "%s = %c", name, c);
}
/* Private function */
char *debug_join_debug_strings_v(CTX_DECLARATION, int count, va_list args) {
raise_message(LOG_LEVEL_TRACE, POSITION_INFO, "DEBUG JOIN: Joining %d strings", count);
@@ -1718,6 +1735,19 @@ char* logger_rules_to_string(Arena *arena) {
return buffer;
}
char *log_rules_to_debug_str__(CTX_DECLARATION, char *name, LogRule *self, PtrSet *visited) {
char *result = arena_alloc(arena, MEM_KiB);
STRUCT_TO_DEBUG_STR(arena, result, LogRule, name, self, visited, 6,
string_to_debug_str__(POSITION_INFO, arena, "level", log_level_to_string(self->level)),
string_to_debug_str__(POSITION_INFO, arena, "file_pattern", self->file_pattern),
string_to_debug_str__(POSITION_INFO, arena, "function_pattern", self->function_pattern),
int_to_debug_str__(POSITION_INFO, arena, "line_start", self->line_start),
int_to_debug_str__(POSITION_INFO, arena, "line_end", self->line_end),
log_rules_to_debug_str__(POSITION_INFO, arena, "next", self->next, visited)
);
return result;
}
// ---------------
// -- Templater --
// ---------------
@@ -1760,16 +1790,6 @@ bool template_validate_config__(POSITION_INFO_DECLARATION, const TemplateConfig
return false;
}
assert(config->Syntax.Braces.open != NULL);
assert(config->Syntax.Braces.close != NULL);
assert(config->Syntax.Section.control != NULL);
assert(config->Syntax.Section.source != NULL);
assert(config->Syntax.Section.begin != NULL);
assert(config->Syntax.Interpolate.invoke != NULL);
assert(config->Syntax.Include.invoke != NULL);
assert(config->Syntax.Execute.invoke != NULL);
assert(config->Syntax.nesting != NULL);
CHECK_CONFIG_STR(Braces.open, "Open brace");
CHECK_CONFIG_STR(Braces.close, "Close brace");
CHECK_CONFIG_STR(Section.control, "Section control");
@@ -1788,7 +1808,7 @@ bool template_validate_config__(POSITION_INFO_DECLARATION, const TemplateConfig
#define TEMPLATE_ASSERT_SYNTAX(pattern, message_arg, code_arg) \
if (strncmp(*s, pattern, strlen(pattern))) { \
raise_message(LOG_LEVEL_EXCEPTION, POSITION_INFO, "PARSE: " message_arg); \
result->type = TEMPLATE_RESULT_ERROR; \
result->type = RESULT_ERROR; \
result->Result.error.code = code_arg; \
result->Result.error.message = message_arg; \
return result; \
@@ -1819,10 +1839,10 @@ TemplateResult *template_parse_interpolation__(POSITION_INFO_DECLARATION, Arena
}
size_t key_len = *s - key_start;
result->Result.node.value.interpolate.key = arena_strncpy__(POSITION_INFO, arena, key_start, key_len);
result->Result.some.value.interpolate.key = arena_strncpy__(POSITION_INFO, arena, key_start, key_len);
result->type = TEMPLATE_RESULT_NODE;
result->Result.node.type = TEMPLATE_NODE_INTERPOLATE;
result->type = RESULT_SOME;
result->Result.some.type = TEMPLATE_NODE_INTERPOLATE;
*s_ptr = *s + strlen(config->Syntax.Braces.close);
@@ -1833,8 +1853,8 @@ TemplateResult *template_parse_section__(POSITION_INFO_DECLARATION, Arena *arena
raise_message(LOG_LEVEL_TRACE, POSITION_INFO, "PARSE: Section");
TemplateResult *result = arena_alloc__(POSITION_INFO, arena, sizeof(TemplateResult));
result->type = TEMPLATE_RESULT_NODE;
result->Result.node.type = TEMPLATE_NODE_SECTION;
result->type = RESULT_SOME;
result->Result.some.type = TEMPLATE_NODE_SECTION;
const char **s = s_ptr;
@@ -1856,7 +1876,7 @@ TemplateResult *template_parse_section__(POSITION_INFO_DECLARATION, Arena *arena
}
size_t iterator_len = *s - iterator_start;
result->Result.node.value.section.iterator = arena_strncpy__(POSITION_INFO, arena, iterator_start, iterator_len);
result->Result.some.value.section.iterator = arena_strncpy__(POSITION_INFO, arena, iterator_start, iterator_len);
// Find the collection name
*s = skip_whitespace(*s);
@@ -1871,15 +1891,15 @@ TemplateResult *template_parse_section__(POSITION_INFO_DECLARATION, Arena *arena
}
size_t collection_len = *s - collection_start;
result->Result.node.value.section.collection = arena_strncpy__(POSITION_INFO, arena, collection_start, collection_len);
result->Result.some.value.section.collection = arena_strncpy__(POSITION_INFO, arena, collection_start, collection_len);
// Parse the body
TemplateResult *body_result = template_parse__(POSITION_INFO, arena, s, config);
if (body_result->type == TEMPLATE_RESULT_ERROR) {
if (body_result->type == RESULT_ERROR) {
return body_result;
}
result->Result.node.value.section.body = &body_result->Result.node;
result->Result.some.value.section.body = &body_result->Result.some;
*s_ptr = *s + strlen(config->Syntax.Braces.close);
@@ -1889,8 +1909,8 @@ TemplateResult *template_parse_section__(POSITION_INFO_DECLARATION, Arena *arena
TemplateResult *template_parse_include__(POSITION_INFO_DECLARATION, Arena *arena, const char **s_ptr, const TemplateConfig *config) {
raise_message(LOG_LEVEL_TRACE, POSITION_INFO, "PARSE: Include");
TemplateResult *result = arena_alloc__(POSITION_INFO, arena, sizeof(TemplateResult));
result->type = TEMPLATE_RESULT_NODE;
result->Result.node.type = TEMPLATE_NODE_INCLUDE;
result->type = RESULT_SOME;
result->Result.some.type = TEMPLATE_NODE_INCLUDE;
const char **s = s_ptr;
@@ -1910,7 +1930,7 @@ TemplateResult *template_parse_include__(POSITION_INFO_DECLARATION, Arena *arena
}
size_t include_len = *s - include_start;
result->Result.node.value.include.key = arena_strncpy__(POSITION_INFO, arena, include_start, include_len);
result->Result.some.value.include.key = arena_strncpy__(POSITION_INFO, arena, include_start, include_len);
*s_ptr = *s + strlen(config->Syntax.Braces.close);
@@ -1921,8 +1941,8 @@ TemplateResult *template_parse_execute__(POSITION_INFO_DECLARATION, Arena *arena
raise_message(LOG_LEVEL_TRACE, POSITION_INFO, "PARSE: Execute");
TemplateResult *result = arena_alloc__(POSITION_INFO, arena, sizeof(TemplateResult));
result->type = TEMPLATE_RESULT_NODE;
result->Result.node.type = TEMPLATE_NODE_EXECUTE;
result->type = RESULT_SOME;
result->Result.some.type = TEMPLATE_NODE_EXECUTE;
const char **s = s_ptr;
@@ -1939,7 +1959,7 @@ TemplateResult *template_parse_execute__(POSITION_INFO_DECLARATION, Arena *arena
}
size_t code_len = *s - code_start;
result->Result.node.value.execute.code = arena_strncpy__(POSITION_INFO, arena, code_start, code_len);
result->Result.some.value.execute.code = arena_strncpy__(POSITION_INFO, arena, code_start, code_len);
*s_ptr = *s + strlen(config->Syntax.Braces.close);
@@ -2002,7 +2022,7 @@ TemplateResult *template_parse__(POSITION_INFO_DECLARATION, Arena *arena, const
TemplateResult *error_result = arena_alloc__(POSITION_INFO, arena, sizeof(TemplateResult));
error_result->type = TEMPLATE_RESULT_ERROR;
error_result->type = RESULT_ERROR;
error_result->Result.error.code = TEMPLATE_ERROR_UNKNOWN_TAG;
error_result->Result.error.message = "Unknown tag prefix";
@@ -2010,11 +2030,11 @@ TemplateResult *template_parse__(POSITION_INFO_DECLARATION, Arena *arena, const
}
}
if (current_result->type == TEMPLATE_RESULT_ERROR) {
if (current_result->type == RESULT_ERROR) {
return current_result;
}
*current = current_result->Result.node;
*current = current_result->Result.some;
current->next = arena_alloc__(POSITION_INFO, arena, sizeof(TemplateNode));
current = current->next;
}
@@ -2029,8 +2049,8 @@ TemplateResult *template_parse__(POSITION_INFO_DECLARATION, Arena *arena, const
}
TemplateResult *result = arena_alloc__(POSITION_INFO, arena, sizeof(TemplateResult));
result->type = TEMPLATE_RESULT_NODE;
result->Result.node = *root;
result->type = RESULT_SOME;
result->Result.some = *root;
return result;
}