diff options
Diffstat (limited to 'scripts/extract-abilist.awk')
-rw-r--r-- | scripts/extract-abilist.awk | 87 |
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); + } } |