409 lines
15 KiB
C++
409 lines
15 KiB
C++
/* _str.h internal version of "C" string.h functions
|
|
|
|
Definitions for string functions.
|
|
|
|
*/
|
|
|
|
/*
|
|
* C/C++ Run Time Library - Version 10.0
|
|
*
|
|
* Copyright (c) 1987, 2000 by Inprise Corporation
|
|
* All Rights Reserved.
|
|
*
|
|
*/
|
|
|
|
/* $Revision: 9.1.1.0 $ */
|
|
|
|
#ifndef __STRING_H
|
|
#define __STRING_H
|
|
#define _INC_STRING /* MSC Guard name */
|
|
|
|
#ifndef ___STDDEF_H
|
|
#include <_stddef.h>
|
|
#endif
|
|
|
|
#if !defined(__STDC__) && defined(__USELOCALES__)
|
|
#if !defined(__LOCALE_H)
|
|
#include <locale.h>
|
|
#endif
|
|
#endif /* !__STDC__ && __USELOCALES__ */
|
|
|
|
#if !defined(RC_INVOKED)
|
|
|
|
#ifndef __MEM_H
|
|
#include <mem.h> /* All mem... functions have now been moved to MEM.H */
|
|
#endif
|
|
|
|
#if defined(__STDC__)
|
|
#pragma warn -nak
|
|
#endif
|
|
|
|
#endif /* !RC_INVOKED */
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
namespace std {
|
|
#endif /* __cplusplus */
|
|
|
|
#define wcscmpi(s1,s2) _wcsicmp(s1,s2)
|
|
#define _wcscmpi(s1,s2) _wcsicmp(s1,s2)
|
|
#define wcsncmpi(s1,s2,n) _wcsnicmp(s1,s2,n)
|
|
#define _wcsncmpi(s1,s2,n) _wcsnicmp(s1,s2,n)
|
|
|
|
_SIZE_T _RTLENTRY _EXPFUNC wcslen(const wchar_t *__s);
|
|
wchar_t * _RTLENTRY _EXPFUNC wcscpy(wchar_t *__dst, const wchar_t *__src);
|
|
wchar_t * _RTLENTRY _EXPFUNC wcscat(wchar_t *__dest, const wchar_t *__src);
|
|
wchar_t * _RTLENTRY _EXPFUNC wcschr(const wchar_t *__s, int __c);
|
|
int _RTLENTRY _EXPFUNC wcscmp(const wchar_t *__s1, const wchar_t *__s2);
|
|
int _RTLENTRY _EXPFUNC wcscoll(const wchar_t * __s1, const wchar_t * __s2);
|
|
_SIZE_T _RTLENTRY _EXPFUNC wcscspn(const wchar_t *__s1, const wchar_t *__s2);
|
|
wchar_t * _RTLENTRY _EXPFUNC _wcsdup(const wchar_t *__s);
|
|
int _RTLENTRY _EXPFUNC wcsncmp(const wchar_t *__s1, const wchar_t *__s2, _SIZE_T __maxlen);
|
|
wchar_t * _RTLENTRY _EXPFUNC wcsncpy(wchar_t *__dest, const wchar_t *__src, _SIZE_T __maxlen);
|
|
wchar_t * _RTLENTRY _EXPFUNC _wcsnset(wchar_t *__s, wchar_t __ch, _SIZE_T __n);
|
|
wchar_t * _RTLENTRY _EXPFUNC wcspbrk(const wchar_t *__s1, const wchar_t *__s2);
|
|
wchar_t * _RTLENTRY _EXPFUNC wcsrchr(const wchar_t *__s, wchar_t __c);
|
|
wchar_t * _RTLENTRY _EXPFUNC _wcsrev(wchar_t *__s);
|
|
wchar_t * _RTLENTRY _EXPFUNC _wcsset(wchar_t*__s, wchar_t __ch);
|
|
_SIZE_T _RTLENTRY _EXPFUNC wcsspn(const wchar_t *__s1, const wchar_t *__s2);
|
|
wchar_t * _RTLENTRY _EXPFUNC wcsstr(const wchar_t *__s1, const wchar_t *__s2);
|
|
wchar_t * _RTLENTRY _EXPFUNC wcstok(wchar_t *__s1, const wchar_t *__s2);
|
|
wchar_t * _RTLENTRY _EXPFUNC wcsncat(wchar_t *__dest, const wchar_t *__src, _SIZE_T __maxlen);
|
|
wchar_t * _RTLENTRY _EXPFUNC wcspcpy(wchar_t *__dest, const wchar_t *__src);
|
|
wchar_t * _RTLENTRY _EXPFUNC _wcspcpy(wchar_t *__dest, const wchar_t *__src);
|
|
int _RTLENTRY _EXPFUNC _wcsicmp(const wchar_t *__s1, const wchar_t *__s2);
|
|
int _RTLENTRY _EXPFUNC _wcsnicmp(const wchar_t *__s1, const wchar_t *__s2, _SIZE_T __maxlen);
|
|
wchar_t * _RTLENTRYF _EXPFUNC _wcslwr(wchar_t *__s);
|
|
wchar_t * _RTLENTRYF _EXPFUNC _wcsupr(wchar_t *__s);
|
|
wchar_t * _RTLENTRYF _EXPFUNC _lwcslwr(wchar_t *__s);
|
|
wchar_t * _RTLENTRYF _EXPFUNC _lwcsupr(wchar_t *__s);
|
|
|
|
char _FAR * _RTLENTRYF _EXPFUNC strcat(char _FAR *__dest, const char _FAR *__src);
|
|
int _RTLENTRYF _EXPFUNC strcmp(const char _FAR *__s1, const char _FAR *__s2);
|
|
char _FAR * _RTLENTRYF _EXPFUNC strcpy(char _FAR *__dest, const char _FAR *__src);
|
|
_SIZE_T _RTLENTRY _EXPFUNC strcspn(const char _FAR *__s1, const char _FAR *__s2);
|
|
char _FAR * _RTLENTRY _EXPFUNC strerror(int __errnum);
|
|
_SIZE_T _RTLENTRYF _EXPFUNC strlen(const char _FAR *__s);
|
|
char _FAR * _RTLENTRYF _EXPFUNC strncat(char _FAR *__dest, const char _FAR *__src,
|
|
_SIZE_T __maxlen);
|
|
int _RTLENTRYF _EXPFUNC strncmp(const char _FAR *__s1, const char _FAR *__s2,
|
|
_SIZE_T __maxlen);
|
|
char _FAR * _RTLENTRYF _EXPFUNC strncpy(char _FAR *__dest, const char _FAR *__src,
|
|
_SIZE_T __maxlen);
|
|
_SIZE_T _RTLENTRY _EXPFUNC strspn(const char _FAR *__s1, const char _FAR *__s2);
|
|
char _FAR * _RTLENTRYF _EXPFUNC strtok(char _FAR *__s1, const char _FAR *__s2);
|
|
char _FAR * _RTLENTRY _EXPFUNC _strerror(const char _FAR *__s);
|
|
|
|
|
|
#if !defined(__STDC__)
|
|
/* compatibility with other compilers */
|
|
#define strcmpi(s1,s2) stricmp(s1,s2)
|
|
#define strncmpi(s1,s2,n) strnicmp(s1,s2,n)
|
|
|
|
char _FAR * _RTLENTRYF _EXPFUNC _lstrlwr(char _FAR *__s);
|
|
char _FAR * _RTLENTRYF _EXPFUNC _lstrupr(char _FAR *__s);
|
|
char _FAR * _RTLENTRYF _EXPFUNC32 stpcpy(char _FAR *__dest, const char _FAR *__src);
|
|
char _FAR * _RTLENTRY _EXPFUNC32 _stpcpy(char _FAR *__dest, const char _FAR *__src);
|
|
char _FAR * _RTLENTRY _EXPFUNC strdup(const char _FAR *__s);
|
|
int _RTLENTRYF _EXPFUNC stricmp(const char _FAR *__s1, const char _FAR *__s2);
|
|
char _FAR * _RTLENTRYF _EXPFUNC strlwr(char _FAR *__s);
|
|
int _RTLENTRYF _EXPFUNC strnicmp(const char _FAR *__s1, const char _FAR *__s2,
|
|
_SIZE_T __maxlen);
|
|
char _FAR * _RTLENTRY _EXPFUNC strnset(char _FAR *__s, int __ch, _SIZE_T __n);
|
|
char _FAR * _RTLENTRY _EXPFUNC strrev(char _FAR *__s);
|
|
char _FAR * _RTLENTRY _EXPFUNC strset(char _FAR *__s, int __ch);
|
|
char _FAR * _RTLENTRYF _EXPFUNC strupr(char _FAR *__s);
|
|
#endif /* !__STDC__ */
|
|
|
|
|
|
#if defined(__cplusplus)
|
|
extern "C++"
|
|
{
|
|
char _FAR * _RTLENTRYF _EXPFUNC strchr(char _FAR * __s, int __c);
|
|
const char _FAR * _RTLENTRYF _EXPFUNC strchr(const char _FAR * __s, int __c);
|
|
char _FAR * _RTLENTRYF _EXPFUNC strrchr(char _FAR *__s, int __c);
|
|
const char _FAR * _RTLENTRYF _EXPFUNC strrchr(const char _FAR *__s, int __c);
|
|
char _FAR * _RTLENTRYF _EXPFUNC strpbrk(char _FAR *__s1, const char _FAR *__s2);
|
|
const char _FAR * _RTLENTRYF _EXPFUNC strpbrk(const char _FAR *__s1, const char _FAR *__s2);
|
|
char _FAR * _RTLENTRY _EXPFUNC strstr(char _FAR *__s1, const char _FAR *__s2);
|
|
const char _FAR * _RTLENTRY _EXPFUNC strstr(const char _FAR *__s1, const char _FAR *__s2);
|
|
}
|
|
#else
|
|
char _FAR * _RTLENTRYF _EXPFUNC strchr(const char _FAR * __s, int __c);
|
|
char _FAR * _RTLENTRYF _EXPFUNC strrchr(const char _FAR *__s, int __c);
|
|
char _FAR * _RTLENTRYF _EXPFUNC strpbrk(const char _FAR *__s1, const char _FAR *__s2);
|
|
char _FAR * _RTLENTRY _EXPFUNC strstr(const char _FAR *__s1, const char _FAR *__s2);
|
|
#endif
|
|
|
|
|
|
/* Intrinsic functions */
|
|
|
|
/* Intrinsics must be prototyped outside of any namespace */
|
|
#ifdef __cplusplus
|
|
} // std
|
|
#endif /* __cplusplus */
|
|
|
|
char _FAR * _RTLENTRY __stpcpy__(char _FAR *__dest, const char _FAR *__src);
|
|
char _FAR * _RTLENTRYF _EXPFUNC16 __strcat__(char _FAR *__dest, const char _FAR *__src);
|
|
char _FAR * _RTLENTRY _EXPFUNC16 __strchr__(const char _FAR *__s, int __c);
|
|
int _RTLENTRYF _EXPFUNC16 __strcmp__(const char _FAR *__s1, const char _FAR *__s2);
|
|
char _FAR * _RTLENTRYF _EXPFUNC16 __strcpy__(char _FAR *__dest, const char _FAR *__src);
|
|
_SIZE_T _RTLENTRYF _EXPFUNC16 __strlen__(const char _FAR *__s);
|
|
char _FAR * _RTLENTRY _EXPFUNC16 __strncat__(char _FAR *__dest, const char _FAR *__src,
|
|
_SIZE_T __maxlen);
|
|
int _RTLENTRY _EXPFUNC16 __strncmp__(const char _FAR *__s1, const char _FAR *__s2,
|
|
_SIZE_T __maxlen);
|
|
char _FAR * _RTLENTRYF _EXPFUNC16 __strncpy__(char _FAR *__dest, const char _FAR *__src,
|
|
_SIZE_T __maxlen);
|
|
char _FAR * _RTLENTRY _EXPFUNC16 __strnset__(char _FAR *__s, int __ch, _SIZE_T __n);
|
|
char _FAR * _RTLENTRYF _EXPFUNC16 __strrchr__(const char _FAR *__s, int __c);
|
|
char _FAR * _RTLENTRY _EXPFUNC16 __strset__(char _FAR *__s, int __ch);
|
|
|
|
/* Now that the intrinsics are finished, turn the namespace back on */
|
|
#ifdef __cplusplus
|
|
namespace std {
|
|
#endif /* __cplusplus */
|
|
|
|
|
|
#if defined(__MSC) && !defined(__MFC_COMPAT__)
|
|
#define _strnicmp(s1,s2,s3) strnicmp(s1,s2,s3)
|
|
#define _stricmp(s1,s2) stricmp(s1,s2)
|
|
#define _strdup(s1) strdup(s1)
|
|
#define _strupr(s1) strupr(s1)
|
|
#define _strlwr(s1) strlwr(s1)
|
|
#define _strrev(s1) strrev(s1)
|
|
#endif /* __MSC */
|
|
|
|
#if defined(__MFC_COMPAT__)
|
|
__inline char _FAR * _RTLENTRY _strrev(char _FAR *__s) { return strrev(__s); }
|
|
|
|
__inline char _FAR * _RTLENTRY _strset(char _FAR *__s, int __ch)
|
|
{ return strset(__s, __ch); }
|
|
__inline char _FAR * _RTLENTRY _strnset(char _FAR *__s, int __ch, _SIZE_T __n)
|
|
{ return strnset(__s, __ch, __n); }
|
|
__inline char _FAR * _RTLENTRYF _strupr(char _FAR *__s) { return strupr(__s); }
|
|
|
|
__inline char _FAR * _RTLENTRYF _strlwr(char _FAR *__s) { return strlwr(__s); }
|
|
|
|
__inline char _FAR * _RTLENTRY _strdup(const char _FAR *__s)
|
|
{ return strdup(__s); }
|
|
__inline int _RTLENTRYF _strcmpi(const char _FAR *__s1, const char _FAR *__s2)
|
|
{ return stricmp (__s1, __s2); }
|
|
__inline int _RTLENTRYF _stricmp(const char _FAR *__s1, const char _FAR *__s2)
|
|
{ return stricmp (__s1, __s2); }
|
|
__inline int _RTLENTRYF _strcmp(const char _FAR *__s1, const char _FAR *__s2)
|
|
{ return strcmp (__s1, __s2); }
|
|
__inline int _RTLENTRYF _strnicmp(const char _FAR *__s1, const char _FAR *__s2, _SIZE_T __maxlen)
|
|
{ return strnicmp (__s1, __s2, __maxlen); }
|
|
#endif
|
|
|
|
int _RTLENTRY _EXPFUNC _lstrcoll(const char * __s1, const char * __s2);
|
|
int _RTLENTRY _EXPFUNC _lstricoll(const char * __s1, const char * __s2);
|
|
int _RTLENTRY _EXPFUNC _lstrncoll(const char * __s1, const char * __s2, const int __len);
|
|
int _RTLENTRY _EXPFUNC _lstrnicoll(const char * __s1, const char * __s2, int __len);
|
|
_SIZE_T _RTLENTRY _EXPFUNC _lstrxfrm(char * __s1, const char * __s2,_SIZE_T __n );
|
|
int _RTLENTRY _EXPFUNC strcoll(const char * __s1, const char * __s2);
|
|
int _RTLENTRY _EXPFUNC _stricoll(const char * __s1, const char * __s2);
|
|
int _RTLENTRY _EXPFUNC _strncoll(const char * __s1, const char * __s2, _SIZE_T __n);
|
|
int _RTLENTRY _EXPFUNC _strnicoll(const char * __s1, const char * __s2, int __len);
|
|
_SIZE_T _RTLENTRY _EXPFUNC strxfrm(char * __s1, const char * __s2,_SIZE_T __n );
|
|
|
|
int _RTLENTRY _EXPFUNC _lwcscoll(const wchar_t * __s1, const wchar_t * __s2);
|
|
int _RTLENTRY _EXPFUNC _lwcsicoll(const wchar_t * __s1, const wchar_t * __s2);
|
|
int _RTLENTRY _EXPFUNC _lwcsncoll(const wchar_t * __s1, const wchar_t * __s2, const int __len);
|
|
int _RTLENTRY _EXPFUNC _lwcsnicoll(const wchar_t * __s1, const wchar_t * __s2, int __len);
|
|
_SIZE_T _RTLENTRY _EXPFUNC _lwcsxfrm(wchar_t * __s1, const wchar_t * __s2,_SIZE_T __n );
|
|
int _RTLENTRY _EXPFUNC wcscoll(const wchar_t * __s1, const wchar_t * __s2);
|
|
int _RTLENTRY _EXPFUNC _wcsicoll(const wchar_t * __s1, const wchar_t * __s2);
|
|
int _RTLENTRY _EXPFUNC _wcsncoll(const wchar_t * __s1, const wchar_t * __s2, _SIZE_T __n);
|
|
int _RTLENTRY _EXPFUNC _wcsnicoll(const wchar_t * __s1, const wchar_t * __s2, int __len);
|
|
_SIZE_T _RTLENTRY _EXPFUNC wcsxfrm(wchar_t * __s1, const wchar_t * __s2, _SIZE_T __n );
|
|
|
|
|
|
#if !defined(__STDC__) /* NON_ANSI */
|
|
#define _fstrcat strcat
|
|
#define _fstrchr strchr
|
|
#define _fstrcmp strcmp
|
|
#define _fstrcpy strcpy
|
|
#define _fstrcspn strcspn
|
|
#define _fstrdup strdup
|
|
#define _fstricmp stricmp
|
|
#define _fstrlen strlen
|
|
#define _fstrlwr strlwr
|
|
#define _fstrncat strncat
|
|
#define _fstrncmp strncmp
|
|
#define _fstrncpy strncpy
|
|
#define _fstrnicmp strnicmp
|
|
#define _fstrnset strnset
|
|
#define _fstrpbrk strpbrk
|
|
#define _fstrrchr strrchr
|
|
#define _fstrrev strrev
|
|
#define _fstrset strset
|
|
#define _fstrspn strspn
|
|
#define _fstrstr strstr
|
|
#define _fstrtok strtok
|
|
#define _fstrupr strupr
|
|
#endif /* __STDC__ */
|
|
|
|
#if defined(__USELOCALES__)
|
|
#define strupr _lstrupr
|
|
#define strlwr _lstrlwr
|
|
#define strcoll _lstrcoll
|
|
#define stricoll _lstricoll
|
|
#define strncoll _lstrncoll
|
|
#define strnicoll _lstrnicoll
|
|
#define strxfrm _lstrxfrm
|
|
#endif /* __USELOCALES__ */
|
|
|
|
#if !defined(RC_INVOKED)
|
|
|
|
#if defined(__STDC__)
|
|
#pragma warn .nak
|
|
#endif
|
|
|
|
#endif /* !RC_INVOKED */
|
|
|
|
#ifdef __cplusplus
|
|
} // std
|
|
#endif /* __cplusplus */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __STRING_H */
|
|
|
|
#if defined(__cplusplus) && !defined(__USING_CNAME__) && !defined(__STRING_H_USING_LIST)
|
|
#define __STRING_H_USING_LIST
|
|
#if !defined(__STDC__)
|
|
using std::_lstrlwr;
|
|
using std::_lstrupr;
|
|
using std::_stpcpy;
|
|
using std::strdup;
|
|
using std::stricmp;
|
|
using std::strlwr;
|
|
using std::strnicmp;
|
|
using std::strrev;
|
|
using std::strupr;
|
|
#endif
|
|
#if defined(__MFC_COMPAT__)
|
|
|
|
using std::_strrev;
|
|
using std::_strset;
|
|
using std::_strnset;
|
|
using std::_strupr;
|
|
using std::_strdup;
|
|
using std::_strlwr;
|
|
using std::_strcmpi;
|
|
using std::_stricmp;
|
|
using std::_strcmp;
|
|
using std::_strnicmp;
|
|
#endif
|
|
using std::_lstrcoll;
|
|
using std::_lstricoll;
|
|
using std::_lstrncoll;
|
|
using std::_lstrnicoll;
|
|
using std::_lstrxfrm;
|
|
using std::_lwcscoll;
|
|
using std::_lwcsicoll;
|
|
using std::_lwcslwr;
|
|
using std::_lwcsncoll;
|
|
using std::_lwcsnicoll;
|
|
using std::_lwcsupr;
|
|
using std::_lwcsxfrm;
|
|
using std::_strerror;
|
|
using std::_stricoll;
|
|
using std::_strncoll;
|
|
using std::_strnicoll;
|
|
using std::_wcsdup;
|
|
using std::_wcsicmp;
|
|
using std::_wcsicoll;
|
|
using std::_wcslwr;
|
|
using std::_wcsncoll;
|
|
using std::_wcsnicmp;
|
|
using std::_wcsnicoll;
|
|
using std::_wcsnset;
|
|
using std::_wcspcpy;
|
|
using std::_wcsrev;
|
|
using std::_wcsset;
|
|
using std::_wcsupr;
|
|
|
|
/*
|
|
Handle intrinsics specially. If intrinsics are on, the compiler creates
|
|
a macro of the normal function mapping to the __ intrinsic version, ie:
|
|
#define strcpy __strcpy__
|
|
Thus, we can test the normal name as a macro to see if it's defined, and
|
|
only preform a using statement if it's not an intrinsic
|
|
*/
|
|
|
|
#if !defined(__STDC__)
|
|
# ifndef strnset
|
|
using std::strnset;
|
|
# endif // ifndef strnset
|
|
# ifndef stpcpy
|
|
using std::stpcpy;
|
|
# endif // ifndef stpcpy
|
|
# ifndef strset
|
|
using std::strset;
|
|
# endif // ifndef strset
|
|
#endif // __STDC__
|
|
|
|
# ifndef strcat
|
|
using std::strcat;
|
|
# endif // ifndef strcat
|
|
# ifndef strchr
|
|
using std::strchr;
|
|
# endif // ifndef strchr
|
|
# ifndef strcmp
|
|
using std::strcmp;
|
|
# endif // ifndef strcmp
|
|
# ifndef strcpy
|
|
using std::strcpy;
|
|
# endif // ifndef strcpy
|
|
# ifndef strlen
|
|
using std::strlen;
|
|
# endif // ifndef strlen
|
|
# ifndef strncat
|
|
using std::strncat;
|
|
# endif // ifndef strncat
|
|
# ifndef strncmp
|
|
using std::strncmp;
|
|
# endif // ifndef strncmp
|
|
# ifndef strncpy
|
|
using std::strncpy;
|
|
# endif // ifndef strncpy
|
|
# ifndef strrchr
|
|
using std::strrchr;
|
|
# endif // ifndef strrchr
|
|
|
|
using std::strcspn;
|
|
using std::strerror;
|
|
using std::strpbrk;
|
|
using std::strspn;
|
|
using std::strstr;
|
|
using std::strtok;
|
|
using std::strxfrm;
|
|
using std::strcoll;
|
|
|
|
using std::wcscat;
|
|
using std::wcschr;
|
|
using std::wcscmp;
|
|
using std::wcscoll;
|
|
using std::wcscpy;
|
|
using std::wcscspn;
|
|
using std::wcslen;
|
|
using std::wcsncat;
|
|
using std::wcsncmp;
|
|
using std::wcsncpy;
|
|
using std::wcspbrk;
|
|
using std::wcspcpy;
|
|
using std::wcsrchr;
|
|
using std::wcsspn;
|
|
using std::wcsstr;
|
|
using std::wcstok;
|
|
using std::wcsxfrm;
|
|
#endif /* __USING_CNAME__ */
|