// -*- 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


#ifdef _RWSTD_STRICT_ANSI
// 17.4.1.2, p6 - masking macros are not allowed
#  undef getwc
#  undef putwc
#endif   // _RWSTD_STRICT_ANSI


#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_STRUCT_TM)

}   // namespace std

#include _RWSTD_ANSI_C_TIME_H

namespace std {

using ::tm;

#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)
{
    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);
}

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
#elif defined (_MSC_VER) && 1400 <= _MSC_VER

}   // namespace std

/* extern "C++" */ inline wchar_t*
wcstok (wchar_t* __s1, const wchar_t* __s2, wchar_t** __ptr)
{
    return wcstok_s (__s1, __s2, __ptr);
}

namespace std {

using ::wcstok;

#  undef _RWSTD_NO_WCSTOK
#  undef _RWSTD_NO_WCSTOK_IN_LIBC
#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
