#include "cb2c.h" #include "../../kerep/src/String/StringBuilder.h" #define addc(C) StringBuilder_append_char(b, C); #define adds(S) StringBuilder_append_cptr(b, S); void appendToken(StringBuilder* b, LLNode(Token)* tokNode, u16* _tab_count){ u16 tab_count=*_tab_count; adds(tokNode->value.value) switch(tokNode->value.id){ case tok_lbracket_fi: tab_count++; goto add_new_line; case tok_rbracket_fi: tab_count--; goto add_new_line; case tok_semicolon: case tok_colon: case tok_comment: ; add_new_line: addc('\n'); for(u16 i=0; ibase.namespace!=NULL){ adds(context->base.namespace) addc('.') } adds(context->base.name) adds(" */\n\n") u16 tab_count=0; LinkedList_foreach(context->base.tokens, tok, appendToken(b, tok, &tab_count)); addc('\n'); return MaybeNull; } Maybe appendClassContext(StringBuilder* b, ClassContext* context){ safethrow(ERR_NOTIMPLEMENTED,;); } Maybe appendFunctionContext(StringBuilder* b, FunctionContext* context){ safethrow(ERR_NOTIMPLEMENTED,;); } Maybe translateToC(Context* context){ StringBuilder* b=StringBuilder_create(); switch(context->type){ case ContextType_Namespace: try(appendNamespaceContext(b, (NamespaceContext*)context), _0, StringBuilder_free(b)); break; case ContextType_Class: try(appendClassContext(b, (ClassContext*)context), _2, StringBuilder_free(b)); break; case ContextType_Function: try(appendFunctionContext(b, (FunctionContext*)context), _1, StringBuilder_free(b)); break; default: safethrow(ERR_WRONGTYPE, StringBuilder_free(b)); } return SUCCESS(UniHeapPtr(char, StringBuilder_build(b).ptr)); }