| # 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; |
| } |
| } |