// -*- 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 1998-2006 Rogue Wave Software.
 * 
 **************************************************************************/

#include <rw/_defs.h>

#ifndef _RWSTD_NO_PURE_C_HEADERS
#  include <ansi/_cwchar.h>
#else

#ifndef _RWSTD_NO_DEPRECATED_C_HEADERS

#ifndef _RWSTD_NAMESPACE_STD_OPEN
#define _RWSTD_NAMESPACE_STD_OPEN 17

_RWSTD_NAMESPACE (std) { 

#endif   // _RWSTD_NAMESPACE_STD_OPEN


#include _RWSTD_ANSI_C_WCHAR_H


#if _RWSTD_NAMESPACE_STD_OPEN == 17
#undef _RWSTD_NAMESPACE_STD_OPEN

}   // namespace std

#endif   // _RWSTD_NAMESPACE_STD_OPEN == 17

#else   // if defined (_RWSTD_NO_DEPRECATED_C_HEADERS)

#ifndef _RWSTD_CWCHAR_INCLUDED
#define _RWSTD_CWCHAR_INCLUDED

#include _RWSTD_ANSI_C_WCHAR_H
#include <rw/_mbstate.h>


// #define WEOF when not #defined (see also <cwctype>)
#if !defined WEOF
#  ifndef _RWSTD_NO_WINT_T
#    define WEOF _RWSTD_STATIC_CAST (_RWSTD_WINT_T, -1)
#  else
#    define WEOF (-1)
#  endif
#endif   // WEOF


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


#if !defined (_RWSTD_NO_NAMESPACE) && !defined (_RWSTD_NO_HONOR_STD)


#ifndef WCHAR_MIN
#  define WCHAR_MIN   _RWSTD_WCHAR_MIN
#endif   // WCHAR_MIN

#ifndef WCHAR_MAX
#  define WCHAR_MAX   _RWSTD_WCHAR_MAX
#endif   // WCHAR_MAX


#if !defined (_RWSTD_NO_USING_LIBC_IN_STD)

namespace std {

#ifndef _RWSTD_NO_SIZE_T
using ::size_t;
#elif defined (_RWSTD_SIZE_T)
    typedef _RWSTD_SIZE_T size_t;
#endif   // _RWSTD_NO_SIZE_T

#ifdef _RWSTD_NO_STD_MBSTATE_T

using ::mbstate_t;

#endif   // _RWSTD_NO_STD_MBSTATE_T

#ifndef _RWSTD_NO_WINT_T
using ::wint_t;
#elif defined (_RWSTD_WINT_T)
    typedef _RWSTD_WINT_T wint_t;
#endif   // _RWSTD_NO_WINT_T

#ifndef _RWSTD_NO_STRUCT_TM_IN_WCHAR_H
using ::tm;
#elif !defined (_RWSTD_NO_TM)

}   // namespace std

#include _RWSTD_ANSI_C_TIME_H

namespace std {

#endif   // NO_STRUCT_TM

#ifndef _RWSTD_NO_BTOWC
using ::btowc;
#elif !defined (_RWSTD_NO_BTOWC_IN_LIBC)

}   // namespace std

extern "C" wint_t btowc (int);

namespace std {

using ::btowc;

#  undef _RWSTD_NO_BTOWC
#endif   // _RWSTD_NO_BTOWC

#ifndef _RWSTD_NO_FGETWC
using ::fgetwc;
#elif !defined (_RWSTD_NO_FGETWC_IN_LIBC)

}   // namespace std

extern "C" wint_t fgetwc (FILE*);

namespace std {

using ::fgetwc;

#  undef _RWSTD_NO_FGETWC
#endif   // _RWSTD_NO_FGETWC[_IN_LIBC]

#ifndef _RWSTD_NO_FGETWS
using ::fgetws;
#elif !defined (_RWSTD_NO_FGETWS_IN_LIBC)

}   // namespace std

extern "C" wchar_t fgetws (wchar_t*, int, FILE*);

namespace std {

using ::fgetws;

#  undef _RWSTD_NO_FGETWS
#endif   // _RWSTD_NO_FGETWS[_IN_LIBC]

#ifndef _RWSTD_NO_FPUTWC
using ::fputwc;
#elif !defined (_RWSTD_NO_FPUTWC_IN_LIBC)

}   // namespace std

extern "C" wint_t fputwc (wint_t, FILE*);

