feat: hectic C: some sigfault

This commit is contained in:
2025-04-15 04:54:31 +00:00
parent d45307336a
commit 8697b00cfc
5 changed files with 113 additions and 118 deletions

View File

@@ -340,6 +340,10 @@ char *float_to_debug_str__(CTX_DECLARATION, const char *name, double number) {
return arena_strdup_fmt__(CTX(arena), "%s = %f", name, number);
}
char *bool_to_debug_str__(CTX_DECLARATION, const char *name, int boolean) {
return arena_strdup_fmt__(CTX(arena), "%s = %s", name, boolean ? "true" : "false");
}
char *size_t_to_debug_str__(CTX_DECLARATION, const char *name, size_t number) {
return arena_strdup_fmt__(CTX(arena), "%s = %zu", name, number);
}
@@ -437,6 +441,7 @@ char *debug_join_debug_strings_v(CTX_DECLARATION, int count, va_list args) {
}
char *struct_to_debug_str__(CTX_DECLARATION, const char *type, const char *name, const void *ptr, int count, ...) {
printf("ZALUPA\n");
raise_message(LOG_LEVEL_TRACE, POSITION_INFO, "DEBUG STR: type: %s, name: %s, ptr: %p, count: %d", type, name, ptr, count);
va_list args;
@@ -853,7 +858,7 @@ char *json_to_pretty_str__(POSITION_INFO_DECLARATION, Arena *arena, const Json *
if (item->type == JSON_OBJECT) {
ptr += sprintf(ptr, "{\n");
Json *child = item->child;
Json *child = item->value.child;
int child_count = 0;
raise_message(LOG_LEVEL_TRACE, POSITION_INFO,
@@ -892,7 +897,7 @@ char *json_to_pretty_str__(POSITION_INFO_DECLARATION, Arena *arena, const Json *
} else if (item->type == JSON_ARRAY) {
ptr += sprintf(ptr, "[\n");
Json *child = item->child;
Json *child = item->value.child;
int child_count = 0;
raise_message(LOG_LEVEL_TRACE, POSITION_INFO,
@@ -928,11 +933,11 @@ char *json_to_pretty_str__(POSITION_INFO_DECLARATION, Arena *arena, const Json *
raise_message(LOG_LEVEL_TRACE, POSITION_INFO,
"PRETTY: Array prettification complete with %d elements", child_count);
} else if (item->type == JSON_STRING) {
sprintf(ptr, "\"%s\"", item->JsonValue.string ? item->JsonValue.string : "");
sprintf(ptr, "\"%s\"", item->value.string ? item->value.string : "");
} else if (item->type == JSON_NUMBER) {
sprintf(ptr, "%g", item->JsonValue.number);
sprintf(ptr, "%g", item->value.number);
} else if (item->type == JSON_BOOL) {
sprintf(ptr, item->JsonValue.boolean ? "true" : "false");
sprintf(ptr, item->value.boolean ? "true" : "false");
} else if (item->type == JSON_NULL) {
sprintf(ptr, "null");
}
@@ -1036,8 +1041,8 @@ static Json *json_parse_array__(POSITION_INFO_DECLARATION, const char **s, Arena
raise_message(LOG_LEVEL_DEBUG, POSITION_INFO, "Failed to parse array element");
return NULL;
}
if (!array->child)
array->child = element;
if (!array->value.child)
array->value.child = element;
else
last->next = element;
last = element;
@@ -1096,8 +1101,8 @@ static Json *json_parse_object__(POSITION_INFO_DECLARATION, const char **s, Aren
return NULL;
}
value->key = key; // assign key to the value
if (!object->child)
object->child = value;
if (!object->value.child)
object->value.child = value;
else
last->next = value;
last = value;
@@ -1129,7 +1134,7 @@ static Json *json_parse_value__(POSITION_INFO_DECLARATION, const char **s, Arena
}
memset(item, 0, sizeof(Json));
item->type = JSON_STRING;
item->JsonValue.string = json_parse_string__(POSITION_INFO, s, arena);
item->value.string = json_parse_string__(POSITION_INFO, s, arena);
return item;
} else if (strncmp(*s, "null", 4) == 0) {
Json *item = arena_alloc__(POSITION_INFO, arena, sizeof(Json));
@@ -1143,7 +1148,7 @@ static Json *json_parse_value__(POSITION_INFO_DECLARATION, const char **s, Arena
if (!item) return NULL;
memset(item, 0, sizeof(Json));
item->type = JSON_BOOL;
item->JsonValue.boolean = 1;
item->value.boolean = 1;
*s += 4;
return item;
} else if (strncmp(*s, "false", 5) == 0) {
@@ -1151,7 +1156,7 @@ static Json *json_parse_value__(POSITION_INFO_DECLARATION, const char **s, Arena
if (!item) return NULL;
memset(item, 0, sizeof(Json));
item->type = JSON_BOOL;
item->JsonValue.boolean = 0;
item->value.boolean = 0;
*s += 5;
return item;
} else if ((**s == '-') || isdigit((unsigned char)**s)) {
@@ -1162,7 +1167,7 @@ static Json *json_parse_value__(POSITION_INFO_DECLARATION, const char **s, Arena
}
memset(item, 0, sizeof(Json));
item->type = JSON_NUMBER;
item->JsonValue.number = json_parse_number__(POSITION_INFO, s);
item->value.number = json_parse_number__(POSITION_INFO, s);
return item;
} else if (**s == '[') {
return json_parse_array__(POSITION_INFO, s, arena);
@@ -1253,7 +1258,7 @@ char *json_to_string_with_opts__(POSITION_INFO_DECLARATION, Arena *arena, const
ptr += sprintf(ptr, "{");
type_name = "object";
Json *child = item->child;
Json *child = item->value.child;
int child_count = 0;
raise_message(LOG_LEVEL_TRACE, POSITION_INFO,
@@ -1284,7 +1289,7 @@ char *json_to_string_with_opts__(POSITION_INFO_DECLARATION, Arena *arena, const
ptr += sprintf(ptr, "[");
type_name = "array";
Json *child = item->child;
Json *child = item->value.child;
int child_count = 0;
raise_message(LOG_LEVEL_TRACE, POSITION_INFO,
@@ -1312,16 +1317,16 @@ char *json_to_string_with_opts__(POSITION_INFO_DECLARATION, Arena *arena, const
} else if (item->type == JSON_STRING) {
type_name = "string";
if ((int)raw) {
sprintf(ptr, "%s", item->JsonValue.string ? item->JsonValue.string : "");
sprintf(ptr, "%s", item->value.string ? item->value.string : "");
} else {
sprintf(ptr, "\"%s\"", item->JsonValue.string ? item->JsonValue.string : "");
sprintf(ptr, "\"%s\"", item->value.string ? item->value.string : "");
}
} else if (item->type == JSON_NUMBER) {
type_name = "number";
sprintf(ptr, "%g", item->JsonValue.number);
sprintf(ptr, "%g", item->value.number);
} else if (item->type == JSON_BOOL) {
type_name = "boolean";
sprintf(ptr, item->JsonValue.boolean ? "true" : "false");
sprintf(ptr, item->value.boolean ? "true" : "false");
} else if (item->type == JSON_NULL) {
type_name = "null";
sprintf(ptr, "null");
@@ -1361,7 +1366,7 @@ Json *json_get_object_item__(POSITION_INFO_DECLARATION, const Json * const objec
// Count the total number of keys for debugging
int total_keys = 0;
Json *debug_scan = object->child;
Json *debug_scan = object->value.child;
while (debug_scan) {
total_keys++;
debug_scan = debug_scan->next;
@@ -1371,7 +1376,7 @@ Json *json_get_object_item__(POSITION_INFO_DECLARATION, const Json * const objec
"ACCESS: Object has %d key-value pairs", total_keys);
// Perform key search
Json *child = object->child;
Json *child = object->value.child;
int position = 0;
while (child) {
@@ -1401,75 +1406,29 @@ Json *json_get_object_item__(POSITION_INFO_DECLARATION, const Json * const objec
return NULL;
}
char* json_to_debug_str__(POSITION_INFO_DECLARATION, Arena *arena, Json json) {
char *json_value_to_debug_str__(POSITION_INFO_DECLARATION, Arena *arena, const char *name, const JsonValue *self, JsonType active_variant, PtrSet *visited) {
char *child_str = json_to_debug_str__(POSITION_INFO, arena, "child", self->child, visited);
char *result = arena_alloc__(POSITION_INFO, arena, 1024);
UNION_TO_DEBUG_STR(arena, result, JsonValue, name, self, visited, active_variant, 5,
JSON_STRING, string_to_debug_str__(POSITION_INFO, arena, "string", self->string),
JSON_NUMBER, float_to_debug_str__(POSITION_INFO, arena, "number", self->number),
JSON_BOOL, bool_to_debug_str__(POSITION_INFO, arena, "boolean", self->boolean),
JSON_OBJECT, child_str,
JSON_ARRAY, child_str
);
return result;
}
char* json_to_debug_str__(POSITION_INFO_DECLARATION, Arena *arena, const char *name, const Json *self, PtrSet *visited) {
raise_message(LOG_LEVEL_TRACE, POSITION_INFO, "json_to_debug_str(<optimized>, <optimized>)");
char meta_buffer[256];
snprintf(meta_buffer, sizeof(meta_buffer), "Json{addr=%p, type=%s, key=%s, child=%p, next=%p, value=",
(void*)&json, json_type_to_string(json.type), json.key ? json.key : "NULL", (void*)json.child, (void*)json.next);
size_t meta_len = strlen(meta_buffer);
char value_buffer[256] = {0};
switch (json.type) {
case JSON_NULL:
strcpy(value_buffer, "null");
break;
case JSON_BOOL:
strcpy(value_buffer, json.JsonValue.boolean ? "true" : "false");
break;
case JSON_NUMBER:
snprintf(value_buffer, sizeof(value_buffer), "%g", json.JsonValue.number);
break;
case JSON_STRING: {
if (!json.JsonValue.string) {
strcpy(value_buffer, "null");
} else {
snprintf(value_buffer, sizeof(value_buffer), "\"%s\"", json.JsonValue.string);
}
break;
}
case JSON_ARRAY: {
// For arrays, simply note the number of elements
size_t count = 0;
Json *item = json.child;
while (item) {
count++;
item = item->next;
}
snprintf(value_buffer, sizeof(value_buffer), "[array with %zu elements]", count);
break;
}
case JSON_OBJECT: {
// For objects, note the number of key-value pairs
size_t count = 0;
Json *item = json.child;
while (item) {
count++;
item = item->next;
}
snprintf(value_buffer, sizeof(value_buffer), "{object with %zu key-value pairs}", count);
break;
}
default:
strcpy(value_buffer, "<UNKNOWN JSON TYPE>");
}
// Create final string
size_t result_len = meta_len + strlen(value_buffer) + 2; // +2 for closing brace and null character
char* result = arena_alloc(arena, result_len);
strcpy(result, meta_buffer);
strcat(result, value_buffer);
strcat(result, "}");
char *result = arena_alloc__(POSITION_INFO, arena, 1024);
STRUCT_TO_DEBUG_STR(arena, result, Json, name, self, visited, 3,
enum_to_debug_str__(POSITION_INFO, arena, "type", self->type, json_type_to_string(self->type)),
string_to_debug_str__(POSITION_INFO, arena, "key", self->key),
json_value_to_debug_str__(POSITION_INFO, arena, "value", &self->value, self->type, visited),
json_to_debug_str__(POSITION_INFO, arena, "next", self->next, visited)
);
return result;
}
@@ -1611,7 +1570,7 @@ JsonResult debug_str_to_json__(POSITION_INFO_DECLARATION, Arena *arena, const ch
// Extract value as string
value_start = skip_whitespace(value_start + 1);
json->JsonValue.string = arena_strdup__(POSITION_INFO, arena, value_start);
json->value.string = arena_strdup__(POSITION_INFO, arena, value_start);
// Move pointer to the end
*s += strlen(*s);
@@ -1659,12 +1618,12 @@ JsonResult debug_str_to_json__(POSITION_INFO_DECLARATION, Arena *arena, const ch
}
else if (strncmp(value, "true", 4) == 0) {
json->type = JSON_BOOL;
json->JsonValue.boolean = true;
json->value.boolean = true;
*s += 4;
}
else if (strncmp(value, "false", 5) == 0) {
json->type = JSON_BOOL;
json->JsonValue.boolean = false;
json->value.boolean = false;
*s += 5;
}
else if (*value == '"') {
@@ -1679,7 +1638,7 @@ JsonResult debug_str_to_json__(POSITION_INFO_DECLARATION, Arena *arena, const ch
}
size_t str_len = end_quote - value;
json->JsonValue.string = arena_strncpy__(POSITION_INFO, arena, value, str_len);
json->value.string = arena_strncpy__(POSITION_INFO, arena, value, str_len);
*s = end_quote + 1;
}
else if (isdigit(*value) || *value == '-' || *value == '+') {
@@ -1688,7 +1647,7 @@ JsonResult debug_str_to_json__(POSITION_INFO_DECLARATION, Arena *arena, const ch
// Use strtod to parse the number
char *end;
json->JsonValue.number = strtod(value, &end);
json->value.number = strtod(value, &end);
*s = end;
}
else {
@@ -1700,7 +1659,7 @@ JsonResult debug_str_to_json__(POSITION_INFO_DECLARATION, Arena *arena, const ch
while (*end && !isspace(*end) && *end != ',' && *end != '}' && *end != ']') end++;
size_t str_len = end - value;
json->JsonValue.string = arena_strncpy__(POSITION_INFO, arena, value, str_len);
json->value.string = arena_strncpy__(POSITION_INFO, arena, value, str_len);
*s = end;
}
@@ -2422,10 +2381,10 @@ char *template_text_value_to_debug_str__(POSITION_INFO_DECLARATION, Arena *arena
return result;
}
char *template_value_to_debug_str__(POSITION_INFO_DECLARATION, Arena *arena, const char *name, const TemplateValue *self, TemplateNodeType type, PtrSet *visited) {
char *template_value_to_debug_str__(POSITION_INFO_DECLARATION, Arena *arena, const char *name, const TemplateValue *self, TemplateNodeType active_variant, PtrSet *visited) {
char *result = arena_alloc(arena, MEM_KiB);
UNION_TO_DEBUG_STR(arena, result, TemplateValue, name, self, visited, type, 5,
UNION_TO_DEBUG_STR(arena, result, TemplateValue, name, self, visited, active_variant, 5,
TEMPLATE_NODE_SECTION, template_section_value_to_debug_str__(POSITION_INFO, arena, "section", &self->section, visited),
TEMPLATE_NODE_INTERPOLATE, template_interpolate_value_to_debug_str__(POSITION_INFO, arena, "interpolate", &self->interpolate, visited),
TEMPLATE_NODE_EXECUTE, template_execute_value_to_debug_str__(POSITION_INFO, arena, "execute", &self->execute, visited),