blob: 1d2755a12b27852e56ecb42416d43cb40150ad15 [file] [log] [blame]
#!/bin/awk
# Check a list of symbols against the master definition
# (official) list. Arguments:
#
# awk -f checksym.awk official-def list-to-check
#
# Output is a file in the current directory called 'symbols.new',
# stdout holds error messages. Error code indicates success or
# failure.
#
# NOTE: this is a pure, old fashioned, awk script. It will
# work with any awk
BEGIN{
err=0
master="" # master file
official[1] = "" # defined symbols from master file
symbol[1] = "" # defined symbols from png.h
removed[1] = "" # removed symbols from png.h
lasto = 0 # last ordinal value from png.h
mastero = 0 # highest ordinal in master file
symbolo = 0 # highest ordinal in png.h
}
# Read existing definitions from the master file (the first
# file on the command line.) This must be a def file and it
# has definition lines (others are ignored) of the form:
#
# symbol @ordinal
#
master == "" {
master = FILENAME;
}
FILENAME==master && NF==2 && $2~/^@/ && $1!~/^;/ {
o=0+substr($2,2)
if (o >0) {
if (official[o] == "") {
official[o] = $1
if (o > mastero) mastero = o
next
} else
print master ": duplicated symbol:", official[o] ":", $0
} else
print master ": bad export line format:", $0
err = 1
}
FILENAME==master {
next
}
# Read new definitions, these are free form but the lines must
# just be symbol definitions. Lines will be commented out for
# 'removed' symbols, introduced in png.h using PNG_REMOVED rather
# than PNG_EXPORT. Use checksym.dfn to generate the input file.
#
# symbol ordinal # two fields, exported symbol
# ; symbol ordinal # three fields, removed symbol
# ; ordinal # two fields, the last ordinal
NF==2 && $1 == ";" && $2 ~ /^[1-9][0-9]*$/ { # last ordinal
o = 0+$2
if (lasto == 0 || lasto == o)
lasto=o
else {
print "png.h: duplicated last ordinal:", lasto, o
err = 1
}
next
}
NF==3 && $1 == ";" && $3 ~ /^[1-9][0-9]*$/ { # removed symbol
o = 0+$3
if (removed[o] == "" || removed[o] == $2) {
removed[o] = $2
if (o > symbolo) symbolo = o
} else {
print "png.h: duplicated removed symbol",
o ": '" removed[o] "' != '" $2 "'"
err = 1
}
next
}
NF==2 && $2 ~ /^[1-9][0-9]*$/ { # exported symbol
o = 0+$2
if (symbol[o] == "" || symbol[o] == $1) {
symbol[o] = $1
if (o > symbolo) symbolo = o
} else {
print "png.h: duplicated symbol",
o ": '" symbol[o] "' != '" $1 "'"
err = 1
}
}
{
next # skip all other lines
}
# At the end check for symbols marked as both duplicated and removed
END{
if (symbolo > lasto) {
print "highest symbol ordinal in png.h,",
symbolo ", exceeds last ordinal from png.h", lasto
err = 1
}
if (mastero > lasto) {
print "highest symbol ordinal in", master ",",
mastero ", exceeds last ordinal from png.h", lasto
err = 1
}
missing = 0
for (o=1; o<=lasto; ++o) {
stop=0
if (symbol[o] == "" && removed[o] == "") {
if (missing == 0) missing = o
if (o < lasto) continue
stop=1
}
if (missing != 0) {
if (o-1 > missing)
print "png.h: missing symbol definitions:", missing "-" o-1
else
print "png.h: missing symbol definition:", missing
missing = 0
err = 1
}
if (stop == 1) break; # lasto is missing
if (symbol[o] != "" && removed[o] != "") {
print "png.h: symbol", o,
"both exported as '" symbol[o] "' and removed as '" removed[o] "'"
err = 1
} else if (symbol[o] != official[o]) {
# either master symbol not there or it changed
err = 1
if (symbol[o] == "")
print "png.h: removed symbol", o,
"'" symbol[o] "' exported as '" official[o] "' in", master
else if (official[o] == "")
print "png.h: exported symbol", o, "'" symbol[o] "' not present in",
master
else
print "png.h: exported symbol", o,
"'" symbol[o] "' exists as '" official[o] "' in", master
}
# Finally generate symbols.new
if (symbol[o] != "")
print " " symbol[o], "@" o > "symbols.new"
}
if (err != 0) {
print "*** A new list is in symbols.new ***"
exit 1
}
}