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