mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 03:40:34 +02:00
Remove more Gnulib generated files.
This commit is contained in:
parent
aeb22f4861
commit
d98888290b
6 changed files with 0 additions and 4329 deletions
1509
lib/inttypes.h
1509
lib/inttypes.h
File diff suppressed because it is too large
Load diff
|
@ -1,529 +0,0 @@
|
||||||
/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
|
|
||||||
/* Type-safe arrays which grow dynamically.
|
|
||||||
Copyright (C) 2017-2021 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
|
|
||||||
<https://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
/* Pre-processor macros which act as parameters:
|
|
||||||
|
|
||||||
DYNARRAY_STRUCT
|
|
||||||
The struct tag of dynamic array to be defined.
|
|
||||||
DYNARRAY_ELEMENT
|
|
||||||
The type name of the element type. Elements are copied
|
|
||||||
as if by memcpy, and can change address as the dynamic
|
|
||||||
array grows.
|
|
||||||
DYNARRAY_PREFIX
|
|
||||||
The prefix of the functions which are defined.
|
|
||||||
|
|
||||||
The following parameters are optional:
|
|
||||||
|
|
||||||
DYNARRAY_ELEMENT_FREE
|
|
||||||
DYNARRAY_ELEMENT_FREE (E) is evaluated to deallocate the
|
|
||||||
contents of elements. E is of type DYNARRAY_ELEMENT *.
|
|
||||||
DYNARRAY_ELEMENT_INIT
|
|
||||||
DYNARRAY_ELEMENT_INIT (E) is evaluated to initialize a new
|
|
||||||
element. E is of type DYNARRAY_ELEMENT *.
|
|
||||||
If DYNARRAY_ELEMENT_FREE but not DYNARRAY_ELEMENT_INIT is
|
|
||||||
defined, new elements are automatically zero-initialized.
|
|
||||||
Otherwise, new elements have undefined contents.
|
|
||||||
DYNARRAY_INITIAL_SIZE
|
|
||||||
The size of the statically allocated array (default:
|
|
||||||
at least 2, more elements if they fit into 128 bytes).
|
|
||||||
Must be a preprocessor constant. If DYNARRAY_INITIAL_SIZE is 0,
|
|
||||||
there is no statically allocated array at, and all non-empty
|
|
||||||
arrays are heap-allocated.
|
|
||||||
DYNARRAY_FINAL_TYPE
|
|
||||||
The name of the type which holds the final array. If not
|
|
||||||
defined, is PREFIX##finalize not provided. DYNARRAY_FINAL_TYPE
|
|
||||||
must be a struct type, with members of type DYNARRAY_ELEMENT and
|
|
||||||
size_t at the start (in this order).
|
|
||||||
|
|
||||||
These macros are undefined after this header file has been
|
|
||||||
included.
|
|
||||||
|
|
||||||
The following types are provided (their members are private to the
|
|
||||||
dynarray implementation):
|
|
||||||
|
|
||||||
struct DYNARRAY_STRUCT
|
|
||||||
|
|
||||||
The following functions are provided:
|
|
||||||
|
|
||||||
void DYNARRAY_PREFIX##init (struct DYNARRAY_STRUCT *);
|
|
||||||
void DYNARRAY_PREFIX##free (struct DYNARRAY_STRUCT *);
|
|
||||||
bool DYNARRAY_PREFIX##has_failed (const struct DYNARRAY_STRUCT *);
|
|
||||||
void DYNARRAY_PREFIX##mark_failed (struct DYNARRAY_STRUCT *);
|
|
||||||
size_t DYNARRAY_PREFIX##size (const struct DYNARRAY_STRUCT *);
|
|
||||||
DYNARRAY_ELEMENT *DYNARRAY_PREFIX##begin (const struct DYNARRAY_STRUCT *);
|
|
||||||
DYNARRAY_ELEMENT *DYNARRAY_PREFIX##end (const struct DYNARRAY_STRUCT *);
|
|
||||||
DYNARRAY_ELEMENT *DYNARRAY_PREFIX##at (struct DYNARRAY_STRUCT *, size_t);
|
|
||||||
void DYNARRAY_PREFIX##add (struct DYNARRAY_STRUCT *, DYNARRAY_ELEMENT);
|
|
||||||
DYNARRAY_ELEMENT *DYNARRAY_PREFIX##emplace (struct DYNARRAY_STRUCT *);
|
|
||||||
bool DYNARRAY_PREFIX##resize (struct DYNARRAY_STRUCT *, size_t);
|
|
||||||
void DYNARRAY_PREFIX##remove_last (struct DYNARRAY_STRUCT *);
|
|
||||||
void DYNARRAY_PREFIX##clear (struct DYNARRAY_STRUCT *);
|
|
||||||
|
|
||||||
The following functions are provided are provided if the
|
|
||||||
prerequisites are met:
|
|
||||||
|
|
||||||
bool DYNARRAY_PREFIX##finalize (struct DYNARRAY_STRUCT *,
|
|
||||||
DYNARRAY_FINAL_TYPE *);
|
|
||||||
(if DYNARRAY_FINAL_TYPE is defined)
|
|
||||||
DYNARRAY_ELEMENT *DYNARRAY_PREFIX##finalize (struct DYNARRAY_STRUCT *,
|
|
||||||
size_t *);
|
|
||||||
(if DYNARRAY_FINAL_TYPE is not defined)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <malloc/dynarray.gl.h>
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#ifndef DYNARRAY_STRUCT
|
|
||||||
# error "DYNARRAY_STRUCT must be defined"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef DYNARRAY_ELEMENT
|
|
||||||
# error "DYNARRAY_ELEMENT must be defined"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef DYNARRAY_PREFIX
|
|
||||||
# error "DYNARRAY_PREFIX must be defined"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef DYNARRAY_INITIAL_SIZE
|
|
||||||
# if DYNARRAY_INITIAL_SIZE < 0
|
|
||||||
# error "DYNARRAY_INITIAL_SIZE must be non-negative"
|
|
||||||
# endif
|
|
||||||
# if DYNARRAY_INITIAL_SIZE > 0
|
|
||||||
# define DYNARRAY_HAVE_SCRATCH 1
|
|
||||||
# else
|
|
||||||
# define DYNARRAY_HAVE_SCRATCH 0
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
/* Provide a reasonable default which limits the size of
|
|
||||||
DYNARRAY_STRUCT. */
|
|
||||||
# define DYNARRAY_INITIAL_SIZE \
|
|
||||||
(sizeof (DYNARRAY_ELEMENT) > 64 ? 2 : 128 / sizeof (DYNARRAY_ELEMENT))
|
|
||||||
# define DYNARRAY_HAVE_SCRATCH 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Public type definitions. */
|
|
||||||
|
|
||||||
/* All fields of this struct are private to the implementation. */
|
|
||||||
struct DYNARRAY_STRUCT
|
|
||||||
{
|
|
||||||
union
|
|
||||||
{
|
|
||||||
struct dynarray_header dynarray_abstract;
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
/* These fields must match struct dynarray_header. */
|
|
||||||
size_t used;
|
|
||||||
size_t allocated;
|
|
||||||
DYNARRAY_ELEMENT *array;
|
|
||||||
} dynarray_header;
|
|
||||||
} u;
|
|
||||||
|
|
||||||
#if DYNARRAY_HAVE_SCRATCH
|
|
||||||
/* Initial inline allocation. */
|
|
||||||
DYNARRAY_ELEMENT scratch[DYNARRAY_INITIAL_SIZE];
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Internal use only: Helper macros. */
|
|
||||||
|
|
||||||
/* Ensure macro-expansion of DYNARRAY_PREFIX. */
|
|
||||||
#define DYNARRAY_CONCAT0(prefix, name) prefix##name
|
|
||||||
#define DYNARRAY_CONCAT1(prefix, name) DYNARRAY_CONCAT0(prefix, name)
|
|
||||||
#define DYNARRAY_NAME(name) DYNARRAY_CONCAT1(DYNARRAY_PREFIX, name)
|
|
||||||
|
|
||||||
/* Use DYNARRAY_FREE instead of DYNARRAY_NAME (free),
|
|
||||||
so that Gnulib does not change 'free' to 'rpl_free'. */
|
|
||||||
#define DYNARRAY_FREE DYNARRAY_CONCAT1 (DYNARRAY_NAME (f), ree)
|
|
||||||
|
|
||||||
/* Address of the scratch buffer if any. */
|
|
||||||
#if DYNARRAY_HAVE_SCRATCH
|
|
||||||
# define DYNARRAY_SCRATCH(list) (list)->scratch
|
|
||||||
#else
|
|
||||||
# define DYNARRAY_SCRATCH(list) NULL
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Internal use only: Helper functions. */
|
|
||||||
|
|
||||||
/* Internal function. Call DYNARRAY_ELEMENT_FREE with the array
|
|
||||||
elements. Name mangling needed due to the DYNARRAY_ELEMENT_FREE
|
|
||||||
macro expansion. */
|
|
||||||
static inline void
|
|
||||||
DYNARRAY_NAME (free__elements__) (DYNARRAY_ELEMENT *__dynarray_array,
|
|
||||||
size_t __dynarray_used)
|
|
||||||
{
|
|
||||||
#ifdef DYNARRAY_ELEMENT_FREE
|
|
||||||
for (size_t __dynarray_i = 0; __dynarray_i < __dynarray_used; ++__dynarray_i)
|
|
||||||
DYNARRAY_ELEMENT_FREE (&__dynarray_array[__dynarray_i]);
|
|
||||||
#endif /* DYNARRAY_ELEMENT_FREE */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Internal function. Free the non-scratch array allocation. */
|
|
||||||
static inline void
|
|
||||||
DYNARRAY_NAME (free__array__) (struct DYNARRAY_STRUCT *list)
|
|
||||||
{
|
|
||||||
#if DYNARRAY_HAVE_SCRATCH
|
|
||||||
if (list->u.dynarray_header.array != list->scratch)
|
|
||||||
free (list->u.dynarray_header.array);
|
|
||||||
#else
|
|
||||||
free (list->u.dynarray_header.array);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Public functions. */
|
|
||||||
|
|
||||||
/* Initialize a dynamic array object. This must be called before any
|
|
||||||
use of the object. */
|
|
||||||
_GL_ATTRIBUTE_NONNULL ((1))
|
|
||||||
static void
|
|
||||||
DYNARRAY_NAME (init) (struct DYNARRAY_STRUCT *list)
|
|
||||||
{
|
|
||||||
list->u.dynarray_header.used = 0;
|
|
||||||
list->u.dynarray_header.allocated = DYNARRAY_INITIAL_SIZE;
|
|
||||||
list->u.dynarray_header.array = DYNARRAY_SCRATCH (list);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Deallocate the dynamic array and its elements. */
|
|
||||||
_GL_ATTRIBUTE_MAYBE_UNUSED _GL_ATTRIBUTE_NONNULL ((1))
|
|
||||||
static void
|
|
||||||
DYNARRAY_FREE (struct DYNARRAY_STRUCT *list)
|
|
||||||
{
|
|
||||||
DYNARRAY_NAME (free__elements__)
|
|
||||||
(list->u.dynarray_header.array, list->u.dynarray_header.used);
|
|
||||||
DYNARRAY_NAME (free__array__) (list);
|
|
||||||
DYNARRAY_NAME (init) (list);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return true if the dynamic array is in an error state. */
|
|
||||||
_GL_ATTRIBUTE_NONNULL ((1))
|
|
||||||
static inline bool
|
|
||||||
DYNARRAY_NAME (has_failed) (const struct DYNARRAY_STRUCT *list)
|
|
||||||
{
|
|
||||||
return list->u.dynarray_header.allocated == __dynarray_error_marker ();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Mark the dynamic array as failed. All elements are deallocated as
|
|
||||||
a side effect. */
|
|
||||||
_GL_ATTRIBUTE_NONNULL ((1))
|
|
||||||
static void
|
|
||||||
DYNARRAY_NAME (mark_failed) (struct DYNARRAY_STRUCT *list)
|
|
||||||
{
|
|
||||||
DYNARRAY_NAME (free__elements__)
|
|
||||||
(list->u.dynarray_header.array, list->u.dynarray_header.used);
|
|
||||||
DYNARRAY_NAME (free__array__) (list);
|
|
||||||
list->u.dynarray_header.array = DYNARRAY_SCRATCH (list);
|
|
||||||
list->u.dynarray_header.used = 0;
|
|
||||||
list->u.dynarray_header.allocated = __dynarray_error_marker ();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return the number of elements which have been added to the dynamic
|
|
||||||
array. */
|
|
||||||
_GL_ATTRIBUTE_NONNULL ((1))
|
|
||||||
static inline size_t
|
|
||||||
DYNARRAY_NAME (size) (const struct DYNARRAY_STRUCT *list)
|
|
||||||
{
|
|
||||||
return list->u.dynarray_header.used;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return a pointer to the array element at INDEX. Terminate the
|
|
||||||
process if INDEX is out of bounds. */
|
|
||||||
_GL_ATTRIBUTE_NONNULL ((1))
|
|
||||||
static inline DYNARRAY_ELEMENT *
|
|
||||||
DYNARRAY_NAME (at) (struct DYNARRAY_STRUCT *list, size_t index)
|
|
||||||
{
|
|
||||||
if (_GL_UNLIKELY (index >= DYNARRAY_NAME (size) (list)))
|
|
||||||
__libc_dynarray_at_failure (DYNARRAY_NAME (size) (list), index);
|
|
||||||
return list->u.dynarray_header.array + index;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return a pointer to the first array element, if any. For a
|
|
||||||
zero-length array, the pointer can be NULL even though the dynamic
|
|
||||||
array has not entered the failure state. */
|
|
||||||
_GL_ATTRIBUTE_NONNULL ((1))
|
|
||||||
static inline DYNARRAY_ELEMENT *
|
|
||||||
DYNARRAY_NAME (begin) (struct DYNARRAY_STRUCT *list)
|
|
||||||
{
|
|
||||||
return list->u.dynarray_header.array;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return a pointer one element past the last array element. For a
|
|
||||||
zero-length array, the pointer can be NULL even though the dynamic
|
|
||||||
array has not entered the failure state. */
|
|
||||||
_GL_ATTRIBUTE_NONNULL ((1))
|
|
||||||
static inline DYNARRAY_ELEMENT *
|
|
||||||
DYNARRAY_NAME (end) (struct DYNARRAY_STRUCT *list)
|
|
||||||
{
|
|
||||||
return list->u.dynarray_header.array + list->u.dynarray_header.used;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Internal function. Slow path for the add function below. */
|
|
||||||
static void
|
|
||||||
DYNARRAY_NAME (add__) (struct DYNARRAY_STRUCT *list, DYNARRAY_ELEMENT item)
|
|
||||||
{
|
|
||||||
if (_GL_UNLIKELY
|
|
||||||
(!__libc_dynarray_emplace_enlarge (&list->u.dynarray_abstract,
|
|
||||||
DYNARRAY_SCRATCH (list),
|
|
||||||
sizeof (DYNARRAY_ELEMENT))))
|
|
||||||
{
|
|
||||||
DYNARRAY_NAME (mark_failed) (list);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Copy the new element and increase the array length. */
|
|
||||||
list->u.dynarray_header.array[list->u.dynarray_header.used++] = item;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Add ITEM at the end of the array, enlarging it by one element.
|
|
||||||
Mark *LIST as failed if the dynamic array allocation size cannot be
|
|
||||||
increased. */
|
|
||||||
_GL_ATTRIBUTE_NONNULL ((1))
|
|
||||||
static inline void
|
|
||||||
DYNARRAY_NAME (add) (struct DYNARRAY_STRUCT *list, DYNARRAY_ELEMENT item)
|
|
||||||
{
|
|
||||||
/* Do nothing in case of previous error. */
|
|
||||||
if (DYNARRAY_NAME (has_failed) (list))
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Enlarge the array if necessary. */
|
|
||||||
if (_GL_UNLIKELY (list->u.dynarray_header.used
|
|
||||||
== list->u.dynarray_header.allocated))
|
|
||||||
{
|
|
||||||
DYNARRAY_NAME (add__) (list, item);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Copy the new element and increase the array length. */
|
|
||||||
list->u.dynarray_header.array[list->u.dynarray_header.used++] = item;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Internal function. Building block for the emplace functions below.
|
|
||||||
Assumes space for one more element in *LIST. */
|
|
||||||
static inline DYNARRAY_ELEMENT *
|
|
||||||
DYNARRAY_NAME (emplace__tail__) (struct DYNARRAY_STRUCT *list)
|
|
||||||
{
|
|
||||||
DYNARRAY_ELEMENT *result
|
|
||||||
= &list->u.dynarray_header.array[list->u.dynarray_header.used];
|
|
||||||
++list->u.dynarray_header.used;
|
|
||||||
#if defined (DYNARRAY_ELEMENT_INIT)
|
|
||||||
DYNARRAY_ELEMENT_INIT (result);
|
|
||||||
#elif defined (DYNARRAY_ELEMENT_FREE)
|
|
||||||
memset (result, 0, sizeof (*result));
|
|
||||||
#endif
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Internal function. Slow path for the emplace function below. */
|
|
||||||
static DYNARRAY_ELEMENT *
|
|
||||||
DYNARRAY_NAME (emplace__) (struct DYNARRAY_STRUCT *list)
|
|
||||||
{
|
|
||||||
if (_GL_UNLIKELY
|
|
||||||
(!__libc_dynarray_emplace_enlarge (&list->u.dynarray_abstract,
|
|
||||||
DYNARRAY_SCRATCH (list),
|
|
||||||
sizeof (DYNARRAY_ELEMENT))))
|
|
||||||
{
|
|
||||||
DYNARRAY_NAME (mark_failed) (list);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return DYNARRAY_NAME (emplace__tail__) (list);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Allocate a place for a new element in *LIST and return a pointer to
|
|
||||||
it. The pointer can be NULL if the dynamic array cannot be
|
|
||||||
enlarged due to a memory allocation failure. */
|
|
||||||
_GL_ATTRIBUTE_MAYBE_UNUSED _GL_ATTRIBUTE_NODISCARD
|
|
||||||
_GL_ATTRIBUTE_NONNULL ((1))
|
|
||||||
static
|
|
||||||
/* Avoid inlining with the larger initialization code. */
|
|
||||||
#if !(defined (DYNARRAY_ELEMENT_INIT) || defined (DYNARRAY_ELEMENT_FREE))
|
|
||||||
inline
|
|
||||||
#endif
|
|
||||||
DYNARRAY_ELEMENT *
|
|
||||||
DYNARRAY_NAME (emplace) (struct DYNARRAY_STRUCT *list)
|
|
||||||
{
|
|
||||||
/* Do nothing in case of previous error. */
|
|
||||||
if (DYNARRAY_NAME (has_failed) (list))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/* Enlarge the array if necessary. */
|
|
||||||
if (_GL_UNLIKELY (list->u.dynarray_header.used
|
|
||||||
== list->u.dynarray_header.allocated))
|
|
||||||
return (DYNARRAY_NAME (emplace__) (list));
|
|
||||||
return DYNARRAY_NAME (emplace__tail__) (list);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Change the size of *LIST to SIZE. If SIZE is larger than the
|
|
||||||
existing size, new elements are added (which can be initialized).
|
|
||||||
Otherwise, the list is truncated, and elements are freed. Return
|
|
||||||
false on memory allocation failure (and mark *LIST as failed). */
|
|
||||||
_GL_ATTRIBUTE_MAYBE_UNUSED _GL_ATTRIBUTE_NONNULL ((1))
|
|
||||||
static bool
|
|
||||||
DYNARRAY_NAME (resize) (struct DYNARRAY_STRUCT *list, size_t size)
|
|
||||||
{
|
|
||||||
if (size > list->u.dynarray_header.used)
|
|
||||||
{
|
|
||||||
bool ok;
|
|
||||||
#if defined (DYNARRAY_ELEMENT_INIT)
|
|
||||||
/* The new elements have to be initialized. */
|
|
||||||
size_t old_size = list->u.dynarray_header.used;
|
|
||||||
ok = __libc_dynarray_resize (&list->u.dynarray_abstract,
|
|
||||||
size, DYNARRAY_SCRATCH (list),
|
|
||||||
sizeof (DYNARRAY_ELEMENT));
|
|
||||||
if (ok)
|
|
||||||
for (size_t i = old_size; i < size; ++i)
|
|
||||||
{
|
|
||||||
DYNARRAY_ELEMENT_INIT (&list->u.dynarray_header.array[i]);
|
|
||||||
}
|
|
||||||
#elif defined (DYNARRAY_ELEMENT_FREE)
|
|
||||||
/* Zero initialization is needed so that the elements can be
|
|
||||||
safely freed. */
|
|
||||||
ok = __libc_dynarray_resize_clear
|
|
||||||
(&list->u.dynarray_abstract, size,
|
|
||||||
DYNARRAY_SCRATCH (list), sizeof (DYNARRAY_ELEMENT));
|
|
||||||
#else
|
|
||||||
ok = __libc_dynarray_resize (&list->u.dynarray_abstract,
|
|
||||||
size, DYNARRAY_SCRATCH (list),
|
|
||||||
sizeof (DYNARRAY_ELEMENT));
|
|
||||||
#endif
|
|
||||||
if (_GL_UNLIKELY (!ok))
|
|
||||||
DYNARRAY_NAME (mark_failed) (list);
|
|
||||||
return ok;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* The list has shrunk in size. Free the removed elements. */
|
|
||||||
DYNARRAY_NAME (free__elements__)
|
|
||||||
(list->u.dynarray_header.array + size,
|
|
||||||
list->u.dynarray_header.used - size);
|
|
||||||
list->u.dynarray_header.used = size;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Remove the last element of LIST if it is present. */
|
|
||||||
_GL_ATTRIBUTE_MAYBE_UNUSED _GL_ATTRIBUTE_NONNULL ((1))
|
|
||||||
static void
|
|
||||||
DYNARRAY_NAME (remove_last) (struct DYNARRAY_STRUCT *list)
|
|
||||||
{
|
|
||||||
/* used > 0 implies that the array is the non-failed state. */
|
|
||||||
if (list->u.dynarray_header.used > 0)
|
|
||||||
{
|
|
||||||
size_t new_length = list->u.dynarray_header.used - 1;
|
|
||||||
#ifdef DYNARRAY_ELEMENT_FREE
|
|
||||||
DYNARRAY_ELEMENT_FREE (&list->u.dynarray_header.array[new_length]);
|
|
||||||
#endif
|
|
||||||
list->u.dynarray_header.used = new_length;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Remove all elements from the list. The elements are freed, but the
|
|
||||||
list itself is not. */
|
|
||||||
_GL_ATTRIBUTE_MAYBE_UNUSED _GL_ATTRIBUTE_NONNULL ((1))
|
|
||||||
static void
|
|
||||||
DYNARRAY_NAME (clear) (struct DYNARRAY_STRUCT *list)
|
|
||||||
{
|
|
||||||
/* free__elements__ does nothing if the list is in the failed
|
|
||||||
state. */
|
|
||||||
DYNARRAY_NAME (free__elements__)
|
|
||||||
(list->u.dynarray_header.array, list->u.dynarray_header.used);
|
|
||||||
list->u.dynarray_header.used = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef DYNARRAY_FINAL_TYPE
|
|
||||||
/* Transfer the dynamic array to a permanent location at *RESULT.
|
|
||||||
Returns true on success on false on allocation failure. In either
|
|
||||||
case, *LIST is re-initialized and can be reused. A NULL pointer is
|
|
||||||
stored in *RESULT if LIST refers to an empty list. On success, the
|
|
||||||
pointer in *RESULT is heap-allocated and must be deallocated using
|
|
||||||
free. */
|
|
||||||
_GL_ATTRIBUTE_MAYBE_UNUSED _GL_ATTRIBUTE_NODISCARD
|
|
||||||
_GL_ATTRIBUTE_NONNULL ((1, 2))
|
|
||||||
static bool
|
|
||||||
DYNARRAY_NAME (finalize) (struct DYNARRAY_STRUCT *list,
|
|
||||||
DYNARRAY_FINAL_TYPE *result)
|
|
||||||
{
|
|
||||||
struct dynarray_finalize_result res;
|
|
||||||
if (__libc_dynarray_finalize (&list->u.dynarray_abstract,
|
|
||||||
DYNARRAY_SCRATCH (list),
|
|
||||||
sizeof (DYNARRAY_ELEMENT), &res))
|
|
||||||
{
|
|
||||||
/* On success, the result owns all the data. */
|
|
||||||
DYNARRAY_NAME (init) (list);
|
|
||||||
*result = (DYNARRAY_FINAL_TYPE) { res.array, res.length };
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* On error, we need to free all data. */
|
|
||||||
DYNARRAY_FREE (list);
|
|
||||||
errno = ENOMEM;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else /* !DYNARRAY_FINAL_TYPE */
|
|
||||||
/* Transfer the dynamic array to a heap-allocated array and return a
|
|
||||||
pointer to it. The pointer is NULL if memory allocation fails, or
|
|
||||||
if the array is empty, so this function should be used only for
|
|
||||||
arrays which are known not be empty (usually because they always
|
|
||||||
have a sentinel at the end). If LENGTHP is not NULL, the array
|
|
||||||
length is written to *LENGTHP. *LIST is re-initialized and can be
|
|
||||||
reused. */
|
|
||||||
_GL_ATTRIBUTE_MAYBE_UNUSED _GL_ATTRIBUTE_NODISCARD
|
|
||||||
_GL_ATTRIBUTE_NONNULL ((1))
|
|
||||||
static DYNARRAY_ELEMENT *
|
|
||||||
DYNARRAY_NAME (finalize) (struct DYNARRAY_STRUCT *list, size_t *lengthp)
|
|
||||||
{
|
|
||||||
struct dynarray_finalize_result res;
|
|
||||||
if (__libc_dynarray_finalize (&list->u.dynarray_abstract,
|
|
||||||
DYNARRAY_SCRATCH (list),
|
|
||||||
sizeof (DYNARRAY_ELEMENT), &res))
|
|
||||||
{
|
|
||||||
/* On success, the result owns all the data. */
|
|
||||||
DYNARRAY_NAME (init) (list);
|
|
||||||
if (lengthp != NULL)
|
|
||||||
*lengthp = res.length;
|
|
||||||
return res.array;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* On error, we need to free all data. */
|
|
||||||
DYNARRAY_FREE (list);
|
|
||||||
errno = ENOMEM;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* !DYNARRAY_FINAL_TYPE */
|
|
||||||
|
|
||||||
/* Undo macro definitions. */
|
|
||||||
|
|
||||||
#undef DYNARRAY_CONCAT0
|
|
||||||
#undef DYNARRAY_CONCAT1
|
|
||||||
#undef DYNARRAY_NAME
|
|
||||||
#undef DYNARRAY_SCRATCH
|
|
||||||
#undef DYNARRAY_HAVE_SCRATCH
|
|
||||||
|
|
||||||
#undef DYNARRAY_STRUCT
|
|
||||||
#undef DYNARRAY_ELEMENT
|
|
||||||
#undef DYNARRAY_PREFIX
|
|
||||||
#undef DYNARRAY_ELEMENT_FREE
|
|
||||||
#undef DYNARRAY_ELEMENT_INIT
|
|
||||||
#undef DYNARRAY_INITIAL_SIZE
|
|
||||||
#undef DYNARRAY_FINAL_TYPE
|
|
|
@ -1,174 +0,0 @@
|
||||||
/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
|
|
||||||
/* Type-safe arrays which grow dynamically. Shared definitions.
|
|
||||||
Copyright (C) 2017-2021 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
|
|
||||||
<https://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
/* To use the dynarray facility, you need to include
|
|
||||||
<malloc/dynarray-skeleton.c> and define the parameter macros
|
|
||||||
documented in that file.
|
|
||||||
|
|
||||||
A minimal example which provides a growing list of integers can be
|
|
||||||
defined like this:
|
|
||||||
|
|
||||||
struct int_array
|
|
||||||
{
|
|
||||||
// Pointer to result array followed by its length,
|
|
||||||
// as required by DYNARRAY_FINAL_TYPE.
|
|
||||||
int *array;
|
|
||||||
size_t length;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define DYNARRAY_STRUCT dynarray_int
|
|
||||||
#define DYNARRAY_ELEMENT int
|
|
||||||
#define DYNARRAY_PREFIX dynarray_int_
|
|
||||||
#define DYNARRAY_FINAL_TYPE struct int_array
|
|
||||||
#include <malloc/dynarray-skeleton.c>
|
|
||||||
|
|
||||||
To create a three-element array with elements 1, 2, 3, use this
|
|
||||||
code:
|
|
||||||
|
|
||||||
struct dynarray_int dyn;
|
|
||||||
dynarray_int_init (&dyn);
|
|
||||||
for (int i = 1; i <= 3; ++i)
|
|
||||||
{
|
|
||||||
int *place = dynarray_int_emplace (&dyn);
|
|
||||||
assert (place != NULL);
|
|
||||||
*place = i;
|
|
||||||
}
|
|
||||||
struct int_array result;
|
|
||||||
bool ok = dynarray_int_finalize (&dyn, &result);
|
|
||||||
assert (ok);
|
|
||||||
assert (result.length == 3);
|
|
||||||
assert (result.array[0] == 1);
|
|
||||||
assert (result.array[1] == 2);
|
|
||||||
assert (result.array[2] == 3);
|
|
||||||
free (result.array);
|
|
||||||
|
|
||||||
If the elements contain resources which must be freed, define
|
|
||||||
DYNARRAY_ELEMENT_FREE appropriately, like this:
|
|
||||||
|
|
||||||
struct str_array
|
|
||||||
{
|
|
||||||
char **array;
|
|
||||||
size_t length;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define DYNARRAY_STRUCT dynarray_str
|
|
||||||
#define DYNARRAY_ELEMENT char *
|
|
||||||
#define DYNARRAY_ELEMENT_FREE(ptr) free (*ptr)
|
|
||||||
#define DYNARRAY_PREFIX dynarray_str_
|
|
||||||
#define DYNARRAY_FINAL_TYPE struct str_array
|
|
||||||
#include <malloc/dynarray-skeleton.c>
|
|
||||||
|
|
||||||
Compared to scratch buffers, dynamic arrays have the following
|
|
||||||
features:
|
|
||||||
|
|
||||||
- They have an element type, and are not just an untyped buffer of
|
|
||||||
bytes.
|
|
||||||
|
|
||||||
- When growing, previously stored elements are preserved. (It is
|
|
||||||
expected that scratch_buffer_grow_preserve and
|
|
||||||
scratch_buffer_set_array_size eventually go away because all
|
|
||||||
current users are moved to dynamic arrays.)
|
|
||||||
|
|
||||||
- Scratch buffers have a more aggressive growth policy because
|
|
||||||
growing them typically means a retry of an operation (across an
|
|
||||||
NSS service module boundary), which is expensive.
|
|
||||||
|
|
||||||
- For the same reason, scratch buffers have a much larger initial
|
|
||||||
stack allocation. */
|
|
||||||
|
|
||||||
#ifndef _DYNARRAY_H
|
|
||||||
#define _DYNARRAY_H
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
struct dynarray_header
|
|
||||||
{
|
|
||||||
size_t used;
|
|
||||||
size_t allocated;
|
|
||||||
void *array;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Marker used in the allocated member to indicate that an error was
|
|
||||||
encountered. */
|
|
||||||
static inline size_t
|
|
||||||
__dynarray_error_marker (void)
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Internal function. See the has_failed function in
|
|
||||||
dynarray-skeleton.c. */
|
|
||||||
static inline bool
|
|
||||||
__dynarray_error (struct dynarray_header *list)
|
|
||||||
{
|
|
||||||
return list->allocated == __dynarray_error_marker ();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Internal function. Enlarge the dynamically allocated area of the
|
|
||||||
array to make room for one more element. SCRATCH is a pointer to
|
|
||||||
the scratch area (which is not heap-allocated and must not be
|
|
||||||
freed). ELEMENT_SIZE is the size, in bytes, of one element.
|
|
||||||
Return false on failure, true on success. */
|
|
||||||
bool __libc_dynarray_emplace_enlarge (struct dynarray_header *,
|
|
||||||
void *scratch, size_t element_size);
|
|
||||||
|
|
||||||
/* Internal function. Enlarge the dynamically allocated area of the
|
|
||||||
array to make room for at least SIZE elements (which must be larger
|
|
||||||
than the existing used part of the dynamic array). SCRATCH is a
|
|
||||||
pointer to the scratch area (which is not heap-allocated and must
|
|
||||||
not be freed). ELEMENT_SIZE is the size, in bytes, of one element.
|
|
||||||
Return false on failure, true on success. */
|
|
||||||
bool __libc_dynarray_resize (struct dynarray_header *, size_t size,
|
|
||||||
void *scratch, size_t element_size);
|
|
||||||
|
|
||||||
/* Internal function. Like __libc_dynarray_resize, but clear the new
|
|
||||||
part of the dynamic array. */
|
|
||||||
bool __libc_dynarray_resize_clear (struct dynarray_header *, size_t size,
|
|
||||||
void *scratch, size_t element_size);
|
|
||||||
|
|
||||||
/* Internal type. */
|
|
||||||
struct dynarray_finalize_result
|
|
||||||
{
|
|
||||||
void *array;
|
|
||||||
size_t length;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Internal function. Copy the dynamically-allocated area to an
|
|
||||||
explicitly-sized heap allocation. SCRATCH is a pointer to the
|
|
||||||
embedded scratch space. ELEMENT_SIZE is the size, in bytes, of the
|
|
||||||
element type. On success, true is returned, and pointer and length
|
|
||||||
are written to *RESULT. On failure, false is returned. The caller
|
|
||||||
has to take care of some of the memory management; this function is
|
|
||||||
expected to be called from dynarray-skeleton.c. */
|
|
||||||
bool __libc_dynarray_finalize (struct dynarray_header *list, void *scratch,
|
|
||||||
size_t element_size,
|
|
||||||
struct dynarray_finalize_result *result);
|
|
||||||
|
|
||||||
|
|
||||||
/* Internal function. Terminate the process after an index error.
|
|
||||||
SIZE is the number of elements of the dynamic array. INDEX is the
|
|
||||||
lookup index which triggered the failure. */
|
|
||||||
_Noreturn void __libc_dynarray_at_failure (size_t size, size_t index);
|
|
||||||
|
|
||||||
#ifndef _ISOMAC
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _DYNARRAY_H */
|
|
580
lib/sched.h
580
lib/sched.h
|
@ -1,580 +0,0 @@
|
||||||
/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
|
|
||||||
/* A GNU-like <sched.h>.
|
|
||||||
Copyright (C) 2008-2022 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
This file 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.
|
|
||||||
|
|
||||||
This file 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 this program. If not, see <https://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
#ifndef _GL_SCHED_H
|
|
||||||
|
|
||||||
#if __GNUC__ >= 3
|
|
||||||
#pragma GCC system_header
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* The include_next requires a split double-inclusion guard. */
|
|
||||||
#if 1
|
|
||||||
# if 1
|
|
||||||
# include <sys/cdefs.h>
|
|
||||||
# endif
|
|
||||||
# include_next <sched.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef _GL_SCHED_H
|
|
||||||
#define _GL_SCHED_H
|
|
||||||
|
|
||||||
/* Get pid_t.
|
|
||||||
This is needed on glibc 2.11 (see
|
|
||||||
glibc bug <https://sourceware.org/bugzilla/show_bug.cgi?id=13198>)
|
|
||||||
and Mac OS X 10.5. */
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#ifdef __KLIBC__
|
|
||||||
/* On OS/2 kLIBC, struct sched_param is in spawn.h. */
|
|
||||||
# include <spawn.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __VMS
|
|
||||||
/* On OpenVMS, struct sched_param is in <pthread.h>. */
|
|
||||||
# include <pthread.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
|
|
||||||
/* C++ compatible function declaration macros.
|
|
||||||
Copyright (C) 2010-2022 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
This program 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 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
#ifndef _GL_CXXDEFS_H
|
|
||||||
#define _GL_CXXDEFS_H
|
|
||||||
|
|
||||||
/* Begin/end the GNULIB_NAMESPACE namespace. */
|
|
||||||
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
|
||||||
# define _GL_BEGIN_NAMESPACE namespace GNULIB_NAMESPACE {
|
|
||||||
# define _GL_END_NAMESPACE }
|
|
||||||
#else
|
|
||||||
# define _GL_BEGIN_NAMESPACE
|
|
||||||
# define _GL_END_NAMESPACE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* The three most frequent use cases of these macros are:
|
|
||||||
|
|
||||||
* For providing a substitute for a function that is missing on some
|
|
||||||
platforms, but is declared and works fine on the platforms on which
|
|
||||||
it exists:
|
|
||||||
|
|
||||||
#if @GNULIB_FOO@
|
|
||||||
# if !@HAVE_FOO@
|
|
||||||
_GL_FUNCDECL_SYS (foo, ...);
|
|
||||||
# endif
|
|
||||||
_GL_CXXALIAS_SYS (foo, ...);
|
|
||||||
_GL_CXXALIASWARN (foo);
|
|
||||||
#elif defined GNULIB_POSIXCHECK
|
|
||||||
...
|
|
||||||
#endif
|
|
||||||
|
|
||||||
* For providing a replacement for a function that exists on all platforms,
|
|
||||||
but is broken/insufficient and needs to be replaced on some platforms:
|
|
||||||
|
|
||||||
#if @GNULIB_FOO@
|
|
||||||
# if @REPLACE_FOO@
|
|
||||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
|
||||||
# undef foo
|
|
||||||
# define foo rpl_foo
|
|
||||||
# endif
|
|
||||||
_GL_FUNCDECL_RPL (foo, ...);
|
|
||||||
_GL_CXXALIAS_RPL (foo, ...);
|
|
||||||
# else
|
|
||||||
_GL_CXXALIAS_SYS (foo, ...);
|
|
||||||
# endif
|
|
||||||
_GL_CXXALIASWARN (foo);
|
|
||||||
#elif defined GNULIB_POSIXCHECK
|
|
||||||
...
|
|
||||||
#endif
|
|
||||||
|
|
||||||
* For providing a replacement for a function that exists on some platforms
|
|
||||||
but is broken/insufficient and needs to be replaced on some of them and
|
|
||||||
is additionally either missing or undeclared on some other platforms:
|
|
||||||
|
|
||||||
#if @GNULIB_FOO@
|
|
||||||
# if @REPLACE_FOO@
|
|
||||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
|
||||||
# undef foo
|
|
||||||
# define foo rpl_foo
|
|
||||||
# endif
|
|
||||||
_GL_FUNCDECL_RPL (foo, ...);
|
|
||||||
_GL_CXXALIAS_RPL (foo, ...);
|
|
||||||
# else
|
|
||||||
# if !@HAVE_FOO@ or if !@HAVE_DECL_FOO@
|
|
||||||
_GL_FUNCDECL_SYS (foo, ...);
|
|
||||||
# endif
|
|
||||||
_GL_CXXALIAS_SYS (foo, ...);
|
|
||||||
# endif
|
|
||||||
_GL_CXXALIASWARN (foo);
|
|
||||||
#elif defined GNULIB_POSIXCHECK
|
|
||||||
...
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* _GL_EXTERN_C declaration;
|
|
||||||
performs the declaration with C linkage. */
|
|
||||||
#if defined __cplusplus
|
|
||||||
# define _GL_EXTERN_C extern "C"
|
|
||||||
#else
|
|
||||||
# define _GL_EXTERN_C extern
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* _GL_FUNCDECL_RPL (func, rettype, parameters_and_attributes);
|
|
||||||
declares a replacement function, named rpl_func, with the given prototype,
|
|
||||||
consisting of return type, parameters, and attributes.
|
|
||||||
Example:
|
|
||||||
_GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
|
|
||||||
_GL_ARG_NONNULL ((1)));
|
|
||||||
*/
|
|
||||||
#define _GL_FUNCDECL_RPL(func,rettype,parameters_and_attributes) \
|
|
||||||
_GL_FUNCDECL_RPL_1 (rpl_##func, rettype, parameters_and_attributes)
|
|
||||||
#define _GL_FUNCDECL_RPL_1(rpl_func,rettype,parameters_and_attributes) \
|
|
||||||
_GL_EXTERN_C rettype rpl_func parameters_and_attributes
|
|
||||||
|
|
||||||
/* _GL_FUNCDECL_SYS (func, rettype, parameters_and_attributes);
|
|
||||||
declares the system function, named func, with the given prototype,
|
|
||||||
consisting of return type, parameters, and attributes.
|
|
||||||
Example:
|
|
||||||
_GL_FUNCDECL_SYS (open, int, (const char *filename, int flags, ...)
|
|
||||||
_GL_ARG_NONNULL ((1)));
|
|
||||||
*/
|
|
||||||
#define _GL_FUNCDECL_SYS(func,rettype,parameters_and_attributes) \
|
|
||||||
_GL_EXTERN_C rettype func parameters_and_attributes
|
|
||||||
|
|
||||||
/* _GL_CXXALIAS_RPL (func, rettype, parameters);
|
|
||||||
declares a C++ alias called GNULIB_NAMESPACE::func
|
|
||||||
that redirects to rpl_func, if GNULIB_NAMESPACE is defined.
|
|
||||||
Example:
|
|
||||||
_GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
|
|
||||||
|
|
||||||
Wrapping rpl_func in an object with an inline conversion operator
|
|
||||||
avoids a reference to rpl_func unless GNULIB_NAMESPACE::func is
|
|
||||||
actually used in the program. */
|
|
||||||
#define _GL_CXXALIAS_RPL(func,rettype,parameters) \
|
|
||||||
_GL_CXXALIAS_RPL_1 (func, rpl_##func, rettype, parameters)
|
|
||||||
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
|
||||||
# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
|
|
||||||
namespace GNULIB_NAMESPACE \
|
|
||||||
{ \
|
|
||||||
static const struct _gl_ ## func ## _wrapper \
|
|
||||||
{ \
|
|
||||||
typedef rettype (*type) parameters; \
|
|
||||||
\
|
|
||||||
inline operator type () const \
|
|
||||||
{ \
|
|
||||||
return ::rpl_func; \
|
|
||||||
} \
|
|
||||||
} func = {}; \
|
|
||||||
} \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#else
|
|
||||||
# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* _GL_CXXALIAS_MDA (func, rettype, parameters);
|
|
||||||
is to be used when func is a Microsoft deprecated alias, on native Windows.
|
|
||||||
It declares a C++ alias called GNULIB_NAMESPACE::func
|
|
||||||
that redirects to _func, if GNULIB_NAMESPACE is defined.
|
|
||||||
Example:
|
|
||||||
_GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
|
|
||||||
*/
|
|
||||||
#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
|
|
||||||
_GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
|
|
||||||
|
|
||||||
/* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
|
|
||||||
is like _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
|
|
||||||
except that the C function rpl_func may have a slightly different
|
|
||||||
declaration. A cast is used to silence the "invalid conversion" error
|
|
||||||
that would otherwise occur. */
|
|
||||||
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
|
||||||
# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
|
|
||||||
namespace GNULIB_NAMESPACE \
|
|
||||||
{ \
|
|
||||||
static const struct _gl_ ## func ## _wrapper \
|
|
||||||
{ \
|
|
||||||
typedef rettype (*type) parameters; \
|
|
||||||
\
|
|
||||||
inline operator type () const \
|
|
||||||
{ \
|
|
||||||
return reinterpret_cast<type>(::rpl_func); \
|
|
||||||
} \
|
|
||||||
} func = {}; \
|
|
||||||
} \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#else
|
|
||||||
# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
|
|
||||||
is like _GL_CXXALIAS_MDA (func, rettype, parameters);
|
|
||||||
except that the C function func may have a slightly different declaration.
|
|
||||||
A cast is used to silence the "invalid conversion" error that would
|
|
||||||
otherwise occur. */
|
|
||||||
#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
|
|
||||||
_GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
|
|
||||||
|
|
||||||
/* _GL_CXXALIAS_SYS (func, rettype, parameters);
|
|
||||||
declares a C++ alias called GNULIB_NAMESPACE::func
|
|
||||||
that redirects to the system provided function func, if GNULIB_NAMESPACE
|
|
||||||
is defined.
|
|
||||||
Example:
|
|
||||||
_GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
|
|
||||||
|
|
||||||
Wrapping func in an object with an inline conversion operator
|
|
||||||
avoids a reference to func unless GNULIB_NAMESPACE::func is
|
|
||||||
actually used in the program. */
|
|
||||||
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
|
||||||
# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
|
|
||||||
namespace GNULIB_NAMESPACE \
|
|
||||||
{ \
|
|
||||||
static const struct _gl_ ## func ## _wrapper \
|
|
||||||
{ \
|
|
||||||
typedef rettype (*type) parameters; \
|
|
||||||
\
|
|
||||||
inline operator type () const \
|
|
||||||
{ \
|
|
||||||
return ::func; \
|
|
||||||
} \
|
|
||||||
} func = {}; \
|
|
||||||
} \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#else
|
|
||||||
# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* _GL_CXXALIAS_SYS_CAST (func, rettype, parameters);
|
|
||||||
is like _GL_CXXALIAS_SYS (func, rettype, parameters);
|
|
||||||
except that the C function func may have a slightly different declaration.
|
|
||||||
A cast is used to silence the "invalid conversion" error that would
|
|
||||||
otherwise occur. */
|
|
||||||
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
|
||||||
# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
|
|
||||||
namespace GNULIB_NAMESPACE \
|
|
||||||
{ \
|
|
||||||
static const struct _gl_ ## func ## _wrapper \
|
|
||||||
{ \
|
|
||||||
typedef rettype (*type) parameters; \
|
|
||||||
\
|
|
||||||
inline operator type () const \
|
|
||||||
{ \
|
|
||||||
return reinterpret_cast<type>(::func); \
|
|
||||||
} \
|
|
||||||
} func = {}; \
|
|
||||||
} \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#else
|
|
||||||
# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* _GL_CXXALIAS_SYS_CAST2 (func, rettype, parameters, rettype2, parameters2);
|
|
||||||
is like _GL_CXXALIAS_SYS (func, rettype, parameters);
|
|
||||||
except that the C function is picked among a set of overloaded functions,
|
|
||||||
namely the one with rettype2 and parameters2. Two consecutive casts
|
|
||||||
are used to silence the "cannot find a match" and "invalid conversion"
|
|
||||||
errors that would otherwise occur. */
|
|
||||||
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
|
||||||
/* The outer cast must be a reinterpret_cast.
|
|
||||||
The inner cast: When the function is defined as a set of overloaded
|
|
||||||
functions, it works as a static_cast<>, choosing the designated variant.
|
|
||||||
When the function is defined as a single variant, it works as a
|
|
||||||
reinterpret_cast<>. The parenthesized cast syntax works both ways. */
|
|
||||||
# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
|
|
||||||
namespace GNULIB_NAMESPACE \
|
|
||||||
{ \
|
|
||||||
static const struct _gl_ ## func ## _wrapper \
|
|
||||||
{ \
|
|
||||||
typedef rettype (*type) parameters; \
|
|
||||||
\
|
|
||||||
inline operator type () const \
|
|
||||||
{ \
|
|
||||||
return reinterpret_cast<type>((rettype2 (*) parameters2)(::func)); \
|
|
||||||
} \
|
|
||||||
} func = {}; \
|
|
||||||
} \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#else
|
|
||||||
# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* _GL_CXXALIASWARN (func);
|
|
||||||
causes a warning to be emitted when ::func is used but not when
|
|
||||||
GNULIB_NAMESPACE::func is used. func must be defined without overloaded
|
|
||||||
variants. */
|
|
||||||
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
|
||||||
# define _GL_CXXALIASWARN(func) \
|
|
||||||
_GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE)
|
|
||||||
# define _GL_CXXALIASWARN_1(func,namespace) \
|
|
||||||
_GL_CXXALIASWARN_2 (func, namespace)
|
|
||||||
/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
|
|
||||||
we enable the warning only when not optimizing. */
|
|
||||||
# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
|
|
||||||
# define _GL_CXXALIASWARN_2(func,namespace) \
|
|
||||||
_GL_WARN_ON_USE (func, \
|
|
||||||
"The symbol ::" #func " refers to the system function. " \
|
|
||||||
"Use " #namespace "::" #func " instead.")
|
|
||||||
# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
|
|
||||||
# define _GL_CXXALIASWARN_2(func,namespace) \
|
|
||||||
extern __typeof__ (func) func
|
|
||||||
# else
|
|
||||||
# define _GL_CXXALIASWARN_2(func,namespace) \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# define _GL_CXXALIASWARN(func) \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* _GL_CXXALIASWARN1 (func, rettype, parameters_and_attributes);
|
|
||||||
causes a warning to be emitted when the given overloaded variant of ::func
|
|
||||||
is used but not when GNULIB_NAMESPACE::func is used. */
|
|
||||||
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
|
||||||
# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
|
|
||||||
_GL_CXXALIASWARN1_1 (func, rettype, parameters_and_attributes, \
|
|
||||||
GNULIB_NAMESPACE)
|
|
||||||
# define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace) \
|
|
||||||
_GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
|
|
||||||
/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
|
|
||||||
we enable the warning only when not optimizing. */
|
|
||||||
# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
|
|
||||||
# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
|
|
||||||
_GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
|
|
||||||
"The symbol ::" #func " refers to the system function. " \
|
|
||||||
"Use " #namespace "::" #func " instead.")
|
|
||||||
# else
|
|
||||||
# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _GL_CXXDEFS_H */
|
|
||||||
|
|
||||||
/* The definition of _GL_WARN_ON_USE is copied here. */
|
|
||||||
/* A C macro for emitting warnings if a function is used.
|
|
||||||
Copyright (C) 2010-2022 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
This program 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 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
/* _GL_WARN_ON_USE (function, "literal string") issues a declaration
|
|
||||||
for FUNCTION which will then trigger a compiler warning containing
|
|
||||||
the text of "literal string" anywhere that function is called, if
|
|
||||||
supported by the compiler. If the compiler does not support this
|
|
||||||
feature, the macro expands to an unused extern declaration.
|
|
||||||
|
|
||||||
_GL_WARN_ON_USE_ATTRIBUTE ("literal string") expands to the
|
|
||||||
attribute used in _GL_WARN_ON_USE. If the compiler does not support
|
|
||||||
this feature, it expands to empty.
|
|
||||||
|
|
||||||
These macros are useful for marking a function as a potential
|
|
||||||
portability trap, with the intent that "literal string" include
|
|
||||||
instructions on the replacement function that should be used
|
|
||||||
instead.
|
|
||||||
_GL_WARN_ON_USE is for functions with 'extern' linkage.
|
|
||||||
_GL_WARN_ON_USE_ATTRIBUTE is for functions with 'static' or 'inline'
|
|
||||||
linkage.
|
|
||||||
|
|
||||||
However, one of the reasons that a function is a portability trap is
|
|
||||||
if it has the wrong signature. Declaring FUNCTION with a different
|
|
||||||
signature in C is a compilation error, so this macro must use the
|
|
||||||
same type as any existing declaration so that programs that avoid
|
|
||||||
the problematic FUNCTION do not fail to compile merely because they
|
|
||||||
included a header that poisoned the function. But this implies that
|
|
||||||
_GL_WARN_ON_USE is only safe to use if FUNCTION is known to already
|
|
||||||
have a declaration. Use of this macro implies that there must not
|
|
||||||
be any other macro hiding the declaration of FUNCTION; but
|
|
||||||
undefining FUNCTION first is part of the poisoning process anyway
|
|
||||||
(although for symbols that are provided only via a macro, the result
|
|
||||||
is a compilation error rather than a warning containing
|
|
||||||
"literal string"). Also note that in C++, it is only safe to use if
|
|
||||||
FUNCTION has no overloads.
|
|
||||||
|
|
||||||
For an example, it is possible to poison 'getline' by:
|
|
||||||
- adding a call to gl_WARN_ON_USE_PREPARE([[#include <stdio.h>]],
|
|
||||||
[getline]) in configure.ac, which potentially defines
|
|
||||||
HAVE_RAW_DECL_GETLINE
|
|
||||||
- adding this code to a header that wraps the system <stdio.h>:
|
|
||||||
#undef getline
|
|
||||||
#if HAVE_RAW_DECL_GETLINE
|
|
||||||
_GL_WARN_ON_USE (getline, "getline is required by POSIX 2008, but"
|
|
||||||
"not universally present; use the gnulib module getline");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
It is not possible to directly poison global variables. But it is
|
|
||||||
possible to write a wrapper accessor function, and poison that
|
|
||||||
(less common usage, like &environ, will cause a compilation error
|
|
||||||
rather than issue the nice warning, but the end result of informing
|
|
||||||
the developer about their portability problem is still achieved):
|
|
||||||
#if HAVE_RAW_DECL_ENVIRON
|
|
||||||
static char ***
|
|
||||||
rpl_environ (void) { return &environ; }
|
|
||||||
_GL_WARN_ON_USE (rpl_environ, "environ is not always properly declared");
|
|
||||||
# undef environ
|
|
||||||
# define environ (*rpl_environ ())
|
|
||||||
#endif
|
|
||||||
or better (avoiding contradictory use of 'static' and 'extern'):
|
|
||||||
#if HAVE_RAW_DECL_ENVIRON
|
|
||||||
static char ***
|
|
||||||
_GL_WARN_ON_USE_ATTRIBUTE ("environ is not always properly declared")
|
|
||||||
rpl_environ (void) { return &environ; }
|
|
||||||
# undef environ
|
|
||||||
# define environ (*rpl_environ ())
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
#ifndef _GL_WARN_ON_USE
|
|
||||||
|
|
||||||
# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
|
|
||||||
/* A compiler attribute is available in gcc versions 4.3.0 and later. */
|
|
||||||
# define _GL_WARN_ON_USE(function, message) \
|
|
||||||
_GL_WARN_EXTERN_C __typeof__ (function) function __attribute__ ((__warning__ (message)))
|
|
||||||
# define _GL_WARN_ON_USE_ATTRIBUTE(message) \
|
|
||||||
__attribute__ ((__warning__ (message)))
|
|
||||||
# elif __clang_major__ >= 4
|
|
||||||
/* Another compiler attribute is available in clang. */
|
|
||||||
# define _GL_WARN_ON_USE(function, message) \
|
|
||||||
_GL_WARN_EXTERN_C __typeof__ (function) function \
|
|
||||||
__attribute__ ((__diagnose_if__ (1, message, "warning")))
|
|
||||||
# define _GL_WARN_ON_USE_ATTRIBUTE(message) \
|
|
||||||
__attribute__ ((__diagnose_if__ (1, message, "warning")))
|
|
||||||
# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
|
|
||||||
/* Verify the existence of the function. */
|
|
||||||
# define _GL_WARN_ON_USE(function, message) \
|
|
||||||
_GL_WARN_EXTERN_C __typeof__ (function) function
|
|
||||||
# define _GL_WARN_ON_USE_ATTRIBUTE(message)
|
|
||||||
# else /* Unsupported. */
|
|
||||||
# define _GL_WARN_ON_USE(function, message) \
|
|
||||||
_GL_WARN_EXTERN_C int _gl_warn_on_use
|
|
||||||
# define _GL_WARN_ON_USE_ATTRIBUTE(message)
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
|
|
||||||
is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
|
|
||||||
function is declared with the given prototype, consisting of return type,
|
|
||||||
parameters, and attributes.
|
|
||||||
This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
|
|
||||||
not work in this case. */
|
|
||||||
#ifndef _GL_WARN_ON_USE_CXX
|
|
||||||
# if !defined __cplusplus
|
|
||||||
# define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
|
|
||||||
_GL_WARN_ON_USE (function, msg)
|
|
||||||
# else
|
|
||||||
# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
|
|
||||||
/* A compiler attribute is available in gcc versions 4.3.0 and later. */
|
|
||||||
# define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
|
|
||||||
extern rettype_gcc function parameters_and_attributes \
|
|
||||||
__attribute__ ((__warning__ (msg)))
|
|
||||||
# elif __clang_major__ >= 4
|
|
||||||
/* Another compiler attribute is available in clang. */
|
|
||||||
# define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
|
|
||||||
extern rettype_clang function parameters_and_attributes \
|
|
||||||
__attribute__ ((__diagnose_if__ (1, msg, "warning")))
|
|
||||||
# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
|
|
||||||
/* Verify the existence of the function. */
|
|
||||||
# define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
|
|
||||||
extern rettype_gcc function parameters_and_attributes
|
|
||||||
# else /* Unsupported. */
|
|
||||||
# define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
|
|
||||||
_GL_WARN_EXTERN_C int _gl_warn_on_use
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* _GL_WARN_EXTERN_C declaration;
|
|
||||||
performs the declaration with C linkage. */
|
|
||||||
#ifndef _GL_WARN_EXTERN_C
|
|
||||||
# if defined __cplusplus
|
|
||||||
# define _GL_WARN_EXTERN_C extern "C"
|
|
||||||
# else
|
|
||||||
# define _GL_WARN_EXTERN_C extern
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !1
|
|
||||||
|
|
||||||
# if !GNULIB_defined_struct_sched_param
|
|
||||||
struct sched_param
|
|
||||||
{
|
|
||||||
int sched_priority;
|
|
||||||
};
|
|
||||||
# define GNULIB_defined_struct_sched_param 1
|
|
||||||
# endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !(defined SCHED_FIFO && defined SCHED_RR && defined SCHED_OTHER)
|
|
||||||
# define SCHED_FIFO 1
|
|
||||||
# define SCHED_RR 2
|
|
||||||
# define SCHED_OTHER 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
# if 0
|
|
||||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
|
||||||
# undef sched_yield
|
|
||||||
# define sched_yield rpl_sched_yield
|
|
||||||
# endif
|
|
||||||
_GL_FUNCDECL_RPL (sched_yield, int, (void));
|
|
||||||
_GL_CXXALIAS_RPL (sched_yield, int, (void));
|
|
||||||
# else
|
|
||||||
# if !1
|
|
||||||
_GL_FUNCDECL_SYS (sched_yield, int, (void));
|
|
||||||
# endif
|
|
||||||
_GL_CXXALIAS_SYS (sched_yield, int, (void));
|
|
||||||
# endif
|
|
||||||
# if __GLIBC__ >= 2
|
|
||||||
_GL_CXXALIASWARN (sched_yield);
|
|
||||||
# endif
|
|
||||||
#elif defined GNULIB_POSIXCHECK
|
|
||||||
# undef sched_yield
|
|
||||||
# if HAVE_RAW_DECL_SCHED_YIELD
|
|
||||||
_GL_WARN_ON_USE (sched_yield, "sched_yield is not portable - "
|
|
||||||
"use gnulib module sched_yield for portability");
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _GL_SCHED_H */
|
|
||||||
#endif /* _GL_SCHED_H */
|
|
1499
lib/spawn.h
1499
lib/spawn.h
File diff suppressed because it is too large
Load diff
|
@ -1,38 +0,0 @@
|
||||||
/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
|
|
||||||
/* stdckdint.h -- checked integer arithmetic
|
|
||||||
|
|
||||||
Copyright 2022 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
This program 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.
|
|
||||||
|
|
||||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
#ifndef _GL_STDCKDINT_H
|
|
||||||
#define _GL_STDCKDINT_H
|
|
||||||
|
|
||||||
#include "intprops-internal.h"
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
/* Store into *R the low-order bits of A + B, A - B, A * B, respectively.
|
|
||||||
Return 1 if the result overflows, 0 otherwise.
|
|
||||||
A, B, and *R can have any integer type other than char, bool, a
|
|
||||||
bit-precise integer type, or an enumeration type.
|
|
||||||
|
|
||||||
These are like the standard macros introduced in C23, except that
|
|
||||||
arguments should not have side effects. */
|
|
||||||
|
|
||||||
#define ckd_add(r, a, b) ((bool) _GL_INT_ADD_WRAPV (a, b, r))
|
|
||||||
#define ckd_sub(r, a, b) ((bool) _GL_INT_SUBTRACT_WRAPV (a, b, r))
|
|
||||||
#define ckd_mul(r, a, b) ((bool) _GL_INT_MULTIPLY_WRAPV (a, b, r))
|
|
||||||
|
|
||||||
#endif /* _GL_STDCKDINT_H */
|
|
Loading…
Add table
Add a link
Reference in a new issue