2002-12-23 Roland McGrath <roland@redhat.com>
[kopensolaris-gnu/glibc.git] / scripts / merge-abilist.awk
1 # awk script to merge a config-specific .symlist file with others.
2 # The input files should be an existing .abilist file, and a .symlist file.
3 # This must be passed run with awk -v config=REGEXP to specify a regexp
4 # matching configuration tuples for which the .symlist input defines an ABI.
5 # The result merges all duplicate occurrences of any symbol in a version set
6 # into a stanza listing the regexps matching configurations that contain it.
7
8 /^[^ ]/ {
9   if (NF < 2 && config == "") {
10     print "BAD LINE:", $0 > "/dev/stderr";
11     exit 2;
12   }
13
14   if (NF < 2) {
15     current = $1 ":" config;
16   }
17   else {
18     current = $1 ":" $2;
19     for (i = 3; i <= NF; ++i) {
20       current = current "," $1 ":" $i;
21     }
22   }
23
24   next;
25 }
26
27 {
28   if ($0 in seen) {
29     seen[$0] = seen[$0] "\n" current;
30   }
31   else {
32     seen[$0] = current;
33   }
34
35   next;
36 }
37
38 END {
39   for (line in seen) {
40     split(seen[line], setlist, "\n");
41     for (i in setlist) {
42       split(setlist[i], configs, ",");
43       for (j in configs) {
44         split(configs[j], temp, ":");
45         version = temp[1];
46         conf = temp[2];
47
48         if ((version,conf) in have) continue;
49         have[version,conf] = 1;
50
51         if (version in confs) {
52           split(confs[version], c, " ");
53           if (conf < c[1]) {
54             confs[version] = conf;
55             for (k = 1; k <= nconfs[version]; ++k) {
56               confs[version] = confs[version] " " c[k];
57             }
58           }
59           else {
60             confs[version] = c[1];
61             for (k = 2; k <= nconfs[version]; ++k) {
62               if (conf < c[k]) break;
63               confs[version] = confs[version] " " c[k];
64             }
65             confs[version] = confs[version] " " conf;
66             for (; k <= nconfs[version]; ++k) {
67               confs[version] = confs[version] " " c[k];
68             }
69           }
70           ++nconfs[version];
71         }
72         else {
73           confs[version] = conf;
74           nconfs[version] = 1;
75         }
76       }
77     }
78     for (idx in have) delete have[idx];
79
80     for (version in confs) {
81       idx = version " " confs[version];
82       if (idx in final) {
83         final[idx] = final[idx] "\n" line;
84       }
85       else {
86         final[idx] = line;
87       }
88       delete confs[version];
89       delete nconfs[version];
90     }
91   }
92
93   nstanzas = 0;
94   for (stanza in final) {
95     if (nstanzas == 0) {
96       stanzas = stanza;
97       nstanzas = 1;
98       continue;
99     }
100     split(stanzas, s, "\n");
101     if (stanza < s[1]) {
102       stanzas = stanza;
103       for (i = 1; i <= nstanzas; ++i) {
104         stanzas = stanzas "\n" s[i];
105       }
106     }
107     else {
108       stanzas = s[1];
109       for (i = 2; i <= nstanzas; ++i) {
110         if (stanza < s[i]) break;
111         stanzas = stanzas "\n" s[i];
112       }
113       stanzas = stanzas "\n" stanza;
114       for (; i <= nstanzas; ++i) {
115         stanzas = stanzas "\n" s[i];
116       }
117     }
118     ++nstanzas;
119   }
120
121   split(stanzas, order, "\n");
122   for (i = 1; i <= nstanzas; ++i) {
123     stanza = order[i];
124     print stanza;
125     outpipe = "sort";
126     print final[stanza] | outpipe;
127     close(outpipe);
128   }
129 }