severity 387220 serious thanks This bugs makes quinn-diff unusable. I'll NMU this in three days with the attached patch.
Bastian -- Women professionals do tend to over-compensate. -- Dr. Elizabeth Dehaver, "Where No Man Has Gone Before", stardate 1312.9.
diff -urN quinn-diff-0.65/debian/changelog quinn-diff-0.65.1/debian/changelog --- quinn-diff-0.65/debian/changelog 2003-06-08 15:40:43.000000000 +0200 +++ quinn-diff-0.65.1/debian/changelog 2006-10-09 12:12:49.000000000 +0200 @@ -1,3 +1,10 @@ +quinn-diff (0.65.1) UNRELEASED; urgency=medium + + * Non-maintainer upload. + * Update version compare code from dpkg. (closes: #387220) + + -- Bastian Blank <[EMAIL PROTECTED]> Mon, 9 Oct 2006 12:08:04 +0200 + quinn-diff (0.65) unstable; urgency=low * src/init.c (usage): don't use multi-line string literals as they're diff -urN quinn-diff-0.65/src/vercmp.c quinn-diff-0.65.1/src/vercmp.c --- quinn-diff-0.65/src/vercmp.c 2003-01-30 18:59:50.000000000 +0100 +++ quinn-diff-0.65.1/src/vercmp.c 2006-10-09 12:15:00.000000000 +0200 @@ -44,34 +44,45 @@ const char *parseversion(struct versionrevision *rversion, const char *string); -static int verrevcmp(const char *val, const char *ref) -{ - int vc, rc; - long vl, rl; - const char *vp, *rp; +/* assume ascii; warning: evaluates x multiple times! */ +#define order(x) ((x) == '~' ? -1 \ + : cisdigit((x)) ? 0 \ + : !(x) ? 0 \ + : cisalpha((x)) ? (x) \ + : (x) + 256) + +int cisdigit(int c) { + return (c>='0') && (c<='9'); +} + +int cisalpha(int c) { + return ((c>='a') && (c<='z')) || ((c>='A') && (c<='Z')); +} +static int verrevcmp(const char *val, const char *ref) { if (!val) val= ""; if (!ref) ref= ""; - for (;;) { - vp= val; while (*vp && !isdigit(*vp)) vp++; - rp= ref; while (*rp && !isdigit(*rp)) rp++; - for (;;) { - vc= val == vp ? 0 : *val++; - rc= ref == rp ? 0 : *ref++; - if (!rc && !vc) break; - if (vc && !isalpha(vc)) vc += 256; /* assumes ASCII character set */ - if (rc && !isalpha(rc)) rc += 256; + + while (*val || *ref) { + int first_diff= 0; + + while ( (*val && !cisdigit(*val)) || (*ref && !cisdigit(*ref)) ) { + int vc= order(*val), rc= order(*ref); if (vc != rc) return vc - rc; + val++; ref++; } - val= vp; - ref= rp; - vl=0; if (isdigit(*vp)) vl= strtol(val,(char**)&val,10); - rl=0; if (isdigit(*rp)) rl= strtol(ref,(char**)&ref,10); - if (vl != rl) return vl - rl; - if (!*val && !*ref) return 0; - if (!*val) return -1; - if (!*ref) return +1; + + while ( *val == '0' ) val++; + while ( *ref == '0' ) ref++; + while (cisdigit(*val) && cisdigit(*ref)) { + if (!first_diff) first_diff= *val - *ref; + val++; ref++; + } + if (cisdigit(*val)) return 1; + if (cisdigit(*ref)) return -1; + if (first_diff) return first_diff; } + return 0; } int versioncompare(const struct versionrevision *version,