27 int verStageOctet = 0;
28 int verSubStageOctet = 0;
29 String win32Version4DotStr = win32Version4DotString;
30 DISABLE_COMPILER_MSC_WARNING_START (4996)
31 int nMatchingItems = ::swscanf (win32Version4DotStr.
As<wstring> ().c_str (), L
"%d.%d.%d.%d", &major, &minor, &verStageOctet, &verSubStageOctet);
32 DISABLE_COMPILER_MSC_WARNING_END (4996)
34 if (major < 0 or major > 255) [[unlikely]] {
37 if (minor < 0 or minor > 255) [[unlikely]] {
40 int verStage =
static_cast<uint16_t
> (verStageOctet) >> 5;
41 Assert (verStage == Memory::BitSubstring (verStageOctet, 5, 8));
42 uint16_t verSubStage =
43 static_cast<uint16_t
> ((Memory::BitSubstring (verStageOctet, 0, 5) << 7) + Memory::BitSubstring (verSubStageOctet, 1, 8));
44 bool verFinal = verSubStageOctet & 0x1;
45 if (nMatchingItems != 4 or not(ToInt (VersionStage::eSTART) <= verStage and verStage <= ToInt (VersionStage::eLAST))) {
46 DbgTrace (
"win32Version4DotString={}"_f, win32Version4DotStr);
49 return Version{
static_cast<uint8_t
> (major),
static_cast<uint8_t
> (minor),
static_cast<VersionStage
> (verStage), verSubStage, verFinal};
57 wstring ppv = prettyVersionString.
As<wstring> ();
60 DISABLE_COMPILER_CLANG_WARNING_START (
"clang diagnostic ignored \"-Wunused-lambda-capture\"");
61 auto my_wcstol_ = [&ppv] (
const wchar_t* i,
wchar_t** endResult) -> uint8_t {
62 long l = wcstol (i, endResult, 10);
63 if (l < 0 or l > numeric_limits<uint8_t>::max ()) [[unlikely]] {
64 DbgTrace (L
"prettyVersionString={}"_f, ppv);
68 return static_cast<uint8_t
> (l);
70 DISABLE_COMPILER_CLANG_WARNING_END (
"clang diagnostic ignored \"-Wunused-lambda-capture\"");
72 const wchar_t* i = ppv.c_str ();
73 wchar_t* tokenEnd =
nullptr;
74 major = my_wcstol_ (i, &tokenEnd);
75 if (i == tokenEnd) [[unlikely]] {
76 DbgTrace (L
"prettyVersionString={}"_f, ppv);
80 Assert (
static_cast<size_t> (i - ppv.c_str ()) <= prettyVersionString.
length ());
83 minor = my_wcstol_ (i, &tokenEnd);
84 if (i == tokenEnd) [[unlikely]] {
85 DbgTrace (
"prettyVersionString={}"_f, ppv);
88 Assert (
static_cast<size_t> (i - ppv.c_str ()) <= ppv.length ());
91 VersionStage verStage = VersionStage::Release;
95 return Version (major, minor, VersionStage::Release, 0);
98 verStage = VersionStage::Alpha;
102 verStage = VersionStage::Beta;
106 verStage = VersionStage::Dev;
110 verStage = VersionStage::ReleaseCandidate;
115 verStage = VersionStage::Release;
119 Assert (
static_cast<size_t> (i - ppv.c_str ()) <= ppv.size ());
120 uint8_t verSubStage = my_wcstol_ (i, &tokenEnd);
121 if (i == tokenEnd) [[unlikely]] {
122 DbgTrace (L
"prettyVersionString={}"_f, ppv);
127 bool finalBuild =
true;
131 Assert (
static_cast<size_t> (i - ppv.c_str ()) <= ppv.size ());
132 return Version{major, minor, verStage, verSubStage, finalBuild};
137 return "{}.{}.{}.{}"_f(fMajorVer, fMinorVer, (
static_cast<uint8_t
> (fVerStage) << 5) | (fVerSubStage >> 7),
168 return "{}.{}{}{}"_f(fMajorVer, fMinorVer, stageStr, verSubStagStr);