]>
Commit | Line | Data |
---|---|---|
361742ed RM |
1 | # Script to preprocess Versions.all lists based on "earliest version" |
2 | # specifications in the shlib-versions file. | |
3 | ||
8680179f UD |
4 | # Return -1, 0 or 1 according to whether v1 is less than, equal to or |
5 | # greater than v2 as a version string. Simplified from GNU Autoconf | |
6 | # version; this one does not need to handle .0x fraction-style versions. | |
7 | function vers_compare (v1, v2) | |
8 | { | |
9 | while (length(v1) && length(v2)) { | |
10 | if (v1 ~ /^[0-9]/ && v2 ~ /^[0-9]/) { | |
11 | for (len1 = 1; substr(v1, len1 + 1) ~ /^[0-9]/; len1++) continue; | |
12 | for (len2 = 1; substr(v2, len2 + 1) ~ /^[0-9]/; len2++) continue; | |
13 | d1 = substr(v1, 1, len1); v1 = substr(v1, len1 + 1); | |
14 | d2 = substr(v2, 1, len2); v2 = substr(v2, len2 + 1); | |
15 | d1 += 0; | |
16 | d2 += 0; | |
17 | } else { | |
18 | d1 = substr(v1, 1, 1); v1 = substr(v1, 2); | |
19 | d2 = substr(v2, 1, 1); v2 = substr(v2, 2); | |
20 | } | |
21 | if (d1 < d2) return -1; | |
22 | if (d1 > d2) return 1; | |
23 | } | |
24 | if (length(v2)) return -1; | |
25 | if (length(v1)) return 1; | |
26 | return 0; | |
27 | } | |
28 | ||
733af7d6 RM |
29 | NF > 2 && $2 == ":" { |
30 | for (i = 0; i <= NF - 3; ++i) | |
31 | firstversion[$1, i] = $(3 + i); | |
32 | idx[$1] = 0; | |
33 | next; | |
34 | } | |
361742ed RM |
35 | |
36 | NF == 2 && $2 == "{" { thislib = $1; print; next } | |
37 | ||
38 | $1 == "}" { | |
48a5e010 | 39 | if ((thislib, idx[thislib]) in firstversion) { |
361742ed RM |
40 | # We haven't seen the stated version, but have produced |
41 | # others pointing to it, so we synthesize it now. | |
733af7d6 RM |
42 | printf " %s\n", firstversion[thislib, idx[thislib]]; |
43 | idx[thislib]++; | |
361742ed RM |
44 | } |
45 | print; | |
46 | next; | |
47 | } | |
48 | ||
e7a2d9c0 | 49 | /GLIBC_PRIVATE/ { print; next } |
733af7d6 | 50 | |
e7a2d9c0 RM |
51 | { |
52 | if ((thislib, idx[thislib]) in firstversion) { | |
5015cde4 | 53 | f = v = firstversion[thislib, idx[thislib]]; |
8680179f | 54 | while (vers_compare($1, v) >= 0) { |
5015cde4 | 55 | delete firstversion[thislib, idx[thislib]]; |
e7a2d9c0 | 56 | idx[thislib]++; |
e034841e CM |
57 | if ((thislib, idx[thislib]) in firstversion) { |
58 | # If we're skipping a referenced version to jump ahead to a | |
59 | # later version, synthesize the earlier referenced version now. | |
60 | if (v != $1 && (thislib, v) in usedversion) | |
61 | print " " v; | |
48a5e010 | 62 | v = firstversion[thislib, idx[thislib]]; |
e034841e | 63 | } else |
48a5e010 | 64 | break; |
e7a2d9c0 | 65 | } |
5015cde4 RM |
66 | if ($1 == v || $1 == f) |
67 | # This version was the specified earliest version itself. | |
48a5e010 | 68 | print; |
8680179f | 69 | else if (vers_compare($1, v) < 0) { |
5015cde4 RM |
70 | # This version is older than the specified earliest version. |
71 | print " " $1, "=", v; | |
72 | # Record that V has been referred to, so we will be sure to emit it | |
73 | # if we hit a later one without hitting V itself. | |
74 | usedversion[thislib, v] = 1; | |
75 | } | |
76 | else { | |
77 | # This version is newer than the specified earliest version. | |
78 | # We haven't seen that version itself or else we wouldn't be here | |
79 | # because we would have removed it from the firstversion array. | |
80 | # If there were any earlier versions that used that one, emit it now. | |
81 | if ((thislib, v) in usedversion) { | |
82 | print " " v; | |
83 | } | |
84 | print " " $1; | |
85 | } | |
361742ed RM |
86 | } |
87 | else | |
e7a2d9c0 | 88 | print; |
361742ed | 89 | } |