/*
 *
 * Copyright (c) 1998-2002
 * John Maddock
 *
 * Use, modification and distribution are subject to the
 * Boost Software License, Version 1.0. (See accompanying file
 * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 *
 */

/*
 *   LOCATION:    see http://www.boost.org for most recent version.
 *   FILE         boost/regex/config/cwchar.hpp
 *   VERSION      see <boost/version.hpp>
 *   DESCRIPTION: regex wide character string fixes.
 */

#ifndef BOOST_REGEX_CONFIG_CWCHAR_HPP
#define BOOST_REGEX_CONFIG_CWCHAR_HPP

#include <cwchar>
#include <cwctype>
#include <boost/config.hpp>

#if defined(__STD_RWCOMPILER_H__) || defined(_RWSTD_VER)
// apparently this is required for the RW STL on Linux:
#undef iswalnum
#undef iswalpha
#undef iswblank
#undef iswcntrl
#undef iswdigit
#undef iswgraph
#undef iswlower
#undef iswprint
#undef iswprint
#undef iswpunct
#undef iswspace
#undef iswupper
#undef iswxdigit
#undef iswctype
#undef towlower
#undef towupper
#undef towctrans
#undef wctrans
#undef wctype
#endif

namespace std {

#ifndef BOOST_NO_STDC_NAMESPACE
extern "C" {
#endif

#ifdef iswalnum
    inline int (iswalnum)(wint_t i)
    {
        return iswalnum(i);
    }
#undef iswalnum
#elif defined(BOOST_NO_STDC_NAMESPACE)
    using ::iswalnum;
#endif

#ifdef iswalpha
    inline int (iswalpha)(wint_t i)
    {
        return iswalpha(i);
    }
#undef iswalpha
#elif defined(BOOST_NO_STDC_NAMESPACE)
    using ::iswalpha;
#endif

#ifdef iswcntrl
    inline int (iswcntrl)(wint_t i)
    {
        return iswcntrl(i);
    }
#undef iswcntrl
#elif defined(BOOST_NO_STDC_NAMESPACE)
    using ::iswcntrl;
#endif

#ifdef iswdigit
    inline int (iswdigit)(wint_t i)
    {
        return iswdigit(i);
    }
#undef iswdigit
#elif defined(BOOST_NO_STDC_NAMESPACE)
    using ::iswdigit;
#endif

#ifdef iswgraph
    inline int (iswgraph)(wint_t i)
    {
        return iswgraph(i);
    }
#undef iswgraph
#elif defined(BOOST_NO_STDC_NAMESPACE)
    using ::iswgraph;
#endif

#ifdef iswlower
    inline int (iswlower)(wint_t i)
    {
        return iswlower(i);
    }
#undef iswlower
#elif defined(BOOST_NO_STDC_NAMESPACE)
    using ::iswlower;
#endif

#ifdef iswprint
    inline int (iswprint)(wint_t i)
    {
        return iswprint(i);
    }
#undef iswprint
#elif defined(BOOST_NO_STDC_NAMESPACE)
    using ::iswprint;
#endif

#ifdef iswpunct
    inline int (iswpunct)(wint_t i)
    {
        return iswpunct(i);
    }
#undef iswpunct
#elif defined(BOOST_NO_STDC_NAMESPACE)
    using ::iswpunct;
#endif

#ifdef iswspace
    inline int (iswspace)(wint_t i)
    {
        return iswspace(i);
    }
#undef iswspace
#elif defined(BOOST_NO_STDC_NAMESPACE)
    using ::iswspace;
#endif

#ifdef iswupper
    inline int (iswupper)(wint_t i)
    {
        return iswupper(i);
    }
#undef iswupper
#elif defined(BOOST_NO_STDC_NAMESPACE)
    using ::iswupper;
#endif

#ifdef iswxdigit
    inline int (iswxdigit)(wint_t i)
    {
        return iswxdigit(i);
    }
#undef iswxdigit
#elif defined(BOOST_NO_STDC_NAMESPACE)
    using ::iswxdigit;
#endif

#ifdef towlower
    inline wint_t (towlower)(wint_t i)
    {
        return towlower(i);
    }
#undef towlower
#elif defined(BOOST_NO_STDC_NAMESPACE)
    using ::towlower;
#endif

#ifdef towupper
    inline wint_t (towupper)(wint_t i)
    {
        return towupper(i);
    }
#undef towupper
#elif defined(BOOST_NO_STDC_NAMESPACE)
    using :: towupper;
#endif

#ifdef wcscmp
    inline int (wcscmp)(const wchar_t *p1, const wchar_t *p2)
    {
        return wcscmp(p1,p2);
    }
#undef wcscmp
#elif defined(BOOST_NO_STDC_NAMESPACE)
    using ::wcscmp;
#endif

#ifdef wcscoll
    inline int (wcscoll)(const wchar_t *p1, const wchar_t *p2)
    {
        return wcscoll(p1,p2);
    }
#undef wcscoll
#elif defined(BOOST_NO_STDC_NAMESPACE) && !defined(UNDER_CE)
    using ::wcscoll;
#endif

#ifdef wcscpy
    inline wchar_t *(wcscpy)(wchar_t *p1, const wchar_t *p2)
    {
        return wcscpy(p1,p2);
    }
#undef wcscpy
#elif defined(BOOST_NO_STDC_NAMESPACE)
    using ::wcscpy;
#endif

#ifdef wcslen
    inline size_t (wcslen)(const wchar_t *p)
    {
        return wcslen(p);
    }
#undef wcslen
#elif defined(BOOST_NO_STDC_NAMESPACE)
    using ::wcslen;
#endif

#ifdef wcsxfrm
    size_t wcsxfrm(wchar_t *p1, const wchar_t *p2, size_t s)
    {
        return wcsxfrm(p1,p2,s);
    }
#undef wcsxfrm
#elif defined(BOOST_NO_STDC_NAMESPACE)
    using ::wcsxfrm;
#endif

#ifndef BOOST_NO_STDC_NAMESPACE
} // extern "C"
#endif

} // namespace std

#endif
