2 # Copyright (C) 2006 Daniel M. Eischen. All rights reserved.
4 # Redistribution and use in source and binary forms, with or without
5 # modification, are permitted provided that the following conditions
7 # 1. Redistributions of source code must retain the above copyright
8 # notice, this list of conditions and the following disclaimer.
9 # 2. Redistributions in binary form must reproduce the above copyright
10 # notice, this list of conditions and the following disclaimer in the
11 # documentation and/or other materials provided with the distribution.
13 # THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 # ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
17 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 # Make a list of all the library versions listed in the master file.
31 # versions[] - array indexed by version name, contains number
32 # of symbols (+ 1) found for each version.
33 # successors[] - array index by version name, contains successor
35 # symbols[][] - array index by [version name, symbol index], contains
36 # names of symbols defined for each version.
43 stderr = "/dev/stderr";
44 while (getline < vfile) {
48 # Strip trailing spaces.
51 if (/^[ \t]*[a-zA-Z0-9._]+ *{/) {
55 successors[symver] = "";
56 generated[symver] = 0;
59 else if (/^[ \t]*} *[a-zA-Z0-9._]+ *;/) {
63 printf("Unmatched bracket.\n");
64 else if (versions[$2] != 1)
65 printf("File %s: %s has unknown " \
66 "successor %s\n", vfile, symver, $2);
68 successors[symver] = $2;
71 else if (/^[ \t]*};/) {
73 printf("File %s: Unmatched bracket.\n",
78 else if (/^[ \t]*}/) {
79 printf("File %s: Missing ending semi-colon.\n",
83 ; # Ignore blank lines.
85 printf("File %s: Unknown directive: %s\n",
92 # Delete comments, preceding and trailing whitespace, then
93 # consume blank lines.
95 sub("^[ \t]+", "", $0);
96 sub("[ \t]+$", "", $0);
101 /^[a-zA-Z0-9._]+ +{$/ {
102 # Strip bracket from version name.
104 if (current_version != "")
105 printf("File %s, line %d: Illegal nesting detected.\n",
106 FILENAME, FNR) > stderr;
107 else if (versions[$1] == 0) {
108 printf("File %s, line %d: Undefined " \
109 "library version %s\n", FILENAME, FNR, $1) > stderr;
110 # Remove this entry from the versions.
114 current_version = $1;
119 /^[a-zA-Z0-9._]+ *;$/ {
120 if (current_version != "") {
121 count = versions[current_version];
122 versions[current_version]++;
123 symbols[current_version, count] = $1;
131 printf("File %s, line %d: Unmatched bracket.\n",
132 FILENAME, FNR, $1) > stderr;
133 brackets = 0; # Reset
135 current_version = "";
141 printf("File %s, line %d: Unknown directive: '%s'\n",
142 FILENAME, FNR, $0) > stderr;
145 function print_version(v)
147 # This function is recursive, so return if this version
148 # has already been printed. Otherwise, if there is an
149 # ancestral version, recursively print its symbols before
150 # printing the symbols for this version.
152 if (generated[v] == 1)
154 if (successors[v] != "")
155 print_version(successors[v]);
159 # The version count is always one more that actual,
160 # so the loop ranges from 1 to n-1.
162 for (i = 1; i < versions[v]; i++) {
165 printf("\t%s\n", symbols[v, i]);
169 if (version_count == 0) {
173 if (successors[v] == "")
176 printf("} %s;\n", successors[v]);
182 for (v in versions) {