blob: ba8728b51d17b849f31d11d0410fc6574ab11cbf [file] [log] [blame] [edit]
#!/bin/awk -f
# checksym.awk - check a list of symbols against the master definition list
#
# Copyright (c) 2025 Cosmin Truta
# Copyright (c) 2010 Glenn Randers-Pehrson
# Originally written by John Bowler, 2010
#
# Use, modification and distribution are subject to
# the same licensing terms and conditions as libpng.
# Please see the copyright notice in png.h or visit
# http://libpng.org/pub/png/src/libpng-LICENSE.txt
#
# SPDX-License-Identifier: libpng-2.0
# Usage:
# 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. Exit
# code indicates success or failure.
BEGIN {
err = 0
master = "" # master file
official[""] = "" # defined symbols from master file
symbol[""] = "" # defined symbols from png.h
removed[""] = "" # removed symbols from 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 is a Windows .def file
# which must NOT have definitions of the form "symbol @ordinal".
master == "" {
master = FILENAME
}
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 to generate the input file.
#
# symbol # one field, exported symbol
# ; symbol # two fields, removed symbol
#
NF == 0 {
# empty line
next
}
NF == 1 && $1 ~ /^[A-Za-z_][A-Za-z_0-9]*$/ {
# exported symbol (one field)
symbol[$1] = $1
next
}
NF == 2 && $1 == ";" && $2 ~ /^[A-Za-z_][A-Za-z_0-9]*$/ {
# removed symbol (two fields)
removed[$1] = $1
next
}
{
print "error: invalid line:", $0
err = 1
next
}
END {
# Write the 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
# Collect all unique symbols into a plain array for sorting.
i = 1
for (sym in symbol) {
if (sym != "") sorted_symbols[i++] = sym
}
# Sort and print the symbols.
num = do_sort(sorted_symbols)
for (i = 1; i <= num; i++) {
print " " sorted_symbols[i] >of
}
if (err != 0) {
print "*** A new list is in", of, "***"
exit 1
}
# TODO: Check for symbols that are both defined and removed.
}
# Portable replacement for the gawk-specific asort function.
function do_sort(arr) {
# Perform insertion sort, which should be fast enough for our use case.
num = length(arr)
for (i = 2; i <= num; i++) {
key = arr[i]
j = i - 1
while (j > 0 && arr[j] > key) {
arr[j + 1] = arr[j]
j = j - 1
}
arr[j + 1] = key
}
# Return the array size, as in the asort function.
return num
}