namespace std {

using ::fputwc;

#  undef _RWSTD_NO_FPUTWC
#endif   // _RWSTD_NO_FPUTWC[_IN_LIBC]

#ifndef _RWSTD_NO_FPUTWS
using ::fputws;
#elif !defined (_RWSTD_NO_FPUTWS_IN_LIBC)

}   // namespace std

extern "C" int fputws (const wchar_t*, FILE*);

namespace std {

using ::fputws;

#  undef _RWSTD_NO_FPUTWS
#endif   // _RWSTD_NO_FPUTWS[_IN_LIBC]

#ifndef _RWSTD_NO_FWIDE
using ::fwide;
#elif !defined (_RWSTD_NO_FWIDE_IN_LIBC)

}   // namespace std

extern "C" int fwide (FILE*, int);

namespace std {

using ::fwide;

#  undef _RWSTD_NO_FWIDE
#endif   // _RWSTD_NO_FWIDE[_IN_LIBC]

#ifndef _RWSTD_NO_FWPRINTF
using ::fwprintf;
#elif !defined (_RWSTD_NO_FWPRINTF_IN_LIBC)

}   // namespace std

extern "C" int fwprintf (FILE*, const wchar_t*, ...);

namespace std {

using ::fwprintf;

#  undef _RWSTD_NO_FWPRINTF
#endif   // _RWSTD_NO_FWPRINTF[_IN_LIBC]

#ifndef _RWSTD_NO_FWSCANF
using ::fwscanf;
#elif !defined (_RWSTD_NO_FWSCANF_IN_LIBC)

}   // namespace std

extern "C" int fwscanf (FILE*, const wchar_t*, ...);

namespace std {

using ::fwscanf;

#  undef _RWSTD_NO_FWSCANF
#endif   // _RWSTD_NO_FWSCANF[_IN_LIBC]

#ifndef _RWSTD_NO_GETWC
using ::getwc;
#elif !defined (_RWSTD_NO_GETWC_IN_LIBC)

}   // namespace std

extern "C" wint_t getwc (FILE*);

namespace std {

using ::getwc;

#  undef _RWSTD_NO_GETWC
#endif   // _RWSTD_NO_GETWC[_IN_LIBC]

#ifndef _RWSTD_NO_PUTWC
using ::putwc;
#elif !defined (_RWSTD_NO_PUTWC_IN_LIBC)

}   // namespace std

extern "C" wint_t putwc (wint_t, FILE*);

namespace std {

using ::putwc;

#  undef _RWSTD_NO_PUTWC
#endif   // _RWSTD_NO_PUTWC[_IN_LIBC]

#ifndef _RWSTD_NO_GETWCHAR
using ::getwchar;
#elif !defined (_RWSTD_NO_GETWCHAR_IN_LIBC)

}   // namespace std

extern "C" wint_t getwchar ();

namespace std {

using ::getwchar;

#  undef _RWSTD_NO_GETWCHAR
#endif   // _RWSTD_NO_GETWCHAR[_IN_LIBC]

#ifndef _RWSTD_NO_PUTWCHAR
using ::putwchar;
#elif !defined (_RWSTD_NO_PUTWCHAR_IN_LIBC)

}   // namespace std

extern "C" wint_t putwchar (wint_t);

namespace std {

using ::putwchar;

#  undef _RWSTD_NO_PUTWCHAR
#endif   // _RWSTD_NO_PUTWCHAR[_IN_LIBC]

#ifndef _RWSTD_NO_SWPRINTF
using ::swprintf;
#elif !defined (_RWSTD_NO_SWPRINTF_IN_LIBC)

}   // namespace std

#if _MSC_VER < 1310   // MSVC < 7.1 or (better yet) not MSVC

extern "C" {

_RWSTD_DLLIMPORT int
swprintf (wchar_t*, size_t, const wchar_t*, ...);

}   // extern "C"

#elif _MSC_VER == 1310   // MSVC 7.1

// MSVC 8.0 defines the C++ overload of swprintf() inline
/* extern "C++" */ _RWSTD_DLLIMPORT int
swprintf (wchar_t*, size_t, const wchar_t*, ...);

#else   // MSVC 8.0 and above

// MSVC 7.1 declares two overloads of swprintf()
/* extern "C++" */ int
swprintf (wchar_t*, size_t, const wchar_t*, ...);

#endif   // MSVC

