diff --git a/src/base/base_core.h b/src/base/base_core.h index cc0a6545..dd50fbc9 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -65,6 +65,14 @@ # define C_LINKAGE #endif +//////////////////////////////// +//~ rjf: Versions + +#define Version(major, minor, patch) (U64)((((U64)(major) & 0xffff) << 32) | ((((U64)(minor) & 0xffff) << 16)) | ((((U64)(patch) & 0xffff) << 0))) +#define MajorFromVersion(version) (((version) & 0xffff00000000ull) >> 32) +#define MinorFromVersion(version) (((version) & 0x0000ffff0000ull) >> 16) +#define PatchFromVersion(version) (((version) & 0x00000000ffffull) >> 0) + //////////////////////////////// //~ rjf: Units diff --git a/src/base/base_strings.c b/src/base/base_strings.c index d3823676..b51e70fc 100644 --- a/src/base/base_strings.c +++ b/src/base/base_strings.c @@ -1187,6 +1187,41 @@ str8_array_copy(Arena *arena, String8Array array) return result; } +//////////////////////////////// +//~ rjf: String Version Helpers + +internal U64 +version_from_str8(String8 string) +{ + U64 result = 0; + Temp scratch = scratch_begin(0, 0); + U64 version_major = 0; + U64 version_minor = 0; + U64 version_patch = 0; + String8List version_parts = str8_split(scratch.arena, string, (U8 *)".", 1, 0); + if(version_parts.first && + version_parts.first->next && + version_parts.first->next->next) + { + try_u64_from_str8_c_rules(version_parts.first->string, &version_major); + try_u64_from_str8_c_rules(version_parts.first->next->string, &version_minor); + try_u64_from_str8_c_rules(version_parts.first->next->next->string, &version_patch); + result = Version(version_major, version_minor, version_patch); + } + scratch_end(scratch); + return result; +} + +internal String8 +str8_from_version(Arena *arena, U64 version) +{ + U64 version_major = MajorFromVersion(version); + U64 version_minor = MinorFromVersion(version); + U64 version_patch = PatchFromVersion(version); + String8 result = push_str8f(arena, "%I64d.%I64d.%I64d", version_major, version_minor, version_patch); + return result; +} + //////////////////////////////// //~ rjf: String Path Helpers diff --git a/src/base/base_strings.h b/src/base/base_strings.h index d5ccaad1..06c7bbfc 100644 --- a/src/base/base_strings.h +++ b/src/base/base_strings.h @@ -293,6 +293,12 @@ internal String8Array str8_array_from_list(Arena *arena, String8List *list); internal String8Array str8_array_reserve(Arena *arena, U64 count); internal String8Array str8_array_copy(Arena *arena, String8Array array); +//////////////////////////////// +//~ rjf: String Version Helpers + +internal U64 version_from_str8(String8 string); +internal String8 str8_from_version(Arena *arena, U64 version); + //////////////////////////////// //~ rjf: String Path Helpers diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 4328debc..c0276778 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -12825,8 +12825,8 @@ rd_frame(void) RD_CfgList file_cfg_list = {0}; if(file_is_okay) { - String8 current_version = str8_lit(BUILD_VERSION_STRING_LITERAL); - if(!str8_match(file_version, current_version, 0)) + U64 file_version_code = version_from_str8(file_version); + if(file_version_code < Version(0, 9, 16)) { RD_CfgList (*legacy_parse_function)(Arena *arena, String8 file_path, String8 data) = rd_cfg_tree_list_from_string__pre_0_9_16; file_cfg_list = legacy_parse_function(scratch.arena, file_path, file_data);