File: StringUtil.cpp

package info (click to toggle)
subcommander 2.0.0~b5p2-5
  • links: PTS
  • area: main
  • in suites: wheezy
  • size: 15,344 kB
  • sloc: cpp: 63,594; sh: 4,050; xml: 1,992; makefile: 1,134; ansic: 786; ruby: 251; lisp: 24
file content (96 lines) | stat: -rw-r--r-- 1,862 bytes parent folder | download | duplicates (4)
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