diff options
Diffstat (limited to 'libc/scripts/firstversions.awk')
-rw-r--r-- | libc/scripts/firstversions.awk | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/libc/scripts/firstversions.awk b/libc/scripts/firstversions.awk new file mode 100644 index 000000000..8da92ae48 --- /dev/null +++ b/libc/scripts/firstversions.awk @@ -0,0 +1,62 @@ +# Script to preprocess Versions.all lists based on "earliest version" +# specifications in the shlib-versions file. + +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) { + # 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) { + delete firstversion[thislib, idx[thislib]]; + idx[thislib]++; + if ((thislib, idx[thislib]) in firstversion) + v = firstversion[thislib, idx[thislib]]; + else + break; + } + if ($1 == v || $1 == f) + # This version was the specified earliest version itself. + print; + else if ($1 < v) { + # 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; +} |