using _STLP_VENDOR_CSTD::size_t;

#if !defined (_STLP_NO_CSTD_FUNCTION_IMPORTS)
#  if defined (__MSL__) && __MC68K__ && !_No_BlockMove && __dest_os == __mac_os
#    undef memcpy
#    undef memmove
inline void* memcpy(void* dst, const void* src, size_t len)
{	return _STLP_VENDOR_CSTD::__memcpy(dst, src, len); }
inline void* memmove(void* dst, const void* src, size_t len)
{	return _STLP_VENDOR_CSTD::__memmove(dst, src, len); }
#  else
using _STLP_VENDOR_CSTD::memmove;
using _STLP_VENDOR_CSTD::memcpy;
#  endif

#  if !defined (_STLP_WCE)
// these functions just don't exist on Windows CE
#    if !defined (ANDROID)
// and these functions just don't exist on Android
using _STLP_VENDOR_CSTD::strcoll;
using _STLP_VENDOR_CSTD::strxfrm;
#    endif
using _STLP_VENDOR_CSTD::strerror;
#  endif

#  if defined (__BORLANDC__)
extern "C++" {
#  endif
using _STLP_VENDOR_CSTD::memchr;
using _STLP_VENDOR_CSTD::strchr;
using _STLP_VENDOR_CSTD::strpbrk;
using _STLP_VENDOR_CSTD::strrchr;
using _STLP_VENDOR_CSTD::strstr;
#  if defined (__BORLANDC__)
}
#  endif

using _STLP_VENDOR_CSTD::memcmp;
using _STLP_VENDOR_CSTD::memset;

using _STLP_VENDOR_CSTD::strcat;

#  if !defined (strcmp)
using _STLP_VENDOR_CSTD::strcmp;
#  endif

#  if !defined (strcpy)
using _STLP_VENDOR_CSTD::strcpy;
#  endif
using _STLP_VENDOR_CSTD::strcspn;
using _STLP_VENDOR_CSTD::strlen;
using _STLP_VENDOR_CSTD::strncat;
using _STLP_VENDOR_CSTD::strncmp;

using _STLP_VENDOR_CSTD::strncpy;
using _STLP_VENDOR_CSTD::strspn;

using _STLP_VENDOR_CSTD::strtok;
#endif /* _STLP_NO_CSTD_FUNCTION_IMPORTS */
