1234353Sdim/*
2224133Sdim * Copyright 2008-2012 Haiku, Inc. All Rights Reserved.
3224133Sdim * Distributed under the terms of the MIT License.
4224133Sdim */
5224133Sdim#ifndef _WCHAR_H
6224133Sdim#define _WCHAR_H
7224133Sdim
8224133Sdim
9224133Sdim#include <limits.h>
10224133Sdim#include <locale_t.h>
11224133Sdim#include <stddef.h>
12224133Sdim#include <stdio.h>
13224133Sdim#include <time.h>
14224133Sdim
15276479Sdim
16224133Sdim/* stddef.h is not supposed to define wint_t, but gcc 2.95.3's one does.
17262613Sdim * In all other cases we will do that. */
18226633Sdim#ifndef _WINT_T
19224133Sdim#define _WINT_T
20224133Sdim
21224133Sdim#ifndef __WINT_TYPE__
22234353Sdim#define __WINT_TYPE__ unsigned int
23226633Sdim#endif
24224133Sdim
25276479Sdimtypedef __WINT_TYPE__ wint_t;
26276479Sdim
27224133Sdim#endif	/* _WINT_T */
28224133Sdim
29224133Sdimtypedef int wctype_t;
30224133Sdim
31224133Sdimtypedef struct {
32224133Sdim	void* converter;
33224133Sdim	char charset[64];
34224133Sdim	unsigned int count;
35224133Sdim	char data[1024 + 8];	/* 1024 bytes for data, 8 for alignment space */
36262613Sdim} mbstate_t;
37288943Sdim
38262613Sdim
39262613Sdim#define WEOF		((wint_t)(-1))
40276479Sdim
41262613Sdim#define WCHAR_MIN	0x00000000UL
42262613Sdim#define WCHAR_MAX	0x7FFFFFFFUL
43262613Sdim
44262613Sdim/*
45262613Sdim * Haiku is always using UTF32 in wchars, other encodings can be handled
46288943Sdim * by converting to/from wchar by means of mbrtowc() or wcrtomb().
47262613Sdim */
48262613Sdim
49276479Sdim
50262613Sdim#ifdef __cplusplus
51262613Sdimextern "C" {
52262613Sdim#endif
53262613Sdim
54224133Sdimextern wint_t	btowc(int);
55224133Sdim
56224133Sdimextern wint_t	fgetwc(FILE *stream);
57224133Sdimextern wchar_t	*fgetws(wchar_t *dest, int destLength, FILE *stream);
58224133Sdimextern wint_t	fputwc(wchar_t wc, FILE *stream);
59224133Sdimextern int		fputws(const wchar_t *wcs, FILE *stream);
60288943Sdimextern int		fwide(FILE *stream, int mode);
61226633Sdimextern int		fwprintf(FILE *stream, const wchar_t *format, ...);
62262613Sdimextern int		fwscanf(FILE *stream, const wchar_t *format, ...);
63226633Sdimextern wint_t	getwc(FILE *stream);
64224133Sdimextern wint_t	getwchar(void);
65224133Sdim
66288943Sdimextern size_t 	mbrlen(const char *s, size_t n, mbstate_t *mbState);
67288943Sdimextern size_t 	mbrtowc(wchar_t *dest, const char *src, size_t srcLength,
68276479Sdim					mbstate_t *mbState);
69288943Sdimextern int		mbsinit(const mbstate_t *mbState);
70288943Sdimextern size_t	mbsnrtowcs(wchar_t *dest, const char **src, size_t srcLength,
71224133Sdim					size_t destLength, mbstate_t *mbState);
72224133Sdimextern size_t	mbsrtowcs(wchar_t *dest, const char **src, size_t destLength,
73251662Sdim					mbstate_t *mbState);
74251662Sdim
75251662Sdimextern wint_t	putwc(wchar_t wc, FILE *stream);
76251662Sdimextern wint_t	putwchar(wchar_t wc);
77251662Sdim
78251662Sdimextern int		swprintf(wchar_t *dest, size_t destLength,
79251662Sdim					const wchar_t *format, ...);
80251662Sdimextern int		swscanf(const wchar_t *wcs, const wchar_t *format, ...);
81251662Sdim
82251662Sdimextern wint_t	ungetwc(wint_t wc, FILE *stream);
83251662Sdim
84288943Sdimextern int		vfwprintf(FILE *stream, const wchar_t *format, va_list arg);
85288943Sdimextern int		vfwscanf(FILE *stream, const wchar_t *format, va_list arg);
86234353Sdimextern int		vswprintf(wchar_t *dest, size_t destLength,
87234353Sdim					const wchar_t *format, va_list arg);
88226633Sdimextern int		vswscanf(const wchar_t *wcs, const wchar_t *format,
89251662Sdim					va_list arg);
90262613Sdimextern int		vwprintf(const wchar_t *format, va_list arg);
91262613Sdimextern int		vwscanf(const wchar_t *format, va_list arg);
92262613Sdim
93262613Sdimextern wchar_t	*wcpcpy(wchar_t *dest, const wchar_t *src);
94262613Sdimextern wchar_t	*wcpncpy(wchar_t *dest, const wchar_t *src, size_t srcLength);
95262613Sdimextern size_t   wcrtomb(char *dest, wchar_t wc, mbstate_t *mbState);
96262613Sdimextern int		wcscasecmp(const wchar_t *wcs1, const wchar_t *wcs2);
97251662Sdimextern int		wcscasecmp_l(const wchar_t *wcs1, const wchar_t *wcs2, locale_t locale);
98288943Sdimextern wchar_t	*wcscat(wchar_t *dest, const wchar_t *src);
99226633Sdimextern wchar_t	*wcschr(const wchar_t *wcs, wchar_t wc);
100224133Sdim#ifdef _GNU_SOURCE
101224133Sdimextern wchar_t	*wcschrnul(const wchar_t *wcs, wchar_t wc);
102288943Sdim#endif
103288943Sdimextern int      wcscmp(const wchar_t *wcs1, const wchar_t *wcs2);
104251662Sdimextern int      wcscoll(const wchar_t *wcs1, const wchar_t *wcs2);
105251662Sdimextern int		wcscoll_l(const wchar_t *wcs1, const wchar_t *wcs2, locale_t locale);
106251662Sdimextern wchar_t	*wcscpy(wchar_t *dest, const wchar_t *src);
107251662Sdimextern size_t	wcscspn(const wchar_t *wcs, const wchar_t *reject);
108262613Sdimextern wchar_t	*wcsdup(const wchar_t *wcs);
109262613Sdimextern size_t	wcsftime(wchar_t *dest, size_t destLength,
110262613Sdim					const wchar_t *format, const struct tm *timeptr);
111262613Sdimextern size_t	wcslcat(wchar_t *dest, const wchar_t *src, size_t maxLength);
112262613Sdimextern size_t	wcslcpy(wchar_t *dest, const wchar_t *src, size_t maxLength);
113262613Sdimextern size_t	wcslen(const wchar_t *wcs);
114262613Sdimextern int		wcsncasecmp(const wchar_t *wcs1, const wchar_t *wcs2,
115262613Sdim					size_t maxLength);
116262613Sdimextern int		wcsncasecmp_l(const wchar_t *wcs1, const wchar_t *wcs2,
117262613Sdim					size_t maxLength, locale_t locale);
118262613Sdimextern wchar_t 	*wcsncat(wchar_t *dest, const wchar_t *src, size_t srcLength);
119251662Sdimextern int		wcsncmp(const wchar_t *wcs1, const wchar_t *wcs2,
120288943Sdim					size_t length);
121251662Sdimextern wchar_t	*wcsncpy(wchar_t *dest, const wchar_t *src, size_t srcLength);
122251662Sdimextern size_t	wcsnlen(const wchar_t *wcs, size_t maxLength);
123262613Sdimextern size_t   wcsnrtombs(char *dest, const wchar_t **src, size_t srcLength,
124288943Sdim					size_t destLength, mbstate_t *mbState);
125288943Sdimextern wchar_t	*wcspbrk(const wchar_t *wcs, const wchar_t *accept);
126288943Sdimextern wchar_t	*wcsrchr(const wchar_t *wcs, wchar_t wc);
127262613Sdimextern size_t   wcsrtombs(char *dest, const wchar_t **src, size_t destLength,
128262613Sdim					mbstate_t *mbState);
129288943Sdimextern size_t	wcsspn(const wchar_t *wcs, const wchar_t *accept);
130288943Sdimextern wchar_t	*wcsstr(const wchar_t *haystack, const wchar_t *needle);
131288943Sdimextern double	wcstod(const wchar_t *wcs, wchar_t **endPtr);
132288943Sdimextern float	wcstof(const wchar_t *wcs, wchar_t **endPtr);
133288943Sdimextern wchar_t	*wcstok(wchar_t *wcs1, const wchar_t *wcs2, wchar_t **ptr);
134262613Sdimextern long		wcstol(const wchar_t *wcs, wchar_t **endPtr, int base);
135262613Sdimextern long double	wcstold(const wchar_t *wcs, wchar_t **endPtr);
136288943Sdimextern long long	wcstoll(const wchar_t *wcs, wchar_t **endPtr, int base);
137288943Sdimextern unsigned long	wcstoul(const wchar_t *wcs, wchar_t **endPtr,
138288943Sdim							int base);
139288943Sdimextern unsigned long long	wcstoull(const wchar_t *wcs, wchar_t **endPtr,
140288943Sdim								int base);
141288943Sdimextern wchar_t	*wcswcs(const wchar_t *haystack, const wchar_t *needle);
142262613Sdimextern int		wcswidth(const wchar_t *wcs, size_t length);
143262613Sdimextern size_t	wcsxfrm(wchar_t *dest, const wchar_t *src, size_t destLength);
144226633Sdimextern size_t	wcsxfrm_l(wchar_t *dest, const wchar_t *src, size_t destLength,
145226633Sdim					locale_t locale);
146262613Sdimextern int		wctob(wint_t wc);
147262613Sdimextern int		wcwidth(wchar_t wc);
148288943Sdimextern wchar_t	*wmemchr(const wchar_t *wcs, wchar_t wc, size_t n);
149226633Sdimextern int		wmemcmp(const wchar_t *wcs1, const wchar_t *wcs2, size_t n);
150288943Sdimextern wchar_t	*wmemcpy(wchar_t *dest, const wchar_t *src, size_t n);
151288943Sdimextern wchar_t	*wmemmove(wchar_t *dest, const wchar_t *src, size_t n);
152288943Sdim#ifdef _GNU_SOURCE
153226633Sdimextern wchar_t	*wmempcpy(wchar_t *dest, const wchar_t *src, size_t n);
154288943Sdim#endif
155288943Sdimextern wchar_t	*wmemset(wchar_t *dest, wchar_t wc, size_t n);
156226633Sdim
157288943Sdimextern int		wprintf(const wchar_t *format, ...);
158288943Sdimextern int		wscanf(const wchar_t *format, ...);
159226633Sdim
160288943Sdim#ifdef __cplusplus
161288943Sdim}
162262613Sdim#endif
163288943Sdim
164288943Sdim#endif /* _WCHAR_H */
165262613Sdim