// vim:fileencoding=utf-8:foldmethod=marker #include "datatypes.h" #include "type_enums.h" #include "wapp_core.h" #define ERR_MSG "Not enough capacity in dst buffer" internal inline void ctype_to_string(Str8 *dst, CType ctype); internal inline void cqualifier_to_string(Str8 *dst, CQualifier cqualifier); internal inline void cpointertype_to_string(Str8 *dst, CPointerType cpointertype); internal inline void cpointer_to_string(Str8 *dst, const CPointer *cpointer); internal inline void cenumval_to_string(Str8 *dst, const CEnumVal *cenumval); internal inline void cmacro_to_string(Str8 *dst, const CMacro *cmacro); void cobject_to_string(Str8 *dst, const CObject *object) { wapp_debug_assert(dst != NULL object != NULL, "`allocator`, `dst` and `object` should not be NULL"); if (object->kind >= COUNT_COBJECTKIND) { return; } switch (object->kind) { case COBJECT_CTYPE: ctype_to_string(dst, object->object.c_type); break; case COBJECT_CQUALIFIER: cqualifier_to_string(dst, object->object.c_qualifier); break; case COBJECT_CPOINTERTYPE: cpointertype_to_string(dst, object->object.c_pointertype); break; case COBJECT_CPOINTER: cpointer_to_string(dst, &(object->object.c_pointer)); break; case COBJECT_CENUMVAL: cenumval_to_string(dst, &(object->object.c_enumval)); break; case COBJECT_CENUM: break; case COBJECT_CMACRO: cmacro_to_string(dst, &(object->object.c_macro)); break; case COBJECT_CSTRUCT: break; case COBJECT_CUSERTYPE: break; case COBJECT_CDATATYPE: break; case COBJECT_CARG: break; case COBJECT_CFUNC: break; case COBJECT_CINCULDE: break; case COBJECT_CHEADER: break; case COBJECT_CSOURCE: break; default: break; } } internal inline void ctype_to_string(Str8 *dst, CType ctype) { wapp_runtime_assert(ctypes[ctype].size <= dst->capacity, ERR_MSG); wapp_str8_copy_str8_capped(dst, &ctypes[ctype]); } internal inline void cqualifier_to_string(Str8 *dst, CQualifier cqualifier) { wapp_runtime_assert(cqualifiers[cqualifier].size <= dst->capacity, ERR_MSG); wapp_str8_copy_str8_capped(dst, &cqualifiers[cqualifier]); } internal inline void cpointertype_to_string(Str8 *dst, CPointerType cpointertype) { wapp_runtime_assert(cpointertypes[cpointertype].size <= dst->capacity, ERR_MSG); wapp_str8_copy_str8_capped(dst, &cpointertypes[cpointertype]); } internal inline void cpointer_to_string(Str8 *dst, const CPointer *cpointer) { wapp_debug_assert(dst != NULL && cpointer != NULL, "`dst` and `cpointer` should not be NULL"); u64 total_size = cpointertypes[cpointer->type].size + cqualifiers[cpointer->qualifier].size; wapp_runtime_assert(total_size <= dst->capacity, ERR_MSG); wapp_str8_format(dst, WAPP_STR8_SPEC WAPP_STR8_SPEC, wapp_str8_varg(cpointertypes[cpointer->type]), wapp_str8_varg(cqualifiers[cpointer->qualifier])); } internal inline void cenumval_to_string(Str8 *dst, const CEnumVal *cenumval) { wapp_debug_assert(dst != NULL && cenumval != NULL, "`dst` and `cenumval` should not be NULL"); Str8 tmp = wapp_str8_buf(32); u64 tmp_size = 0; if (cenumval->value != NULL) { wapp_str8_format(&tmp, " = %d", *(cenumval->value)); tmp_size = tmp.size; } u64 total_size = cenumval->name.size + tmp_size; wapp_runtime_assert(total_size <= dst->capacity, ERR_MSG); wapp_str8_format(dst, WAPP_STR8_SPEC WAPP_STR8_SPEC, wapp_str8_varg(cenumval->name), wapp_str8_varg(tmp)); } internal inline void cmacro_to_string(Str8 *dst, const CMacro *cmacro) { wapp_debug_assert(dst != NULL && cenumval != NULL, "`dst` and `cmacro` should not be NULL"); Str8 def = wapp_str8_lit("#define "); u64 total_size = def.size + cmacro->name.size + cmacro->value.size + 1; // Add 1 for newline wapp_runtime_assert(total_size <= dst->capacity, ERR_MSG); wapp_str8_format(dst, WAPP_STR8_SPEC WAPP_STR8_SPEC " " WAPP_STR8_SPEC "\n", wapp_str8_varg(def), wapp_str8_varg(cmacro->name), wapp_str8_varg(cmacro->value)); }