Edit

IABSD.fr/src/include/uchar.h

Branch :

  • Show log

    Commit

  • Author : schwarze
    Date : 2023-09-05 23:16:01
    Hash : ee970480
    Message : 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@.

  • include/uchar.h
  • /*	$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_ */