xref: /aosp_15_r20/external/libpng/scripts/checksym.awk (revision a67afe4df73cf47866eedc69947994b8ff839aba)
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