namespace std {

using ::swprintf;

#  undef _RWSTD_NO_SWPRINTF
#endif   // _RWSTD_NO_SWPRINTF[_IN_LIBC]

#ifndef _RWSTD_NO_SWSCANF
using ::swscanf;
#elif !defined (_RWSTD_NO_SWSCANF_IN_LIBC)

}   // namespace std

extern "C" int swscanf (const wchar_t*, const wchar_t*, ...);

namespace std {

using ::swscanf;

#  undef _RWSTD_NO_SWSCANF
#endif   // _RWSTD_NO_SWSCANF[_IN_LIBC]

#ifndef _RWSTD_NO_UNGETWC
using ::ungetwc;
#elif !defined (_RWSTD_NO_UNGETWC_IN_LIBC)

}   // namespace std

extern "C" wint_t ungetwc (wint_t, FILE*);

namespace std {

using ::ungetwc;

#  undef _RWSTD_NO_UNGETWC
#endif   // _RWSTD_NO_UNGETWC[_IN_LIBC]

#ifndef _RWSTD_NO_VFWPRINTF
using ::vfwprintf;
#elif !defined (_RWSTD_NO_VFWPRINTF_IN_LIBC)

}   // namespace std

extern "C" int vfwprintf (FILE*, const wchar_t *format, _RWSTD_VA_LIST);

namespace std {

using ::vfwprintf;

#  undef _RWSTD_NO_VFWPRINTF
#endif   // _RWSTD_NO_VFWPRINTF[_IN_LIBC]

#ifndef _RWSTD_NO_VSWPRINTF
using ::vswprintf;
#elif !defined (_RWSTD_NO_VSWPRINTF_IN_LIBC)

}   // namespace std

#if _MSC_VER < 1310   // MSVC < 7.1 or (better yet) not MSVC

extern "C" {

_RWSTD_DLLIMPORT int
vswprintf (wchar_t*, size_t, const wchar_t*, _RWSTD_VA_LIST);

}   // extern "C"

#elif _MSC_VER == 1310   // MSVC 7.1

// MSVC 7.1 declares two overloads of swprintf()
/* extern "C++" */ _RWSTD_DLLIMPORT int
swprintf (wchar_t*, size_t, const wchar_t*, ...);

#else   // MSVC 8.0 and above

// MSVC 8.0 defines the C++ overload of vswprintf() inline
/* extern "C++" */ int
vswprintf (wchar_t*, size_t, const wchar_t*, _RWSTD_VA_LIST);

#endif   // MSVC

namespace std {

using ::vswprintf;

#  undef _RWSTD_NO_VSWPRINTF
#endif   // _RWSTD_NO_VSWPRINTF[_IN_LIBC]

#ifndef _RWSTD_NO_VWPRINTF
using ::vwprintf;
#elif !defined (_RWSTD_NO_VWPRINTF_IN_LIBC)

}   // namespace std

extern "C" int vwprintf (const wchar_t*, _RWSTD_VA_LIST);

namespace std {

using ::vwprintf;

#  undef _RWSTD_NO_VWPRINTF
#endif   // _RWSTD_NO_VWPRINTF[_IN_LIBC]

#ifndef _RWSTD_NO_WPRINTF
using ::wprintf;
#elif !defined (_RWSTD_NO_WPRINTF_IN_LIBC)

}   // namespace std

extern "C" int wprintf (const wchar_t*, ...);

namespace std {

using ::wprintf;

#  undef _RWSTD_NO_WPRINTF
#endif   // _RWSTD_NO_WPRINTF[_IN_LIBC]

#ifndef _RWSTD_NO_WSCANF
using ::wscanf;
#elif !defined (_RWSTD_NO_WSCANF_IN_LIBC)

}   // namespace std

extern "C" int wscanf (const wchar_t*, ...);

namespace std {

using ::wscanf;

#  undef _RWSTD_NO_WSCANF
#endif   // _RWSTD_NO_WSCANF[_IN_LIBC]

#ifndef _RWSTD_NO_MBRLEN
using ::mbrlen;
#elif !defined (_RWSTD_NO_MBRLEN_IN_LIBC)

}   // namespace std

extern "C" size_t mbrlen (const char*, size_t, _RWSTD_MBSTATE_T*);

