#include #include #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; }