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