mirror of
https://git.yoctoproject.org/poky
synced 2026-06-11 04:19:50 +00:00
4de220459c
git-svn-id: https://svn.o-hand.com/repos/poky/trunk@3827 311d38ba-8fff-0310-9ca6-ca027cbcb966
85 lines
2.3 KiB
Diff
85 lines
2.3 KiB
Diff
Update the version comparision to a more recent one from dpkg. This
|
|
means it now recognises 0.0-foo > 0.0+foo as it should.
|
|
|
|
RP - 19/02/2008
|
|
|
|
Index: ipkg-0.99.163/pkg.c
|
|
===================================================================
|
|
--- ipkg-0.99.163.orig/pkg.c 2008-02-18 11:24:45.000000000 +0000
|
|
+++ ipkg-0.99.163/pkg.c 2008-02-19 00:24:50.000000000 +0000
|
|
@@ -1128,43 +1130,37 @@
|
|
return r;
|
|
}
|
|
|
|
-int verrevcmp(const char *val, const char *ref)
|
|
-{
|
|
- int vc, rc;
|
|
- long vl, rl;
|
|
- const char *vp, *rp;
|
|
- const char *vsep, *rsep;
|
|
-
|
|
- 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;
|
|
- if (vc != rc) return vc - rc;
|
|
- }
|
|
- 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;
|
|
-
|
|
- vc = *val;
|
|
- rc = *ref;
|
|
- vsep = strchr(".-", vc);
|
|
- rsep = strchr(".-", rc);
|
|
- if (vsep && !rsep) return -1;
|
|
- if (!vsep && rsep) return +1;
|
|
-
|
|
- if (!*val && !*ref) return 0;
|
|
- if (!*val) return -1;
|
|
- if (!*ref) return +1;
|
|
- }
|
|
+/* assume ascii; warning: evaluates x multiple times! */
|
|
+#define order(x) ((x) == '~' ? -1 \
|
|
+ : isdigit((x)) ? 0 \
|
|
+ : !(x) ? 0 \
|
|
+ : isalpha((x)) ? (x) \
|
|
+ : (x) + 256)
|
|
+
|
|
+static int verrevcmp(const char *val, const char *ref) {
|
|
+ if (!val) val= "";
|
|
+ if (!ref) ref= "";
|
|
+
|
|
+ while (*val || *ref) {
|
|
+ int first_diff= 0;
|
|
+
|
|
+ while ( (*val && !isdigit(*val)) || (*ref && !isdigit(*ref)) ) {
|
|
+ int vc= order(*val), rc= order(*ref);
|
|
+ if (vc != rc) return vc - rc;
|
|
+ val++; ref++;
|
|
+ }
|
|
+
|
|
+ while ( *val == '0' ) val++;
|
|
+ while ( *ref == '0' ) ref++;
|
|
+ while (isdigit(*val) && isdigit(*ref)) {
|
|
+ if (!first_diff) first_diff= *val - *ref;
|
|
+ val++; ref++;
|
|
+ }
|
|
+ if (isdigit(*val)) return 1;
|
|
+ if (isdigit(*ref)) return -1;
|
|
+ if (first_diff) return first_diff;
|
|
+ }
|
|
+ return 0;
|
|
}
|
|
|
|
int pkg_version_satisfied(pkg_t *it, pkg_t *ref, const char *op)
|