iff
set	stdio ast_common.h
set	include .

cat{
	#ifndef _AST_WCHAR_H
	#define _AST_WCHAR_H	1
	#if defined(__FreeBSD__) || defined(__DragonFly__)
	#define _STDFILE_DECLARED 1
	#endif
}end

lib	mbstowcs,wctomb,wcrtomb,wcslen,wcstombs,wcwidth stdlib.h stdio.h wchar.h
lib	towlower,towupper stdlib.h stdio.h wchar.h
typ	mbstate_t stdlib.h stdio.h wchar.h
nxt	wchar

run{
cat <<!
	#ifndef _SFSTDIO_H
	#include <ast_common.h>
	#include <stdio.h>
	#endif

	#if _hdr_wchar && defined(_nxt_wchar)
	#include ${_nxt_wchar-_nxt_wchar}	/* the native wchar.h */
	#endif
!
}end

if	tst note{ <wchar.h> requires native <stdio.h> }end nocompile{
		/*<NOSTDIO>*/
		#define _STDIO_INCLUDED 1
		#define FILE		void
		#include <wchar.h>
		int tst;
	}end
	if	tst note{ <stdio.h> defines __va_list for <wchar.h> }end compile{
			/*<NOSTDIO>*/
			#define _STDIO_INCLUDED 1
			#define FILE		void
			#include <stdarg.h>
			#define __va_list	va_list
			#include <wchar.h>
			int tst;
		}end && {
			#define __va_list va_list
		}
	endif
endif

if	hdr - wctype wchar.h
	if	! npt - iswalpha wchar.h {
			#include <wctype.h> /* <wchar.h> includes <wctype.h> */
		}
	endif
endif

tst	iswpunct_broken note{ is iswpunct(3) broken }end execute{
	/* on Android 14.0, it is: it does not recognise some of the ASCII characters. ispunct(3) is fine */
	#include <ctype.h>
	#include <wctype.h>
	int main(void)
	{
		char c[] = { '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', ':', ';',
				'<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`', '{', '|', '}', '~', '\0' };
		int i;
		for (i = 0; c[i]; i++)
			if (ispunct(c[i]) && !iswpunct(c[i]))
				return 0;
		return 1;
	}
}end

run{
cat <<!
	#ifndef WEOF
	#define WEOF		(-1)
	#endif

	#undef	fgetwc
	#undef	fgetws
	#undef	fputwc
	#undef	fputws
	#undef	getwc
	#undef	getwchar
	#undef	getws
	#undef	putwc
	#undef	putwchar
	#undef	ungetwc

	#define fgetwc		_ast_fgetwc
	#define fgetws		_ast_fgetws
	#define fputwc		_ast_fputwc
	#define fputws		_ast_fputws
	#define fwide		_ast_fwide
	#define fwprintf	_ast_fwprintf
	#define fwscanf		_ast_fwscanf
	#define getwc		_ast_getwc
	#define getwchar	_ast_getwchar
	#define getws		_ast_getws
	#define putwc		_ast_putwc
	#define putwchar	_ast_putwchar
	#define swprintf	_ast_swprintf
	#define swscanf		_ast_swscanf
	#define ungetwc		_ast_ungetwc
	#define vfwprintf	_ast_vfwprintf
	#define vfwscanf	_ast_vfwscanf
	#define vswprintf	_ast_vswprintf
	#define vswscanf	_ast_vswscanf
	#define vwprintf	_ast_vwprintf
	#define vwscanf		_ast_vwscanf
	#define wprintf		_ast_wprintf
	#define wscanf		_ast_wscanf

	#if !_typ_mbstate_t
	#undef	_typ_mbstate_t
	#define _typ_mbstate_t	1
	typedef char mbstate_t;
	#endif

	#if !_lib_mbstowcs
	extern size_t		mbstowcs(wchar_t*, const char*, size_t);
	#endif
	#if !_lib_wctomb
	extern int		wctomb(char*, wchar_t);
	#endif
	#if !_lib_wcrtomb
	extern size_t		wcrtomb(char*, wchar_t, mbstate_t*);
	#endif
	#if !_lib_wcslen
	extern size_t		wcslen(const wchar_t*);
	#endif
	#if !_lib_wcstombs
	extern size_t		wcstombs(char*, const wchar_t*, size_t);
	#endif

	extern int		fwprintf(FILE*, const wchar_t*, ...);
	extern int		fwscanf(FILE*, const wchar_t*, ...);
	extern wint_t		fgetwc(FILE*);
	extern wchar_t*		fgetws(wchar_t*, int, FILE*);
	extern wint_t		fputwc(wchar_t, FILE*);
	extern int		fputws(const wchar_t*, FILE*);
	extern int		fwide(FILE*, int);
	extern wint_t		getwc(FILE*);
	extern wint_t		getwchar(void);
	extern wchar_t*		getws(wchar_t*);
	extern wint_t		putwc(wchar_t, FILE*);
	extern wint_t		putwchar(wchar_t);
	extern int		swprintf(wchar_t*, size_t, const wchar_t*, ...);
	extern int		swscanf(const wchar_t*, const wchar_t*, ...);
	extern wint_t		ungetwc(wint_t, FILE*);
	extern int		vfwprintf(FILE*, const wchar_t*, va_list);
	extern int		vfwscanf(FILE*, const wchar_t*, va_list);
	extern int		vwprintf(const wchar_t*, va_list);
	extern int		vwscanf(const wchar_t*, va_list);
	extern int		vswprintf(wchar_t*, size_t, const wchar_t*, va_list);
	extern int		vswscanf(const wchar_t*, const wchar_t*, va_list);
	extern int		wprintf(const wchar_t*, ...);
	extern int		wscanf(const wchar_t*, ...);

	#undef	extern

	#else

	/* on some systems <wchar.h> is included multiple times with multiple effects */

	#if _hdr_wchar && defined(_nxt_wchar)
	#include ${_nxt_wchar-_nxt_wchar}	/* the native wchar.h */
	#endif

	#endif
!
}end
