99 lines
2.2 KiB
Awk
99 lines
2.2 KiB
Awk
# awk script to extract a config-specific .symlist file from a merged file.
|
|
# 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. 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 {
|
|
inside = 0;
|
|
}
|
|
|
|
/^ / {
|
|
inside = 1;
|
|
if (!ignore) {
|
|
for (version in current) {
|
|
if (version in versions)
|
|
versions[version] = versions[version] "\n" $0;
|
|
else
|
|
versions[version] = $0;
|
|
}
|
|
}
|
|
next;
|
|
}
|
|
|
|
{
|
|
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 (!second || ignore)
|
|
# Clear old array.
|
|
split("", current);
|
|
current[second ? $2 : $1] = 1;
|
|
ignore = 0;
|
|
next;
|
|
}
|
|
}
|
|
|
|
if (!second)
|
|
ignore = 1;
|
|
next;
|
|
}
|
|
|
|
END {
|
|
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;
|
|
}
|
|
|
|
split(verslist, order, "\n");
|
|
for (i = 1; i <= nverslist; ++i) {
|
|
version = order[i];
|
|
|
|
print version;
|
|
outpipe = "sort";
|
|
print versions[version] | outpipe;
|
|
close(outpipe);
|
|
|
|
if (version == lastversion)
|
|
break;
|
|
}
|
|
}
|