#!/bin/awk -f# 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',# the value of the awk variable "of" (which can be changed on the# command line if required.) 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 missing = "error"# log an error on missing symbols of="symbols.new" # default to a fixed name} # 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 && $1==";missing" && NF==2{ # This allows the master file to control how missing symbols # are handled; symbols that aren't in either the master or # the new file. Valid values are 'ignore', 'warning' and # 'error' missing = $2}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 symbols.dfn or pngwin.dfn to generate the# input file.## symbol @ordinal # two fields, exported symbol# ; symbol @ordinal # three fields, removed symbol# ; @ordinal # two fields, the last ordinalNF==2 && $1 == ";" && $2 ~ /^@[1-9][0-9]*$/ { # last ordinal o=0+substr($2,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+substr($3,2) 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+substr($2,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 removedEND{ 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 } unexported=0 # Add a standard header to symbols.new: print ";Version INSERT-VERSION-HERE" >of print ";--------------------------------------------------------------" >of print "; LIBPNG symbol list as a Win32 DEF file" >of print "; Contains all the symbols that can be exported from libpng" >of print ";--------------------------------------------------------------" >of print "LIBRARY" >of print "" >of print "EXPORTS" >of for (o=1; o<=lasto; ++o) { if (symbol[o] == "" && removed[o] == "") { if (unexported == 0) unexported = o if (official[o] == "") { # missing in export list too, so ok if (o < lasto) continue } } if (unexported != 0) { # Symbols in the .def but not in the new file are errors, but # the 'unexported' symbols aren't in either. By default this # is an error too (see the setting of 'missing' at the start), # but this can be reset on the command line or by stuff in the # file - see the comments above. if (missing != "ignore") { if (o-1 > unexported) print "png.h:", missing ": missing symbols:", unexported "-" o-1 else print "png.h:", missing ": missing symbol:", unexported if (missing != "warning") err = 1 } unexported = 0 } 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 the symbol is missing somewhere or it changed err = 1 if (symbol[o] == "") print "png.h: symbol", o, "is 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 > of } if (err != 0) { print "*** A new list is in", of, "***" exit 1 }}
#!/bin/awk -f
# 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',
# the value of the awk variable "of" (which can be changed on the
# command line if required.) 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
missing = "error"# log an error on missing symbols
of="symbols.new" # default to a fixed name
}
# 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 && $1==";missing" && NF==2{
# This allows the master file to control how missing symbols
# are handled; symbols that aren't in either the master or
# the new file. Valid values are 'ignore', 'warning' and
# 'error'
missing = $2
}
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 symbols.dfn or pngwin.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+substr($2,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+substr($3,2)
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+substr($2,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
}
unexported=0
# Add a standard header to symbols.new:
print ";Version INSERT-VERSION-HERE" >of
print ";--------------------------------------------------------------" >of
print "; LIBPNG symbol list as a Win32 DEF file" >of
print "; Contains all the symbols that can be exported from libpng" >of
print ";--------------------------------------------------------------" >of
print "LIBRARY" >of
print "" >of
print "EXPORTS" >of
for (o=1; o<=lasto; ++o) {
if (symbol[o] == "" && removed[o] == "") {
if (unexported == 0) unexported = o
if (official[o] == "") {
# missing in export list too, so ok
if (o < lasto) continue
}
}
if (unexported != 0) {
# Symbols in the .def but not in the new file are errors, but
# the 'unexported' symbols aren't in either. By default this
# is an error too (see the setting of 'missing' at the start),
# but this can be reset on the command line or by stuff in the
# file - see the comments above.
if (missing != "ignore") {
if (o-1 > unexported)
print "png.h:", missing ": missing symbols:", unexported "-" o-1
else
print "png.h:", missing ": missing symbol:", unexported
if (missing != "warning")
err = 1
}
unexported = 0
}
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 the symbol is missing somewhere or it changed
err = 1
if (symbol[o] == "")
print "png.h: symbol", o, "is 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 > of
}
if (err != 0) {
print "*** A new list is in", of, "***"
exit 1
}
}