/*  $OpenBSD: wchar.h,v 1.11 2010/07/24 09:58:39 guenther Exp $ */
/*  $NetBSD: wchar.h,v 1.16 2003/03/07 07:11:35 tshiozak Exp $  */

/*-
 * Copyright (c)1999 Citrus Project,
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

/*-
 * Copyright (c) 1999, 2000 The NetBSD Foundation, Inc.
 * All rights reserved.
 *
 * This code is derived from software contributed to The NetBSD Foundation
 * by Julian Coleman.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef _WCHAR_H_
#define _WCHAR_H_

#include <sys/cdefs.h>
#include <sys/_types.h>
#include <sys/stdint.h> /* WCHAR_MAX/WCHAR_MIN */

#ifndef NULL
#ifdef __cplusplus
#define NULL    0
#else
#define NULL    ((void *)0)
#endif
#endif

#if !defined(_WCHAR_T_DEFINED_) && !defined(__cplusplus)
#define _WCHAR_T_DEFINED_
#ifndef __WCHAR_TYPE__
#define __WCHAR_TYPE__ int
#endif
typedef __WCHAR_TYPE__ wchar_t;
#endif

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

#ifndef _WINT_T_DEFINED_
#define _WINT_T_DEFINED_
typedef __wint_t    wint_t;
#endif

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

#ifndef WEOF
#define WEOF    ((wint_t)-1)
#endif

__BEGIN_DECLS

wint_t      _TLIBC_CDECL_ btowc(int);
int         _TLIBC_CDECL_ wctob(wint_t);
size_t      _TLIBC_CDECL_ mbrlen(const char *, size_t, mbstate_t *);
size_t      _TLIBC_CDECL_ mbrtowc(wchar_t *, const char *, size_t, mbstate_t *);
int         _TLIBC_CDECL_ mbsinit(const mbstate_t *);
size_t      _TLIBC_CDECL_ mbsrtowcs(wchar_t *, const char **, size_t, mbstate_t *);
size_t      _TLIBC_CDECL_ wcrtomb(char *, wchar_t, mbstate_t *);
wchar_t *   _TLIBC_CDECL_ wcschr(const wchar_t *, wchar_t);
int         _TLIBC_CDECL_ wcscmp(const wchar_t *, const wchar_t *);
int         _TLIBC_CDECL_ wcscoll(const wchar_t *, const wchar_t *);
size_t      _TLIBC_CDECL_ wcscspn(const wchar_t *, const wchar_t *);
size_t      _TLIBC_CDECL_ wcslen(const wchar_t *);
wchar_t *   _TLIBC_CDECL_ wcsncat(wchar_t *, const wchar_t *, size_t);
int         _TLIBC_CDECL_ wcsncmp(const wchar_t *, const wchar_t *, size_t);
wchar_t *   _TLIBC_CDECL_ wcsncpy(wchar_t *, const wchar_t *, size_t);
wchar_t *   _TLIBC_CDECL_ wcspbrk(const wchar_t *, const wchar_t *);
wchar_t *   _TLIBC_CDECL_ wcsrchr(const wchar_t *, wchar_t);
size_t      _TLIBC_CDECL_ wcsrtombs(char *, const wchar_t **, size_t, mbstate_t *);
size_t      _TLIBC_CDECL_ wcsspn(const wchar_t *, const wchar_t *);
wchar_t *   _TLIBC_CDECL_ wcsstr(const wchar_t *, const wchar_t *);
wchar_t *   _TLIBC_CDECL_ wcstok(wchar_t *, const wchar_t *, wchar_t **);
size_t      _TLIBC_CDECL_ wcsxfrm(wchar_t *, const wchar_t *, size_t);
wchar_t *   _TLIBC_CDECL_ wmemchr(const wchar_t *, wchar_t, size_t);
int         _TLIBC_CDECL_ wmemcmp(const wchar_t *, const wchar_t *, size_t);
wchar_t *   _TLIBC_CDECL_ wmemcpy(wchar_t *, const wchar_t *, size_t);
wchar_t *   _TLIBC_CDECL_ wmemmove(wchar_t *, const wchar_t *, size_t);
wchar_t *   _TLIBC_CDECL_ wmemset(wchar_t *, wchar_t, size_t);

int         _TLIBC_CDECL_ swprintf(wchar_t *, size_t, const wchar_t *, ...);
int         _TLIBC_CDECL_ vswprintf(wchar_t *, size_t, const wchar_t *, __va_list);

long double         _TLIBC_CDECL_ wcstold (const wchar_t *, wchar_t **);
long long           _TLIBC_CDECL_ wcstoll (const wchar_t *, wchar_t **, int);
unsigned long long  _TLIBC_CDECL_ wcstoull (const wchar_t *, wchar_t **, int);

/* leagcy version of wcsstr */
wchar_t *   _TLIBC_CDECL_ wcswcs(const wchar_t *, const wchar_t *);

__END_DECLS

#endif /* !_WCHAR_H_ */
