diff options
-rw-r--r-- | apt-pkg/deb/debversion.cc | 74 |
1 files changed, 37 insertions, 37 deletions
diff --git a/apt-pkg/deb/debversion.cc b/apt-pkg/deb/debversion.cc index 80f75f25a..a3bb908dd 100644 --- a/apt-pkg/deb/debversion.cc +++ b/apt-pkg/deb/debversion.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: debversion.cc,v 1.4 2002/11/22 06:59:35 doogie Exp $ +// $Id: debversion.cc,v 1.5 2002/11/23 07:54:36 jgg Exp $ /* ###################################################################### Debian Version - Versioning system for Debian @@ -32,30 +32,17 @@ debVersioningSystem::debVersioningSystem() Label = "Standard .deb"; } /*}}}*/ -// StrToLong - Convert the string between two iterators to a long /*{{{*/ -// --------------------------------------------------------------------- -/* */ -static unsigned long StrToLong(const char *begin,const char *end) -{ - char S[40]; - char *I = S; - for (; begin != end && I < S + 40;) - *I++ = *begin++; - *I = 0; - return strtoul(S,0,10); -} - /*}}}*/ -#define order(x) ((x) == '~' ? -1 \ - : isdigit((x)) ? 0 \ - : !(x) ? 0 \ - : isalpha((x)) ? (x) \ - : (x) + 256) // debVS::CmpFragment - Compare versions /*{{{*/ // --------------------------------------------------------------------- -/* This compares a fragment of the version. Dpkg has a really short - version of this, but it is uh.. interesting to grok. */ -int debVersioningSystem::CmpFragment(const char *A,const char *AEnd, +/* This compares a fragment of the version. This is a slightly adapted + version of what dpkg uses. */ +#define order(x) ((x) == '~' ? -1 \ + : isdigit((x)) ? 0 \ + : !(x) ? 0 \ + : isalpha((x)) ? (x) \ + : (x) + 256) +int debVersioningSystem::CmpFragment(const char *A,const char *AEnd, const char *B,const char *BEnd) { if (A >= AEnd && B >= BEnd) @@ -64,9 +51,9 @@ int debVersioningSystem::CmpFragment(const char *A,const char *AEnd, return -1; if (B >= BEnd) return 1; - + /* Iterate over the whole string - What this does is to spilt the whole string into groups of + What this does is to spilt the whole string into groups of numeric and non numeric portions. For instance: a67bhgs89 Has 4 portions 'a', '67', 'bhgs', '89'. A more normal: @@ -80,22 +67,35 @@ int debVersioningSystem::CmpFragment(const char *A,const char *AEnd, const char *Slhs = lhs; const char *Srhs = rhs; int first_diff = 0; - - while ( (lhs != AEnd && !isdigit(*lhs)) || (rhs != BEnd && !isdigit(*rhs)) ) { - int vc= order(*lhs), rc= order(*rhs); - if (vc != rc) return vc - rc; + + while ((lhs != AEnd && !isdigit(*lhs)) || + (rhs != BEnd && !isdigit(*rhs)) ) + { + int vc = order(*lhs); + int rc = order(*rhs); + if (vc != rc) + return vc - rc; lhs++; rhs++; } - while ( *lhs == '0' ) lhs++; - while ( *rhs == '0' ) rhs++; - while (isdigit(*lhs) && isdigit(*rhs)) { - if (!first_diff) first_diff= *lhs - *rhs; - lhs++; rhs++; + while (*lhs == '0') + lhs++; + while (*rhs == '0') + rhs++; + while (isdigit(*lhs) && isdigit(*rhs)) + { + if (!first_diff) + first_diff = *lhs - *rhs; + lhs++; + rhs++; } - if (isdigit(*lhs)) return 1; - if (isdigit(*rhs)) return -1; - if (first_diff) return first_diff; + + if (isdigit(*lhs)) + return 1; + if (isdigit(*rhs)) + return -1; + if (first_diff) + return first_diff; } // The strings must be equal @@ -109,7 +109,7 @@ int debVersioningSystem::CmpFragment(const char *A,const char *AEnd, // rhs is shorter if (rhs == BEnd) return 1; - + // Shouldnt happen return 1; } |