diff options
| author | navewindre <boneyaard@gmail.com> | 2025-09-03 20:10:09 +0200 |
|---|---|---|
| committer | navewindre <boneyaard@gmail.com> | 2025-09-03 20:10:09 +0200 |
| commit | f8b92ce3aa08b1445c9f956d8166830946562d12 (patch) | |
| tree | 94e63a5aec9f8f52b577f56799e0c9201fd976a5 /src/util/config/parsers.cpp | |
a
Diffstat (limited to 'src/util/config/parsers.cpp')
| -rw-r--r-- | src/util/config/parsers.cpp | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/src/util/config/parsers.cpp b/src/util/config/parsers.cpp new file mode 100644 index 0000000..1dbfc07 --- /dev/null +++ b/src/util/config/parsers.cpp @@ -0,0 +1,156 @@ +#include <cstdarg> +#include <cstdio> + +#include "../config.h" + +U8* parse_hex_string( CFG_PARSER* p, const char* hex_str, U8* bytes, U32* size ) { + *size = strlen( hex_str ) / 2; + for( U32 i = 0; i < *size; ++i ) { + U32 buf; + I32 c = sscanf( hex_str + 2 * i, "%02x", &buf ); + if( c != 1 ) { + cfg_seterr( p, "Invalid hex string: %s", hex_str ); + free( bytes ); + return NULL; + } + + bytes[i] = ( buf & 0xff ); + } + + return bytes; +} + +STAT cfg_parser_bytes( CFG_PARSER* p, CFG_SECTION* s, char* name ) { + char* sizep = strtok( NULL, "]" ); + if( !sizep ) { + cfg_seterr( p, "cfg_parser_bytes() : %s: invalid size [L:%d]", name, p->linen ); + return STAT_ERR; + } + + U32 size = atoi( sizep ); + strtok( NULL, "=" ); + strtok( NULL, "\"" ); + char* hex_value = strtok( NULL, "\"" ); + if( !hex_value ) { + cfg_seterr( p, "cfg_parser_bytes() : %s: invalid value (size: %d) [L:%d]", name, size, p->linen ); + return STAT_ERR; + } + + U32 totals; + U8* bytes = (U8*)malloc( size ); + parse_hex_string( p, hex_value, bytes, &totals ); + cfg_bytes( name, (CFG_NODE*)s, bytes, size ); + + return STAT_OK; +} + +STAT cfg_parser_str( CFG_PARSER* p, CFG_SECTION* s, char* name ) { + char* sizep = strtok( NULL, "]" ); + if( !sizep ) { + cfg_seterr( p, "cfg_parser_str() : %s: invalid size [L:%d]", name, p->linen ); + return STAT_ERR; + } + + U32 size = atoi( sizep ); + strtok( NULL, "=" ); + strtok( NULL, "\"" ); + char* v = strtok( NULL, "\"" ); + if( !v ) { + cfg_seterr( p, "cfg_parser_str() : %s: incorrect value [L:%d]", name, p->linen ); + return STAT_ERR; + } + + cfg_str( name, (CFG_NODE*)s, v, size ); + + return STAT_OK; +} + +STAT cfg_parser_int( CFG_PARSER* p, CFG_SECTION* s, char* name ) { + char* vp = strtok( NULL, ";" ); + if( !vp ) { + cfg_seterr( p, "cfg_parser_int() : %s: incorrect value [L:%d]", name, p->linen ); + return STAT_ERR; + } + + I32 value = atoi( vp ); + cfg_int( name, (CFG_NODE*)s, value ); + + return STAT_OK; +} + +STAT cfg_parser_float( CFG_PARSER* p, CFG_SECTION* s, char* name ) { + char* vp = strtok( NULL, ";" ); + if( !vp ) { + cfg_seterr( p, "cfg_parser_float() : %s: incorrect value [L:%d]", name, p->linen ); + return STAT_ERR; + } + + F32 value = atof( vp ); + cfg_float( name, (CFG_NODE*)s, value ); + + return STAT_OK; +} + +STAT cfg_parser_vec2( CFG_PARSER *p, CFG_SECTION* s, char* name ) { + char* vp = strtok( NULL, "{" ); + const char* errstr = "cfg_parser_vec2() : %s: incorrect value [L:%d]"; + + if( !vp ) { cfg_seterr( p, errstr, name, p->linen ); return STAT_ERR; } + vp = strtok( NULL, "," ); + if( !vp ) { cfg_seterr( p, errstr, name, p->linen ); return STAT_ERR; } + F32 v1 = atof( vp ); + vp = strtok( NULL, "}" ); + if( !vp ) { cfg_seterr( p, errstr, name, p->linen ); return STAT_ERR; } + F32 v2 = atof( vp ); + + VEC2 v = { v1, v2 }; + cfg_vec2( name, (CFG_NODE*)s, v ); + + return STAT_OK; +} + +STAT cfg_parser_vec3( CFG_PARSER *parser, CFG_SECTION *section, char *name ) { + char *vp = strtok( NULL, "{" ); + const char* errstr = "cfg_parser_vec3() : %s: incorrect value [L:%d]"; + + if( !vp ) { cfg_seterr( parser, errstr, name, parser->linen ); return STAT_ERR; } + vp = strtok( NULL, "," ); + if( !vp ) { cfg_seterr( parser, errstr, name, parser->linen ); return STAT_ERR; } + F32 x = atof( vp ); + vp = strtok( NULL, "," ); + if( !vp ) { cfg_seterr( parser, errstr, name, parser->linen ); return STAT_ERR; } + F32 y = atof( vp ); + vp = strtok( NULL, "}" ); + if( !vp ) { cfg_seterr( parser, errstr, name, parser->linen ); return STAT_ERR; } + F32 z = atof( vp ); + VEC3 v = { x, y, z }; + cfg_vec3( name, (CFG_NODE*)section, v ); + + return STAT_OK; +} + +STAT cfg_parser_clr( CFG_PARSER* parser, CFG_SECTION* section, char* name ) { + const char* vp = strtok( NULL, "{" ); + const char* errstr = "cfg_parser_clr() : %s: incorrect value [L:%d]"; + if( !vp ) { + cfg_seterr( parser, errstr, name, parser->linen ); + return STAT_ERR; + } + + vp = strtok( NULL, "," ); + if( !vp ) { cfg_seterr( parser, errstr, name, parser->linen ); return STAT_ERR; } + F32 r = atof( vp ); + vp = strtok( NULL, "," ); + if( !vp ) { cfg_seterr( parser, errstr, name, parser->linen ); return STAT_ERR; } + F32 g = atof( vp ); + vp = strtok( NULL, "," ); + if( !vp ) { cfg_seterr( parser, errstr, name, parser->linen ); return STAT_ERR; } + F32 b = atof( vp ); + vp = strtok( NULL, "}" ); + if( !vp ) { cfg_seterr( parser, errstr, name, parser->linen ); return STAT_ERR; } + F32 a = atof( vp ); + + CLR c = { r, g, b, a }; + cfg_clr( name, (CFG_NODE*)section, c ); + return STAT_OK; +} |
