1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
# 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);
idx[$1] = 0;
next;
}
NF == 2 && $2 == "{" { thislib = $1; print; next }
$1 == "}" {
if ((thislib, idx[thislib]) in firstversion) {
# We haven't seen the stated version, but have produced
# others pointing to it, so we synthesize it now.
printf " %s\n", firstversion[thislib, idx[thislib]];
idx[thislib]++;
}
print;
next;
}
/GLIBC_PRIVATE/ { print; next }
{
if ((thislib, idx[thislib]) in firstversion) {
f = v = firstversion[thislib, idx[thislib]];
while (vers_compare($1, v) >= 0) {
delete firstversion[thislib, idx[thislib]];
idx[thislib]++;
if ((thislib, idx[thislib]) in firstversion) {
# If we're skipping a referenced version to jump ahead to a
# later version, synthesize the earlier referenced version now.
if (v != $1 && (thislib, v) in usedversion)
print " " v;
v = firstversion[thislib, idx[thislib]];
} else
break;
}
if ($1 == v || $1 == f)
# This version was the specified earliest version itself.
print;
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
# if we hit a later one without hitting V itself.
usedversion[thislib, v] = 1;
}
else {
# This version is newer than the specified earliest version.
# We haven't seen that version itself or else we wouldn't be here
# because we would have removed it from the firstversion array.
# If there were any earlier versions that used that one, emit it now.
if ((thislib, v) in usedversion) {
print " " v;
}
print " " $1;
}
}
else
print;
}
|