175 lines
5.4 KiB
C
175 lines
5.4 KiB
C
#if !defined(DQN_CGEN_H)
|
|
#define DQN_CGEN_H
|
|
|
|
/*
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// $$$$$$\ $$$$$$\ $$$$$$$$\ $$\ $$\
|
|
// $$ __$$\ $$ __$$\ $$ _____|$$$\ $$ |
|
|
// $$ / \__|$$ / \__|$$ | $$$$\ $$ |
|
|
// $$ | $$ |$$$$\ $$$$$\ $$ $$\$$ |
|
|
// $$ | $$ |\_$$ |$$ __| $$ \$$$$ |
|
|
// $$ | $$\ $$ | $$ |$$ | $$ |\$$$ |
|
|
// \$$$$$$ |\$$$$$$ |$$$$$$$$\ $$ | \$$ |
|
|
// \______/ \______/ \________|\__| \__|
|
|
//
|
|
// dqn_cgen.h -- C/C++ code generation from table data in Metadesk files
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
*/
|
|
|
|
// NOTE: [$CGEN] Dqn_CGen //////////////////////////////////////////////////////////////////////////
|
|
#if !defined(MD_H)
|
|
#error Metadesk 'md.h' must be included before 'dqn_cgen.h'
|
|
#endif
|
|
|
|
#if !defined(DQN_H)
|
|
#error 'dqn.h' must be included before 'dqn_cgen.h'
|
|
#endif
|
|
|
|
#if !defined(DQN_CPP_FILE_H)
|
|
#error 'dqn_cpp_file.h' must be included before 'dqn_cgen.h'
|
|
#endif
|
|
|
|
enum Dqn_CGenTableKeyType
|
|
{
|
|
Dqn_CGenTableKeyType_Nil,
|
|
Dqn_CGenTableKeyType_Name,
|
|
Dqn_CGenTableKeyType_Type,
|
|
};
|
|
|
|
enum Dqn_CGenTableType
|
|
{
|
|
Dqn_CGenTableType_Nil,
|
|
Dqn_CGenTableType_Data,
|
|
Dqn_CGenTableType_CodeGenBuiltinTypes,
|
|
Dqn_CGenTableType_CodeGenStruct,
|
|
Dqn_CGenTableType_CodeGenEnum,
|
|
Dqn_CGenTableType_Count,
|
|
};
|
|
|
|
enum Dqn_CGenTableRowTagType
|
|
{
|
|
Dqn_CGenTableRowTagType_Nil,
|
|
Dqn_CGenTableRowTagType_CommentDivider,
|
|
Dqn_CGenTableRowTagType_EmptyLine,
|
|
};
|
|
|
|
enum Dqn_CGenTableRowTagCommentDivider
|
|
{
|
|
Dqn_CGenTableRowTagCommentDivider_Nil,
|
|
Dqn_CGenTableRowTagCommentDivider_Label,
|
|
};
|
|
|
|
enum Dqn_CGenTableHeaderType
|
|
{
|
|
Dqn_CGenTableHeaderType_Name,
|
|
Dqn_CGenTableHeaderType_Table,
|
|
Dqn_CGenTableHeaderType_CppType,
|
|
Dqn_CGenTableHeaderType_CppName,
|
|
Dqn_CGenTableHeaderType_CppValue,
|
|
Dqn_CGenTableHeaderType_CppIsPtr,
|
|
Dqn_CGenTableHeaderType_CppOpEquals,
|
|
Dqn_CGenTableHeaderType_CppArraySize,
|
|
Dqn_CGenTableHeaderType_CppArraySizeField,
|
|
Dqn_CGenTableHeaderType_CppLabel,
|
|
Dqn_CGenTableHeaderType_GenTypeInfo,
|
|
Dqn_CGenTableHeaderType_GenEnumCount,
|
|
Dqn_CGenTableHeaderType_Count,
|
|
};
|
|
|
|
struct Dqn_CGenTableHeader
|
|
{
|
|
MD_String8 name;
|
|
int longest_string;
|
|
};
|
|
|
|
struct Dqn_CGenTableRowTag
|
|
{
|
|
Dqn_CGenTableRowTagType type;
|
|
MD_String8 comment;
|
|
Dqn_CGenTableRowTag *next;
|
|
};
|
|
|
|
|
|
struct Dqn_CGenTableColumn
|
|
{
|
|
MD_Node *node;
|
|
Dqn_Str8 string;
|
|
};
|
|
|
|
struct Dqn_CGenTableRow
|
|
{
|
|
Dqn_CGenTableRowTag *first_tag;
|
|
Dqn_CGenTableRowTag *last_tag;
|
|
Dqn_CGenTableColumn *columns;
|
|
};
|
|
|
|
struct Dqn_CGenTable
|
|
{
|
|
Dqn_CGenTableType type;
|
|
Dqn_Str8 name;
|
|
MD_Map headers_map;
|
|
Dqn_CGenTableHeader *headers;
|
|
Dqn_CGenTableRow *rows;
|
|
size_t column_count;
|
|
size_t row_count;
|
|
|
|
MD_Node *node;
|
|
MD_Node *headers_node;
|
|
Dqn_usize column_indexes[Dqn_CGenTableHeaderType_Count];
|
|
Dqn_CGenTable *next;
|
|
};
|
|
|
|
struct Dqn_CGen
|
|
{
|
|
MD_Arena *arena;
|
|
MD_Node *file_list;
|
|
MD_Map table_map;
|
|
Dqn_CGenTable *first_table;
|
|
Dqn_CGenTable *last_table;
|
|
Dqn_usize table_counts[Dqn_CGenTableType_Count];
|
|
};
|
|
|
|
struct Dqn_CGenMapNodeToEnum
|
|
{
|
|
uint32_t enum_val;
|
|
Dqn_Str8 node_string;
|
|
};
|
|
|
|
struct Dqn_CGenLookupTableIterator
|
|
{
|
|
Dqn_CGenTable *cgen_table;
|
|
Dqn_CGenTableRow *cgen_table_row;
|
|
Dqn_CGenTableColumn cgen_table_column[Dqn_CGenTableHeaderType_Count];
|
|
Dqn_CGenTable *table;
|
|
Dqn_usize row_index;
|
|
};
|
|
|
|
struct Dqn_CGenLookupColumnAtHeader
|
|
{
|
|
Dqn_usize index;
|
|
Dqn_CGenTableHeader header;
|
|
Dqn_CGenTableColumn column;
|
|
};
|
|
|
|
enum Dqn_CGenEmit
|
|
{
|
|
Dqn_CGenEmit_Prototypes = 1 << 0,
|
|
Dqn_CGenEmit_Implementation = 1 << 1,
|
|
};
|
|
|
|
// NOTE: [$CGEN] Dqn_CGen //////////////////////////////////////////////////////////////////////////
|
|
#define Dqn_CGen_MDToDqnStr8(str8) Dqn_Str8_Init((str8).str, (str8).size)
|
|
#define Dqn_CGen_DqnToMDStr8(str8) {DQN_CAST(MD_u8 *)(str8).data, (str8).size}
|
|
DQN_API Dqn_CGen Dqn_CGen_InitFilesArgV (int argc, char const **argv, Dqn_ErrorSink *error);
|
|
DQN_API Dqn_Str8 Dqn_CGen_TableHeaderTypeToDeclStr8 (Dqn_CGenTableHeaderType type);
|
|
DQN_API Dqn_CGenMapNodeToEnum Dqn_CGen_MapNodeToEnumOrExit (MD_Node const *node, Dqn_CGenMapNodeToEnum const *valid_keys, Dqn_usize valid_keys_size, char const *fmt, ...);
|
|
DQN_API Dqn_usize Dqn_CGen_NodeChildrenCount (MD_Node const *node);
|
|
DQN_API void Dqn_CGen_LogF (MD_MessageKind kind, MD_Node *node, Dqn_ErrorSink *error, char const *fmt, ...);
|
|
DQN_API bool Dqn_CGen_TableHasHeaders (Dqn_CGenTable const *table, Dqn_Str8 const *headers, Dqn_usize header_count, Dqn_ErrorSink *error);
|
|
DQN_API Dqn_CGenLookupColumnAtHeader Dqn_CGen_LookupColumnAtHeader (Dqn_CGenTable *table, Dqn_Str8 header, Dqn_CGenTableRow const *row);
|
|
DQN_API bool Dqn_CGen_LookupNextTableInCodeGenTable(Dqn_CGen *cgen, Dqn_CGenTable *cgen_table, Dqn_CGenLookupTableIterator *it);
|
|
DQN_API void Dqn_CGen_EmitCodeForTables (Dqn_CGen *cgen, Dqn_CGenEmit emit, Dqn_CppFile *cpp, Dqn_Str8 emit_prefix);
|
|
#endif // DQN_CGEN_H
|