mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-28 00:21:52 +03:00
2008-12-05 Joseph Myers <joseph@codesourcery.com>
Ulrich Drepper <drepper@redhat.com> * scripts/firstversion.awk: Use custom comparison function to compare version numbers. * scripts/versions.awk: Use sort invocation which can handle multi-digit sub-version numbers.
This commit is contained in:
@ -1,6 +1,31 @@
|
||||
# Script to preprocess Versions.all lists based on "earliest version"
|
||||
# specifications in the shlib-versions file.
|
||||
|
||||
# Return -1, 0 or 1 according to whether v1 is less than, equal to or
|
||||
# greater than v2 as a version string. Simplified from GNU Autoconf
|
||||
# version; this one does not need to handle .0x fraction-style versions.
|
||||
function vers_compare (v1, v2)
|
||||
{
|
||||
while (length(v1) && length(v2)) {
|
||||
if (v1 ~ /^[0-9]/ && v2 ~ /^[0-9]/) {
|
||||
for (len1 = 1; substr(v1, len1 + 1) ~ /^[0-9]/; len1++) continue;
|
||||
for (len2 = 1; substr(v2, len2 + 1) ~ /^[0-9]/; len2++) continue;
|
||||
d1 = substr(v1, 1, len1); v1 = substr(v1, len1 + 1);
|
||||
d2 = substr(v2, 1, len2); v2 = substr(v2, len2 + 1);
|
||||
d1 += 0;
|
||||
d2 += 0;
|
||||
} else {
|
||||
d1 = substr(v1, 1, 1); v1 = substr(v1, 2);
|
||||
d2 = substr(v2, 1, 1); v2 = substr(v2, 2);
|
||||
}
|
||||
if (d1 < d2) return -1;
|
||||
if (d1 > d2) return 1;
|
||||
}
|
||||
if (length(v2)) return -1;
|
||||
if (length(v1)) return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
NF > 2 && $2 == ":" {
|
||||
for (i = 0; i <= NF - 3; ++i)
|
||||
firstversion[$1, i] = $(3 + i);
|
||||
@ -25,10 +50,8 @@ $1 == "}" {
|
||||
|
||||
{
|
||||
if ((thislib, idx[thislib]) in firstversion) {
|
||||
# XXX relative string comparison loses if we ever have multiple digits
|
||||
# between dots in GLIBC_x.y[.z] names.
|
||||
f = v = firstversion[thislib, idx[thislib]];
|
||||
while ($1 >= v) {
|
||||
while (vers_compare($1, v) >= 0) {
|
||||
delete firstversion[thislib, idx[thislib]];
|
||||
idx[thislib]++;
|
||||
if ((thislib, idx[thislib]) in firstversion)
|
||||
@ -39,7 +62,7 @@ $1 == "}" {
|
||||
if ($1 == v || $1 == f)
|
||||
# This version was the specified earliest version itself.
|
||||
print;
|
||||
else if ($1 < v) {
|
||||
else if (vers_compare($1, v) < 0) {
|
||||
# This version is older than the specified earliest version.
|
||||
print " " $1, "=", v;
|
||||
# Record that V has been referred to, so we will be sure to emit it
|
||||
|
@ -28,10 +28,8 @@ BEGIN {
|
||||
close(defsfile);
|
||||
|
||||
tmpfile = buildroot "Versions.tmp";
|
||||
# Note this sorting presumes only single digits between dots for proper
|
||||
# numeric ordering. sort -n doesn't do quite the right thing either,
|
||||
# and in some non-GNU sort implementations does not sort at all.
|
||||
sort = "sort > " tmpfile;
|
||||
# POSIX sort needed.
|
||||
sort = "sort -t. -k 1,1 -k 2n,2n -k 3 > " tmpfile;
|
||||
}
|
||||
|
||||
# Remove comment lines.
|
||||
@ -135,5 +133,5 @@ END {
|
||||
printf("\n");
|
||||
closeversion(oldver, veryoldver);
|
||||
close_and_move(outfile, real_outfile);
|
||||
system("rm -f " tmpfile);
|
||||
#system("rm -f " tmpfile);
|
||||
}
|
||||
|
Reference in New Issue
Block a user