2003-03-02 Roland McGrath <roland@redhat.com>
[kopensolaris-gnu/glibc.git] / scripts / extract-abilist.awk
index c5b76e1..e4f466e 100644 (file)
@@ -2,43 +2,94 @@
 # This must be passed run with awk -v config=TUPLE to specify the configuration
 # tuple we will match.  The merged file contains stanzas in the form:
 #      GLIBC_x.y regexp...
+#      | GLIBC_x.y.z regexp...
+#      | GLIBC_m.n regexp...
 #       function F
 #       variable D 0x4
 # Each regexp is matched against TUPLE, and only matching stanzas go
-# into the output, with the regexp list removed.  The result matches the
-# original .symlist file from abilist.awk that was fed into merge-abilist.awk.
+# into the output, with the regexp list removed.  Multiple version lines
+# can match with the same regexp, meaning the stanza is duplicated in
+# multiple version sets.  The result matches the original .symlist file
+# from abilist.awk that was fed into merge-abilist.awk.
 
 BEGIN {
-  outpipe = "";
+  inside = 0;
 }
 
-/^ / { if (!ignore) print | outpipe; next; }
+/^ / {
+  inside = 1;
+  if (!ignore) {
+    for (version in current) {
+      if (version in versions)
+       versions[version] = versions[version] "\n" $0;
+      else
+       versions[version] = $0;
+    }
+  }
+  next;
+}
 
 {
-  for (i = 2; i <= NF; ++i) {
+  second = ($1 == "|");
+  if (second && inside) {
+    printf "%s:%d: bad input line inside stanza: %s\n", FILENAME, FNR, $0;
+    exit 1;
+  }
+  inside = 0;
+
+  for (i = second ? 3 : 2; i <= NF; ++i) {
     regex = "^" $i "$";
     if (match(config, regex) != 0) {
-      if ($1 != version) {
-       if (outpipe != "") {
-         close(outpipe);
-       }
-       version = $1;
-       print version;
-       outpipe = "sort";
-      }
+      if (!second || ignore)
+        # Clear old array.
+        split("", current);
+      current[second ? $2 : $1] = 1;
       ignore = 0;
       next;
     }
   }
-  ignore = 1;
+
+  if (!second)
+    ignore = 1;
   next;
 }
 
 END {
-  if (outpipe == "") {
-    print "No stanza matched", config > "/dev/stderr";
-    exit 2;
+  nverlist = 0;
+  for (version in versions) {
+    if (nverslist == 0) {
+      verslist = version;
+      nverslist = 1;
+      continue;
+    }
+    split(verslist, s, "\n");
+    if (version < s[1]) {
+      verslist = version;
+      for (i = 1; i <= nverslist; ++i) {
+       verslist = verslist "\n" s[i];
+      }
+    }
+    else {
+      verslist = s[1];
+      for (i = 2; i <= nverslist; ++i) {
+       if (version < s[i]) break;
+       verslist = verslist "\n" s[i];
+      }
+      verslist = verslist "\n" version;
+      for (; i <= nverslist; ++i) {
+       verslist = verslist "\n" s[i];
+      }
+    }
+    ++nverslist;
   }
-  else
+
+  split(verslist, order, "\n");
+  for (i = 1; i <= nverslist; ++i) {
+    version = order[i];
+
+    print version;
+    outpipe = "sort";
+    print versions[version] | outpipe;
     close(outpipe);
+  }
 }