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