namespace std {

using ::mbrlen;

#  undef _RWSTD_NO_MBRLEN
#endif   // _RWSTD_NO_MBRLEN

#ifndef _RWSTD_NO_MBRTOWC
using ::mbrtowc;
#elif !defined (_RWSTD_NO_MBRTOWC_IN_LIBC)

}   // namespace std

extern "C" size_t mbrtowc (wchar_t*, const char*, size_t, _RWSTD_MBSTATE_T*);

namespace std {

using ::mbrtowc;

#  undef _RWSTD_MBRTOWC
#endif   // _RWSTD_MBRTOWC[_IN_LIBC]

#ifndef _RWSTD_NO_MBSINIT
using ::mbsinit;
#elif !defined (_RWSTD_NO_MBSINIT_IN_LIBC)

}   // namespace std

extern "C" int mbsinit (const _RWSTD_MBSTATE_T*);

namespace std {

using ::mbsinit;

#  undef _RWSTD_NO_MBSINIT
#endif   // !_RWSTD_NO_MBSINIT_IN_LIBC

#ifndef _RWSTD_NO_MBSRTOWCS
using ::mbsrtowcs;
#elif !defined (_RWSTD_NO_MBSRTOWCS_IN_LIBC)

}   // namespace std

extern "C" size_t mbsrtowcs (wchar_t*, const char**, size_t, _RWSTD_MBSTATE_T*);

namespace std {

using ::mbsrtowcs;

#  undef _RWSTD_NO_MBSRTOWCS
#endif    // _RWSTD_NO_MBSRTOWCS

#ifndef _RWSTD_NO_WCRTOMB
using ::wcrtomb;
#elif !defined (_RWSTD_NO_WCRTOMB_IN_LIBC)

}   // namespace std

extern "C" size_t wcrtomb (char*, wchar_t, _RWSTD_MBSTATE_T*);

namespace std {

using ::wcrtomb;

#  undef _RWSTD_NO_WCRTOMB
#endif   // _RWSTD_NO_WCRTOMB

#ifndef _RWSTD_NO_WCSCAT
using ::wcscat;
#elif !defined (_RWSTD_NO_WCSCAT_IN_LIBC)

}   // namespace std

extern "C" wchar_t* wcscat (wchar_t*, const wchar_t*);

namespace std {

using ::wcscat;

#else   // if defined (_RWSTD_NO_WCSCAT)

}   // namespace std

extern "C" {

inline wchar_t* wcscat (wchar_t *__dst, const wchar_t *__src)
{
    wchar_t *__s = __dst;
    for (; *__s; ++__s);
    while ((*__s++ = *__src++));
    return __dst;
}

}   // extern "C"

namespace std {

using ::wcscat;

#endif   // _RWSTD_NO_WCSCAT

#undef _RWSTD_NO_WCSCAT


#ifndef _RWSTD_NO_WCSCHR
using ::wcschr;
#elif !defined (_RWSTD_NO_WCSCHR_IN_LIBC)

}   // namespace std

extern "C" wchar_t* wcschr (wchar_t*, wchar_t);

inline const wchar_t* wcschr (const wchar_t *__s, wchar_t __c)
{
    return wcschr (_RWSTD_CONST_CAST (wchar_t*, __s), __c);
}

namespace std {

using ::wcschr;

#else   // if defined (_RWSTD_NO_WCSCHR)

}   // namespace std

extern "C" {

inline wchar_t* wcschr (wchar_t *__s, wchar_t __c)
{
    do {
        if (*__s == __c)
            return __s;
    } while (*__s);
    return 0;
}

}   // extern "C"

inline const wchar_t* wcschr (const wchar_t *__s, wchar_t __c)
{
    return wcschr (_RWSTD_CONST_CAST (wchar_t*, __s), __c);
}

namespace std {

using ::wcschr;

#endif   // _RWSTD_NO_WCSCHR

#undef _RWSTD_NO_WCSCHR


#ifndef _RWSTD_NO_WCSCMP
using ::wcscmp;
#elif !defined (_RWSTD_NO_WCSCMP_IN_LIBC)

}   // namespace std

extern "C" int wcscmp (const wchar_t*, const wchar_t*);

namespace std {

using ::wcscmp;

#  undef _RWSTD_NO_WCSCMP
#endif   // _RWSTD_NO_WCSCMP

#ifndef _RWSTD_NO_WCSCOLL
using ::wcscoll;
#elif !defined (_RWSTD_NO_WCSCOLL_IN_LIBC)

}   // namespace std

