448 lines
9.1 KiB
C++
448 lines
9.1 KiB
C++
// -*- C++ -*-
|
|
/***************************************************************************
|
|
*
|
|
* cstring - C++ Standard library interface to the ANSI C header string.h
|
|
*
|
|
* $Id: cstring 550991 2007-06-26 23:58:07Z sebor $
|
|
*
|
|
***************************************************************************
|
|
*
|
|
* 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.
|
|
*
|
|
**************************************************************************/
|
|
|
|
#include <rw/_defs.h>
|
|
|
|
#ifndef _RWSTD_NO_PURE_C_HEADERS
|
|
# include <ansi/_cstring.h>
|
|
#else
|
|
|
|
#ifndef _RWSTD_NO_DEPRECATED_C_HEADERS
|
|
|
|
#ifndef _RWSTD_NO_NAMESPACE
|
|
|
|
#ifndef _RWSTD_NAMESPACE_STD_OPEN
|
|
#define _RWSTD_NAMESPACE_STD_OPEN 15
|
|
|
|
_RWSTD_NAMESPACE (std) {
|
|
|
|
#endif // _RWSTD_NAMESPACE_STD_OPEN
|
|
|
|
|
|
#include _RWSTD_ANSI_C_STRING_H
|
|
|
|
|
|
#if _RWSTD_NAMESPACE_STD_OPEN == 15
|
|
#undef _RWSTD_NAMESPACE_STD_OPEN
|
|
|
|
} // namespace std
|
|
|
|
#endif // _RWSTD_NAMESPACE_STD_OPEN == 15
|
|
|
|
|
|
_RWSTD_NAMESPACE (std) {
|
|
|
|
#if 0
|
|
|
|
const char* strchr (const char *__s, int __c);
|
|
const char* strpbrk (const char *__s1, const char *__s2);
|
|
const char* strrchr (const char *__s, int __c);
|
|
const char* strstr (const char *__s1, const char *__s2);
|
|
const void* memchr (const void *__p, int __c, size_t __n);
|
|
|
|
#endif // 0/1
|
|
|
|
|
|
#ifndef _RWSTD_CSTRING_INCLUDED
|
|
#define _RWSTD_CSTRING_INCLUDED
|
|
|
|
inline char* strchr (char *__s, int __c)
|
|
{
|
|
return strchr ((const char*)__s, __c);
|
|
}
|
|
|
|
inline char* strpbrk (char *__s1, const char *__s2)
|
|
{
|
|
return strpbrk ((const char*)__s1, __s2);
|
|
}
|
|
|
|
inline char* strrchr (char *__s, int __c)
|
|
{
|
|
return strrchr ((const char*)__s, __c);
|
|
}
|
|
|
|
inline char* strstr (char *__s1, const char *__s2)
|
|
{
|
|
return strstr ((const char*)__s1, __s2);
|
|
}
|
|
|
|
inline void* memchr (void *__p, int __c, size_t __n)
|
|
{
|
|
return memchr ((const void*)__p, __c, __n);
|
|
}
|
|
|
|
#endif // _RWSTD_CSTRING_INCLUDED
|
|
|
|
} // namespace std
|
|
|
|
#else // if defined (_RWSTD_NO_NAMESPACE)
|
|
|
|
|
|
#include _RWSTD_ANSI_C_STRING_H
|
|
|
|
|
|
#endif // _RWSTD_NO_NAMESPACE
|
|
|
|
#else // if defined (_RWSTD_NO_DEPRECATED_C_HEADERS)
|
|
|
|
#ifndef _RWSTD_CSTRING_INCLUDED
|
|
#define _RWSTD_CSTRING_INCLUDED
|
|
|
|
#include _RWSTD_ANSI_C_STRING_H
|
|
|
|
# undef index
|
|
# undef rindex
|
|
|
|
# undef strcpy
|
|
# undef strcmp
|
|
|
|
# undef strlen
|
|
# undef strchr
|
|
# undef strrchr
|
|
# undef strcat
|
|
# undef memchr
|
|
# undef memcpy
|
|
# undef memmove
|
|
# undef memcmp
|
|
# undef memset
|
|
|
|
# undef memccpy
|
|
# undef strncat
|
|
# undef strncmp
|
|
# undef strncpy
|
|
|
|
#ifndef NULL
|
|
# define NULL 0
|
|
#endif // NULL
|
|
|
|
|
|
#if !defined (_RWSTD_NO_NAMESPACE) && !defined (_RWSTD_NO_HONOR_STD) && \
|
|
!defined (_RWSTD_NO_USING_LIBC_IN_STD)
|
|
|
|
namespace std {
|
|
|
|
using ::size_t;
|
|
|
|
#ifndef _RWSTD_NO_MEMCHR
|
|
using ::memchr;
|
|
#elif !defined (_RWSTD_NO_MEMCHR_IN_LIBC)
|
|
|
|
} // namespace std
|
|
|
|
extern "C" void* memchr (void*, int, size_t);
|
|
|
|
inline const void* memchr (const void *__p, int __c, size_t __n)
|
|
{
|
|
return memchr (_RWSTD_CONST_CAST (void*, __p), __c, __n);
|
|
}
|
|
|
|
namespace std {
|
|
|
|
using ::memchr;
|
|
|
|
# undef _RWSTD_NO_MEMCHR
|
|
|
|
#else // if defined (_RWSTD_NO_MEMCHR)
|
|
#endif // _RWSTD_NO_MEMCHR
|
|
|
|
#ifndef _RWSTD_NO_MEMCMP
|
|
using ::memcmp;
|
|
#elif !defined (_RWSTD_NO_MEMCMP_IN_LIBC)
|
|
|
|
} // namespace std
|
|
|
|
extern "C" int memcmp (const void*, const void*, size_t);
|
|
|
|
namespace std {
|
|
|
|
using ::memcmp;
|
|
|
|
# undef _RWSTD_NO_MEMCMP
|
|
|
|
#else // if defined (_RWSTD_NO_MEMCMP)
|
|
|
|
} // namespace std
|
|
|
|
extern "C" {
|
|
|
|
inline int memcmp (const void *__s1, const void *__s2, size_t __n)
|
|
{
|
|
const char *__ss1 = _RWSTD_REINTERPRET_CAST (const char*, __s1);
|
|
const char *__ss2 = _RWSTD_REINTERPRET_CAST (const char*, __s2);
|
|
|
|
for (; __n; --__n, ++__ss1, ++__ss2)
|
|
if (*__ss1 != *__ss2)
|
|
return *__ss1 - *__ss2;
|
|
return 0;
|
|
}
|
|
|
|
} // extern "C"
|
|
|
|
namespace std {
|
|
|
|
using ::memcmp;
|
|
|
|
# undef _RWSTD_NO_MEMCMP
|
|
|
|
#endif // _RWSTD_NO_MEMCMP
|
|
|
|
#ifndef _RWSTD_NO_MEMCPY
|
|
using ::memcpy;
|
|
#elif !defined (_RWSTD_NO_MEMCPY_IN_LIBC)
|
|
|
|
} // namespace std
|
|
|
|
extern "C" void* memcpy (void*, const void*, size_t);
|
|
|
|
namespace std {
|
|
|
|
using ::memcpy;
|
|
|
|
# undef _RWSTD_NO_MEMCPY
|
|
|
|
#else
|
|
#endif // _RWSTD_NO_MEMCPY
|
|
|
|
#ifndef _RWSTD_NO_MEMMOVE
|
|
using ::memmove;
|
|
#elif !defined (_RWSTD_NO_MEMMOVE_IN_LIBC)
|
|
|
|
} // namespace std
|
|
|
|
extern "C" void* memmove (void*, const void*, size_t);
|
|
|
|
namespace std {
|
|
|
|
using ::memmove;
|
|
|
|
# undef _RWSTD_NO_MEMMOVE
|
|
|
|
#else // if defined (_RWSTD_NO_MEMMOVE)
|
|
|
|
} // namespace std
|
|
|
|
extern "C" {
|
|
|
|
inline void* memmove (void *__dest, const void *__src, size_t __n)
|
|
{
|
|
char *__d = _RWSTD_REINTERPRET_CAST (char*, __dest);
|
|
const char *__s = _RWSTD_REINTERPRET_CAST (const char*, __src);
|
|
|
|
if (__d < __s || __d >= __s + __n)
|
|
memcpy (__d, __s, __n);
|
|
else {
|
|
// regions overlap
|
|
__d += __n;
|
|
__s += __n;
|
|
while (__n--)
|
|
*--__d = *--__s;
|
|
}
|
|
return __dest;
|
|
}
|
|
|
|
} // extern "C"
|
|
|
|
namespace std {
|
|
|
|
using ::memmove;
|
|
|
|
# undef _RWSTD_NO_MEMMOVE
|
|
|
|
#endif // _RWSTD_NO_MEMMOVE
|
|
|
|
#ifndef _RWSTD_NO_MEMSET
|
|
using ::memset;
|
|
#else // if defined (_RWSTD_NO_MEMSET)
|
|
#endif // _RWSTD_NO_MEMSET
|
|
|
|
#ifndef _RWSTD_NO_STRCAT
|
|
using ::strcat;
|
|
#else // if defined (_RWSTD_NO_STRCAT)
|
|
#endif // _RWSTD_NO_STRCAT
|
|
|
|
#ifndef _RWSTD_NO_STRCHR
|
|
using ::strchr;
|
|
#elif !defined (_RWSTD_NO_STRCHR_IN_LIBC)
|
|
|
|
} // namespace std
|
|
|
|
extern "C" char* strchr (char*, int);
|
|
|
|
inline const char* strchr (const char *__s, int __c)
|
|
{
|
|
return strchr (_RWSTD_CONST_CAST (char*, __s), __c);
|
|
}
|
|
|
|
namespace std {
|
|
|
|
using ::strchr;
|
|
|
|
# undef _RWSTD_NO_STRCHR
|
|
|
|
#else // if defined (_RWSTD_NO_STRCHR)
|
|
#endif // _RWSTD_NO_STRCHR
|
|
|
|
#ifndef _RWSTD_NO_STRCMP
|
|
using ::strcmp;
|
|
#elif !defined (_RWSTD_NO_STRCMP_IN_LIBC)
|
|
#else // if defined (_RWSTD_NO_STRCMP)
|
|
#endif // _RWSTD_NO_STRCMP
|
|
|
|
#ifndef _RWSTD_NO_STRCOLL
|
|
using ::strcoll;
|
|
#else // if defined (_RWSTD_NO_STRCOLL)
|
|
#endif // _RWSTD_NO_STRCOLL
|
|
|
|
#ifndef _RWSTD_NO_STRCPY
|
|
using ::strcpy;
|
|
#else // if defined (_RWSTD_NO_STRCPY)
|
|
#endif // _RWSTD_NO_STRCPY
|
|
|
|
#ifndef _RWSTD_NO_STRCSPN
|
|
using ::strcspn;
|
|
#else // if defined (_RWSTD_NO_STRCSPN)
|
|
#endif // _RWSTD_NO_STRCSPN
|
|
|
|
#ifndef _RWSTD_NO_STRERROR
|
|
using ::strerror;
|
|
#else // if defined (_RWSTD_NO_STRERROR)
|
|
#endif // _RWSTD_NO_STRERROR
|
|
|
|
#ifndef _RWSTD_NO_STRLEN
|
|
using ::strlen;
|
|
#else // if defined (_RWSTD_NO_STRLEN)
|
|
#endif // _RWSTD_NO_STRLEN
|
|
|
|
#ifndef _RWSTD_NO_STRNCAT
|
|
using ::strncat;
|
|
#else // if defined (_RWSTD_NO_STRNCAT)
|
|
#endif // _RWSTD_NO_STRNCAT
|
|
|
|
#ifndef _RWSTD_NO_STRNCMP
|
|
using ::strncmp;
|
|
#else // if defined (_RWSTD_NO_STRNCMP)
|
|
#endif // _RWSTD_NO_STRNCMP
|
|
|
|
#ifndef _RWSTD_NO_STRNCPY
|
|
using ::strncpy;
|
|
#else // if defined (_RWSTD_NO_STRNCPY)
|
|
#endif // _RWSTD_NO_STRNCPY
|
|
|
|
#ifndef _RWSTD_NO_STRPBRK
|
|
using ::strpbrk;
|
|
#elif !defined (_RWSTD_NO_STRPBRK_IN_LIBC)
|
|
|
|
} // namespace std
|
|
|
|
extern "C" char* strpbrk (char*, const char*);
|
|
|
|
inline const char* strpbrk (const char *__s, const char *__pat)
|
|
{
|
|
return strpbrk (_RWSTD_CONST_CAST (char*, __s), __pat);
|
|
}
|
|
|
|
namespace std {
|
|
|
|
using ::strpbrk;
|
|
|
|
# undef _RWSTD_NO_STRPBRK
|
|
|
|
#else
|
|
#endif // _RWSTD_NO_STRPBRK
|
|
|
|
#ifndef _RWSTD_NO_STRRCHR
|
|
using ::strrchr;
|
|
#elif !defined (_RWSTD_NO_STRRCHR_IN_LIBC)
|
|
|
|
} // namespace std
|
|
|
|
extern "C" char* strrchr (char*, int);
|
|
|
|
inline const char* strrchr (const char *__s, int __c)
|
|
{
|
|
return strrchr (_RWSTD_CONST_CAST (char*, __s), __c);
|
|
}
|
|
|
|
namespace std {
|
|
|
|
using ::strrchr;
|
|
|
|
# undef _RWSTD_NO_STRRCHR
|
|
|
|
#else // if defined (_RWSTD_NO_STRRCHR)
|
|
|
|
#endif // _RWSTD_NO_STRRCHR
|
|
|
|
#ifndef _RWSTD_NO_STRSPN
|
|
using ::strspn;
|
|
#else // if defined (_RWSTD_NO_STRSPN)
|
|
#endif // _RWSTD_NO_STRSPN
|
|
|
|
#ifndef _RWSTD_NO_STRSTR
|
|
using ::strstr;
|
|
#elif !defined (_RWSTD_NO_STRSTR_IN_LIBC)
|
|
|
|
} // namespace std
|
|
|
|
extern "C" char* strstr (char*, const char*);
|
|
|
|
inline const char* strstr (const char *__s1, const char *__s2)
|
|
{
|
|
return strstr (_RWSTD_CONST_CAST (char*, __s1), __s2);
|
|
}
|
|
|
|
namespace std {
|
|
|
|
using ::strstr;
|
|
|
|
# undef _RWSTD_NO_STRSTR
|
|
|
|
#else // if defined (_RWSTD_NO_STRSTR)
|
|
#endif // _RWSTD_NO_STRSTR
|
|
|
|
#ifndef _RWSTD_NO_STRTOK
|
|
using ::strtok;
|
|
#else // if defined (_RWSTD_NO_STRTOK)
|
|
#endif // _RWSTD_NO_STRTOK
|
|
|
|
#ifndef _RWSTD_NO_STRXFRM
|
|
using ::strxfrm;
|
|
#else // if defined (_RWSTD_NO_STRXFRM)
|
|
#endif // _RWSTD_NO_STRXFRM
|
|
|
|
} // std
|
|
|
|
#endif // !NO_NAMESPACE && !NO_HONOR_STD && !NO_USING_LIBC_IN_STD
|
|
|
|
#endif // _RWSTD_CSTRING_INCLUDED
|
|
|
|
#endif // _RWSTD_NO_DEPRECATED_C_HEADERS
|
|
|
|
#endif // _RWSTD_NO_PURE_C_HEADERS
|