about summary refs log tree commit diff
path: root/REORG.TODO/scripts/firstversions.awk
diff options
context:
space:
mode:
Diffstat (limited to 'REORG.TODO/scripts/firstversions.awk')
-rw-r--r--REORG.TODO/scripts/firstversions.awk89
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;
+}