extern "C" int wcscoll (const wchar_t*, const wchar_t*);

namespace std {

using ::wcscoll;

#  undef _RWSTD_NO_WCSCOLL
#endif   // _RWSTD_NO_WCSCOLL

#ifndef _RWSTD_NO_WCSCPY
using ::wcscpy;
#else   // if defined (_RWSTD_NO_WCSCPY)

}   // namespace std

extern "C" {

inline wchar_t* wcscpy (wchar_t *__dst, const wchar_t *__src)
{
    for (wchar_t *__s = __dst; (*__s++ = *__src++); );
    return __dst;
}

}   // extern "C"

namespace std {

using ::wcscpy;

#  undef _RWSTD_NO_WCSCPY
#endif   // _RWSTD_NO_WCSCPY


#ifndef _RWSTD_NO_WCSCSPN
using ::wcscspn;
#elif !defined (_RWSTD_NO_WCSCSPN_IN_LIBC)

}   // namespace std

extern "C" size_t wcscspn (const wchar_t*, const wchar_t*);

namespace std {

using ::wcscspn;

#  undef _RWSTD_NO_WCSCSPN
#else

}   // namespace std

extern "C" {

inline size_t wcscspn (const wchar_t *__s1, const wchar_t *__s2)
{
    const wchar_t *__s = __s1;
    for (; *__s; ++__s) {
        for (const wchar_t *__ss = __s2; *__ss; ++__ss)
            if (*__ss == *__s)
                return __s - __s1;
    }
    return __s - __s1;
}

}   // extern "C"

namespace std {

using wcscspn;

#  undef _RWSTD_NO_WCSCSPN
#endif   // _RWSTD_NO_WCSCSPN

#ifndef _RWSTD_NO_WCSFTIME
using ::wcsftime;
#elif !defined (_RWSTD_NO_WCSFTIME_IN_LIBC)

}   // namespace std

extern "C" size_t wcsftime (wchar_t*, size_t, const wchar_t*, const struct tm*);

namespace std {

using ::wcsftime;

#endif   // _RWSTD_NO_WCSFTIME


#ifndef _RWSTD_NO_WCSLEN
using ::wcslen;
#elif !defined (_RWSTD_NO_WCSLEN_IN_LIBC)

}   // namespace std

extern "C" size_t wcslen (const wchar_t*);

namespace std {

using ::wcslen;

#  undef _RWSTD_NO_WCSLEN
#else   // defined (_RWSTD_NO_WCSLEN)

}   // namespace std

extern "C" {

inline size_t wcslen (const wchar_t* __s)
{
    const wchar_t *__begin = __s;
    while (*__s)
        ++__s;
    return __s - __begin;
}

}   // extern "C"

namespace std {

using ::wcslen;

#  undef _RWSTD_NO_WCSLEN
#endif   // _RWSTD_NO_WCSLEN


#ifndef _RWSTD_NO_WCSNCAT
using ::wcsncat;
#elif !defined (_RWSTD_NO_WCSNCAT_IN_LIBC)

}   // namespace std

extern "C" wchar_t* wcsncat (wchar_t*, const wchar_t*, size_t);

namespace std {

using ::wcsncat;

#  undef _RWSTD_NO_WCSNCAT
#else

}   // namespace std

extern "C" {

inline wchar_t* wcsncat (wchar_t *__dst, const wchar_t *__src, size_t __n)
{
    wchar_t *__s = __dst;
    for (; *__s; ++__s);
    while (__n--)
        if (!(*__s++ = *__src++))
            return __dst;
    *__s = 0;
    return __dst;
}

}   // extern "C"

namespace std {

using ::wcsncat;

#  undef _RWSTD_NO_WCSNCAT
#endif   // _RWSTD_NO_WCSNCAT

#ifndef _RWSTD_NO_WCSNCMP
using ::wcsncmp;
#elif !defined (_RWSTD_NO_WCSNCMP_IN_LIBC)

}   // namespace std

extern "C" int wcsncmp (const wchar_t*, const wchar_t*, size_t);

namespace std {

using ::wcsncmp;

#  undef _RWSTD_NO_WCSNCMP
#else

}   // namespace std

extern "C" {

inline int wcsncmp (const wchar_t *__s1, const wchar_t *__s2, size_t __n)
{
    if (!__n)
        return 0;
    for (; --__n && *__s1 && *__s1 == *__s2; ++__s1, ++__s2);
    return int (*__s1 - *__s2);
}

}   // extern "C"

