1 | #!/bin/awk -f
|
---|
2 |
|
---|
3 | # Check a list of symbols against the master definition
|
---|
4 | # (official) list. Arguments:
|
---|
5 | #
|
---|
6 | # awk -f checksym.awk official-def list-to-check
|
---|
7 | #
|
---|
8 | # Output is a file in the current directory called 'symbols.new',
|
---|
9 | # the value of the awk variable "of" (which can be changed on the
|
---|
10 | # command line if required.) stdout holds error messages. Error
|
---|
11 | # code indicates success or failure.
|
---|
12 | #
|
---|
13 | # NOTE: this is a pure, old fashioned, awk script. It will
|
---|
14 | # work with any awk
|
---|
15 |
|
---|
16 | BEGIN{
|
---|
17 | err=0
|
---|
18 | master="" # master file
|
---|
19 | official[1] = "" # defined symbols from master file
|
---|
20 | symbol[1] = "" # defined symbols from png.h
|
---|
21 | removed[1] = "" # removed symbols from png.h
|
---|
22 | lasto = 0 # last ordinal value from png.h
|
---|
23 | mastero = 0 # highest ordinal in master file
|
---|
24 | symbolo = 0 # highest ordinal in png.h
|
---|
25 | missing = "error"# log an error on missing symbols
|
---|
26 | of="symbols.new" # default to a fixed name
|
---|
27 | }
|
---|
28 |
|
---|
29 | # Read existing definitions from the master file (the first
|
---|
30 | # file on the command line.) This must be a def file and it
|
---|
31 | # has definition lines (others are ignored) of the form:
|
---|
32 | #
|
---|
33 | # symbol @ordinal
|
---|
34 | #
|
---|
35 | master == "" {
|
---|
36 | master = FILENAME
|
---|
37 | }
|
---|
38 | FILENAME==master && NF==2 && $2~/^@/ && $1!~/^;/ {
|
---|
39 | o=0+substr($2,2)
|
---|
40 | if (o > 0) {
|
---|
41 | if (official[o] == "") {
|
---|
42 | official[o] = $1
|
---|
43 | if (o > mastero) mastero = o
|
---|
44 | next
|
---|
45 | } else
|
---|
46 | print master ": duplicated symbol:", official[o] ":", $0
|
---|
47 | } else
|
---|
48 | print master ": bad export line format:", $0
|
---|
49 | err = 1
|
---|
50 | }
|
---|
51 | FILENAME==master && $1==";missing" && NF==2{
|
---|
52 | # This allows the master file to control how missing symbols
|
---|
53 | # are handled; symbols that aren't in either the master or
|
---|
54 | # the new file. Valid values are 'ignore', 'warning' and
|
---|
55 | # 'error'
|
---|
56 | missing = $2
|
---|
57 | }
|
---|
58 | FILENAME==master {
|
---|
59 | next
|
---|
60 | }
|
---|
61 |
|
---|
62 | # Read new definitions, these are free form but the lines must
|
---|
63 | # just be symbol definitions. Lines will be commented out for
|
---|
64 | # 'removed' symbols, introduced in png.h using PNG_REMOVED rather
|
---|
65 | # than PNG_EXPORT. Use symbols.dfn or pngwin.dfn to generate the
|
---|
66 | # input file.
|
---|
67 | #
|
---|
68 | # symbol @ordinal # two fields, exported symbol
|
---|
69 | # ; symbol @ordinal # three fields, removed symbol
|
---|
70 | # ; @ordinal # two fields, the last ordinal
|
---|
71 | NF==2 && $1 == ";" && $2 ~ /^@[1-9][0-9]*$/ { # last ordinal
|
---|
72 | o=0+substr($2,2)
|
---|
73 | if (lasto == 0 || lasto == o)
|
---|
74 | lasto=o
|
---|
75 | else {
|
---|
76 | print "png.h: duplicated last ordinal:", lasto, o
|
---|
77 | err = 1
|
---|
78 | }
|
---|
79 | next
|
---|
80 | }
|
---|
81 | NF==3 && $1 == ";" && $3 ~ /^@[1-9][0-9]*$/ { # removed symbol
|
---|
82 | o=0+substr($3,2)
|
---|
83 | if (removed[o] == "" || removed[o] == $2) {
|
---|
84 | removed[o] = $2
|
---|
85 | if (o > symbolo) symbolo = o
|
---|
86 | } else {
|
---|
87 | print "png.h: duplicated removed symbol", o ": '" removed[o] "' != '" $2 "'"
|
---|
88 | err = 1
|
---|
89 | }
|
---|
90 | next
|
---|
91 | }
|
---|
92 | NF==2 && $2 ~ /^@[1-9][0-9]*$/ { # exported symbol
|
---|
93 | o=0+substr($2,2)
|
---|
94 | if (symbol[o] == "" || symbol[o] == $1) {
|
---|
95 | symbol[o] = $1
|
---|
96 | if (o > symbolo) symbolo = o
|
---|
97 | } else {
|
---|
98 | print "png.h: duplicated symbol", o ": '" symbol[o] "' != '" $1 "'"
|
---|
99 | err = 1
|
---|
100 | }
|
---|
101 | }
|
---|
102 | {
|
---|
103 | next # skip all other lines
|
---|
104 | }
|
---|
105 |
|
---|
106 | # At the end check for symbols marked as both duplicated and removed
|
---|
107 | END{
|
---|
108 | if (symbolo > lasto) {
|
---|
109 | print "highest symbol ordinal in png.h,", symbolo ", exceeds last ordinal from png.h", lasto
|
---|
110 | err = 1
|
---|
111 | }
|
---|
112 | if (mastero > lasto) {
|
---|
113 | print "highest symbol ordinal in", master ",", mastero ", exceeds last ordinal from png.h", lasto
|
---|
114 | err = 1
|
---|
115 | }
|
---|
116 | unexported=0
|
---|
117 | # Add a standard header to symbols.new:
|
---|
118 | print ";Version INSERT-VERSION-HERE" >of
|
---|
119 | print ";--------------------------------------------------------------" >of
|
---|
120 | print "; LIBPNG symbol list as a Win32 DEF file" >of
|
---|
121 | print "; Contains all the symbols that can be exported from libpng" >of
|
---|
122 | print ";--------------------------------------------------------------" >of
|
---|
123 | print "LIBRARY" >of
|
---|
124 | print "" >of
|
---|
125 | print "EXPORTS" >of
|
---|
126 |
|
---|
127 | for (o=1; o<=lasto; ++o) {
|
---|
128 | if (symbol[o] == "" && removed[o] == "") {
|
---|
129 | if (unexported == 0) unexported = o
|
---|
130 | if (official[o] == "") {
|
---|
131 | # missing in export list too, so ok
|
---|
132 | if (o < lasto) continue
|
---|
133 | }
|
---|
134 | }
|
---|
135 | if (unexported != 0) {
|
---|
136 | # Symbols in the .def but not in the new file are errors, but
|
---|
137 | # the 'unexported' symbols aren't in either. By default this
|
---|
138 | # is an error too (see the setting of 'missing' at the start),
|
---|
139 | # but this can be reset on the command line or by stuff in the
|
---|
140 | # file - see the comments above.
|
---|
141 | if (missing != "ignore") {
|
---|
142 | if (o-1 > unexported)
|
---|
143 | print "png.h:", missing ": missing symbols:", unexported "-" o-1
|
---|
144 | else
|
---|
145 | print "png.h:", missing ": missing symbol:", unexported
|
---|
146 | if (missing != "warning")
|
---|
147 | err = 1
|
---|
148 | }
|
---|
149 | unexported = 0
|
---|
150 | }
|
---|
151 | if (symbol[o] != "" && removed[o] != "") {
|
---|
152 | print "png.h: symbol", o, "both exported as '" symbol[o] "' and removed as '" removed[o] "'"
|
---|
153 | err = 1
|
---|
154 | } else if (symbol[o] != official[o]) {
|
---|
155 | # either the symbol is missing somewhere or it changed
|
---|
156 | err = 1
|
---|
157 | if (symbol[o] == "")
|
---|
158 | print "png.h: symbol", o, "is exported as '" official[o] "' in", master
|
---|
159 | else if (official[o] == "")
|
---|
160 | print "png.h: exported symbol", o, "'" symbol[o] "' not present in", master
|
---|
161 | else
|
---|
162 | print "png.h: exported symbol", o, "'" symbol[o] "' exists as '" official[o] "' in", master
|
---|
163 | }
|
---|
164 |
|
---|
165 | # Finally generate symbols.new
|
---|
166 | if (symbol[o] != "")
|
---|
167 | print " " symbol[o], "@" o > of
|
---|
168 | }
|
---|
169 |
|
---|
170 | if (err != 0) {
|
---|
171 | print "*** A new list is in", of, "***"
|
---|
172 | exit 1
|
---|
173 | }
|
---|
174 | }
|
---|