vn/code/vn_config.h

89 lines
2.1 KiB
C

/* date = June 17th 2023 10:48 pm */
#ifndef VN_CONFIG_H
#define VN_CONFIG_H
////////////////////////////////
//~ sixten: Config Types
enum config_entry_type
{
Config_Entry_S32,
Config_Entry_S64,
Config_Entry_B32,
};
struct config_entry
{
string Name;
void *Target;
config_entry_type Type;
config_entry *Next;
config_entry *Prev;
config_entry *NextInternal;
};
struct config_entry_bucket
{
config_entry *First;
config_entry *Last;
};
struct config
{
memory_arena *Arena;
config_entry_bucket EntryBuckets[32];
// sixten(NOTE): Keeps track of the order in which the entries were declared. (Used during saving)
config_entry *FirstInternal;
config_entry *LastInternal;
};
////////////////////////////////
//~ sixten: Config Parse Types
enum config_parse_mode
{
ConfigParseMode_Main,
ConfigParseMode_ScanForCurlyOpenOrEquals,
ConfigParseMode_ScanForValue,
ConfigParseMode_ScanForSemicolon,
};
struct config_parse_node
{
config_parse_node *Next;
config_parse_node *Prev;
string Name;
};
struct config_parse_list
{
config_parse_node *First;
config_parse_node *Last;
s64 TotalCountPlusOne;
};
////////////////////////////////
//~ sixten: Config Type Functions
static config *CreateConfig(void);
static config_entry *Config_FindEntryByName(config *Config, string Name);
static void Config_BindEntry(config *Config, string Name, config_entry_type Type, void *Target);
inline void Config_BindS32(config *Config, string Name, s32 *Target, s32 Default);
inline void Config_BindS64(config *Config, string Name, s64 *Target, s64 Default);
inline void Config_BindB32(config *Config, string Name, b32 *Target, b32 Default);
static void Config_ReadFile(config *Config, string Path);
static void Config_WriteFile(config *Config);
////////////////////////////////
//~ sixten: Config Parse Type Functions
static void Config_ParseListPush(memory_arena *Arena, config_parse_list *List, string Name);
static void Config_ParseListPop(config_parse_list *List);
static string Config_ParseListJoin(memory_arena *Arena, config_parse_list *List);
#endif //VN_CONFIG_H