mirror of
https://github.com/glennrp/libpng.git
synced 2026-10-24 08:39:18 +03:00
126 lines
3.5 KiB
Awk
Executable File
126 lines
3.5 KiB
Awk
Executable File
#!/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
|
|
}
|