summaryrefslogtreecommitdiff
path: root/src/util/config/parsers.cpp
diff options
context:
space:
mode:
authornavewindre <boneyaard@gmail.com>2025-09-03 20:10:09 +0200
committernavewindre <boneyaard@gmail.com>2025-09-03 20:10:09 +0200
commitf8b92ce3aa08b1445c9f956d8166830946562d12 (patch)
tree94e63a5aec9f8f52b577f56799e0c9201fd976a5 /src/util/config/parsers.cpp
a
Diffstat (limited to 'src/util/config/parsers.cpp')
-rw-r--r--src/util/config/parsers.cpp156
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;
+}