[BACK]Return to uchar.h CVS log [TXT][DIR] Up to [local] / src / include

File: [local] / src / include / uchar.h (download)

Revision 1.2, Tue Sep 5 23:16:01 2023 UTC (8 months, 1 week ago) by schwarze
Branch: MAIN
CVS Tags: OPENBSD_7_5_BASE, OPENBSD_7_5, OPENBSD_7_4_BASE, OPENBSD_7_4, HEAD
Changes since 1.1: +3 -1 lines

According to the C11 standard, char32_t and char16_t are not part
of the C language but are part of the C library and have to be
declared in <uchar.h> - see paragraph 7.28.2.

In stark contrast, according to the C++11 standard, char32_t and char16_t
are part of the C++ language, namely, keywords - see paragraph 2.12.1.
Consequently, they must not be declared in a header file.

To resolve this vile contradiction, use the predefined macro __cplusplus
to find out which language is in use for the current compilation unit -
see C11 paragraph 6.10.8.3 and C++11 paragraph 16.8.1.

Reminded of the problem by naddy@.
OK naddy@ who tested in make build / make release.
Looks reasonable to millert@.

/*	$OpenBSD: uchar.h,v 1.2 2023/09/05 23:16:01 schwarze Exp $	*/
/*
 * Written by Ingo Schwarze <schwarze@openbsd.org>
 * and placed in the public domain on March 19, 2022.
 */

#ifndef _UCHAR_H_
#define _UCHAR_H_

#include <sys/cdefs.h>
#include <sys/_types.h>

#ifndef _MBSTATE_T_DEFINED_
#define _MBSTATE_T_DEFINED_
typedef __mbstate_t	mbstate_t;
#endif

#ifndef _SIZE_T_DEFINED_
#define _SIZE_T_DEFINED_
typedef __size_t	size_t;
#endif

#define __STDC_UTF_16__	1
#define __STDC_UTF_32__	1

#if !defined(__cplusplus) || __cplusplus < 201103L
typedef __uint16_t	char16_t;
typedef __uint32_t	char32_t;
#endif

__BEGIN_DECLS
size_t	mbrtoc16(char16_t * __restrict, const char * __restrict, size_t,
	    mbstate_t * __restrict);
size_t	c16rtomb(char * __restrict, char16_t, mbstate_t * __restrict);
size_t	mbrtoc32(char32_t * __restrict, const char * __restrict, size_t,
	    mbstate_t * __restrict);
size_t	c32rtomb(char * __restrict, char32_t, mbstate_t * __restrict);
__END_DECLS

#endif /* !_UCHAR_H_ */