123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- #!/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
- }
- }
|