1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
/* ====================================================================
* Copyright (c) 2003-2007, Martin Hauner
* http://subcommander.tigris.org
*
* Subcommander is licensed as described in the file doc/COPYING, which
* you should have received as part of this distribution.
* ====================================================================
*/
// sc
#include "StringUtil.h"
// qt
#include <QtCore/QString>
namespace sc
{
int compare( const QString& s1, const QString& s2 )
{
int cnt = 0;
while( (cnt < s1.size()) && (cnt < s2.size()) )
//while( !(s1[cnt].isNull()) && !(s2[cnt].isNull()) )
{
QChar qc1 = s1[cnt];
QChar qc2 = s2[cnt];
bool d1 = qc1.isDigit();
bool d2 = qc2.isDigit();
if( d1 && d2 )
{
int dCnt1 = 0;
int dCnt2 = 0;
// cnt digit characters
while( cnt+dCnt1 < s1.size() && s1[cnt+dCnt1].isDigit() )
dCnt1++;
while( cnt+dCnt2 < s2.size() && s2[cnt+dCnt2].isDigit() )
dCnt2++;
// this will break the compare if the numbers are
// greater than 2^64 ..
qulonglong n1 = s1.mid( cnt, dCnt1 ).toULongLong();
qulonglong n2 = s2.mid( cnt, dCnt2 ).toULongLong();
if( n1 < n2 )
{
return -1;
}
else if( n1 > n2 )
{
return 1;
}
else
{
// number are equal, so dCnt1 == dCnt2
// skip number
cnt += dCnt1;
}
}
else
{
if( qc1 < qc2 )
{
return -1;
}
else if( qc1 > qc2 )
{
return 1;
}
{
// equal, check next char
cnt++;
}
}
}
if( s1.length() < s2.length() )
{
return -1;
}
else if( s1.length() > s2.length() )
{
return 1;
}
else // s1.length() == s2.length()
{
return 0;
}
}
} // namespace
|