File: Compare.cpp

package info (click to toggle)
subcommander 2.0.0~b5p1-2
  • links: PTS
  • area: main
  • in suites: squeeze
  • size: 14,880 kB
  • ctags: 9,003
  • sloc: cpp: 63,591; sh: 3,904; xml: 1,984; makefile: 1,166; ansic: 786; ruby: 251; lisp: 24
file content (110 lines) | stat: -rw-r--r-- 2,245 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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/* ====================================================================
 * Copyright (c) 2007-2008  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 "Compare.h"
#include "String.h"
#include "svn/Path.h" // \todo circular dependency between util <-> svn

// sys
#include <cstring>


int calcDepth( const sc::String& s )
{
  int depth = 0;
  const char* c = (const char*)s;
  for( sc::Size cnt = 0; cnt < s.getByteCnt(); cnt++ )
  {
    if( c[cnt] == '/' )
      depth++;
  }
  return depth;
}


int compare3( const sc::String& a, bool adir, const sc::String& b, bool bdir )
{
  if( ! adir && ! bdir )
  {
    sc::String ap = svn::Path::getDirName(a);
    sc::String bp = svn::Path::getDirName(b);

    if( ap == bp )
    {
      sc::String ab = svn::Path::getBaseName(a);
      sc::String bb = svn::Path::getBaseName(b);
      return compare3(ab,bb);
    }

    if( ap.getByteCnt() <= bp.getByteCnt() )
    {
      int r = strncmp( ap, b, ap.getByteCnt() );
      if( r != 0 )
        return r < 0 ? -1 : 1;

      return 1;
    }
    else
    {
      int r = strncmp( a, bp, bp.getByteCnt() );
      if( r != 0 )
        return r < 0 ? -1 : 1;

      return -1;
    }
  }

  if( adir && !bdir )
  {
    sc::String bp = svn::Path::getDirName(b);

    if( a.getByteCnt() <= bp.getByteCnt() )
    {
      int r = strncmp( a, bp, a.getByteCnt() );
      if( r != 0 )
        return r < 0 ? -1 : 1;

      return -1;
    }
    else
    {
      int r = strncmp( a, bp, bp.getByteCnt() );
      if( r != 0 )
        return r < 0 ? -1 : 1;

      return -1;
    }
  }

  if( !adir && bdir )
  {
    sc::String ap = svn::Path::getDirName(a);

    if( ap.getByteCnt() <= b.getByteCnt() )
    {
      int r = strncmp( ap, b, ap.getByteCnt() );
      if( r != 0 )
        return r < 0 ? -1 : 1;

      return 1;
    }
    else
    {
      int r = strncmp( ap, b, b.getByteCnt() );
      if( r != 0 )
        return r < 0 ? -1 : 1;

      return 1;
    }
  }

  int result = compare3(a,b);
  return result;
}