diff options
Diffstat (limited to 'REORG.TODO/scripts/firstversions.awk')
-rw-r--r-- | REORG.TODO/scripts/firstversions.awk | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/REORG.TODO/scripts/firstversions.awk b/REORG.TODO/scripts/firstversions.awk new file mode 100644 index 0000000000..ccde4b59b4 --- /dev/null +++ b/REORG.TODO/scripts/firstversions.awk @@ -0,0 +1,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; +} |