namespace std {

using ::wcsncmp;

#  undef _RWSTD_NO_WCSNCMP
#endif   // _RWSTD_NO_WCSNCMP


#ifndef _RWSTD_NO_WCSNCPY
using ::wcsncpy;
#elif !defined (_RWSTD_NO_WCSNCPY_IN_LIBC)

}   // namespace std

extern "C" wchar_t* wcsncpy (wchar_t*, const wchar_t*, size_t);

namespace std {

using ::wcsncpy;

#  undef _RWSTD_NO_WCSNCPY
#else   // if defined (_RWSTD_NO_WCSNCPY)

}   // namespace std

extern "C" {

inline wchar_t* wcsncpy (wchar_t *__dst, const wchar_t *__src, size_t __n)
{
    wchar_t *__s = __dst;
    for (; __n && (*__s++ = *__src++); --__n);
    while (__n--)
        *__s = 0;
    return __dst;
}

}   // extern "C"

namespace std {

using ::wcsncpy;

#  undef _RWSTD_NO_WCSNCPY
#endif   // _RWSTD_NO_WCSNCPY


#ifndef _RWSTD_NO_WCSPBRK
using ::wcspbrk;
#elif !defined (_RWSTD_NO_WCSPBRK_IN_LIBC)

}   // namespace std

extern "C" wchar_t* wcspbrk (wchar_t*, const wchar_t*);

inline const wchar_t* wcspbrk (const wchar_t *__s1, const wchar_t *__s2)
{
    return wcspbrk (_RWSTD_CONST_CAST (wchar_t*, __s1), __s2);
}

namespace std {

using ::wcspbrk;

#  undef _RWSTD_NO_WCSPBRK
#endif   // _RWSTD_NO_WCSPBRK


#ifndef _RWSTD_NO_WCSRCHR
using ::wcsrchr;
#elif !defined (_RWSTD_NO_WCSRCHR_IN_LIBC)

}   // namespace std

extern "C" const wchar_t* wcsrchr (const wchar_t*, wchar_t);

wchar_t* wcsrchr (wchar_t *__s, wchar_t __c)
{
    return wcsrchr (_RWSTD_CONST_CAST (wchar_t*, __s), __c);
}

namespace std {

using ::wcsrchr;

#  undef _RWSTD_NO_WCSRCHR
#else   // if defined (_RWSTD_NO_WCSRCHR)

}   // namespace std

extern "C" {

inline wchar_t* wcsrchr (wchar_t *__s, wchar_t __c)
{
    const wchar_t *__ss = __s;
    while (*__ss++);
    while (--__ss != __s && *__ss != __c);
    return *__ss == __c ? __ss : 0;
}

}   // extern "C"

inline const wchar_t* wcsrchr (const wchar_t *__s, wchar_t __c)
{
    return wcsrchr (_RWSTD_CONST_CAST (wchar_t*, __s), __c);
}

}   // extern "C"

namespace std {

using ::wcsrchr;

#  undef _RWSTD_NO_WCSRCHR
#endif   // _RWSTD_NO_WCSRCHR


#ifndef _RWSTD_NO_WCSRTOMBS
using ::wcsrtombs;
#elif !defined (_RWSTD_NO_WCSRTOMBS_IN_LIBC)

}   // namespace std

extern "C" size_t wcsrtombs (char*, const wchar_t**, size_t, _RWSTD_MBSTATE_T*);

namespace std {

using ::wcsrtombs;

#  undef _RWSTD_NO_WCSRTOMBS
#endif   // _RWSTD_NO_WCSRTOMBS

#ifndef _RWSTD_NO_WCSSPN
using ::wcsspn;
#else

}   // namespace std

extern "C" {

inline size_t wcsspn (const wchar_t *__s1, const wchar_t *__s2)
{
    const wchar_t *__s = __s1;
    for (; *__s; ++__s) {
        for (const wchar_t *__ss = __s2; *__ss != *__s; ++__ss)
            if (!*__ss)
                return __s - __s1;
    }
    return __s - __s1;
}

}   // extern "C"

namespace std {

using ::wcsspn;

#  undef _RWSTD_NO_WCSSPN
#endif   // _RWSTD_NO_WCSSPN

#ifndef _RWSTD_NO_WCSSTR
using ::wcsstr;
#elif !defined (_RWSTD_NO_WCSSTR_IN_LIBC)

}   // namespace std

