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;
}
|