power_play/src/meta/meta_lay.h
2025-12-31 15:52:52 -06:00

169 lines
3.5 KiB
C

////////////////////////////////////////////////////////////
//~ Error types
Struct(M_Error)
{
M_Error *next;
String msg;
struct M_Token *token;
};
Struct(M_ErrorList)
{
M_Error *first;
M_Error *last;
u64 count;
};
////////////////////////////////////////////////////////////
//~ File types
Struct(M_File)
{
String name;
String data;
};
////////////////////////////////////////////////////////////
//~ Token types
Enum(M_TokenKind)
{
M_TokenKind_Ident,
M_TokenKind_Eol, // End of line
};
Struct(M_Token)
{
b32 valid;
M_Token *next;
M_TokenKind kind;
struct M_TokenFile *file;
String s;
};
Struct(M_TokenFile)
{
b32 valid;
M_TokenFile *next;
String name;
String data;
M_Token *first_token;
M_Token *last_token;
u64 tokens_count;
M_ErrorList errors;
};
Struct(M_TokenFileList)
{
M_TokenFile *first;
M_TokenFile *last;
u64 count;
};
////////////////////////////////////////////////////////////
//~ Entry types
Enum(M_EntryKind)
{
M_EntryKind_Unknown,
M_EntryKind_Layer,
M_EntryKind_Dep,
M_EntryKind_IncludeC,
M_EntryKind_IncludeG,
M_EntryKind_DefaultDownstream,
M_EntryKind_Bootstrap,
M_EntryKind_VertexShader,
M_EntryKind_PixelShader,
M_EntryKind_ComputeShader,
M_EntryKind_EmbedDir,
};
Enum(M_PlatformKind)
{
M_PlatformKind_Any,
M_PlatformKind_Win32,
};
Global Readonly char *M_entry_kind_rules[] = {
[M_EntryKind_Layer] = "@Layer",
[M_EntryKind_Dep] = "@Dep",
[M_EntryKind_IncludeC] = "@IncludeC",
[M_EntryKind_IncludeG] = "@IncludeG",
[M_EntryKind_DefaultDownstream] = "@DefaultDownstream",
[M_EntryKind_Bootstrap] = "@Bootstrap",
[M_EntryKind_VertexShader] = "@VertexShader",
[M_EntryKind_PixelShader] = "@PixelShader",
[M_EntryKind_ComputeShader] = "@ComputeShader",
[M_EntryKind_EmbedDir] = "@EmbedDir",
};
Struct(M_Entry)
{
b32 valid;
M_Entry *next;
M_EntryKind kind;
M_Token *name_token;
M_Token *arg_tokens[2];
u64 args_count;
};
Struct(M_Layer)
{
b32 valid;
M_Layer *next;
M_TokenFile *file;
M_Entry *first;
M_Entry *last;
u64 count;
M_ErrorList errors;
};
Struct(M_LayerList)
{
M_Layer *first;
M_Layer *last;
u64 count;
};
////////////////////////////////////////////////////////////
//~ State types
extern Readonly M_Token M_NilToken;
extern Readonly M_TokenFile M_NilTokenFile;
extern Readonly M_Entry M_NilEntry;
extern Readonly M_Layer M_NilLayer;
////////////////////////////////////////////////////////////
//~ Error helpers
M_Error *M_PushError(Arena *arena, M_ErrorList *l, M_Token *token, String msg);
void M_AppendErrors(Arena *arena, M_ErrorList *dst, M_ErrorList src);
////////////////////////////////////////////////////////////
//~ Lex
M_Token *M_PushToken(Arena *arena, M_TokenFile *file, String s, M_TokenKind kind);
M_TokenFileList M_TokensFromSrcDirs(Arena *arena, StringList src_dirs);
////////////////////////////////////////////////////////////
//~ Parse
M_Layer *M_PushLayer(Arena *arena, M_LayerList *list, M_TokenFile *file);
M_Entry *M_PushEntry(Arena *arena, M_Layer *l, M_EntryKind kind, M_Token *entry_token, u64 args_count, M_Token **args);
M_LayerList M_LayersFromTokenFiles(Arena *arena, M_TokenFileList token_files);
////////////////////////////////////////////////////////////
//~ Flatten
M_Layer M_FlattenEntries(Arena *arena, M_LayerList unflattened, StringList starting_layer_names);