aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/bits/intconf.h47
-rw-r--r--include/bits/types.h154
-rw-r--r--include/slibc/version.h128
-rw-r--r--include/stddef.h1
-rw-r--r--include/stdint.h422
5 files changed, 752 insertions, 0 deletions
diff --git a/include/bits/intconf.h b/include/bits/intconf.h
new file mode 100644
index 0000000..f76c999
--- /dev/null
+++ b/include/bits/intconf.h
@@ -0,0 +1,47 @@
+/**
+ * slibc — Yet another C library
+ * Copyright © 2015 Mattias Andrée (maandree@member.fsf.org)
+ *
+ * This program 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.
+ *
+ * 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef _BITS_INTCONF_H
+#define _BITS_INTCONF_H
+
+
+#define __MAX_TO_MIN(max) (-(max) - 1)
+#define __CHAR_BIT 8
+#define __SHORT_BIT 16
+#define __INT_BIT 32
+#define __LONG_BIT 64
+#define __LONG_LONG_BIT 64
+#define __INT8 char
+#define __INT16 short int
+#define __INT32 int
+#define __INT64 long int
+#define __INT_FAST8 __INT8
+#define __INT_FAST16 __INT64
+#define __INT_FAST32 __INT64
+#define __INT_FAST64 __INT64
+#define __INT_FAST8_MAX INT8_MAX
+#define __INT_FAST16_MAX INT64_MAX
+#define __INT_FAST32_MAX INT64_MAX
+#define __INT_FAST64_MAX INT64_MAX
+#define __UINT_FAST8_MAX UINT8_MAX
+#define __UINT_FAST16_MAX UINT64_MAX
+#define __UINT_FAST32_MAX UINT64_MAX
+#define __UINT_FAST64_MAX UINT64_MAX
+
+
+#endif
+
diff --git a/include/bits/types.h b/include/bits/types.h
index 1fffa0c..618cb98 100644
--- a/include/bits/types.h
+++ b/include/bits/types.h
@@ -21,6 +21,19 @@
* order headers are included. */
+#include <bits/intconf.h>
+
+
+/**
+ * Returns the maximum value of an unsigned integer type,
+ * in that type.
+ */
+#ifndef __MAX_OF
+# define __MAX_OF(type) \
+ (((type)1) << sizeof(type))
+#define
+
+
/**
* Signed integer type of the result of subtracting two pointers.
* May not be greater than the with of type long.
@@ -54,6 +67,16 @@ typedef unsigned long int uptrdiff_t;
#if defined(__NEED_wchar_t) && !defined(__DEFINED_wchar_t)
# define __DEFINED_wchar_t
typedef long int wchar_t;
+# define __WCHAR_MAX INTPTR_MAX
+#endif
+
+
+/**
+ * Variant of `wchar_t` cna can hold the value of `WEOF`.
+ */
+#if defined(__NEED_wint_t) && !defined(__DEFINED_wint_t)
+# define __DEFINED_wint_t
+typedef wchar_t wint_t;
#endif
@@ -90,3 +113,134 @@ typedef struct
} max_align_t;
#endif
+
+/**
+ * Signed exact-width integer types.
+ *
+ * These types are guaranteed to use two's complement.
+ */
+#if defined(__NEED_intN_t) && !defined(__DEFINED_intN_t)
+# define __DEFINED_intN_t
+typedef signed __INT8 int8_t;
+typedef signed __INT16 int16_t;
+typedef signed __INT32 int32_t;
+typedef signed __INT64 int64_t;
+#endif
+
+
+/**
+ * Unsigned exact-width integer types.
+ */
+#if defined(__NEED_uintN_t) && !defined(__DEFINED_uintN_t)
+# define __DEFINED_uintN_t
+typedef unsigned __INT8 uint8_t;
+typedef unsigned __INT16 uint16_t;
+typedef unsigned __INT32 uint32_t;
+typedef unsigned __INT64 uint64_t;
+#endif
+
+
+/**
+ * Signed integer types with guaranteed minimum length
+ * with otherwise minimal length.
+ *
+ * `int_least8_t`, `int_least16_t`, `int_least32_t`, and
+ * `int_least64_t` are guaranteed to be defined.
+ */
+#if defined(__NEED_int_leastN_t) && !defined(__DEFINED_int_leastN_t)
+# define __DEFINED_int_leastN_t
+typedef signed __INT8 int_least8_t;
+typedef signed __INT16 int_least16_t;
+typedef signed __INT32 int_least32_t;
+typedef signed __INT64 int_least64_t;
+#endif
+
+
+/**
+ * Unsigned integer types with guaranteed minimum length
+ * with otherwise minimal length.
+ *
+ * `uint_least8_t`, `uint_least16_t`, `uint_least32_t`, and
+ * `uint_least64_t` are guaranteed to be defined.
+ */
+#if defined(__NEED_uint_leastN_t) && !defined(__DEFINED_uint_leastN_t)
+# define __DEFINED_uint_leastN_t
+typedef unsigned __INT8 uint_least8_t;
+typedef unsigned __INT16 uint_least16_t;
+typedef unsigned __INT32 uint_least32_t;
+typedef unsigned __INT64 uint_least64_t;
+#endif
+
+
+/**
+ * Signed integer types with guaranteed minimum length
+ * and are thought to be the fastest to in most use-cases.
+ *
+ * `int_fast8_t`, `int_fast16_t`, `int_fast32_t`, and
+ * `int_fast64_t` are guaranteed to be defined.
+ * It is howevr strongly discouraged to uses this types
+ * in serialised/marshalled data, as they may depend
+ * on the C library the program is compiled against
+ * and the version of that library.
+ */
+#if defined(__NEED_int_fastN_t) && !defined(__DEFINED_int_fastN_t)
+# define __DEFINED_int_fastN_t
+typedef signed __INT_FAST8 int_fast8_t;
+typedef signed __INT_FAST16 int_fast16_t;
+typedef signed __INT_FAST32 int_fast32_t;
+typedef signed __INT_FAST64 int_fast64_t;
+#endif
+
+
+/**
+ * Ubsigned integer types with guaranteed minimum length
+ * and are thought to be the fastest to in most use-cases.
+ *
+ * `uint_fast8_t`, `uint_fast16_t`, `uint_fast32_t`, and
+ * `uint_fast64_t` are guaranteed to be defined.
+ * It is howevr strongly discouraged to uses this types
+ * in serialised/marshalled data, as they may depend
+ * on the C library the program is compiled against
+ * and the version of that library.
+ */
+#if defined(__NEED_uint_fastN_t) && !defined(__DEFINED_uint_fastN_t)
+# define __DEFINED_uint_fastN_t
+typedef unsigned __INT_FAST8 uint_fast8_t;
+typedef unsigned __INT_FAST16 uint_fast16_t;
+typedef unsigned __INT_FAST32 uint_fast32_t;
+typedef unsigned __INT_FAST64 uint_fast64_t;
+#endif
+
+
+/**
+ * The widest signed integer type available.
+ */
+#if defined(__NEED_intmax_t) && !defined(__DEFINED_intmax_t)
+# define __DEFINED_intmax_t
+typedef signed __INT64 intmax_t;
+# define __INTMAX_MAX INT64_MAX
+#endif
+
+
+/**
+ * The widest unsigned integer type available.
+ */
+#if defined(__NEED_uintmax_t) && !defined(__DEFINED_uintmax_t)
+# define __DEFINED_uintmax_t
+typedef unsigned __INT64 uintmax_t;
+# define __UINTMAX_MAX UINT64_MAX
+#endif
+
+
+/**
+ * A integer type over which operations are atomic.
+ * It may be defined as volatile, slibc does not do
+ * this however because it is good practice to do
+ * so explcitily when using the `sig_atomic_t` type.
+ */
+#if defined(__NEED_sig_atomic_t) && !defined(__DEFINED_sig_atomic_t)
+# define __DEFINED_sig_atomic_t
+typedef int sig_atomic_t;
+# define __SIG_ATOMIC_BIT __INT_BIT
+#endif
+
diff --git a/include/slibc/version.h b/include/slibc/version.h
new file mode 100644
index 0000000..00eebba
--- /dev/null
+++ b/include/slibc/version.h
@@ -0,0 +1,128 @@
+/**
+ * slibc — Yet another C library
+ * Copyright © 2015 Mattias Andrée (maandree@member.fsf.org)
+ *
+ * This program 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.
+ *
+ * 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef _SLIBC_VERSION_H
+#define _SLIBC_VERSION_H
+
+
+/* Any header file is in the top-level of the header direction,
+ * and is provided by slibc, will include this header file.
+ * That way you do not need to include an slibc specific header
+ * to find out whether you are using slibc. */
+
+
+
+/**
+ * The major-number in the version of slibc that
+ * you are compiling against.
+ *
+ * The version is formatted `<major>.<minor>.<micro>.<patch>`,
+ * however `.<patch>` is omitted if the patch-number is nought,
+ * `.<micro>` is omitted if the both the patch- and micro-number
+ * are nought.
+ */
+#define __SLIBC_MAJOR__ 0
+
+/**
+ * The minor-number in the version of slibc that
+ * you are compiling against.
+ */
+#define __SLIBC_MINOR__ 1
+
+/**
+ * The micro-number in the version of slibc that
+ * you are compiling against.
+ */
+#define __SLIBC_MICRO__ 0
+
+/**
+ * The patch-number in the version of slibc that
+ * you are compiling against.
+ */
+#define __SLIBC_PATCH__ 0
+
+
+
+/**
+ * This function is used internal for comparing
+ * slibc versions.
+ *
+ * @param major The major-number of the version.
+ * @param minor The minor-number of the version.
+ * @param micro The micro-number of the version.
+ * @param patch The patch-number of the version.
+ * @return A scalar integer describing the version.
+ */
+#define __SLIBC_CONSTRUCT_VERSION(major, minor, micro, patch) \
+ (((major ## L) << (3 * 7)) | \
+ ((minor ## L) << (2 * 7)) | \
+ ((micro ## L) << (1 * 7)) | \
+ ((patch ## L) << (0 * 7)))
+
+
+/**
+ * The scalar integer describing the version
+ * of slibc you are compiling against.
+ *
+ * You can check if this header is defined to
+ * check whether you are using slibc at all.
+ */
+#define __SLIBC__ \
+ __SLIBC_CONSTRUCT_VERSION(__SLIBC_MAJOR__, __SLIBC_MINOR__, \
+ __SLIBC_MICRO__, __SLIBC_PATCH__)
+
+
+/**
+ * Test whether you are compiling against a
+ * specific version of slibc, or against any
+ * newer version of slibc.
+ *
+ * @param major The major-number of the least required version of slibc.
+ * @param minor The minor-number of the least required version of slibc.
+ * @param micro The micro-number of the least required version of slibc.
+ * @param patch The patch-number of the least required version of slibc.
+ */
+#define __SLIBC_REQ_4__(major, minor, micro, patch) \
+ (__SLIBC__ >= __SLIBC_CONSTRUCT_VERSION(major, minor, micro, patch))
+
+/**
+ * Test whether you are compiling against a
+ * specific version of slibc, or against any
+ * newer version of slibc.
+ *
+ * @param major The major-number of the least required version of slibc.
+ * @param minor The minor-number of the least required version of slibc.
+ * @param micro The micro-number of the least required version of slibc.
+ */
+#define __SLIBC_REQ_3__(major, minor, micro) \
+ __SLIBC_REQ_4__(major, minor, micro, patch)
+
+/**
+ * Test whether you are compiling against a
+ * specific version of slibc, or against any
+ * newer version of slibc.
+ *
+ * @param major The major-number of the least required version of slibc.
+ * @param minor The minor-number of the least required version of slibc.
+ */
+#define __SLIBC_REQ__(major, minor) \
+ __SLIBC_REQ_4__(major, minor, 0, 0)
+
+
+
+#endif
+
diff --git a/include/stddef.h b/include/stddef.h
index b8ad4ea..8a0ce5d 100644
--- a/include/stddef.h
+++ b/include/stddef.h
@@ -17,6 +17,7 @@
*/
#ifndef _STDDEF_H
#define _STDDEF_H
+#include <slibc/version.h>
diff --git a/include/stdint.h b/include/stdint.h
new file mode 100644
index 0000000..3486de3
--- /dev/null
+++ b/include/stdint.h
@@ -0,0 +1,422 @@
+/**
+ * slibc — Yet another C library
+ * Copyright © 2015 Mattias Andrée (maandree@member.fsf.org)
+ *
+ * This program 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.
+ *
+ * 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef _STDINT_H
+#define _STDINT_H
+#include <slibc/version.h>
+
+
+
+#define __NEED_intN_t
+#define __NEED_uintN_t
+#define __NEED_int_leastN_t
+#define __NEED_uint_leastN_t
+#define __NEED_int_fastN_t
+#define __NEED_uint_fastN_t
+#define __NEED_intptr_t
+#define __NEED_uintptr_t
+#define __NEED_intmax_t
+#define __NEED_uintmax_t
+
+#include <bits/types.h>
+
+
+
+/**
+ * Macro that ensure that a signed numeral literal
+ * of at most 8 encoding bits does not overflow.
+ */
+#define INT8_C(value) value
+
+/**
+ * Macro that ensure that an unsigned numeral literal
+ * of at most 8 encoding bits does not overflow.
+ */
+#define UINT8_C(value) value
+
+
+/**
+ * Macro that ensure that a signed numeral literal
+ * of at most 16 encoding bits does not overflow.
+ */
+#define INT16_C(value) value
+
+/**
+ * Macro that ensure that an unsigned numeral literal
+ * of at most 16 encoding bits does not overflow.
+ */
+#define UINT16_C(value) value # U
+
+
+/**
+ * Macro that ensure that a signed numeral literal
+ * of at most 32 encoding bits does not overflow.
+ */
+#if __INT_BITS == 16
+# define INT32_C(value) value # L
+#else
+# define INT32_C(value) value
+#end
+
+/**
+ * Macro that ensure that an unsigned numeral literal
+ * of at most 32 encoding bits does not overflow.
+ */
+#if __INT_BITS == 16
+# define UINT32_C(value) value # UL
+#else
+# define UINT32_C(value) value # U
+#end
+
+
+/**
+ * Macro that ensure that a signed numeral literal
+ * of at most 64 encoding bits does not overflow.
+ */
+#if __LONG_BITS == 32
+# define INT64_C(value) value # LL
+#else
+# define INT64_C(value) value # L
+#end
+
+/**
+ * Macro that ensure that an unsigned numeral literal
+ * of at most 64 encoding bits does not overflow.
+ */
+#if __LONG_BITS == 32
+# define UINT64_C(value) value # ULL
+#else
+# define UINT64_C(value) value # UL
+#end
+
+
+/**
+ * Macro that ensure that any signed numeral literal
+ * does not overflow, unless there is no scalar integer
+ * type that can hold it.
+ */
+#if __LONG_BITS == __LONG_LONG_BITS
+# define INTMAX_C(value) value # L
+#else
+# define INTMAX_C(value) value # LL
+#endif
+
+/**
+ * Macro that ensure that any unsigned numeral literal
+ * does not overflow, unless there is no scalar integer
+ * type that can hold it.
+ */
+#if __LONG_BITS == __LONG_LONG_BITS
+# define UINTMAX_C(value) value # UL
+#else
+# define UINTMAX_C(value) value # ULL
+#endif
+
+
+
+/**
+ * Maximum value of `uint8_t`.
+ */
+#define UINT8_MAX (UINT8_C(0xFF))
+
+/**
+ * Maximum value of `int8_t`.
+ */
+#define INT8_MAX (INT8_C(0x7F))
+
+/**
+ * Minimum value of `int8_t`.
+ */
+#define INT8_MIN (-(INT8_MAX) - 1)
+
+
+/**
+ * Maximum value of `uint16_t`.
+ */
+#define UINT16_MAX (UINT16_C(0xFFFF))
+
+/**
+ * Maximum value of `int16_t`.
+ */
+#define INT16_MAX (INT16_C(0x7FFF))
+
+/**
+ * Minimum value of `int16_t`.
+ */
+#define INT16_MIN (-(INT16_MAX) - 1)
+
+
+/**
+ * Maximum value of `uint32_t`.
+ */
+#define UINT32_MAX (UINT32_C(0xFFFFFFFF))
+
+/**
+ * Maximum value of `int32_t`.
+ */
+#define INT32_MAX (INT32_C(0x7FFFFFFF))
+
+/**
+ * Minimum value of `int32_t`.
+ */
+#define INT32_MIN (-(INT32_MAX) - 1)
+
+
+/**
+ * Maximum value of `uint64_t`.
+ */
+#define UINT64_MAX (UINT64_C(0xFFFFFFFFFFFFFFFF))
+
+/**
+ * Maximum value of `int64_t`.
+ */
+#define INT64_MAX (INT64_C(0x7FFFFFFFFFFFFFFF))
+
+/**
+ * Minimum value of `int64_t`.
+ */
+#define INT64_MIN (-(INT64_MAX) - 1)
+
+
+/**
+ * Maximum value of `uint_least8_t`.
+ */
+#define UINT_LEAST8_MAX UINT8_MAX
+
+/**
+ * Maximum value of `int_least8_t`.
+ */
+#define INT_LEAST8_MAX INT8_MAX
+
+/**
+ * Minimum value of `int_least8_t`.
+ */
+#define INT_LEAST8_MIN (__MAX_TO_MIN(INT_LEAST8_MAX))
+
+
+/**
+ * Maximum value of `uint_least16_t`.
+ */
+#define UINT_LEAST16_MAX UINT16_MAX
+
+/**
+ * Maximum value of `int_least16_t`.
+ */
+#define INT_LEAST16_MAX INT16_MAX
+
+/**
+ * Minimum value of `int_least16_t`.
+ */
+#define INT_LEAST16_MIN (__MAX_TO_MIN(INT_LEAST16_MAX))
+
+
+/**
+ * Maximum value of `uint_least32_t`.
+ */
+#define UINT_LEAST32_MAX UINT32_MAX
+
+/**
+ * Maximum value of `int_least32_t`.
+ */
+#define INT_LEAST32_MAX INT32_MAX
+
+/**
+ * Minimum value of `int_least32_t`.
+ */
+#define INT_LEAST32_MIN (__MAX_TO_MIN(INT_LEAST32_MAX))
+
+
+/**
+ * Maximum value of `uint_least64_t`.
+ */
+#define UINT_LEAST64_MAX UINT64_MAX
+
+/**
+ * Maximum value of `int_least64_t`.
+ */
+#define INT_LEAST64_MAX INT64_MAX
+
+/**
+ * Minimum value of `int_least64_t`.
+ */
+#define INT_LEAST64_MIN (__MAX_TO_MIN(INT_LEAST64_MAX))
+
+
+/**
+ * Maximum value of `uint_fast8_t`.
+ */
+#define UINT_FAST8_MAX __UINT_FAST8_MAX
+
+/**
+ * Maximum value of `int_fast8_t`.
+ */
+#define INT_FAST8_MAX __INT_FAST8_MAX
+
+/**
+ * Minimum value of `int_fast8_t`.
+ */
+#define INT_FAST8_MIN (__MAX_TO_MIN(INT_FAST8_MAX))
+
+
+/**
+ * Maximum value of `uint_fast16_t`.
+ */
+#define UINT_FAST16_MAX __UINT_FAST16_MAX
+
+/**
+ * Maximum value of `int_fast16_t`.
+ */
+#define INT_FAST16_MAX __INT_FAST16_MAX
+
+/**
+ * Minimum value of `int_fast16_t`.
+ */
+#define INT_FAST16_MIN (__MAX_TO_MIN(INT_FAST16_MAX))
+
+
+/**
+ * Maximum value of `uint_fast32_t`.
+ */
+#define UINT_FAST32_MAX __UINT_FAST32_MAX
+
+/**
+ * Maximum value of `int_fast32_t`.
+ */
+#define INT_FAST32_MAX __INT_FAST32_MAX
+
+/**
+ * Minimum value of `int_fast32_t`.
+ */
+#define INT_FAST32_MIN (__MAX_TO_MIN(INT_FAST32_MAX))
+
+
+/**
+ * Maximum value of `uint_fast64_t`.
+ */
+#define UINT_FAST64_MAX __UINT_FAST64_MAX
+
+/**
+ * Maximum value of `int_fast64_t`.
+ */
+#define INT_FAST64_MAX __INT_FAST64_MAX
+
+/**
+ * Minimum value of `int_fast64_t`.
+ */
+#define INT_FAST64_MIN (__MAX_TO_MIN(INT_FAST64_MAX))
+
+
+/**
+ * Maximum value of `uintmax_t`.
+ */
+#define UINTMAX_MAX __UINTMAX_MAX
+
+/**
+ * Maximum value of `intmax_t`.
+ */
+#define INTMAX_MAX __INTMAX_MAX
+
+/**
+ * Minimum value of `intmax_t`.
+ */
+#define INTMAX_MIN (__MAX_TO_MIN(INTMAX_MIN))
+
+
+/**
+ * Maximum value of `uintptr_t`.
+ */
+#if __LONG_BIT == 32
+# define UINTPTR_MAX UINT32_MAX
+#else
+# define UINTPTR_MAX UINT64_MAX
+#endif
+
+/**
+ * Maximum value of `intptr_t`.
+ */
+#if __LONG_BIT == 32
+# define INTPTR_MAX INT32_MAX
+#else
+# define INTPTR_MAX INT64_MAX
+#endif
+
+/**
+ * Minimum value of `intptr_t`.
+ */
+#define INTPTR_MIN (__MAX_TO_MIN(INTPTR_MAX))
+
+
+/**
+ * Maximum value of `size_t`.
+ */
+#define SIZE_MAX UINTPTR_MAX
+
+/**
+ * Maximum value of `ssize_t`.
+ */
+#define SSIZE_MAX INTPTR_MAX
+
+/**
+ * Minimum value of `ssize_t`.
+ */
+#define SSIZE_MIN INTPTR_MIN
+
+
+/**
+ * Maximum value of `wchar_t`.
+ */
+#define WCHAR_MAX __WCHAR_MAX
+
+/**
+ * Minimum value of `wchar_t`.
+ */
+#define WCHAR_MIN (__MAX_TO_MIN(WCHAR_MAX))
+
+
+/**
+ * Maximum value of `wint_t`.
+ */
+#define WINT_MAX WCHAR_MAX
+
+/**
+ * Minimum value of `wint_t`.
+ */
+#define WINT_MIN WCHAR_MIN
+
+
+/**
+ * Maximum value of `sig_atomic_t`.
+ */
+#if __SIG_ATOMIC_BIT == 8
+# define SIG_ATOMIC_MAX INT8_MAX
+#elif __SIG_ATOMIC_BIT == 16
+# define SIG_ATOMIC_MAX INT16_MAX
+#elif __SIG_ATOMIC_BIT == 32
+# define SIG_ATOMIC_MAX INT32_MAX
+#else
+# define SIG_ATOMIC_MAX INT64_MAX
+#endif
+
+/**
+ * Minimum value of `sig_atomic_t`.
+ */
+#define SIG_ATOMIC_MIN (__MAX_TO_MIN(__SIG_ATOMIC_MAX))
+
+
+
+#endif
+