summaryrefslogtreecommitdiff
path: root/scripts/extract-abilist.awk
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/extract-abilist.awk')
-rw-r--r--scripts/extract-abilist.awk87
1 files changed, 69 insertions, 18 deletions
diff --git a/scripts/extract-abilist.awk b/scripts/extract-abilist.awk
index c5b76e1309..e4f466e6a9 100644
--- a/scripts/extract-abilist.awk
+++ b/scripts/extract-abilist.awk
@@ -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);
+ }
}