// 比较以"."分隔十进制数字的版本号大小,相等返回0,不相等的情况如:
// "2.0.10.6" 与 "2.0.3.9"相比较的返回结果为7
// "2.0.3.9" 与 "2.0.10.6"相比较的返回结果为-7
static int VersionCompareA(const char* pszStr1, const char* pszStr2)
{
if (pszStr1 == NULL || pszStr2 == NULL)
{
return 0;
}
int nCurPos = 0, nCapPos;
const char* pszTmp1 = pszStr1;
const char* pszTmp2 = pszStr2;
char pszSec1[32], pszSec2[32];
while ((*pszTmp1 != '/0') && (*pszTmp2 != '/0') && (*pszTmp1++ == *pszTmp2++))
{
nCurPos++;
if (*pszTmp1 == '.')
{
nCapPos = nCurPos;
}
}
if (*pszTmp1 == '/0' && *pszTmp2 == '/0') // 两个字符串相等
{
return 0;
}
else // 两个字符串不相等,比较大小
{
pszTmp1 = pszStr1 + nCapPos + 1;
pszTmp2 = pszStr2 + nCapPos + 1;
int nPos;
nPos = 0;
while ((*pszTmp1 != '/0') && (*pszTmp1 != '.') && (nPos < 32))
{
pszSec1[nPos++] = *pszTmp1++;
}
pszSec1[nPos] = '/0';
nPos = 0;
while ((*pszTmp2 != '/0') && (*pszTmp2 != '.') && (nPos < 32))
{
pszSec2[nPos++] = *pszTmp2++;
}
pszSec2[nPos] = '/0';
return (atoi(pszSec1) - atoi(pszSec2));
}
}
// 比较以"."分隔十进制数字的版本号大小,相等返回0,不相等的情况如:
// "2.0.10.6" 与 "2.0.3.9"相比较的返回结果为7
// "2.0.3.9" 与 "2.0.10.6"相比较的返回结果为-7
static int VersionCompareW(const wchar_t* wpszStr1, const wchar_t* wpszStr2)
{
if (wpszStr1 == NULL || wpszStr2 == NULL)
{
return 0;
}
int nCurPos = 0, nCapPos;
const wchar_t* wpszTmp1 = wpszStr1;
const wchar_t* wpszTmp2 = wpszStr2;
wchar_t wpszSec1[32], wpszSec2[32];
while ((*wpszTmp1 != L'/0') && (*wpszTmp2 != L'/0') && (*wpszTmp1++ == *wpszTmp2++))
{
nCurPos++;
if (*wpszTmp1 == L'.')
{
nCapPos = nCurPos;
}
}
if (*wpszTmp1 == L'/0' && *wpszTmp2 == L'/0') // 两个字符串相等
{
return 0;
}
else // 两个字符串不相等,比较大小
{
wpszTmp1 = wpszStr1 + nCapPos + 1;
wpszTmp2 = wpszStr2 + nCapPos + 1;
int nPos;
nPos = 0;
while ((*wpszTmp1 != L'/0') && (*wpszTmp1 != L'.') && (nPos < 32))
{
wpszSec1[nPos++] = *wpszTmp1++;
}
wpszSec1[nPos] = L'/0';
nPos = 0;
while ((*wpszTmp2 != L'/0') && (*wpszTmp2 != L'.') && (nPos < 32))
{
wpszSec2[nPos++] = *wpszTmp2++;
}
wpszSec2[nPos] = L'/0';
return (_wtoi(wpszSec1) - _wtoi(wpszSec2));
}
}