diff options
Diffstat (limited to 'scripts/merge-abilist.awk')
-rw-r--r-- | scripts/merge-abilist.awk | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/scripts/merge-abilist.awk b/scripts/merge-abilist.awk new file mode 100644 index 0000000000..016debc628 --- /dev/null +++ b/scripts/merge-abilist.awk @@ -0,0 +1,129 @@ +# awk script to merge a config-specific .symlist file with others. +# The input files should be an existing .abilist file, and a .symlist file. +# This must be passed run with awk -v config=REGEXP to specify a regexp +# matching configuration tuples for which the .symlist input defines an ABI. +# The result merges all duplicate occurrences of any symbol in a version set +# into a stanza listing the regexps matching configurations that contain it. + +/^[^ ]/ { + if (NF < 2 && config == "") { + print "BAD LINE:", $0 > "/dev/stderr"; + exit 2; + } + + if (NF < 2) { + current = $1 ":" config; + } + else { + current = $1 ":" $2; + for (i = 3; i <= NF; ++i) { + current = current "," $1 ":" $i; + } + } + + next; +} + +{ + if ($0 in seen) { + seen[$0] = seen[$0] "\n" current; + } + else { + seen[$0] = current; + } + + next; +} + +END { + for (line in seen) { + split(seen[line], setlist, "\n"); + for (i in setlist) { + split(setlist[i], configs, ","); + for (j in configs) { + split(configs[j], temp, ":"); + version = temp[1]; + conf = temp[2]; + + if ((version,conf) in have) continue; + have[version,conf] = 1; + + if (version in confs) { + split(confs[version], c, " "); + if (conf < c[1]) { + confs[version] = conf; + for (k = 1; k <= nconfs[version]; ++k) { + confs[version] = confs[version] " " c[k]; + } + } + else { + confs[version] = c[1]; + for (k = 2; k <= nconfs[version]; ++k) { + if (conf < c[k]) break; + confs[version] = confs[version] " " c[k]; + } + confs[version] = confs[version] " " conf; + for (; k <= nconfs[version]; ++k) { + confs[version] = confs[version] " " c[k]; + } + } + ++nconfs[version]; + } + else { + confs[version] = conf; + nconfs[version] = 1; + } + } + } + for (idx in have) delete have[idx]; + + for (version in confs) { + idx = version " " confs[version]; + if (idx in final) { + final[idx] = final[idx] "\n" line; + } + else { + final[idx] = line; + } + delete confs[version]; + delete nconfs[version]; + } + } + + nstanzas = 0; + for (stanza in final) { + if (nstanzas == 0) { + stanzas = stanza; + nstanzas = 1; + continue; + } + split(stanzas, s, "\n"); + if (stanza < s[1]) { + stanzas = stanza; + for (i = 1; i <= nstanzas; ++i) { + stanzas = stanzas "\n" s[i]; + } + } + else { + stanzas = s[1]; + for (i = 2; i <= nstanzas; ++i) { + if (stanza < s[i]) break; + stanzas = stanzas "\n" s[i]; + } + stanzas = stanzas "\n" stanza; + for (; i <= nstanzas; ++i) { + stanzas = stanzas "\n" s[i]; + } + } + ++nstanzas; + } + + split(stanzas, order, "\n"); + for (i = 1; i <= nstanzas; ++i) { + stanza = order[i]; + print stanza; + outpipe = "sort"; + print final[stanza] | outpipe; + close(outpipe); + } +} |