extern "C" wchar_t* wcsstr (wchar_t*, const wchar_t*);

inline const wchar_t* wcsstr (const wchar_t *__s1, const wchar_t *__s2)
{
    return wcsstr (_RWSTD_CONST_CAST (wchar_t*, __s1), __s2);
}

namespace std {

using ::wcsstr;

#  undef _RWSTD_NO_WCSSTR
#else

#  ifdef _RWSTD_OS_HPUX

}   // namespace std

extern "C" {

inline wchar_t* wcsstr (wchar_t *__s1, const wchar_t *__s2)
{
    return wcswcs (__s1, __s2);
}

}   // extern "C"

inline wchar_t* wcsstr (wchar_t *__s1, const wchar_t *__s2)
{
    return wcswcs (__s1, __s2);
}

namespace std {

using ::wcsstr;

#    undef _RWSTD_NO_WCSSTR
#  endif   // _RWSTD_OS_HPUX

#endif   // _RWSTD_NO_WCSSTR

#ifndef _RWSTD_NO_WCSTOD
using ::wcstod;
#elif !defined (_RWSTD_NO_WCSTOD_IN_LIBC)

}   // namespace std

extern "C" double wcstod (const wchar_t*, wchar_t**);

namespace std {

using ::wcstod;

#  undef _RWSTD_NO_WCSTOD
#endif   // _RWSTD_NO_WCSTOD[_IN_LIBC]

#ifndef _RWSTD_NO_WCSTOK
using ::wcstok;
#elif !defined (_RWSTD_NO_WCSTOK_IN_LIBC)

}   // namespace std

extern "C" wchar_t* wcstok (wchar_t*, const wchar_t*, wchar_t**);

namespace std {

using ::wcstok;

#  undef _RWSTD_NO_WCSTOK
#endif   // _RWSTD_NO_WCSTOK[_IN_LIBC]

#ifndef _RWSTD_NO_WCSTOL
using ::wcstol;
#elif !defined (_RWSTD_NO_WCSTOL_IN_LIBC)

}   // namespace std

extern "C" long wcstol (const wchar_t*, wchar_t**, int);

namespace std {

using ::wcstol;

#  undef _RWSTD_NO_WCSTOL
#endif   // _RWSTD_NO_WCSTOL[_IN_LIBC]

#ifndef _RWSTD_NO_WCSTOUL
using ::wcstoul;
#elif !defined (_RWSTD_NO_WCSTOUL_IN_LIBC)

}   // namespace std

extern "C" unsigned long wcstoul (const wchar_t*, wchar_t**, int);

namespace std {

using ::wcstoul;

#  undef _RWSTD_NO_WCSTOUL
#endif   // _RWSTD_NO_WCSTOUL[_IN_LIBC]

#ifndef _RWSTD_NO_WCSXFRM
using ::wcsxfrm;
#elif !defined (_RWSTD_NO_WCSXFRM_IN_LIBC)

}   // namespace std

extern "C" size_t wcsxfrm (wchar_t*, const wchar_t*, size_t);

namespace std {

using ::wcsxfrm;

#  undef _RWSTD_NO_WCSXFRM
#endif   // _RWSTD_NO_WCSXFRM[_IN_LIBC]

#ifndef _RWSTD_NO_WCTOB
using ::wctob;
#elif !defined (_RWSTD_NO_WCTOB_IN_LIBC)

}   // namespace std

extern "C" int wctob (wint_t);

namespace std {

using ::wctob;

#  undef _RWSTD_NO_WCTOB
#endif   // _RWSTD_NO_WCTOB


#ifndef _RWSTD_NO_WMEMCHR
using ::wmemchr;
#else

}   // namespace std

extern "C" {

inline wchar_t* wmemchr (wchar_t* __s, wchar_t __c, size_t __n)
{
    for (; __n ; --__n, ++__s)
        if (*__s == __c)
            return __s;
    return 0;
}

}   // extern "C"

inline const wchar_t* wmemchr (const wchar_t* __s, wchar_t __c, size_t __n)
{
    return wmemchr (_RWSTD_CONST_CAST (wchar_t*, __s), __c, __n);
}

namespace std {

using ::wmemchr;

#  undef _RWSTD_NO_WMEMCHR
#endif   // _RWSTD_NO_WMEMCHR


#ifndef _RWSTD_NO_WMEMCMP
using ::wmemcmp;
#elif !defined (_RWSTD_NO_WMEMCMP_IN_LIBC)

}   // namespace std

