| # 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; |
| } |