chiark / gitweb /
Apply https://sourceware.org/git/?p=glibc.git;a=commit;h=d5dd6189d506068ed11c8bfa1e1e...
[eglibc.git] / scripts / firstversions.awk
1 # Script to preprocess Versions.all lists based on "earliest version"
2 # specifications in the shlib-versions file.
3
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
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 }
35
36 NF == 2 && $2 == "{" { thislib = $1; print; next }
37
38 $1 == "}" {
39   if ((thislib, idx[thislib]) in firstversion) {
40     # We haven't seen the stated version, but have produced
41     # others pointing to it, so we synthesize it now.
42     printf "  %s\n", firstversion[thislib, idx[thislib]];
43     idx[thislib]++;
44   }
45   print;
46   next;
47 }
48
49 /GLIBC_PRIVATE/ { print; next }
50
51 {
52   if ((thislib, idx[thislib]) in firstversion) {
53     f = v = firstversion[thislib, idx[thislib]];
54     while (vers_compare($1, v) >= 0) {
55       delete firstversion[thislib, idx[thislib]];
56       idx[thislib]++;
57       if ((thislib, idx[thislib]) in firstversion)
58         v = firstversion[thislib, idx[thislib]];
59       else
60         break;
61     }
62     if ($1 == v || $1 == f)
63       # This version was the specified earliest version itself.
64       print;
65     else if (vers_compare($1, v) < 0) {
66       # This version is older than the specified earliest version.
67       print "  " $1, "=", v;
68       # Record that V has been referred to, so we will be sure to emit it
69       # if we hit a later one without hitting V itself.
70       usedversion[thislib, v] = 1;
71     }
72     else {
73       # This version is newer than the specified earliest version.
74       # We haven't seen that version itself or else we wouldn't be here
75       # because we would have removed it from the firstversion array.
76       # If there were any earlier versions that used that one, emit it now.
77       if ((thislib, v) in usedversion) {
78         print "  " v;
79       }
80       print "  " $1;
81     }
82   }
83   else
84     print;
85 }