121 lines
4.2 KiB
C
121 lines
4.2 KiB
C
// 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));
|
|
}
|