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. 7function 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 29NF > 2 && $2 == ":" { 30 for (i = 0; i <= NF - 3; ++i) 31 firstversion[$1, i] = $(3 + i); 32 idx[$1] = 0; 33 next; 34} 35 36NF == 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 # If we're skipping a referenced version to jump ahead to a 59 # later version, synthesize the earlier referenced version now. 60 if (v != $1 && (thislib, v) in usedversion) 61 print " " v; 62 v = firstversion[thislib, idx[thislib]]; 63 } else 64 break; 65 } 66 if ($1 == v || $1 == f) 67 # This version was the specified earliest version itself. 68 print; 69 else if (vers_compare($1, v) < 0) { 70 # This version is older than the specified earliest version. 71 print " " $1, "=", v; 72 # Record that V has been referred to, so we will be sure to emit it 73 # if we hit a later one without hitting V itself. 74 usedversion[thislib, v] = 1; 75 } 76 else { 77 # This version is newer than the specified earliest version. 78 # We haven't seen that version itself or else we wouldn't be here 79 # because we would have removed it from the firstversion array. 80 # If there were any earlier versions that used that one, emit it now. 81 if ((thislib, v) in usedversion) { 82 print " " v; 83 } 84 print " " $1; 85 } 86 } 87 else 88 print; 89} 90