// -*- C++ -*-
/***************************************************************************
 *
 * cwchar - C++ Standard library interface to the ANSI C header wchar.h
 *
 * $Id$
 *
 ***************************************************************************
 *
 * Licensed to the Apache Software  Foundation (ASF) under one or more
 * contributor  license agreements.  See  the NOTICE  file distributed
 * with  this  work  for  additional information  regarding  copyright
 * ownership.   The ASF  licenses this  file to  you under  the Apache
 * License, Version  2.0 (the  "License"); you may  not use  this file
 * except in  compliance with the License.   You may obtain  a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the  License is distributed on an  "AS IS" BASIS,
 * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
 * implied.   See  the License  for  the  specific language  governing
 * permissions and limitations under the License.
 *
 * Copyright 1994-2006 Rogue Wave Software.
 * 
 **************************************************************************/

#ifndef _RWSTD_CWCHAR_H_INCLUDED
#define _RWSTD_CWCHAR_H_INCLUDED


#include <rw/_mbstate.h>   // for _RWSTD_MBSTATE_T
#include <rw/_defs.h>


_RWSTD_NAMESPACE (std) {


#ifndef NULL
#  define NULL 0
#endif   // NULL

#ifdef _RWSTD_SIZE_T
typedef _RWSTD_SIZE_T size_t;
#else
typedef unsigned long size_t;
#endif   // _RWSTD_SIZE_T

extern "C" {

// _RWSTD_MBSTATE_T is defined in <rw/_mbstate.h>
typedef _RWSTD_MBSTATE_T mbstate_t;

struct tm;

#ifndef WCHAR_MIN
#  define WCHAR_MIN _RWSTD_WCHAR_T_MIN
#endif   // WCHAR_MIN

#ifndef WCHAR_MAX
#  define WCHAR_MAX _RWSTD_WCHAR_T_MAX
#endif   // WCHAR_MAX

#ifndef WEOF
#  define WEOF _RWSTD_WEOF
#endif   // WEOF

#ifndef _RWSTD_NO_WINT_T
typedef _RWSTD_WINT_T wint_t;
#else
typedef int wint_t;
#endif   // _RWSTD_NO_WINT_T

// declared, not defined (FILE need not be a complete type)
struct FILE;

int fwprintf (FILE*, const wchar_t*, ...);
int fwscanf (FILE*, const wchar_t*, ...);
int wprintf (const wchar_t*, ...);
int wscanf (const wchar_t*, ...);
int swprintf (wchar_t*, size_t, const wchar_t*, ...);
int swscanf (const wchar_t*, const wchar_t*, ...);
int vfwprintf (FILE*, const wchar_t *format, _RWSTD_VA_LIST);
int vwprintf (const wchar_t*, _RWSTD_VA_LIST);
int vswprintf (wchar_t*, size_t, const wchar_t*, _RWSTD_VA_LIST);
wint_t fgetwc (FILE*);
wchar_t* fgetws (wchar_t*, int, FILE*);
wint_t fputwc (wchar_t, FILE*);
int fputws (const wchar_t*, FILE*);
wint_t getwc (FILE*);
wint_t getwchar();
wint_t putwc (wchar_t, FILE*);
wint_t putwchar (wchar_t);
wint_t ungetwc (wint_t, FILE*);
int fwide (FILE*, int);
double wcstod (const wchar_t*, wchar_t**);
long int wcstol (const wchar_t*, wchar_t**, int);
unsigned long int wcstoul (const wchar_t*, wchar_t**, int);
wchar_t* wcscpy (wchar_t*, const wchar_t*);
wchar_t* wcsncpy (wchar_t*, const wchar_t*, size_t);
wchar_t* wcscat (wchar_t*, const wchar_t*);
wchar_t* wcsncat (wchar_t*, const wchar_t*, size_t);
int wcscmp (const wchar_t*, const wchar_t*);
int wcscoll (const wchar_t*, const wchar_t*);
int wcsncmp (const wchar_t*, const wchar_t*, size_t);
size_t wcsxfrm (wchar_t*, const wchar_t*, size_t);
wchar_t* wcschr (wchar_t*, wchar_t);
size_t wcscspn (const wchar_t*, const wchar_t*);
wchar_t* wcspbrk (wchar_t*, const wchar_t*);
wchar_t* wcsrchr (wchar_t*, wchar_t);
size_t wcsspn (const wchar_t*, const wchar_t*);
wchar_t* wcsstr (wchar_t*, const wchar_t*);
wchar_t* wcstok (wchar_t*, const wchar_t*, wchar_t**);
size_t wcslen (const wchar_t*);
wchar_t* wmemchr (wchar_t*, wchar_t, size_t);
int wmemcmp (const wchar_t*, const wchar_t*, size_t);
wchar_t* wmemcpy (wchar_t*, const wchar_t*, size_t);
wchar_t* wmemmove (wchar_t*, const wchar_t*, size_t);
wchar_t* wmemset (wchar_t*, wchar_t, size_t);

size_t wcsftime (wchar_t*, size_t, const wchar_t*, const struct tm*);
wint_t btowc (int);
int wctob (wint_t);

int mbsinit (const mbstate_t*);
size_t mbrlen (const char*, size_t, mbstate_t*);
size_t mbrtowc (wchar_t*, const char*, size_t, mbstate_t*);
size_t wcrtomb (char*, wchar_t, mbstate_t*);
size_t mbsrtowcs (wchar_t*, const char**, size_t, mbstate_t*);
size_t wcsrtombs (char*, const wchar_t**, size_t, mbstate_t*);


}   // extern "C"


// 21.4, p14 of ISO/IEC 14882:1998
inline const wchar_t* wcschr (const wchar_t *__s, wchar_t __c)
{
    return wcschr (_RWSTD_CONST_CAST (wchar_t*, __s), __c);
}


// 21.4, p16 of ISO/IEC 14882:1998
inline const wchar_t* wcspbrk (const wchar_t *__s1, const wchar_t *__s2)
{
    return wcspbrk (_RWSTD_CONST_CAST (wchar_t*, __s1), __s2);
}


// 21.4, p18 of ISO/IEC 14882:1998
inline const wchar_t* wcsrchr (const wchar_t *__s, wchar_t __c)
{
    return wcsrchr (_RWSTD_CONST_CAST (wchar_t*, __s), __c);
}


// 21.4, p20 of ISO/IEC 14882:1998
inline const wchar_t* wcsstr (const wchar_t *__s1, const wchar_t *__s2)
{
    return wcsstr (_RWSTD_CONST_CAST (wchar_t*, __s1), __s2);
}


// 21.4, p22 of ISO/IEC 14882:1998
inline const wchar_t* wmemchr (const wchar_t *__p, wchar_t __c, size_t __n)
{
    return wmemchr (_RWSTD_CONST_CAST (wchar_t*, __p), __c, __n);
}


}   // namespace std


#endif   // _RWSTD_CWCHAR_H_INCLUDED
