#!/usr/bin/python3
# Check header contents against the given standard.
# Copyright (C) 2018 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
#
# The GNU C Library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# The GNU C Library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with the GNU C Library; if not, see
# <http://www.gnu.org/licenses/>.
import argparse
import fnmatch
import os.path
import re
import subprocess
import sys
import tempfile
import glibcconform
class ElementTest(object):
"""Test for an element of a structure or union type."""
def __init__(self, dummy, type_name, member_type, member_name, *rest):
"""Initialize an ElementTest object."""
self.type_name = type_name
self.member_type = member_type
self.member_name = member_name
self.rest = ' '.join(rest)
self.allow_name = self.member_name
def run(self, header_tests):
"""Run an ElementTest."""
text = ('%s a;\n'
'%s b;\n'
'extern void xyzzy (__typeof__ (&b.%s), __typeof__ (&a.%s), '
'unsigned);\n'
'void foobarbaz (void) {\n'
'xyzzy (&a.%s, &b.%s, sizeof (a.%s));\n'
'}\n'
% (self.type_name, self.type_name,
self.member_name, self.member_name,
self.member_name, self.member_name, self.member_name))
header_tests.compile_test('Availability of member %s'
% self.member_name,
text)
text = ('%s a;\n'
'extern %s b%s;\n'
'extern __typeof__ (a.%s) b;\n'
% (self.type_name, self.member_type, self.rest,
self.member_name))
header_tests.compile_test('Type of member %s' % self.member_name,
text)
class ConstantTest(object):
"""Test for a macro or constant."""
def __init__(self, symbol_type, symbol, extra1=None, extra2=None,
extra3=None):
"""Initialize a ConstantTest object."""
self.symbol_type = symbol_type
self.symbol = symbol
# A comparison operation may be specified without a type.
if extra2 is not None and extra3 is None:
self.c_type = None
self.op = extra1
self.value = extra2
else:
self.c_type = extra1
self.op = extra2
self.value = extra3
self.allow_name = self.symbol
def run(self, header_tests):
"""Run a ConstantTest."""
if 'macro' in self.symbol_type:
text = ('#ifndef %s\n'
'# error "Macro %s not defined"\n'
'#endif\n'
% (self.symbol, self.symbol))
header_tests.compile_test('Availability of macro %s'
% self.symbol,
text)
if 'constant' in self.symbol_type:
text = ('__typeof__ (%s) a = %s;\n'
% (self.symbol, self.symbol))
header_tests.compile_test('Availability of constant %s'
% self.symbol,
text)
if self.symbol_type == 'macro-int-constant':
sym_bits_def_neg = ''.join(
'# if %s & (1LL << %d)\n'
'# define conformtest_bit_%d 0LL\n'