/* Jitter: header supplying functions and macros which some systems lack.
Copyright (C) 2017, 2019, 2020 Luca Saiu
Updated in 2021 by Luca Saiu
Written by Luca Saiu
This file is part of Jitter.
Jitter is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Jitter 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with Jitter. If not, see . */
#ifndef JITTER_MISSING_H_
#define JITTER_MISSING_H_
#include
#include
#include /* for offsetof, in case it is supported. */
/* Struct offset computation.
* ************************************************************************** */
/* If offsetof is missign I can emulate with a macro which should be portable
in practice even if not according to the letter of the Standard. */
#if ! defined (JITTER_HAVE_OFFSETOF)
# define offsetof(type_name, field_name) \
((size_t) \
((char *) & (((type_name *) NULL)->field_name) \
- (char *) NULL))
#endif // ! defined (JITTER_HAVE_OFFSETOF)
/* Alignment qualifiers.
* ************************************************************************** */
/* If alignas is missing I can emulate it with a GNU C attribute. In practice
alignas is only used (in jitter-heap.h and friends) with GCC, so the issue is
just supporting old versions. */
#if ! defined (JITTER_HAVE_ALIGNAS)
# define alignas(thing) __attribute__((aligned (thing)))
# define alignof __alignof__
#endif // ! defined (JITTER_HAVE_ALIGNAS)
/* GNU C attributes.
* ************************************************************************** */
/* C compilers not supporting the GNU exensions will not recognize attributes.
A simple fix is redefining the attribute keyword as a macro. */
#if ! defined (JITTER_HAVE_GNU_C_ATTRIBUTE)
# define attribute(ignored_attributes) /* Nothing. */
# define __attribute__(ignored_attributes) /* Nothing. */
#endif /* ! defined (JITTER_HAVE_GNU_C_ATTRIBUTE) */
/* After the previous definition, non-GNU C compilers will not have any problem,
since every attribute use will be macroexpanded away; therefore it would be
useless, in the following, to conditionalize over the attribute syntax
availability. What remains to be solved is older GNU C compilers not knowing
about more recently introduced attributes. */
#if ! defined (JITTER_HAVE_ATTRIBUTE_NO_REORDER)
# define no_reorder /* Nothing. */
# define __no_reorder__ /* Nothing. */
/* On configurations where no_reorder is not defined, which will be the case
for very old GCCs, configure tries to add -fno-toplevel-reorder to CFLAGS .
That is a more brutal, global way of enforcing ordering. */
#endif /* #if ! defined (JITTER_HAVE_ATTRIBUTE_NO_REORDER) */
#if ! defined (JITTER_HAVE_ATTRIBUTE_RETURNS_NONNULL)
# define returns_nonnull /* Nothing. */
# define __returns_nonnull__ /* Nothing. */
#endif /* #if ! defined (JITTER_HAVE_ATTRIBUTE_RETURNS_NONNULL) */
/* GCC builtins.
* ************************************************************************** */
/* The logic relying on __builtin_constant_p is probably all conditionalised on
GCC, but it is also easy to simulate it where missing with a dummy
compatibility macro which treats every expression as non-constant. */
#if ! defined (JITTER_HAVE_GCC_BUILTIN_CONSTANT_P)
# define __builtin_constant_p(expression) \
0
#endif /* # if ! defined (JITTER_HAVE_GCC_BUILTIN_CONSTANT_P) */
/* We can work with any compiler missing __builtin_expect by defining it as a
macro. */
#if ! defined (JITTER_HAVE_GCC_BUILTIN_EXPECT)
# define __builtin_expect(expression, expected_value) \
(expression)
#endif /* # if ! defined (JITTER_HAVE_GCC_BUILTIN_EXPECT) */
/* Non-GCC compilers or very old GCCs miss the __bultin_unreachable builtin. */
#if ! defined (JITTER_HAVE_GCC_BUILTIN_UNREACHABLE)
# define __builtin_unreachable() \
/* It is acceptable to compile this into nothing. */ \
do { /* Nothing*/ } while (false)
#endif /* # if ! defined (JITTER_HAVE_GCC_BUILTIN_UNREACHABLE) */
/* I/O functions.
* ************************************************************************** */
/* The functions declared here are no-ops if we can live with them doing
nothing; otherwise they fail fatally when called. Each function
implementation in jitter-missing.c is disabled by a CPP conditional if
the system is found to have a real implementation at configure time. */
/* Do nothing. */
void
flockfile ()
__attribute__ ((nonnull (1)));
/* Do nothing. */
void
funlockfile ()
__attribute__ ((nonnull (1)));
#endif // #ifndef JITTER_MISSING_H_