master
  1/*	$NetBSD: featuretest.h,v 1.10.66.1 2024/10/11 18:51:20 martin Exp $	*/
  2
  3/*
  4 * Written by Klaus Klein <kleink@NetBSD.org>, February 2, 1998.
  5 * Public domain.
  6 *
  7 * NOTE: Do not protect this header against multiple inclusion.  Doing
  8 * so can have subtle side-effects due to header file inclusion order
  9 * and testing of e.g. _POSIX_SOURCE vs. _POSIX_C_SOURCE.  Instead,
 10 * protect each CPP macro that we want to supply.
 11 */
 12
 13/*
 14 * Feature-test macros are defined by several standards, and allow an
 15 * application to specify what symbols they want the system headers to
 16 * expose, and hence what standard they want them to conform to.
 17 * There are two classes of feature-test macros.  The first class
 18 * specify complete standards, and if one of these is defined, header
 19 * files will try to conform to the relevant standard.  They are:
 20 *
 21 * ANSI macros:
 22 * _ANSI_SOURCE			ANSI C89
 23 *
 24 * POSIX macros:
 25 * _POSIX_SOURCE == 1		IEEE Std 1003.1 (version?)
 26 * _POSIX_C_SOURCE == 1		IEEE Std 1003.1-1990
 27 * _POSIX_C_SOURCE == 2		IEEE Std 1003.2-1992
 28 * _POSIX_C_SOURCE == 199309L	IEEE Std 1003.1b-1993
 29 * _POSIX_C_SOURCE == 199506L	ISO/IEC 9945-1:1996
 30 * _POSIX_C_SOURCE == 200112L	IEEE Std 1003.1-2001
 31 * _POSIX_C_SOURCE == 200809L   IEEE Std 1003.1-2008
 32 *
 33 * X/Open macros:
 34 * _XOPEN_SOURCE		System Interfaces and Headers, Issue 4, Ver 2
 35 * _XOPEN_SOURCE_EXTENDED == 1	XSH4.2 UNIX extensions
 36 * _XOPEN_SOURCE == 500		System Interfaces and Headers, Issue 5
 37 * _XOPEN_SOURCE == 520		Networking Services (XNS), Issue 5.2
 38 * _XOPEN_SOURCE == 600		IEEE Std 1003.1-2001, XSI option
 39 * _XOPEN_SOURCE == 700		IEEE Std 1003.1-2008, XSI option
 40 *
 41 * NetBSD macros:
 42 * _NETBSD_SOURCE == 1		Make all NetBSD features available.
 43 *
 44 * If more than one of these "major" feature-test macros is defined,
 45 * then the set of facilities provided (and namespace used) is the
 46 * union of that specified by the relevant standards, and in case of
 47 * conflict, the earlier standard in the above list has precedence (so
 48 * if both _POSIX_C_SOURCE and _NETBSD_SOURCE are defined, the version
 49 * of rename() that's used is the POSIX one).  If none of the "major"
 50 * feature-test macros is defined, _NETBSD_SOURCE is assumed.
 51 *
 52 * There are also "minor" feature-test macros, which enable extra
 53 * functionality in addition to some base standard.  They should be
 54 * defined along with one of the "major" macros.  The "minor" macros
 55 * are:
 56 *
 57 * _REENTRANT
 58 * _ISOC99_SOURCE
 59 * _ISOC11_SOURCE
 60 * _LARGEFILE_SOURCE		Large File Support
 61 *		<http://ftp.sas.com/standards/large.file/x_open.20Mar96.html>
 62 */
 63
 64#if defined(_POSIX_SOURCE) && !defined(_POSIX_C_SOURCE)
 65#define _POSIX_C_SOURCE	1L
 66#endif
 67
 68#if !defined(_ANSI_SOURCE) && !defined(_POSIX_C_SOURCE) && \
 69    !defined(_XOPEN_SOURCE) && !defined(_NETBSD_SOURCE)
 70#define _NETBSD_SOURCE 1
 71#endif
 72
 73#if ((_POSIX_C_SOURCE - 0) >= 199506L || (_XOPEN_SOURCE - 0) >= 500) && \
 74    !defined(_REENTRANT)
 75#define _REENTRANT
 76#endif
 77
 78/*
 79 * The _XOPEN_SOURCE namespaces are supersets of corresponding
 80 * _POSIX_C_SOURCE namespaces, so to keep the namespace tests in header
 81 * files simpler, if _XOPEN_SOURCE is defined but _POSIX_C_SOURCE is
 82 * not, define _POSIX_C_SOURCE to the corresponding value.
 83 */
 84#if defined(_XOPEN_SOURCE) && !defined(_POSIX_C_SOURCE)
 85
 86/*
 87 * `[I]f _XOPEN_SOURCE is set equal to 800 and _POSIX_C_SOURCE is set
 88 *  equal to 202405L, the behavior is the same as if only _XOPEN_SOURCE
 89 *  is defined and set equal to 800.
 90 *
 91 * IEEE Std 1003.1-2024, 2.2.1.2 `The _XOPEN_SOURCE Feature Test Macro'
 92 * https://pubs.opengroup.org/onlinepubs/9799919799.2024edition/functions/V2_chap02.html#tag_16_02_01_02
 93 */
 94#if (_XOPEN_SOURCE - 0) == 800
 95#define	_POSIX_C_SOURCE	202405L
 96
 97/*
 98 * `[I]f _XOPEN_SOURCE is set equal to 700 and _POSIX_C_SOURCE is set
 99 *  equal to 200809L, the behavior is the same as if only _XOPEN_SOURCE
100 *  is defined and set equal to 700.'
101 *
102 * IEEE Std 1003.1-2008, 2.2.1 `POSIX.1 Symbols', subsection `The
103 * _XOPEN_SOURCE Feature Test Macro'
104 * https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/functions/V2_chap02.html
105 */
106#elif (_XOPEN_SOURCE - 0) == 700
107#define	_POSIX_C_SOURCE	200809L
108
109/*
110 * `[I]f _XOPEN_SOURCE is set equal to 600 and _POSIX_C_SOURCE is set
111 *  equal to 200112L, the behavior is the same as if only _XOPEN_SOURCE
112 *  is defined and set equal to 600.'
113 *
114 * IEEE Std 1003.1-2001, 2.2.1 `POSIX.1 Symbols', subsection `The
115 * _XOPEN_SOURCE Feature Test Macro'
116 * https://pubs.opengroup.org/onlinepubs/007904875/functions/xsh_chap02_02.html
117 */
118#elif (_XOPEN_SOURCE - 0) == 600
119#define	_POSIX_C_SOURCE	200112L
120
121/*
122 * `[I]f _XOPEN_SOURCE is set equal to 500 and _POSIX_SOURCE is
123 *  defined, or _POSIX_C_SOURCE is set greater than zero and less than
124 *  or equal to 199506L, the behaviour is the same as if only
125 *  _XOPEN_SOURCE is defined and set equal to 500.'
126 *
127 * Single UNIX Specification, Version 2, `The Compilation Environment'
128 * https://pubs.opengroup.org/onlinepubs/007908799/xsh/compilation.html
129 */
130#elif (_XOPEN_SOURCE - 0) == 500
131#define	_POSIX_C_SOURCE	199506L
132#endif
133
134#endif