diff options
Diffstat (limited to 'packages/ipkg/files/update_version_comparision.patch')
-rw-r--r-- | packages/ipkg/files/update_version_comparision.patch | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/packages/ipkg/files/update_version_comparision.patch b/packages/ipkg/files/update_version_comparision.patch new file mode 100644 index 0000000000..9f617ef9f0 --- /dev/null +++ b/packages/ipkg/files/update_version_comparision.patch @@ -0,0 +1,82 @@ +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. + +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) |