extern "C" int wmemcmp (const wchar_t*, const wchar_t*, size_t);

namespace std {

using ::wmemcmp;

#else   // if _RWSTD_NO_WMEMCMP && _RWSTD_NO_WMEMCMP_IN_LIBC

}   // namespace std

namespace __rw {

_RWSTD_EXPORT int
__rw_wmemcmp (const wchar_t*, const wchar_t*, size_t);

}   // namespace __rw

extern "C" {

inline int
wmemcmp (const wchar_t *__s1, const wchar_t *__s2, size_t __n)
{
    return _RW::__rw_wmemcmp (__s1, __s2, __n);
}

}   // extern "C"

namespace std {

using ::wmemcmp;

#endif   // _RWSTD_NO_WMEMCMP

#undef _RWSTD_NO_WMEMCMP


#ifndef _RWSTD_NO_WMEMCPY
using ::wmemcpy;
#elif !defined (_RWSTD_NO_WMEMCPY_IN_LIBC)

}   // namespace std

extern "C" wchar_t* wmemcpy (wchar_t*, const wchar_t*, size_t);

namespace std {

using ::wmemcpy;

#else   // if _RWSTD_NO_WMEMCPY && _RWSTD_NO_WMEMCPY_IN_LIBC

}   // namespace std

namespace __rw {

_RWSTD_EXPORT wchar_t*
__rw_wmemcpy (wchar_t*, const wchar_t*, size_t);

}   // namespace __rw


extern "C" {

inline wchar_t*
wmemcpy (wchar_t *__dst, const wchar_t *__src, size_t __n)
{
    return _RW::__rw_wmemcpy (__dst, __src, __n);
}

}   // extern "C"

namespace std {

using ::wmemcpy;

#endif   // _RWSTD_NO_WMEMCPY

#undef _RWSTD_NO_WMEMCPY


#ifndef _RWSTD_NO_WMEMMOVE
using ::wmemmove;
#elif !defined (_RWSTD_NO_WMEMMOVE_IN_LIBC)

}   // namespace std

extern "C" wchar_t* wmemmove (wchar_t*, const wchar_t*, size_t);

namespace std {

using ::wmemmove;

#else   // if _RWSTD_NO_WMEMMOVE && _RWSTD_NO_WMEMMOVE_IN_LIBC

}   // namespace std

namespace __rw {

_RWSTD_EXPORT wchar_t*
__rw_wmemmove (wchar_t*, const wchar_t*, size_t);

}   // namespace __rw

extern "C" {

inline wchar_t*
wmemmove (wchar_t *__dst, const wchar_t *__src, size_t __n)
{
    return _RW::__rw_wmemmove (__dst, __src, __n);
}

}   // extern "C"

namespace std {

using ::wmemmove;

#endif   // _RWSTD_NO_WMEMMOVE

#undef _RWSTD_NO_WMEMMOVE


#ifndef _RWSTD_NO_WMEMSET
using ::wmemset;
#elif !defined (_RWSTD_NO_WMEMSET_IN_LIBC)

}   // namespace std

extern "C" wchar_t* wmemset (wchar_t*, wchar_t, size_t);

namespace std {

using ::wmemset;

#else   // if _RWSTD_NO_WMEMSET && _RWSTD_NO_WMEMSET_IN_LIBC

}   // namespace std

namespace __rw {

_RWSTD_EXPORT wchar_t*
__rw_wmemset (wchar_t*, wchar_t, size_t);

}   // namespace __rw

extern "C" {

inline wchar_t*
wmemset (wchar_t* __s, wchar_t __c, size_t __n)
{
    return _RW::__rw_wmemset (__s, __c, __n);
}

}   // extern "C"

namespace std {

using ::wmemset;

#endif   // _RWSTD_NO_WMEMSET

#undef _RWSTD_NO_WMEMSET

}   // std

#endif   // !_RWSTD_NO_USING_LIBC_IN_STD

#endif   // !_RWSTD_NO_NAMESPACE && !_RWSTD_NO_HONOR_STD

#endif   // _RWSTD_CWCHAR_INCLUDED

#endif   // _RWSTD_NO_DEPRECATED_C_HEADERS

#endif   // _RWSTD_NO_PURE_C_HEADERS
