home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1997 May / Pcwk0597.iso / borland / cb / setup / cbuilder / data.z / STRING.H < prev    next >
C/C++ Source or Header  |  1997-02-28  |  81KB  |  2,124 lines

  1. /*  string.h
  2.  
  3.     Definitions for memory and string functions.
  4.  
  5. */
  6.  
  7. /*
  8.  *      C/C++ Run Time Library - Version 8.0
  9.  *
  10.  *      Copyright (c) 1987, 1997 by Borland International
  11.  *      All Rights Reserved.
  12.  *
  13.  */
  14. /* $Revision:   8.16  $ */
  15.  
  16. #if !defined(__USING_STD_NAMES__)
  17.  
  18. #ifndef __STRING_H
  19. #define __STRING_H
  20.  
  21. #if !defined(___DEFS_H)
  22. #include <_defs.h>
  23. #endif
  24.  
  25. #ifndef __STDDEF_H
  26. #include <stddef.h>
  27. #endif
  28.  
  29. #if !defined(NULL)
  30. #include <_null.h>
  31. #endif
  32.  
  33. #if !defined(__STDC__) && defined(__USELOCALES__)
  34. #if !defined(__LOCALE_H)
  35. #include <locale.h>
  36. #endif
  37. #endif  /* !__STDC__ && __USELOCALES__ */
  38.  
  39. #if !defined(RC_INVOKED)
  40.  
  41. #if defined(__STDC__)
  42. #pragma warn -nak
  43. #endif
  44.  
  45. #endif  /* !RC_INVOKED */
  46.  
  47.  
  48. #ifdef __cplusplus
  49. extern "C" {
  50. #endif
  51.  
  52.  
  53. #ifndef _SIZE_T
  54. #define _SIZE_T
  55. typedef unsigned size_t;
  56. #endif
  57.  
  58. #define wcscmpi(s1,s2)      _wcsicmp(s1,s2)
  59. #define _wcscmpi(s1,s2)     _wcsicmp(s1,s2)
  60. #define wcsncmpi(s1,s2,n)   _wcsnicmp(s1,s2,n)
  61. #define _wcsncmpi(s1,s2,n)  _wcsnicmp(s1,s2,n)
  62.  
  63. size_t          _RTLENTRY  _EXPFUNC wcslen(const wchar_t *__s);
  64. wchar_t *       _RTLENTRY  _EXPFUNC wcscpy(wchar_t *__dst, const wchar_t *__src);
  65. wchar_t *       _RTLENTRY  _EXPFUNC wcscat(wchar_t *__dest, const wchar_t *__src);
  66. wchar_t *       _RTLENTRY  _EXPFUNC wcschr(const wchar_t *__s, int __c);
  67. int             _RTLENTRY  _EXPFUNC wcscmp(const wchar_t *__s1, const wchar_t *__s2);
  68. int             _RTLENTRY  _EXPFUNC wcscoll(const wchar_t * __s1, const wchar_t * __s2);
  69. size_t          _RTLENTRY  _EXPFUNC wcscspn(const wchar_t *__s1, const wchar_t *__s2);
  70. wchar_t *       _RTLENTRY  _EXPFUNC _wcsdup(const wchar_t *__s);
  71. int             _RTLENTRY  _EXPFUNC wcsncmp(const wchar_t *__s1, const wchar_t *__s2, size_t __maxlen);
  72. wchar_t *       _RTLENTRY  _EXPFUNC wcsncpy(wchar_t *__dest, const wchar_t *__src, size_t __maxlen);
  73. wchar_t *       _RTLENTRY  _EXPFUNC _wcsnset(wchar_t *__s, wchar_t __ch, size_t __n);
  74. wchar_t *       _RTLENTRY  _EXPFUNC wcspbrk(const wchar_t *__s1, const wchar_t *__s2);
  75. wchar_t *       _RTLENTRY  _EXPFUNC wcsrchr(const wchar_t *__s, wchar_t __c);
  76. wchar_t *       _RTLENTRY  _EXPFUNC _wcsrev(wchar_t *__s);
  77. wchar_t *       _RTLENTRY  _EXPFUNC _wcsset(wchar_t*__s, wchar_t __ch);
  78. size_t          _RTLENTRY  _EXPFUNC wcsspn(const wchar_t *__s1, const wchar_t *__s2);
  79. wchar_t *       _RTLENTRY  _EXPFUNC wcsstr(const wchar_t *__s1, const wchar_t *__s2);
  80. wchar_t *       _RTLENTRY  _EXPFUNC wcstok(wchar_t *__s1, const wchar_t *__s2);
  81. wchar_t *       _RTLENTRY  _EXPFUNC wcsncat(wchar_t *__dest, const wchar_t *__src, size_t __maxlen);
  82. wchar_t *       _RTLENTRY  _EXPFUNC wcspcpy(wchar_t *__dest, const wchar_t *__src);
  83. wchar_t *       _RTLENTRY  _EXPFUNC _wcspcpy(wchar_t *__dest, const wchar_t *__src);
  84. int             _RTLENTRY  _EXPFUNC _wcsicmp(const wchar_t *__s1, const wchar_t *__s2);
  85. int             _RTLENTRY  _EXPFUNC _wcsnicmp(const wchar_t *__s1, const wchar_t *__s2, size_t __maxlen);
  86. void *          _RTLENTRY  _EXPFUNC _wmemset(void *__s, int __c, size_t __n);
  87. wchar_t *       _RTLENTRYF _EXPFUNC _wcslwr(wchar_t *__s);
  88. wchar_t *       _RTLENTRYF _EXPFUNC _wcsupr(wchar_t *__s);
  89. wchar_t *       _RTLENTRYF _EXPFUNC _lwcslwr(wchar_t *__s);
  90. wchar_t *       _RTLENTRYF _EXPFUNC _lwcsupr(wchar_t *__s);
  91. void *          _RTLENTRY  _EXPFUNC _wmemcpy(void *__dest, const void *__src, size_t __n);
  92.  
  93. int         _RTLENTRY  _EXPFUNC memcmp(const void _FAR *__s1,
  94.                                        const void _FAR *__s2, size_t __n);
  95. void _FAR * _RTLENTRY  _EXPFUNC memcpy(void _FAR *__dest, const void _FAR *__src,
  96.                                        size_t __n);
  97. void _FAR * _RTLENTRYF _EXPFUNC memmove(void _FAR *__dest, const void _FAR *__src,
  98.                                         size_t __n);
  99. void _FAR * _RTLENTRYF _EXPFUNC memset(void _FAR *__s, int __c, size_t __n);
  100. char _FAR * _RTLENTRYF _EXPFUNC strcat(char _FAR *__dest, const char _FAR *__src);
  101. int         _RTLENTRYF _EXPFUNC strcmp(const char _FAR *__s1, const char _FAR *__s2);
  102. char _FAR * _RTLENTRYF _EXPFUNC strcpy(char _FAR *__dest, const char _FAR *__src);
  103. size_t      _RTLENTRY  _EXPFUNC strcspn(const char _FAR *__s1, const char _FAR *__s2);
  104. char _FAR * _RTLENTRY  _EXPFUNC strerror(int __errnum);
  105. size_t      _RTLENTRYF _EXPFUNC strlen(const char _FAR *__s);
  106. char _FAR * _RTLENTRYF _EXPFUNC strncat(char _FAR *__dest, const char _FAR *__src,
  107.                                         size_t __maxlen);
  108. int         _RTLENTRYF _EXPFUNC strncmp(const char _FAR *__s1, const char _FAR *__s2,
  109.                                         size_t __maxlen);
  110. char _FAR * _RTLENTRYF _EXPFUNC strncpy(char _FAR *__dest, const char _FAR *__src,
  111.                                         size_t __maxlen);
  112. size_t      _RTLENTRY  _EXPFUNC strspn(const char _FAR *__s1, const char _FAR *__s2);
  113. char _FAR * _RTLENTRYF _EXPFUNC strtok(char _FAR *__s1, const char _FAR *__s2);
  114. char _FAR * _RTLENTRY  _EXPFUNC _strerror(const char _FAR *__s);
  115.  
  116.  
  117. #if !defined(__STDC__)
  118. /* compatibility with other compilers */
  119. #define strcmpi(s1,s2)      stricmp(s1,s2)
  120. #define strncmpi(s1,s2,n)   strnicmp(s1,s2,n)
  121.  
  122. char _FAR * _RTLENTRYF _EXPFUNC   _lstrlwr(char _FAR *__s);
  123. char _FAR * _RTLENTRYF _EXPFUNC   _lstrupr(char _FAR *__s);
  124. void _FAR * _RTLENTRY  _EXPFUNC   memccpy(void _FAR *__dest, const void _FAR *__src,
  125.                                           int __c, size_t __n);
  126. int         _RTLENTRY  _EXPFUNC   memicmp(const void _FAR *__s1, const void _FAR *__s2,
  127.                                           size_t __n);
  128. char _FAR * _RTLENTRYF _EXPFUNC32 stpcpy(char _FAR *__dest, const char _FAR *__src);
  129. char _FAR * _RTLENTRY  _EXPFUNC32 _stpcpy(char _FAR *__dest, const char _FAR *__src);
  130. char _FAR * _RTLENTRY  _EXPFUNC   strdup(const char _FAR *__s);
  131. int         _RTLENTRYF _EXPFUNC   stricmp(const char _FAR *__s1, const char _FAR *__s2);
  132. char _FAR * _RTLENTRYF _EXPFUNC   strlwr(char _FAR *__s);
  133. int         _RTLENTRYF _EXPFUNC   strnicmp(const char _FAR *__s1, const char _FAR *__s2,
  134.                                            size_t __maxlen);
  135. char _FAR * _RTLENTRY  _EXPFUNC   strnset(char _FAR *__s, int __ch, size_t __n);
  136. char _FAR * _RTLENTRY  _EXPFUNC   strrev(char _FAR *__s);
  137. char _FAR * _RTLENTRY  _EXPFUNC   strset(char _FAR *__s, int __ch);
  138. char _FAR * _RTLENTRYF _EXPFUNC   strupr(char _FAR *__s);
  139. #endif  /* !__STDC__ */
  140.  
  141.  
  142. #if defined(__cplusplus)
  143. extern "C++"
  144. {
  145.           void _FAR * _RTLENTRY  _EXPFUNC32 memchr(void _FAR *__s, int __c, size_t __n);
  146.     const void _FAR * _RTLENTRY  _EXPFUNC32 memchr(const void _FAR *__s, int __c, size_t __n);
  147. #if defined(__FLAT__)
  148.           void      * _RTLENTRY  _EXPFUNC32 _wmemchr(void *__s, int __c, size_t __n);
  149.     const void      * _RTLENTRY  _EXPFUNC32 _wmemchr(const void *__s, int __c, size_t __n);
  150. #endif
  151.           char _FAR * _RTLENTRYF _EXPFUNC   strchr(char _FAR * __s, int __c);
  152.     const char _FAR * _RTLENTRYF _EXPFUNC   strchr(const char _FAR * __s, int __c);
  153.           char _FAR * _RTLENTRYF _EXPFUNC   strrchr(char _FAR *__s, int __c);
  154.     const char _FAR * _RTLENTRYF _EXPFUNC   strrchr(const char _FAR *__s, int __c);
  155.           char _FAR * _RTLENTRYF _EXPFUNC   strpbrk(char _FAR *__s1, const char _FAR *__s2);
  156.     const char _FAR * _RTLENTRYF _EXPFUNC   strpbrk(const char _FAR *__s1, const char _FAR *__s2);
  157.           char _FAR * _RTLENTRY  _EXPFUNC   strstr(char _FAR *__s1, const char _FAR *__s2);
  158.     const char _FAR * _RTLENTRY  _EXPFUNC   strstr(const char _FAR *__s1, const char _FAR *__s2);
  159. }
  160. #else
  161.           void _FAR * _RTLENTRY  _EXPFUNC32 memchr(const void _FAR *__s, int __c, size_t __n);
  162. #if defined(__FLAT__)
  163.           void      * _RTLENTRY  _EXPFUNC32 _wmemchr(const void *__s, int __c, size_t __n);
  164. #endif
  165.           char _FAR * _RTLENTRYF _EXPFUNC   strchr(const char _FAR * __s, int __c);
  166.           char _FAR * _RTLENTRYF _EXPFUNC   strrchr(const char _FAR *__s, int __c);
  167.           char _FAR * _RTLENTRYF _EXPFUNC   strpbrk(const char _FAR *__s1, const char _FAR *__s2);
  168.           char _FAR * _RTLENTRY  _EXPFUNC   strstr(const char _FAR *__s1, const char _FAR *__s2);
  169. #endif
  170.  
  171.  
  172. /* Intrinsic functions */
  173. #if !defined(__MEM_H)
  174. void _FAR * _RTLENTRY  _EXPFUNC16 __memchr__(const void _FAR *__s, int __c, size_t __n);
  175. int         _RTLENTRY  _EXPFUNC16 __memcmp__(const void _FAR *__s1,
  176.                                              const void _FAR *__s2, size_t __n);
  177. void _FAR * _RTLENTRY  _EXPFUNC16 __memcpy__(void _FAR *__dest, const void _FAR *__src,
  178.                                              size_t __n);
  179. void _FAR * _RTLENTRYF _EXPFUNC16 __memset__(void _FAR *__s, int __c, size_t __n);
  180. #endif
  181.  
  182. char _FAR * _RTLENTRY             __stpcpy__(char _FAR *__dest, const char _FAR *__src);
  183. char _FAR * _RTLENTRYF _EXPFUNC16 __strcat__(char _FAR *__dest, const char _FAR *__src);
  184. char _FAR * _RTLENTRY  _EXPFUNC16 __strchr__(const char _FAR *__s, int __c);
  185. int         _RTLENTRYF _EXPFUNC16 __strcmp__(const char _FAR *__s1, const char _FAR *__s2);
  186. char _FAR * _RTLENTRYF _EXPFUNC16 __strcpy__(char _FAR *__dest, const char _FAR *__src);
  187. size_t      _RTLENTRYF _EXPFUNC16 __strlen__(const char _FAR *__s);
  188. char _FAR * _RTLENTRY  _EXPFUNC16 __strncat__(char _FAR *__dest, const char _FAR *__src,
  189.                                               size_t __maxlen);
  190. int         _RTLENTRY  _EXPFUNC16 __strncmp__(const char _FAR *__s1, const char _FAR *__s2,
  191.                                               size_t __maxlen);
  192. char _FAR * _RTLENTRYF _EXPFUNC16 __strncpy__(char _FAR *__dest, const char _FAR *__src,
  193.                                               size_t __maxlen);
  194. char _FAR * _RTLENTRY  _EXPFUNC16 __strnset__(char _FAR *__s, int __ch, size_t __n);
  195. char _FAR * _RTLENTRYF _EXPFUNC16 __strrchr__(const char _FAR *__s, int __c);
  196. char _FAR * _RTLENTRY  _EXPFUNC16 __strset__(char _FAR *__s, int __ch);
  197.  
  198. #if defined(__MSC) && !defined(__MFC_COMPAT__)
  199. #define _stricmp(s1,s2) stricmp(s1,s2)
  200. #define _strdup(s1)     strdup(s1)
  201. #define _strupr(s1)     strupr(s1)
  202. #define _strlwr(s1)     strlwr(s1)
  203. #define _strrev(s1)     strrev(s1)
  204. #endif  /* __MSC */
  205.  
  206. #if defined(__MFC_COMPAT__)
  207. inline char _FAR * _RTLENTRY  _strrev(char _FAR *__s) { return strrev(__s); }
  208.  
  209. inline char _FAR * _RTLENTRY  _strset(char _FAR *__s, int __ch)
  210.                               { return strset(__s, __ch); }
  211. inline char _FAR * _RTLENTRY  _strnset(char _FAR *__s, int __ch, size_t __n)
  212.                               { return strnset(__s, __ch, __n); }
  213. inline char _FAR * _RTLENTRYF _strupr(char _FAR *__s) { return strupr(__s); }
  214.  
  215. inline char _FAR * _RTLENTRYF _strlwr(char _FAR *__s) { return strlwr(__s); }
  216.  
  217. inline char _FAR * _RTLENTRY  _strdup(const char _FAR *__s)
  218.                               { return strdup(__s); }
  219. inline int         _RTLENTRYF _strcmpi(const char _FAR *__s1, const char _FAR *__s2)
  220.                               { return stricmp (__s1, __s2); }
  221. inline int         _RTLENTRYF _stricmp(const char _FAR *__s1, const char _FAR *__s2)
  222.                               { return stricmp (__s1, __s2); }
  223. inline int         _RTLENTRYF _strcmp(const char _FAR *__s1, const char _FAR *__s2)
  224.                               { return strcmp (__s1, __s2); }
  225. inline int         _RTLENTRYF _strnicmp(const char _FAR *__s1, const char _FAR *__s2, size_t __maxlen)
  226.                               { return strnicmp (__s1, __s2, __maxlen); }
  227. #endif
  228.  
  229. #if !defined(__FLAT__) || defined(__DPMI32__)
  230. void        _RTLENTRY  _EXPFUNC movedata(unsigned __srcseg,unsigned __srcoff,
  231.                                          unsigned __dstseg,unsigned __dstoff, size_t __n);
  232. #endif
  233.  
  234.  
  235. #if !defined(__FLAT__)
  236. int           _RTLENTRYF _EXPFUNC _lstrcoll(const char _FAR *__s1, const char _FAR *__s2);
  237. size_t        _RTLENTRYF _EXPFUNC _lstrxfrm(char _FAR *__s1, const char _FAR *__s2,
  238.                                             size_t __n );
  239. int           _RTLENTRYF          strcoll(const char _FAR *__s1, const char _FAR *__s2);
  240. size_t        _RTLENTRYF          strxfrm(char _FAR *__s1, const char _FAR *__s2,
  241.                                           size_t __n );
  242.  
  243. #if !defined(__STDC__)
  244. void  __far * _RTLENTRY _FARCALL  _fmemccpy(void __far *__dest, const void __far *__src,
  245.                                             int c, size_t __n);
  246. void  __far * _RTLENTRY _FARCALL  _fmemchr(const void __far *__s, int c, size_t __n);
  247. int           _RTLENTRY _FARCALL  _fmemcmp(const void __far *__s1, const void __far *__s2,
  248.                                            size_t __n);
  249. void  __far * _RTLENTRY _FARCALL  _fmemcpy(void __far *__dest, const void __far *__src,
  250.                                            size_t __n);
  251. int           _RTLENTRY _FARCALL  _fmemicmp(const void __far *__s1, const void __far *__s2,
  252.                                             size_t __n);
  253. void  __far * _RTLENTRY _FARCALL  _fmemmove(void __far *__dest, const void __far *__src,
  254.                                             size_t __n);
  255. void  __far * _RTLENTRY _FARCALL  _fmemset(void __far *__s, int c, size_t __n);
  256. void          _RTLENTRY _FARCALL  _fmovmem(const void __far *__src, void __far *__dest,
  257.                                            unsigned __length);
  258. void          _RTLENTRY _FARCALL  _fsetmem(void __far *__dest,unsigned __length,
  259.                                            char __value);
  260. char  __far * _RTLENTRY _FARCALL  _fstrcat(char __far *__dest, const char __far *__src);
  261. char  __far * _RTLENTRY _FARCALL  _fstrchr(const char __far *__s, int c);
  262. int           _RTLENTRY _FARCALL  _fstrcmp(const char __far *__s1, const char __far *__s2);
  263. char  __far * _RTLENTRY _FARCALL  _fstrcpy(char __far *__dest, const char __far *__src);
  264. size_t        _RTLENTRY _FARCALL  _fstrcspn(const char __far *__s1, const char __far *__s2);
  265. char  __far * _RTLENTRY _FARCALL  _fstrdup(const char __far *__s);
  266. int           _RTLENTRY _FARCALL  _fstricmp(const char __far *__s1, const char __far *__s2);
  267. size_t        _RTLENTRY _FARCALL  _fstrlen(const char __far *__s);
  268. char  __far * _RTLENTRY _FARCALL  _fstrlwr(char __far *__s);
  269. char  __far * _RTLENTRY _FARCALL  _fstrncat(char __far *__dest, const char __far *__src,
  270.                                             size_t maxlen);
  271. int           _RTLENTRY _FARCALL  _fstrncmp(const char __far *__s1, const char __far *__s2,
  272.                                             size_t maxlen);
  273. char  __far * _RTLENTRY _FARCALL  _fstrncpy(char __far *__dest, const char __far *__src,
  274.                                             size_t maxlen);
  275. int           _RTLENTRY _FARCALL  _fstrnicmp(const char __far *__s1, const char __far *__s2,
  276.                                              size_t maxlen);
  277. char  __far * _RTLENTRY _FARCALL  _fstrnset(char __far *__s, int ch, size_t __n);
  278. char  __far * _RTLENTRY _FARCALL  _fstrpbrk(const char __far *__s1, const char __far *__s2);
  279. char  __far * _RTLENTRY _FARCALL  _fstrrchr(const char __far *__s, int c);
  280. char  __far * _RTLENTRY _FARCALL  _fstrrev(char __far *__s);
  281. char  __far * _RTLENTRY _FARCALL  _fstrset(char __far *__s, int ch);
  282. size_t        _RTLENTRY _FARCALL  _fstrspn(const char __far *__s1, const char __far *__s2);
  283. char  __far * _RTLENTRY _FARCALL  _fstrstr(const char __far *__s1, const char __far *__s2);
  284. char  __far * _RTLENTRY _FARCALL  _fstrtok(char __far *__s1, const char __far *__s2);
  285. char  __far * _RTLENTRY _FARCALL  _fstrupr(char __far *__s);
  286. #endif  /* ! __STDC__ */
  287.  
  288.  
  289. #else    /* defined __FLAT__ */
  290.  
  291.  
  292. int    _RTLENTRY  _EXPFUNC _lstrcoll(const char * __s1, const char * __s2);
  293. int    _RTLENTRY  _EXPFUNC _lstricoll(const char * __s1, const char * __s2);
  294. int    _RTLENTRY  _EXPFUNC _lstrncoll(const char * __s1, const char * __s2, const int len);
  295. int    _RTLENTRY  _EXPFUNC _lstrnicoll(const char * __s1, const char * __s2, int len);
  296. size_t _RTLENTRY  _EXPFUNC _lstrxfrm(char * __s1, const char * __s2,size_t __n );
  297. int    _RTLENTRY  _EXPFUNC strcoll(const char * __s1, const char * __s2);
  298. int    _RTLENTRY  _EXPFUNC _stricoll(const char * __s1, const char * __s2);
  299. int    _RTLENTRY  _EXPFUNC _strncoll(const char * __s1, const char * __s2, size_t __n);
  300. int    _RTLENTRY  _EXPFUNC _strnicoll(const char * __s1, const char * __s2, int len);
  301. size_t _RTLENTRY  _EXPFUNC strxfrm(char * __s1, const char * __s2,size_t __n );
  302.  
  303. int    _RTLENTRY  _EXPFUNC _lwcscoll(const wchar_t * __s1, const wchar_t * __s2);
  304. int    _RTLENTRY  _EXPFUNC _lwcsicoll(const wchar_t * __s1, const wchar_t * __s2);
  305. int    _RTLENTRY  _EXPFUNC _lwcsncoll(const wchar_t * __s1, const wchar_t * __s2, const int len);
  306. int    _RTLENTRY  _EXPFUNC _lwcsnicoll(const wchar_t * __s1, const wchar_t * __s2, int len);
  307. size_t _RTLENTRY  _EXPFUNC _lwcsxfrm(wchar_t * __s1, const wchar_t * __s2,size_t __n );
  308. int    _RTLENTRY  _EXPFUNC wcscoll(const wchar_t * __s1, const wchar_t * __s2);
  309. int    _RTLENTRY  _EXPFUNC _wcsicoll(const wchar_t * __s1, const wchar_t * __s2);
  310. int    _RTLENTRY  _EXPFUNC _wcsncoll(const wchar_t * __s1, const wchar_t * __s2, size_t __n);
  311. int    _RTLENTRY  _EXPFUNC _wcsnicoll(const wchar_t * __s1, const wchar_t * __s2, int len);
  312. size_t _RTLENTRY  _EXPFUNC wcsxfrm(wchar_t * __s1, const wchar_t * __s2, size_t __n );
  313.  
  314.  
  315. #if !defined(__STDC__) /* NON_ANSI  */
  316. #define _fmemccpy  memccpy
  317. #define _fmemchr   memchr
  318. #define _fmemcmp   memcmp
  319. #define _fmemcpy   memcpy
  320. #define _fmemicmp  memicmp
  321. #define _fmemmove  memmove
  322. #define _fmemset   memset
  323. #define _fmovmem   movmem
  324. #define _fsetmem   setmem
  325. #define _fstrcat   strcat
  326. #define _fstrchr   strchr
  327. #define _fstrcmp   strcmp
  328. #define _fstrcpy   strcpy
  329. #define _fstrcspn  strcspn
  330. #define _fstrdup   strdup
  331. #define _fstricmp  stricmp
  332. #define _fstrlen   strlen
  333. #define _fstrlwr   strlwr
  334. #define _fstrncat  strncat
  335. #define _fstrncmp  strncmp
  336. #define _fstrncpy  strncpy
  337. #define _fstrnicmp strnicmp
  338. #define _fstrnset  strnset
  339. #define _fstrpbrk  strpbrk
  340. #define _fstrrchr  strrchr
  341. #define _fstrrev   strrev
  342. #define _fstrset   strset
  343. #define _fstrspn   strspn
  344. #define _fstrstr   strstr
  345. #define _fstrtok   strtok
  346. #define _fstrupr   strupr
  347. #endif /* __STDC__  */
  348.  
  349. #endif  /* __FLAT__ */
  350.  
  351. #if defined(__USELOCALES__)
  352. #define  strupr     _lstrupr
  353. #define  strlwr     _lstrlwr
  354. #define  strcoll    _lstrcoll
  355. #define  stricoll   _lstricoll
  356. #define  strncoll   _lstrncoll
  357. #define  strnicoll  _lstrnicoll
  358. #define  strxfrm    _lstrxfrm
  359. #endif  /* __USELOCALES__ */
  360.  
  361. #ifdef __cplusplus
  362. }
  363. #endif
  364.  
  365. #if !defined(RC_INVOKED)
  366.  
  367. #if defined(__STDC__)
  368. #pragma warn .nak
  369. #endif
  370.  
  371. #endif  /* !RC_INVOKED */
  372.  
  373.  
  374. #endif  /* __STRING_H */
  375.  
  376. #else   /* __USING_STD_NAMES__ */
  377.  
  378. #ifndef __STD_STRING
  379. #define __STD_STRING
  380.  
  381. /***************************************************************************
  382.  *
  383.  * string - Declarations for the Standard Library string classes
  384.  *
  385.  * $Id: string,v 1.116 1995/10/03 00:03:27 smithey Exp $
  386.  *
  387.  ***************************************************************************
  388.  *
  389.  * (c) Copyright 1994, 1995 Rogue Wave Software, Inc.
  390.  * ALL RIGHTS RESERVED
  391.  *
  392.  * The software and information contained herein are proprietary to, and
  393.  * comprise valuable trade secrets of, Rogue Wave Software, Inc., which
  394.  * intends to preserve as trade secrets such software and information.
  395.  * This software is furnished pursuant to a written license agreement and
  396.  * may be used, copied, transmitted, and stored only in accordance with
  397.  * the terms of such license and with the inclusion of the above copyright
  398.  * notice.  This software and information or any other copies thereof may
  399.  * not be provided or otherwise made available to any other person.
  400.  *
  401.  * Notwithstanding any other lease or license that may pertain to, or
  402.  * accompany the delivery of, this computer software and information, the
  403.  * rights of the Government regarding its use, reproduction and disclosure
  404.  * are as set forth in Section 52.227-19 of the FARS Computer
  405.  * Software-Restricted Rights clause.
  406.  *
  407.  * Use, duplication, or disclosure by the Government is subject to
  408.  * restrictions as set forth in subparagraph (c)(1)(ii) of the Rights in
  409.  * Technical Data and Computer Software clause at DFARS 252.227-7013.
  410.  * Contractor/Manufacturer is Rogue Wave Software, Inc.,
  411.  * P.O. Box 2328, Corvallis, Oregon 97339.
  412.  *
  413.  * This computer software and information is distributed with "restricted
  414.  * rights."  Use, duplication or disclosure is subject to restrictions as
  415.  * set forth in NASA FAR SUP 18-52.227-79 (April 1985) "Commercial
  416.  * Computer Software-Restricted Rights (April 1985)."  If the Clause at
  417.  * 18-52.227-74 "Rights in Data General" is specified in the contract,
  418.  * then the "Alternate III" clause applies.
  419.  *
  420.  **************************************************************************/
  421.  
  422. #include <stdcomp.h>
  423. #include <stddefs.h>
  424.  
  425. #ifndef RWSTD_NO_NEW_HEADER
  426. #include <cstddef>
  427. #include <cstring>
  428. #include <cctype>
  429. #else
  430. #include <stddef.h>
  431. #include <string.h>
  432. #include <ctype.h>
  433. #endif
  434.  
  435. #include <memory>     // For allocator.
  436. #include <algorith>
  437. #include <iterator>
  438.  
  439. #ifdef RWSTD_MULTI_THREAD
  440. #include <stdmutex.h>
  441. #endif
  442.  
  443. #ifndef RWSTD_NO_WSTR
  444. #ifndef RWSTD_NO_NEW_HEADER
  445. #include <cwctype>
  446. #include <cwchar>
  447. #else
  448. #ifndef RWSTD_NO_WCTYPE_H
  449. # include <wctype.h>
  450. #endif
  451. #include <wchar.h>
  452. #endif
  453. #endif
  454.  
  455. #ifdef RW_STD_IOSTREAM
  456. #include <iostream>
  457. #else
  458. #include <iostream.h>
  459. #endif
  460.  
  461. //
  462. // Temporarily turn off the warnings under the Borland compiler that
  463. // say 'Functions containing ... cannot be inlined'
  464. //
  465. #if defined(__BORLANDC__)
  466. #pragma warn -inl
  467. #endif
  468.  
  469.  
  470. //
  471. // Extra comment after = d keeps > and > from being put together
  472. // if the default parameter is a templated type and is also the
  473. // last in the template parameter list
  474. //
  475.  
  476. #ifndef RWSTD_NO_DEFAULT_TEMPLATES
  477. #define RWSTD_TDFLT(d) = d /* */
  478. #else
  479. #define RWSTD_TDFLT(d) /* */
  480. #endif
  481.  
  482. #ifdef RW_STD_ALLOCATOR
  483. #define RWSTD_ALLOC_TYPE(t) allocator
  484. #else
  485. #define RWSTD_ALLOC_TYPE(t) allocator<t>
  486. #endif
  487.  
  488. #ifndef RWSTD_NO_NAMESPACE
  489. namespace std {
  490. #endif
  491.  
  492. //
  493. // Global error message declarations
  494. //
  495.  
  496. extern char RWSTDExport rwse_InvalidSizeParam[];
  497. extern char RWSTDExport rwse_PosBeyondEndOfString[];
  498. extern char RWSTDExport rwse_ResultLenInvalid[];
  499. extern char RWSTDExport rwse_StringIndexOutOfRange[];
  500. extern char RWSTDExport rwse_UnexpectedNullPtr[];
  501.  
  502. //
  503. // Class & Structure Declarations
  504. //
  505.  
  506. template<class charT> struct ios_traits;
  507. template<class charT> struct string_char_traits;
  508.  
  509. template< class charT, class traits RWSTD_TDFLT(string_char_traits<charT>),
  510.   class Allocator RWSTD_TDFLT(RWSTD_ALLOC_TYPE(charT)) >
  511. class string_ref;
  512.  
  513. template< class charT,  class traits RWSTD_TDFLT(string_char_traits<charT>),
  514.  class Allocator RWSTD_TDFLT(RWSTD_ALLOC_TYPE(charT)) >
  515. class basic_string;
  516.  
  517. //
  518. // string_char_traits structure definition
  519. //
  520. // Header right out of the working paper.
  521. //
  522.  
  523. template <class charT>
  524. struct string_char_traits
  525. {
  526.   typedef charT char_type;
  527.  
  528. #ifdef RW_STD_IOSTREAM
  529.   typedef basic_istream<char_type, ios_traits<char_type> > istream_type;
  530.   typedef basic_ostream<char_type, ios_traits<char_type> > ostream_type;
  531. #endif
  532.  
  533.   static void assign (char_type& c1, const char_type& c2)   { c1 = c2;         }
  534.   static bool eq (const char_type& c1, const char_type& c2) { return c1 == c2; }
  535.   static bool ne (const char_type& c1, const char_type& c2) { return !(c1==c2);}
  536.   static bool lt (const char_type& c1, const char_type& c2) { return c1 < c2;  }
  537.   static char_type eos ()  { return char_type(); }
  538.  
  539. #ifdef RW_STD_IOSTREAM
  540.   static istream_type& char_in  (istream_type& is, char_type& a) { is.get(a); return is;}
  541.   static ostream_type& char_out (ostream_type& os, char_type  a) { return os<<a;}
  542. #endif
  543.  
  544.   static bool is_del (char_type a)  { return isspace(a); }   // Delimiter
  545.  
  546.   static int compare (const char_type* s1, const char_type* s2, size_t n)
  547.   {
  548.     int result = 0;
  549.     for (size_t i = 0; i < n && result == 0; ++i, ++s1, ++s2)
  550.       if (ne(*s1, *s2))
  551.         result = lt(*s1, *s2) ? -1 : 1;
  552.     return result;
  553.   }
  554.   static size_t length (const char_type * s)
  555.   {
  556.     size_t l = 0;
  557.     while (ne(*s++, eos()))  ++l;
  558.     return l;
  559.   }
  560.   static char_type* copy (char_type* s1, const char_type* s2, size_t n)
  561.   {
  562.     char_type* s = s1;
  563.     for (size_t i = 0; i < n; i++)  assign(*s1++, *s2++);
  564.     return s;
  565.   }
  566.   static char_type* move (char_type* s1, const char_type* s2, size_t n)
  567.   {
  568.     char_type * s = s1;
  569.     if (s1 < s2)
  570.       copy(s1, s2, n);
  571.     else if (s1 > s2)
  572.     {
  573.       s1 += n;
  574.       s2 += n;
  575.       for(size_t i = 0; i < n; ++i) assign(*--s1, *--s2);
  576.     }
  577.     return s;
  578.   }
  579. };
  580.  
  581. class RWSTDExport string_char_traits<char>
  582. {
  583.  public:
  584.   typedef char char_type;
  585.  
  586. #ifdef RW_STD_IOSTREAM
  587.   typedef basic_istream<char, ios_traits<char> > istream_type;
  588.   typedef basic_ostream<char, ios_traits<char> > ostream_type;
  589. #else
  590.   typedef istream istream_type;
  591.   typedef ostream ostream_type;
  592. #endif
  593.  
  594.   static void assign (char_type& c1, const char_type& c2)   { c1 = c2; }
  595.   static bool eq (const char_type& c1, const char_type& c2) { return c1 == c2;}
  596.   static bool ne (const char_type& c1, const char_type& c2) { return c1 != c2;}
  597.   static bool lt (const char_type& c1, const char_type& c2) { return c1 < c2;}
  598.   static char_type eos () { return 0; }
  599.  
  600.   static istream_type& char_in  (istream_type& is, char_type& a) { is.get(a); return is;}
  601.   static ostream_type& char_out (ostream_type& os, char_type  a) { os.put(a); return os; }
  602.  
  603.   static bool is_del (char_type a)  { return isspace(a); }
  604.  
  605.   static int compare (const char_type* s1, const char_type* s2, size_t n)
  606.   {
  607.     return memcmp(s1, s2, n);
  608.   }
  609.   static size_t length (const char_type* s)
  610.   {
  611.     return strlen(s);
  612.   }
  613.   static char_type * copy (char_type* s1, const char_type* s2, size_t n)
  614.   {
  615.     return (char_type *) memcpy(s1, s2, n);
  616.   }
  617.   static char_type * move (char_type* s1, const char_type* s2, size_t n)
  618.   {
  619. #ifndef RWSTD_NO_MEMMOVE
  620.     return (char_type *) memmove(s1, s2, n);
  621. #else
  622.     char_type * s = s1;
  623.     if (s1 < s2)
  624.       copy(s1, s2, n);
  625.     else if (s1 > s2)
  626.     {
  627.       s1 += n;
  628.       s2 += n;
  629.       for(size_t i = 0; i < n; ++i) assign(*--s1, *--s2);
  630.     }
  631.     return s;
  632. #endif
  633.   }
  634. };
  635.  
  636. #ifndef RWSTD_NO_WSTR
  637. struct RWSTDExport string_char_traits<wchar_t>
  638. {
  639.   typedef wchar_t char_type;
  640.  
  641. #ifdef RW_STD_IOSTREAM
  642.   typedef basic_istream<char_type, ios_traits<char_type> > istream_type;
  643.   typedef basic_ostream<char_type, ios_traits<char_type> > ostream_type;
  644. #else
  645.   typedef istream istream_type;
  646.   typedef ostream ostream_type;
  647. #endif
  648.  
  649.   static void assign (char_type& c1, const char_type& c2)   { c1 = c2; }
  650.   static bool eq (const char_type& c1, const char_type& c2) { return c1 == c2;}
  651.   static bool ne (const char_type& c1, const char_type& c2) { return c1 != c2;}
  652.   static bool lt (const char_type& c1, const char_type& c2) { return c1 < c2;}
  653.   static char_type eos ()  { return 0; }
  654.  
  655. #ifdef RW_STD_IOSTREAM
  656.   static istream_type& char_in  (istream_type& is, char_type& a) { is.get(a); return is;}
  657.   static ostream_type& char_out (ostream_type& os, char_type  a) { return os<<a;}
  658. #else
  659.   static istream_type& char_in (istream_type& is, char_type& a)
  660.   {
  661.     char c;
  662.     is.get(c);
  663.     char_type wc;
  664.     mbtowc(&wc,&c,1);
  665.     a = wc;
  666.     return is;
  667.   }
  668.   static ostream_type& char_out (ostream_type& os, char_type a)
  669.   {
  670.     char c[RWSTD_MB_CUR_MAX+1];
  671.     int i;
  672.     if (i = wctomb(c,a) > 0)
  673.     {
  674.       c[i] = '\0';
  675.       os << c;
  676.     }
  677.     return os;
  678.   }
  679. #endif
  680.  
  681.   static bool is_del (char a)  { return iswspace(a); }
  682.  
  683.   static int compare (const char_type* s1, const char_type* s2, size_t n)
  684.   {
  685.     return wcsncmp(s1, s2, n);
  686.   }
  687.   static size_t length(const char_type* s)  { return wcslen(s); }
  688.   static char_type* copy(char_type* s1, const char_type* s2, size_t n)
  689.   {
  690.     return (char_type *) wcsncpy(s1, s2, n);
  691.   }
  692.   static char_type* move(char_type* s1, const char_type* s2, size_t n)
  693.   {
  694.     return (char_type *) wcsncpy(s1, s2, n);
  695.   }
  696. };
  697. #endif /* not defined RWSTD_NO_WSTR */
  698.  
  699. template <class Allocator>
  700. class string_ref_rep
  701. {
  702.  public:
  703.   string_ref_rep() : refs_(0), capacity_(0), nchars_(0) {;}
  704.  
  705. #ifdef RWSTD_MULTI_THREAD
  706.   RWSTDMutex mutex_;
  707. #endif
  708.  
  709.   typedef typename Allocator::size_type    size_type;
  710.  
  711.  protected:
  712.  
  713.   unsigned long   refs_;      // (1 less than) number of references
  714.  
  715.   size_type       capacity_;  // Size of allocated memory
  716.   size_type       nchars_;    // Number of actual data values stored
  717. };
  718.  
  719. template <class charT, class traits, class Allocator>
  720. struct null_string_ref_rep
  721. {
  722.   //
  723.   // ref_hdr has to be immediately followed by eos_char !
  724.   //
  725.   string_ref_rep<Allocator>      ref_hdr;
  726.   charT                          eos_char;
  727.  
  728.   null_string_ref_rep () : eos_char(traits::eos())  {;}
  729. };
  730.  
  731. #ifdef RWSTD_NO_STATIC_DEF3
  732. extern unsigned long RWSTDExport nullref[];
  733. #endif
  734.  
  735. template <class charT, class traits, class Allocator>
  736. class string_ref : public string_ref_rep<Allocator>
  737. {
  738.   typedef string_ref_rep<Allocator> string_ref_rep_type;
  739.  
  740.   string_ref (long initRef = 0) { refs_ = (unsigned long)initRef - 1; }
  741.  
  742.   unsigned references () const { return refs_+1; }
  743.  
  744.   void setRefCount (unsigned r)
  745.   {
  746. #ifdef RWSTD_MULTI_THREAD
  747.       RWSTDGuard guard(this->mutex_);
  748. #endif
  749.       refs_ = r-1;
  750.   }
  751.  
  752.   void addReference ()
  753.   {
  754. #ifdef RWSTD_MULTI_THREAD
  755.       RWSTDGuard guard(this->mutex_);
  756. #endif
  757.       refs_++;
  758.   }
  759.   unsigned  removeReference ()
  760.   {
  761. #ifdef RWSTD_MULTI_THREAD
  762.       RWSTDGuard guard(this->mutex_);
  763. #endif
  764.       return unSafeRemoveReference();
  765.   }
  766. unsigned  unSafeRemoveReference ()
  767.   {
  768.       return refs_--;
  769.   }
  770.  
  771.   size_type length         () const           { return nchars_; }
  772.   size_type getCapac       () const           { return capacity_;}
  773.   charT*    data           () const           { return (charT*)(this+1); }
  774.  
  775.   charT&    operator[]     (size_type i)      { return ((charT*)(this+1))[i]; }
  776.   charT     operator[]     (size_type i) const{ return ((charT*)(this+1))[i]; }
  777.  
  778.   //
  779.   // Disconnect from this ref, maybe delete it.
  780.   //
  781.   void      unLink          (Allocator& alloc);
  782.   void      unSafeunLink    (Allocator& alloc);
  783.  
  784.   friend class basic_string<charT, traits, Allocator>;
  785. };
  786.  
  787.  
  788. template <class charT, class traits, class Allocator >
  789. class basic_string
  790. {
  791.   public:
  792.     //
  793.     // types
  794.     //
  795.     typedef traits                                            traits_type;
  796.     typedef typename traits::char_type                        value_type;
  797.  
  798. #ifndef RWSTD_NO_COMPLICATED_TYPEDEF
  799.     typedef typename Allocator::size_type                     size_type;
  800. #else
  801.     typedef size_t                                            size_type;
  802. #endif
  803.     typedef typename Allocator::difference_type               difference_type;
  804.  
  805. #ifdef RW_STD_ALLOCATOR
  806.     typedef typename Allocator::types<charT>::reference       reference;
  807.     typedef typename Allocator::types<charT>::const_reference const_reference;
  808.     typedef typename Allocator::types<charT>::pointer         pointer;
  809.     typedef typename Allocator::types<charT>::const_pointer   const_pointer;
  810.  
  811.     typedef typename Allocator::types<charT>::pointer         iterator;
  812.     typedef typename Allocator::types<charT>::const_pointer   const_iterator;
  813. #else
  814.     typedef typename Allocator::reference                     reference;
  815.     typedef typename Allocator::const_reference               const_reference;
  816.     typedef typename Allocator::pointer                       pointer;
  817.     typedef typename Allocator::const_pointer                 const_pointer;
  818.  
  819.     typedef typename Allocator::pointer                       iterator;
  820.     typedef typename Allocator::const_pointer                 const_iterator;
  821. #endif
  822.  
  823.     typedef reverse_iterator<const_iterator, value_type,
  824.                     const_reference, difference_type>   const_reverse_iterator;
  825.     typedef reverse_iterator<iterator, value_type,
  826.                     reference, difference_type>         reverse_iterator;
  827.  
  828.     static const size_type npos;
  829.  
  830.     explicit basic_string (const Allocator& = Allocator());
  831.     basic_string (const basic_string<charT, traits, Allocator>&);
  832.     basic_string (const basic_string<charT, traits, Allocator>&, size_type,
  833.                   size_type = npos, const Allocator& = Allocator());
  834.     basic_string (const charT*, size_type, const Allocator& = Allocator());
  835.     basic_string (const charT*, const Allocator& = Allocator());
  836.     basic_string (size_type, charT, const Allocator& = Allocator());
  837. #ifndef RWSTD_NO_MEMBER_TEMPLATES
  838.     template <class InputIterator>
  839.       basic_string (InputIterator, InputIterator, const Allocator&=Allocator());
  840. #else
  841.     basic_string (const charT*, const charT*, const Allocator& = Allocator());
  842. #endif
  843.  
  844.    ~basic_string ();
  845.  
  846.     basic_string<charT, traits, Allocator>& operator= (const basic_string<charT, traits, Allocator>&);
  847.     basic_string<charT, traits, Allocator>& operator= (const charT*);
  848.     basic_string<charT, traits, Allocator>& operator= (charT);
  849.     //
  850.     // iterators
  851.     //
  852.     iterator       begin ()        { return data_;          }
  853.     const_iterator begin () const  { return data_;          }
  854.     iterator       end   ()        { return data_+length(); }
  855.     const_iterator end   () const  { return data_+length(); }
  856.  
  857.     reverse_iterator rbegin ()
  858.     {
  859.         reverse_iterator tmp(end()); return tmp;
  860.     }
  861.     const_reverse_iterator rbegin () const
  862.     {
  863.         const_reverse_iterator tmp(end()); return tmp;
  864.     }
  865.     reverse_iterator rend ()
  866.     {
  867.         reverse_iterator tmp(begin()); return tmp;
  868.     }
  869.     const_reverse_iterator rend () const
  870.     {
  871.         const_reverse_iterator tmp(begin()); return tmp;
  872.     }
  873.     //
  874.     // capacity
  875.     //
  876.     size_type length () const;
  877.     size_type size () const      { return length(); }
  878.     size_type max_size () const
  879.     {
  880.         return npos - sizeof(string_ref_rep<Allocator>);
  881.     }
  882.     void resize (size_type, charT);
  883.     void resize (size_type);
  884.     size_type capacity () const;
  885.     void reserve (size_type);
  886.     bool empty () const  { return length() == 0; }
  887.     //
  888.     // element access
  889.     //
  890.     charT           operator[] (size_type) const;
  891.     reference       operator[] (size_type);
  892.     const_reference at (size_type) const;
  893.     reference       at (size_type);
  894.     //
  895.     // modifiers
  896.     //
  897.     basic_string<charT, traits, Allocator>& operator+= (const basic_string<charT, traits, Allocator>&);
  898.     basic_string<charT, traits, Allocator>& operator+= (const charT*);
  899.     basic_string<charT, traits, Allocator>& operator+= (charT);
  900.  
  901.     basic_string<charT, traits, Allocator>& append (const basic_string<charT, traits, Allocator>&,
  902.                                                     size_type = 0,
  903.                                                     size_type = npos);
  904.     basic_string<charT, traits, Allocator>& append (const charT*, size_type);
  905.     basic_string<charT, traits, Allocator>& append (const charT*);
  906.     //
  907.     // The WP defaults the second argument here.
  908.     //
  909.     basic_string<charT, traits, Allocator>& append (size_type, charT);
  910.     //
  911.     // This is currently not in the WP.
  912.     //
  913.     basic_string<charT, traits, Allocator>& append (charT c)
  914.     {
  915.         return append(1,c);
  916.     }
  917. #ifndef RWSTD_NO_MEMBER_TEMPLATES
  918.     template<class InputIterator>
  919.     basic_string<charT, traits, Allocator>& append (InputIterator,
  920.                                                     InputIterator);
  921. #else
  922.     basic_string<charT, traits, Allocator>& append (const charT*,
  923.                                                     const charT*);
  924. #endif
  925.  
  926.     basic_string<charT, traits, Allocator>& assign (const basic_string<charT, traits, Allocator>&,
  927.                                                     size_type = 0,
  928.                                                     size_type = npos);
  929.     basic_string<charT, traits, Allocator>& assign (const charT*, size_type);
  930.     basic_string<charT, traits, Allocator>& assign (const charT*);
  931.     //
  932.     // The WP defaults the second argument here.
  933.     //
  934.     basic_string<charT, traits, Allocator>& assign (size_type, charT);
  935.     //
  936.     // This is currently not in the WP.
  937.     //
  938.     basic_string<charT, traits, Allocator>& assign (charT c)
  939.     {
  940.       return assign(1,c);
  941.     }
  942. #ifndef RWSTD_NO_MEMBER_TEMPLATES
  943.     template<class InputIterator>
  944.     basic_string<charT, traits, Allocator>& assign (InputIterator,
  945.                                                     InputIterator);
  946. #else
  947.     basic_string<charT, traits, Allocator>& assign (const charT*,
  948.                                                     const charT*);
  949. #endif
  950.  
  951.     basic_string<charT, traits, Allocator>& insert (size_type,
  952.                                                     const basic_string<charT, traits, Allocator>&,
  953.                                                     size_type = 0,
  954.                                                     size_type = npos);
  955.     basic_string<charT, traits, Allocator>& insert (size_type,
  956.                                                     const charT*,
  957.                                                     size_type);
  958.     basic_string<charT, traits, Allocator>& insert (size_type, const charT*);
  959.     //
  960.     // The WP defaults the third argument here.
  961.     //
  962.     basic_string<charT, traits, Allocator>& insert (size_type,size_type,charT);
  963.     //
  964.     // This is not currently defined by the WP.
  965.     //
  966.     basic_string<charT, traits, Allocator>& insert (size_type pos, charT c)
  967.     {
  968.         return insert(pos,1,c);
  969.     }
  970.     //
  971.     // The WP defaults the third argument here.
  972.     //
  973.     iterator insert (iterator, size_type, charT);
  974.     //
  975.     // The WP defaults the second argument here.
  976.     //
  977.     iterator insert (iterator pos, charT c)
  978.     {
  979.         return insert(pos,1,c);
  980.     }
  981. #ifndef RWSTD_NO_MEMBER_TEMPLATES
  982.     template<class InputIterator>
  983.     void insert (iterator, InputIterator, InputIterator);
  984. #else
  985.     void insert (iterator, const charT*, const charT*);
  986. #endif
  987.  
  988.     basic_string<charT, traits, Allocator>& remove (size_type = 0,
  989.                                                     size_type = npos);
  990.     basic_string<charT, traits, Allocator>& remove (iterator);
  991.     basic_string<charT, traits, Allocator>& remove (iterator, iterator);
  992.  
  993.     void erase (iterator it) { remove(it); }
  994.     void erase (iterator first, iterator last) { remove(first,last); }
  995.  
  996. private:
  997.     //
  998.     // Used for effiency
  999.     //
  1000.     basic_string<charT, traits, Allocator>::iterator replace (size_type,
  1001.                                                               size_type,
  1002.                                                               const charT*,
  1003.                                                               size_type,
  1004.                                                               size_type,
  1005.                                                               size_type);
  1006.     basic_string<charT, traits, Allocator>::iterator replace_aux (size_type,
  1007.                                                                   size_type,
  1008.                                                                   const basic_string<charT, traits, Allocator>&,
  1009.                                                                   size_type =0,
  1010.                                                                   size_type =npos);
  1011. public:
  1012.  
  1013.     basic_string<charT, traits, Allocator>& replace (size_type,
  1014.                                                      size_type,
  1015.                                                      const basic_string<charT, traits, Allocator>&,
  1016.                                                      size_type = 0,
  1017.                                                      size_type = npos);
  1018.     basic_string<charT, traits, Allocator>& replace (size_type,
  1019.                                                      size_type,
  1020.                                                      const charT*,
  1021.                                                      size_type);
  1022.     basic_string<charT, traits, Allocator>& replace (size_type,
  1023.                                                      size_type,
  1024.                                                      const charT*);
  1025.     basic_string<charT, traits, Allocator>& replace (size_type,
  1026.                                                      size_type,
  1027.                                                      size_type,
  1028.                                                      charT);
  1029.     basic_string<charT, traits, Allocator>& replace (iterator,
  1030.                                                      iterator,
  1031.                                                      const basic_string<charT, traits, Allocator>&);
  1032.     basic_string<charT, traits, Allocator>& replace (iterator,
  1033.                                                      iterator,
  1034.                                                      const charT*,
  1035.                                                      size_type);
  1036.     basic_string<charT, traits, Allocator>& replace (iterator,
  1037.                                                      iterator,
  1038.                                                      const charT*);
  1039.     basic_string<charT, traits, Allocator>& replace (iterator,
  1040.                                                      iterator,
  1041.                                                      size_type,
  1042.                                                      charT);
  1043.     basic_string<charT, traits, Allocator>& replace (iterator first,
  1044.                                                      iterator last,
  1045.                                                      charT c)
  1046.     {
  1047.         return replace(first,last,1,c);
  1048.     }
  1049. #ifndef RWSTD_NO_MEMBER_TEMPLATES
  1050.     template<class InputIterator>
  1051.     basic_string<charT, traits, Allocator>& replace (iterator, iterator,
  1052.                                                      InputIterator,
  1053.                                                      InputIterator);
  1054. #else
  1055.     basic_string<charT, traits, Allocator>& replace (iterator, iterator,
  1056.                                                      const charT*,
  1057.                                                      const charT*);
  1058. #endif
  1059.  
  1060.     size_type copy (charT*, size_type, size_type = 0);
  1061.     basic_string<charT, traits, Allocator> copy () const; // Returns deep copy
  1062.     void swap(basic_string<charT, traits, Allocator>& s)
  1063.     {
  1064.         charT * temp = data_; data_ = s.data_; s.data_ = temp;
  1065.     }
  1066.     //
  1067.     // string operations
  1068.     //
  1069.     const charT* c_str () const;
  1070.     const charT* data  () const;
  1071.  
  1072.     size_type find (const basic_string<charT, traits, Allocator>&,
  1073.                     size_type = 0) const;
  1074.     size_type find (const charT*, size_type, size_type) const;
  1075.     size_type find (const charT*, size_type = 0) const;
  1076.     size_type find (charT, size_type = 0) const;
  1077.  
  1078.     size_type rfind (const basic_string<charT, traits, Allocator>&,
  1079.                      size_type = npos) const;
  1080.     size_type rfind (const charT*, size_type, size_type) const;
  1081.     size_type rfind (const charT*, size_type = npos) const;
  1082.     size_type rfind (charT, size_type = npos) const;
  1083.  
  1084.     size_type find_first_of (const basic_string<charT, traits, Allocator>&,
  1085.                              size_type = 0) const;
  1086.     size_type find_first_of (const charT*, size_type, size_type) const;
  1087.     size_type find_first_of (const charT*, size_type = 0) const;
  1088.     size_type find_first_of (charT, size_type = 0) const;
  1089.  
  1090.     size_type find_last_of (const basic_string<charT, traits, Allocator>&,
  1091.                             size_type = npos) const;
  1092.     size_type find_last_of (const charT*, size_type, size_type) const;
  1093.     size_type find_last_of (const charT*, size_type = npos) const;
  1094.     size_type find_last_of (charT, size_type = npos) const;
  1095.  
  1096.     size_type find_first_not_of (const basic_string<charT, traits, Allocator>&,
  1097.                                  size_type = 0) const;
  1098.     size_type find_first_not_of (const charT*, size_type ,
  1099.                                  size_type) const;
  1100.     size_type find_first_not_of (const charT*, size_type = 0) const;
  1101.     size_type find_first_not_of (charT, size_type = 0) const;
  1102.  
  1103.     size_type find_last_not_of (const basic_string<charT, traits, Allocator>&,
  1104.                                 size_type = npos) const;
  1105.     size_type find_last_not_of (const charT*, size_type, size_type) const;
  1106.     size_type find_last_not_of (const charT*, size_type = npos) const;
  1107.     size_type find_last_not_of (charT, size_type = npos) const;
  1108.  
  1109.     basic_string<charT, traits, Allocator> substr (size_type = 0,
  1110.                                                    size_type = npos) const;
  1111.  
  1112.     int compare(const basic_string<charT, traits, Allocator>&,
  1113.                 size_type = 0,
  1114.                 size_type = npos) const;
  1115.     int compare (charT*, size_type, size_type) const;
  1116.     int compare (charT*, size_type = 0) const;
  1117.  
  1118.  protected:
  1119.  
  1120.     size_type getCapac () const { return pref()->getCapac(); }
  1121.  
  1122.     void clobber (size_type); // Remove old contents
  1123.     void cow ()               // Do copy on write as necessary
  1124.     {
  1125. #ifdef RWSTD_MULTI_THREAD
  1126.         RWSTDGuard guard(pref()->mutex_);
  1127. #endif
  1128.         if (pref()->references() > 1)
  1129.             unSafeClone();
  1130.     }
  1131.     void cow (size_type nc)     // Do copy on write w/ new capacity
  1132.     {
  1133. #ifdef RWSTD_MULTI_THREAD
  1134.         RWSTDGuard guard(pref()->mutex_);
  1135. #endif
  1136.         if (pref()->references() > 1 || getCapac() < nc)
  1137.             unSafeClone(nc);
  1138.     }
  1139.  
  1140.  private:
  1141.  
  1142.     typedef string_ref<charT,traits,Allocator> string_ref_type;
  1143.  
  1144.     static charT eos () { return traits::eos(); }
  1145.  
  1146.     //
  1147.     // Make a distinct copy of self
  1148.     //
  1149.     void clone ()
  1150.     {
  1151. #ifdef RWSTD_MULTI_THREAD
  1152.         RWSTDGuard guard(pref()->mutex_);
  1153. #endif
  1154.         unSafeClone();
  1155.     }
  1156.     void unSafeClone ();
  1157.     //
  1158.     // Make a distinct copy w/ new capacity nc
  1159.     //
  1160.     void clone (size_type nc)
  1161.     {
  1162. #ifdef RWSTD_MULTI_THREAD
  1163.         RWSTDGuard guard(pref()->mutex_);
  1164. #endif
  1165.         unSafeClone(nc);
  1166.     }
  1167.     void unSafeClone (size_type);
  1168.  
  1169.     string_ref_type *  pref () const
  1170.     {
  1171.         return (string_ref_type*) (((string_ref_type*) data_) - 1);
  1172.     }
  1173.     //
  1174.     // Null string ref
  1175.     //
  1176. #ifndef RWSTD_NO_STATIC_DEF3
  1177.     static const null_string_ref_rep<charT, traits, Allocator> nullref;
  1178. #endif
  1179.  
  1180.     static string_ref<charT, traits, Allocator> * getNullRep ()
  1181. #ifndef RWSTD_NO_STATIC_DEF3
  1182.     { return (string_ref<charT, traits, Allocator> *) &nullref; }
  1183. #else
  1184.     { return (string_ref<charT, traits, Allocator> *) &nullref[0]; }
  1185. #endif
  1186.  
  1187.     string_ref<charT, traits, Allocator> * getRep (size_type capac,
  1188.                                                    size_type nchar,
  1189.                                                    Allocator& alloc);
  1190.     charT*    data_;
  1191.     Allocator alloc_;
  1192. };
  1193.  
  1194. #ifndef RWSTD_NO_EXPLICIT_INSTANTIATION
  1195. template class RWSTDExportTemplate RWSTD_ALLOC_TYPE(char);
  1196.  
  1197. template class RWSTDExportTemplate string_ref<char,string_char_traits<char>, allocator<char> >;
  1198.  
  1199. template class RWSTDExportTemplate
  1200.  basic_string<char, string_char_traits<char>, RWSTD_ALLOC_TYPE(char) >;
  1201.  
  1202. #ifndef RWSTD_NO_WSTR
  1203. template class RWSTDExportTemplate
  1204.  basic_string<wchar_t, string_char_traits<wchar_t>, RWSTD_ALLOC_TYPE(wchar_t) >;
  1205. #endif
  1206. #endif
  1207.  
  1208. //
  1209. // Standard Type Definitions
  1210. //
  1211. typedef basic_string<char, string_char_traits<char>, RWSTD_ALLOC_TYPE(char) >
  1212.   string;
  1213.  
  1214. #ifndef RWSTD_NO_WSTR
  1215. typedef basic_string<wchar_t, string_char_traits<wchar_t>, RWSTD_ALLOC_TYPE(wchar_t) >
  1216.   wstring;
  1217. #endif
  1218.  
  1219. #ifndef RWSTD_NO_NAMESPACE
  1220. }
  1221. #endif
  1222.  
  1223. //
  1224. // The following has to go after the declaration of the string
  1225. // classes because of cross references.
  1226. //
  1227. #ifdef RW_STD_EXCEPT
  1228. #include <stdexcep>
  1229. #endif
  1230.  
  1231. #ifndef RWSTD_NO_NAMESPACE
  1232. namespace std {
  1233. #endif
  1234.  
  1235. #if defined(RWSTD_NO_DESTROY_BUILTIN) || defined(RWSTD_NO_DESTROY_NONBUILTIN)
  1236. //
  1237. // Specializations for STL destroy
  1238. //
  1239. inline void destroy (string**)    {;}
  1240. inline void destroy (string***)   {;}
  1241. inline void destroy (string****)  {;}
  1242. #ifndef RWSTD_NO_WSTR
  1243. inline void destroy (wstring**)   {;}
  1244. inline void destroy (wstring***)  {;}
  1245. inline void destroy (wstring****) {;}
  1246. #endif
  1247. #endif
  1248.  
  1249. //
  1250. // Inline member functions for class string_ref
  1251. //
  1252.  
  1253. template <class charT, class traits, class Allocator >
  1254. inline void string_ref<charT, traits, Allocator>::unLink(Allocator& alloc)
  1255. {
  1256.     if (removeReference() == 0)
  1257.         alloc.deallocate((charT*)this);
  1258. }
  1259.  
  1260. template <class charT, class traits, class Allocator >
  1261. inline void string_ref<charT, traits, Allocator>::unSafeunLink(Allocator& alloc)
  1262. {
  1263.     if (unSafeRemoveReference() == 0)
  1264.         alloc.deallocate((charT*)this);
  1265. }
  1266.  
  1267. //
  1268. // Inline member functions for class basic_string
  1269. //
  1270.  
  1271. template <class charT, class traits, class Allocator >
  1272. inline basic_string<charT, traits, Allocator>
  1273.   ::basic_string (const Allocator& alloc)
  1274. {
  1275.     data_ = getNullRep()->data();
  1276.     getNullRep()->addReference();
  1277.     alloc_ = alloc;
  1278. }
  1279.  
  1280. template <class charT, class traits, class Allocator >
  1281. inline
  1282. basic_string<charT, traits, Allocator>
  1283.   ::basic_string (const basic_string<charT, traits, Allocator> & s)
  1284. {
  1285.     data_ = s.data_;
  1286.     pref()->addReference();
  1287. }
  1288.  
  1289. #ifndef RWSTD_NO_MEMBER_TEMPLATES
  1290. template <class charT, class traits, class Allocator>
  1291. template <class InputIterator>
  1292. basic_string<charT, traits, Allocator>::basic_string (InputIterator first,
  1293.                                                       InputIterator last,
  1294.                                                       const Allocator& alloc)
  1295. {
  1296.     data_ = getNullRep()->data();
  1297.     getNullRep()->addReference();
  1298.     alloc_ = alloc;
  1299.     while (first != last) append(1,*first++);
  1300. }
  1301. #else
  1302. template <class charT, class traits, class Allocator >
  1303. basic_string<charT, traits, Allocator>::basic_string (const charT* first,
  1304.                                                       const charT* last,
  1305.                                                       const Allocator& alloc)
  1306. {
  1307.     data_ = getNullRep()->data();
  1308.     getNullRep()->addReference();
  1309.     alloc_ = alloc;
  1310.     while (first != last) append(1,*first++);
  1311. }
  1312. #endif
  1313.  
  1314. template <class charT, class traits, class Allocator >
  1315. inline basic_string<charT, traits, Allocator>::~basic_string ()
  1316. {
  1317.     pref()->unLink(alloc_);
  1318. }
  1319.  
  1320. template <class charT, class traits, class Allocator >
  1321. inline basic_string<charT, traits, Allocator> &
  1322. basic_string<charT, traits, Allocator>::operator= (charT c)
  1323. {
  1324.     return *this = basic_string<charT, traits, Allocator>(1,c);
  1325. }
  1326.  
  1327. template <class charT, class traits, class Allocator >
  1328. inline basic_string<charT, traits, Allocator> &
  1329. basic_string<charT, traits, Allocator>::operator+= (const basic_string<charT, traits, Allocator>& s)
  1330. {
  1331.     return append(s);
  1332. }
  1333.  
  1334. template <class charT, class traits, class Allocator >
  1335. inline basic_string<charT, traits, Allocator> &
  1336. basic_string<charT, traits, Allocator>::operator+= (const charT* s)
  1337. {
  1338.     return append(s);
  1339. }
  1340.  
  1341. template <class charT, class traits, class Allocator >
  1342. inline basic_string<charT, traits, Allocator> &
  1343. basic_string<charT, traits, Allocator>::operator+= (charT c)
  1344. {
  1345.     return append((size_type) 1, c);
  1346. }
  1347.  
  1348. template <class charT, class traits, class Allocator >
  1349. inline basic_string<charT, traits, Allocator> &
  1350. basic_string<charT, traits, Allocator>::append (const charT* s, size_type n)
  1351. {
  1352.     return append(basic_string<charT,traits,Allocator>(s,n));
  1353. }
  1354.  
  1355. template <class charT, class traits, class Allocator >
  1356. inline basic_string<charT, traits, Allocator> &
  1357. basic_string<charT, traits, Allocator>::append (const charT* s)
  1358. {
  1359.     return append(basic_string<charT,traits,Allocator>(s));
  1360. }
  1361.  
  1362. template <class charT, class traits, class Allocator >
  1363. inline basic_string<charT, traits, Allocator> &
  1364. basic_string<charT, traits, Allocator>::append (size_type n, charT c)
  1365. {
  1366.     return append(basic_string<charT,traits,Allocator>(n,c));
  1367. }
  1368.  
  1369. #ifndef RWSTD_NO_MEMBER_TEMPLATES
  1370. template<class charT, class traits, class Allocator>
  1371. template<class InputIterator>
  1372. inline basic_string<charT, traits, Allocator>&
  1373. basic_string<charT, traits, Allocator>::append (InputIterator first,
  1374.                                                 InputIterator last )
  1375. {
  1376.     return append(basic_string<charT, traits, Allocator>(first, last));
  1377. }
  1378. #else
  1379. template <class charT, class traits, class Allocator >
  1380. inline basic_string<charT, traits, Allocator>&
  1381. basic_string<charT, traits, Allocator>::append (const charT* first,
  1382.                                                 const charT* last)
  1383. {
  1384.     return append(basic_string<charT, traits, Allocator>(first, last));
  1385. }
  1386. #endif
  1387.  
  1388. template <class charT, class traits, class Allocator >
  1389. inline basic_string<charT, traits, Allocator> &
  1390. basic_string<charT, traits, Allocator>::assign (const charT* s, size_type n)
  1391. {
  1392.     return assign(basic_string<charT,traits,Allocator>(s,n));
  1393. }
  1394.  
  1395. template <class charT, class traits, class Allocator >
  1396. inline basic_string<charT, traits, Allocator> &
  1397. basic_string<charT, traits, Allocator>::assign (const charT* s)
  1398. {
  1399.     return assign(basic_string<charT,traits,Allocator>(s));
  1400. }
  1401.  
  1402. template <class charT, class traits, class Allocator >
  1403. inline basic_string<charT, traits, Allocator> &
  1404. basic_string<charT, traits, Allocator>::assign (size_type n, charT c)
  1405. {
  1406.     return assign(basic_string<charT,traits,Allocator>(n,c));
  1407. }
  1408.  
  1409. #ifndef RWSTD_NO_MEMBER_TEMPLATES
  1410. template<class charT, class traits, class Allocator>
  1411. template<class InputIterator>
  1412. basic_string<charT, traits, Allocator>&
  1413. basic_string<charT, traits, Allocator>::assign (InputIterator first,
  1414.                                                 InputIterator last)
  1415. {
  1416.     return assign(basic_string<charT, traits, Allocator>(first, last));
  1417. }
  1418. #else
  1419. template <class charT, class traits, class Allocator >
  1420. basic_string<charT, traits, Allocator>&
  1421. basic_string<charT, traits, Allocator>::assign (const charT* first,
  1422.                                                 const charT* last)
  1423. {
  1424.     return assign(basic_string<charT, traits, Allocator>(first, last));
  1425. }
  1426. #endif
  1427.  
  1428. template <class charT, class traits, class Allocator >
  1429. inline basic_string<charT, traits, Allocator> &
  1430. basic_string<charT, traits, Allocator>::insert (size_type pos,
  1431.                                                 const charT* s,
  1432.                                                 size_type n)
  1433. {
  1434.     return insert(pos, basic_string<charT,traits,Allocator>(s,n));
  1435. }
  1436.  
  1437. template <class charT, class traits, class Allocator >
  1438. inline basic_string<charT, traits, Allocator> &
  1439. basic_string<charT, traits, Allocator>::insert (size_type pos, const charT* s)
  1440. {
  1441.     return insert(pos, basic_string<charT,traits,Allocator>(s));
  1442. }
  1443.  
  1444. template <class charT, class traits, class Allocator >
  1445. inline basic_string<charT, traits, Allocator> &
  1446. basic_string<charT, traits, Allocator>::insert(size_type pos,
  1447.                                                size_type n,
  1448.                                                charT c)
  1449. {
  1450.     return insert(pos, basic_string<charT,traits,Allocator>(n,c));
  1451. }
  1452.  
  1453. template <class charT, class traits, class Allocator >
  1454. inline basic_string<charT, traits, Allocator>::iterator
  1455. basic_string<charT, traits, Allocator>::insert (iterator p,
  1456.                                                 size_type n,
  1457.                                                 charT c)
  1458. {
  1459.     return replace_aux(p-begin(),0,basic_string<charT,traits,Allocator>(n,c));
  1460. }
  1461.  
  1462. #ifndef RWSTD_NO_MEMBER_TEMPLATES
  1463. template<class charT, class traits, class Allocator>
  1464. template<class InputIterator>
  1465. inline void
  1466. basic_string<charT, traits, Allocator>::insert (iterator p,
  1467.                                                 InputIterator first,
  1468.                                                 InputIterator last)
  1469. {
  1470.     replace(p-begin(), 0, basic_string<charT, traits, Allocator>(first, last));
  1471. }
  1472. #else
  1473. template <class charT, class traits, class Allocator >
  1474. inline void
  1475. basic_string<charT, traits, Allocator>::insert (iterator p,
  1476.                                                 const charT* first,
  1477.                                                 const charT* last)
  1478. {
  1479.     replace(p-begin(), 0, basic_string<charT, traits, Allocator>(first, last));
  1480. }
  1481. #endif
  1482.  
  1483. template <class charT, class traits, class Allocator >
  1484. inline basic_string<charT, traits, Allocator> &
  1485. basic_string<charT, traits, Allocator>::remove (size_type pos, size_type n)
  1486. {
  1487.     RWSTD_THROW(pos > length(), out_of_range, rwse_StringIndexOutOfRange);
  1488.     return replace(pos,
  1489.                    min(n, length() - pos),
  1490.                    basic_string<charT, traits, Allocator>((size_type)0, (charT)0));
  1491. }
  1492.  
  1493. template <class charT, class traits, class Allocator >
  1494. inline basic_string<charT, traits, Allocator> &
  1495. basic_string<charT, traits, Allocator>::remove (iterator it)
  1496. {
  1497.     return replace(it - begin(),
  1498.                    1,
  1499.                    basic_string<charT, traits, Allocator>((size_type)0, (charT)0));
  1500. }
  1501.  
  1502. template <class charT, class traits, class Allocator >
  1503. inline basic_string<charT, traits, Allocator> &
  1504. basic_string<charT, traits, Allocator>::remove (iterator first, iterator last)
  1505. {
  1506.     return replace(first-begin(),
  1507.                    min(last - first, end() - first),
  1508.                    basic_string<charT, traits, Allocator>((size_type)0, (charT)0));
  1509. }
  1510.  
  1511. template <class charT, class traits, class Allocator >
  1512. inline basic_string<charT, traits, Allocator> &
  1513. basic_string<charT, traits, Allocator>::replace (size_type pos1,
  1514.                                                  size_type n1,
  1515.                                                  const basic_string<charT, traits, Allocator> & str,
  1516.                                                  size_type pos2,
  1517.                                                  size_type n2)
  1518. {
  1519.     replace(pos1, n1, str.data(), str.length(), pos2, n2);
  1520.     return *this;
  1521. }
  1522.  
  1523. template <class charT, class traits, class Allocator >
  1524. inline basic_string<charT, traits, Allocator>::iterator
  1525. basic_string<charT, traits, Allocator>::replace_aux (size_type pos1,
  1526.                                                      size_type n1,
  1527.                                                      const basic_string<charT, traits, Allocator> & str,
  1528.                                                      size_type pos2,
  1529.                                                      size_type n2)
  1530. {
  1531.     return replace(pos1, n1, str.data(), str.length(), pos2, n2);
  1532. }
  1533.  
  1534. template <class charT, class traits, class Allocator >
  1535. inline basic_string<charT, traits, Allocator> &
  1536. basic_string<charT, traits, Allocator>::replace (size_type pos,
  1537.                                                  size_type n1,
  1538.                                                  const charT* s,
  1539.                                                  size_type n2)
  1540. {
  1541.     replace(pos, n1, basic_string<charT,traits,Allocator>(s,n2));
  1542.     return *this;
  1543. }
  1544.  
  1545. template <class charT, class traits, class Allocator >
  1546. inline basic_string<charT, traits, Allocator> &
  1547. basic_string<charT, traits, Allocator>::replace (size_type pos,
  1548.                                                  size_type n1,
  1549.                                                  const charT* s)
  1550. {
  1551.     replace(pos, n1, basic_string<charT,traits,Allocator>(s));
  1552.     return *this;
  1553. }
  1554.  
  1555. template <class charT, class traits, class Allocator >
  1556. inline basic_string<charT, traits, Allocator> &
  1557. basic_string<charT, traits, Allocator>::replace (size_type pos,
  1558.                                                  size_type n,
  1559.                                                  size_type n2,
  1560.                                                  charT c)
  1561. {
  1562.     return replace(pos, n, basic_string<charT, traits, Allocator>(n2,c));
  1563. }
  1564.  
  1565. template <class charT, class traits, class Allocator >
  1566. inline basic_string<charT, traits, Allocator>&
  1567. basic_string<charT, traits, Allocator>::replace (iterator first,
  1568.                                                  iterator last,
  1569.                                                  const basic_string<charT, traits, Allocator>& str)
  1570. {
  1571.     return replace(first - begin(), last - first, str);
  1572. }
  1573.  
  1574. template <class charT, class traits, class Allocator >
  1575. inline basic_string<charT, traits, Allocator>&
  1576. basic_string<charT, traits, Allocator>::replace (iterator first,
  1577.                                                  iterator last,
  1578.                                                  const charT* s,
  1579.                                                  size_type n)
  1580. {
  1581.     return replace(first,last,basic_string<charT,traits,Allocator>(s,n));
  1582. }
  1583.  
  1584. template <class charT, class traits, class Allocator >
  1585. inline basic_string<charT, traits, Allocator>&
  1586. basic_string<charT, traits, Allocator>::replace (iterator first,
  1587.                                                  iterator last,
  1588.                                                  const charT* s)
  1589. {
  1590.     return replace(first,last,basic_string<charT,traits,Allocator>(s));
  1591. }
  1592.  
  1593. template <class charT, class traits, class Allocator >
  1594. inline basic_string<charT, traits, Allocator>&
  1595. basic_string<charT, traits, Allocator>::replace (iterator first,
  1596.                                                  iterator last,
  1597.                                                  size_type n,
  1598.                                                  charT c)
  1599. {
  1600.     return replace(first,last,basic_string<charT,traits,Allocator>(n,c));
  1601. }
  1602.  
  1603. #ifndef RWSTD_NO_MEMBER_TEMPLATES
  1604. template<class charT, class traits, class Allocator>
  1605. template<class InputIterator>
  1606. inline basic_string<charT, traits, Allocator>&
  1607. basic_string<charT, traits, Allocator>::replace (iterator first1,
  1608.                                                  iterator last1,
  1609.                                                  InputIterator first2,
  1610.                                                  InputIterator last2)
  1611. {
  1612.     return replace(first1,last1,
  1613.                    basic_string<charT,traits,Allocator>(first2,last2));
  1614. }
  1615. #else
  1616. template <class charT, class traits, class Allocator >
  1617. inline basic_string<charT, traits, Allocator>&
  1618. basic_string<charT, traits, Allocator>::replace (iterator first1,
  1619.                                                  iterator last1,
  1620.                                                  const charT* first2,
  1621.                                                  const charT* last2)
  1622. {
  1623.     return replace(first1,last1,
  1624.                    basic_string<charT,traits,Allocator>(first2,last2));
  1625. }
  1626. #endif
  1627.  
  1628. template <class charT, class traits, class Allocator >
  1629. inline charT basic_string<charT, traits, Allocator>::operator[] (size_type pos) const
  1630. {
  1631.     RWSTD_THROW(pos > size(), out_of_range, rwse_PosBeyondEndOfString);
  1632.     return pos == size() ? traits::eos() : data_[pos];
  1633. }
  1634.  
  1635. template <class charT, class traits, class Allocator >
  1636. inline basic_string<charT, traits, Allocator>::reference
  1637. basic_string<charT, traits, Allocator>::operator[] (size_type pos)
  1638. {
  1639.     RWSTD_THROW(pos >= size(), out_of_range, rwse_PosBeyondEndOfString);
  1640.     cow();
  1641.     return data_[pos];
  1642. }
  1643.  
  1644. template <class charT, class traits, class Allocator >
  1645. inline basic_string<charT, traits, Allocator>::const_reference
  1646. basic_string<charT, traits, Allocator>::at (size_type pos) const
  1647. {
  1648.     RWSTD_THROW(pos >= size(), out_of_range, rwse_PosBeyondEndOfString);
  1649.     return data_[pos];
  1650. }
  1651.  
  1652. template <class charT, class traits, class Allocator >
  1653. inline basic_string<charT, traits, Allocator>::reference
  1654. basic_string<charT, traits, Allocator>::at (size_type pos)
  1655. {
  1656.     RWSTD_THROW(pos >= size(), out_of_range, rwse_PosBeyondEndOfString);
  1657.     return data_[pos];
  1658. }
  1659.  
  1660. template <class charT, class traits, class Allocator >
  1661. inline const charT* basic_string<charT, traits, Allocator>::c_str () const
  1662. {
  1663.     return data_;
  1664. }
  1665.  
  1666. template <class charT, class traits, class Allocator >
  1667. inline const charT* basic_string<charT, traits, Allocator>::data () const
  1668. {
  1669.     return length() == 0 ? (charT*) 0 : data_;
  1670. }
  1671.  
  1672. template <class charT, class traits, class Allocator >
  1673. inline basic_string<charT, traits, Allocator>::size_type
  1674. basic_string<charT, traits, Allocator>::length () const
  1675. {
  1676.     return pref()->nchars_;
  1677. }
  1678.  
  1679. template <class charT, class traits, class Allocator >
  1680. void
  1681. basic_string<charT, traits, Allocator>::resize (size_type n)
  1682. {
  1683.     resize(n, eos());
  1684. }
  1685.  
  1686. template <class charT, class traits, class Allocator >
  1687. basic_string<charT, traits, Allocator>::size_type
  1688. basic_string<charT, traits, Allocator>::capacity () const
  1689. {
  1690.     return getCapac();
  1691. }
  1692.  
  1693. template <class charT, class traits, class Allocator >
  1694. inline void basic_string<charT, traits, Allocator>::reserve(size_type res_arg)
  1695. {
  1696.     if (res_arg > getCapac()) clone(res_arg);
  1697. }
  1698.  
  1699. template <class charT, class traits, class Allocator >
  1700. inline basic_string<charT, traits, Allocator>
  1701. basic_string<charT, traits, Allocator>::copy () const
  1702. {
  1703.     basic_string<charT, traits, Allocator> temp(*this); // Make referenced copy
  1704.     temp.clone();   // Make a distinct copy
  1705.     return temp;
  1706. }
  1707.  
  1708. template <class charT, class traits, class Allocator >
  1709. inline basic_string<charT, traits, Allocator>::size_type
  1710. basic_string<charT, traits, Allocator>::find (const charT* s,
  1711.                                               size_type pos,
  1712.                                               size_type n) const
  1713. {
  1714.     return find(basic_string<charT, traits, Allocator>(s, n), pos);
  1715. }
  1716.  
  1717. template <class charT, class traits, class Allocator >
  1718. inline basic_string<charT, traits, Allocator>::size_type
  1719. basic_string<charT, traits, Allocator>::find (const charT* s,
  1720.                                               size_type pos) const
  1721. {
  1722.     return find(basic_string<charT, traits, Allocator>(s), pos);
  1723. }
  1724.  
  1725. template <class charT, class traits, class Allocator >
  1726. inline basic_string<charT, traits, Allocator>::size_type
  1727. basic_string<charT, traits, Allocator>::find (charT c, size_type pos) const
  1728. {
  1729.     return find(basic_string<charT, traits, Allocator>(1, c), pos);
  1730. }
  1731.  
  1732. template <class charT, class traits, class Allocator >
  1733. inline basic_string<charT, traits, Allocator>::size_type
  1734. basic_string<charT, traits, Allocator>::rfind (const charT* s,
  1735.                                                size_type pos,
  1736.                                                size_type n) const
  1737. {
  1738.     return rfind(basic_string<charT, traits, Allocator>(s,n), pos);
  1739. }
  1740.  
  1741. template <class charT, class traits, class Allocator >
  1742. inline basic_string<charT, traits, Allocator>::size_type
  1743. basic_string<charT, traits, Allocator>::rfind (const charT* s, size_type pos)
  1744. const
  1745. {
  1746.     return rfind(basic_string<charT, traits, Allocator>(s), pos);
  1747. }
  1748.  
  1749. template <class charT, class traits, class Allocator >
  1750. inline basic_string<charT, traits, Allocator>::size_type
  1751. basic_string<charT, traits, Allocator>::rfind (charT c, size_type pos) const
  1752. {
  1753.     return rfind(basic_string<charT, traits, Allocator>(1, c), pos);
  1754. }
  1755.  
  1756. template <class charT, class traits, class Allocator >
  1757. inline basic_string<charT, traits, Allocator>::size_type
  1758. basic_string<charT, traits, Allocator>::find_first_of (const charT* s,
  1759.                                                        size_type pos,
  1760.                                                        size_type n) const
  1761. {
  1762.     return find_first_of(basic_string<charT, traits, Allocator>(s, n), pos);
  1763. }
  1764.  
  1765. template <class charT, class traits, class Allocator >
  1766. inline basic_string<charT, traits, Allocator>::size_type
  1767. basic_string<charT, traits, Allocator>::find_first_of (const charT* s,
  1768.                                                        size_type pos) const
  1769. {
  1770.     return find_first_of(basic_string<charT, traits, Allocator>(s), pos);
  1771. }
  1772.  
  1773. template <class charT, class traits, class Allocator >
  1774. inline basic_string<charT, traits, Allocator>::size_type
  1775. basic_string<charT, traits, Allocator>::find_first_of (charT c, size_type pos) const
  1776. {
  1777.     return find_first_of(basic_string<charT, traits, Allocator>(1, c), pos);
  1778. }
  1779.  
  1780. template <class charT, class traits, class Allocator >
  1781. inline basic_string<charT, traits, Allocator>::size_type
  1782. basic_string<charT, traits, Allocator>::find_last_of (const charT* s,
  1783.                                                       size_type pos,
  1784.                                                       size_type n) const
  1785. {
  1786.     return find_last_of(basic_string<charT, traits, Allocator>(s,n), pos);
  1787. }
  1788.  
  1789. template <class charT, class traits, class Allocator >
  1790. inline basic_string<charT, traits, Allocator>::size_type
  1791. basic_string<charT, traits, Allocator>::find_last_of (const charT* s,
  1792.                                                       size_type pos) const
  1793. {
  1794.     return find_last_of(basic_string<charT, traits, Allocator>(s), pos);
  1795. }
  1796.  
  1797. template <class charT, class traits, class Allocator >
  1798. inline basic_string<charT, traits, Allocator>::size_type
  1799. basic_string<charT, traits, Allocator>::find_last_of (charT c, size_type pos)
  1800. const
  1801. {
  1802.     return find_last_of(basic_string<charT, traits, Allocator>(1, c), pos);
  1803. }
  1804.  
  1805. template <class charT, class traits, class Allocator >
  1806. inline basic_string<charT, traits, Allocator>::size_type
  1807. basic_string<charT, traits, Allocator>::find_first_not_of (const charT* s,
  1808.                                                            size_type pos,
  1809.                                                            size_type n) const
  1810. {
  1811.     return find_first_not_of(basic_string<charT,traits,Allocator>(s, n), pos);
  1812. }
  1813.  
  1814. template <class charT, class traits, class Allocator >
  1815. inline basic_string<charT, traits, Allocator>::size_type
  1816. basic_string<charT, traits, Allocator>::find_first_not_of (const charT* s,
  1817.                                                            size_type pos) const
  1818. {
  1819.     return find_first_not_of(basic_string<charT, traits, Allocator>(s), pos);
  1820. }
  1821.  
  1822. template <class charT, class traits, class Allocator >
  1823. inline basic_string<charT, traits, Allocator>::size_type
  1824. basic_string<charT, traits, Allocator>::find_first_not_of (charT c,
  1825.                                                            size_type pos) const
  1826. {
  1827.     return find_first_not_of(basic_string<charT,traits,Allocator>(1, c), pos);
  1828. }
  1829.  
  1830. template <class charT, class traits, class Allocator >
  1831. inline basic_string<charT, traits, Allocator>::size_type
  1832. basic_string<charT, traits, Allocator>::find_last_not_of(const charT* s,
  1833.                                                          size_type pos,
  1834.                                                          size_type n) const
  1835. {
  1836.     return find_last_not_of(basic_string<charT, traits, Allocator>(s,n), pos);
  1837. }
  1838.  
  1839. template <class charT, class traits, class Allocator >
  1840. inline basic_string<charT, traits, Allocator>::size_type
  1841. basic_string<charT, traits, Allocator>::find_last_not_of (const charT* s,
  1842.                                                           size_type pos) const
  1843. {
  1844.     return find_last_not_of(basic_string<charT, traits, Allocator>(s), pos);
  1845. }
  1846.  
  1847. template <class charT, class traits, class Allocator >
  1848. inline basic_string<charT, traits, Allocator>::size_type
  1849. basic_string<charT, traits, Allocator>::find_last_not_of (charT c,
  1850.                                                           size_type pos) const
  1851. {
  1852.     return find_last_not_of(basic_string<charT, traits, Allocator>(1, c), pos);
  1853. }
  1854.  
  1855. template <class charT, class traits, class Allocator >
  1856. inline int
  1857. basic_string<charT, traits, Allocator>::compare (charT* s,
  1858.                                                  size_type pos,
  1859.                                                  size_type n) const
  1860. {
  1861.     return compare(basic_string<charT, traits, Allocator>(s,n), pos);
  1862. }
  1863.  
  1864. template <class charT, class traits, class Allocator >
  1865. inline int
  1866. basic_string<charT, traits, Allocator>::compare (charT* s, size_type pos) const
  1867. {
  1868.     return compare(basic_string<charT, traits, Allocator>(s), pos);
  1869. }
  1870.  
  1871. //
  1872. // Inlined non-member operators
  1873. //
  1874.  
  1875. template <class charT, class traits, class Allocator >
  1876. inline basic_string<charT, traits, Allocator> operator+(
  1877.   const basic_string<charT, traits, Allocator>& lhs,
  1878.   const basic_string<charT, traits, Allocator>& rhs)
  1879. {
  1880.     return basic_string<charT, traits, Allocator>(lhs).append(rhs);
  1881. }
  1882.  
  1883. template <class charT, class traits, class Allocator >
  1884. inline basic_string<charT, traits, Allocator> operator+(
  1885.   const charT*                                  lhs,
  1886.   const basic_string<charT, traits, Allocator>& rhs)
  1887. {
  1888.     return basic_string<charT, traits, Allocator>(lhs).append(rhs);
  1889. }
  1890.  
  1891. template <class charT, class traits, class Allocator >
  1892. inline basic_string<charT, traits, Allocator> operator+(
  1893.   charT lhs, const basic_string<charT, traits, Allocator>& rhs)
  1894. {
  1895.     return basic_string<charT, traits, Allocator>(1,lhs).append(rhs);
  1896. }
  1897.  
  1898. template <class charT, class traits, class Allocator >
  1899. inline basic_string<charT, traits, Allocator> operator+(
  1900.   const basic_string<charT, traits, Allocator>& lhs,
  1901.   const charT*                                  rhs)
  1902. {
  1903.     return basic_string<charT,traits,Allocator>(lhs).append(basic_string<charT, traits, Allocator>(rhs));
  1904. }
  1905.  
  1906. template <class charT, class traits, class Allocator >
  1907. inline basic_string<charT, traits, Allocator> operator+(
  1908.   const basic_string<charT, traits, Allocator>& lhs,
  1909.   charT                                         rhs)
  1910. {
  1911.     return basic_string<charT,traits,Allocator>(lhs).append(basic_string<charT, traits, Allocator>(1,rhs));
  1912. }
  1913.  
  1914. template <class charT, class traits, class Allocator >
  1915. inline bool operator==(
  1916.   const basic_string<charT, traits, Allocator>& lhs,
  1917.   const basic_string<charT, traits, Allocator>& rhs)
  1918. {
  1919.     return lhs.compare(rhs) == 0 ? true : false ;
  1920. }
  1921.  
  1922. template <class charT, class traits, class Allocator >
  1923. inline bool operator==(
  1924.   const charT*                                  lhs,
  1925.   const basic_string<charT, traits, Allocator>& rhs)
  1926. {
  1927.    return basic_string<charT,traits,Allocator>(lhs).compare(rhs)==0?true:false;
  1928. }
  1929.  
  1930. template <class charT, class traits, class Allocator >
  1931. inline bool operator==(
  1932.   const basic_string<charT, traits, Allocator>& lhs,
  1933.   const charT*                                  rhs)
  1934. {
  1935.    return lhs.compare(basic_string<charT,traits,Allocator>(rhs))==0?true:false;
  1936. }
  1937.  
  1938. template <class charT, class traits, class Allocator >
  1939. inline bool operator<(
  1940.   const basic_string<charT, traits, Allocator>& lhs,
  1941.   const basic_string<charT, traits, Allocator>& rhs)
  1942. {
  1943.     return lhs.compare(rhs) < 0 ? true:false ;
  1944. }
  1945.  
  1946. template <class charT, class traits, class Allocator >
  1947. inline bool operator<(
  1948.   const charT*                                  lhs,
  1949.   const basic_string<charT, traits, Allocator>& rhs)
  1950. {
  1951.     return basic_string<charT,traits,Allocator>(lhs).compare(rhs)<0?true:false;
  1952. }
  1953.  
  1954. template <class charT, class traits, class Allocator >
  1955. inline bool operator<(
  1956.   const basic_string<charT, traits, Allocator>& lhs,
  1957.   const charT*                                  rhs)
  1958. {
  1959.   return lhs.compare(basic_string<charT,traits,Allocator>(rhs))<0?true:false;
  1960. }
  1961.  
  1962. #ifndef RWSTD_NO_PART_SPEC_OVERLOAD
  1963. template <class charT, class traits, class Allocator >
  1964. inline bool operator!=(
  1965.   const basic_string<charT, traits, Allocator>& lhs,
  1966.   const basic_string<charT, traits, Allocator>& rhs)
  1967. {
  1968.     return lhs.compare(rhs) != 0 ? true : false;
  1969. }
  1970. #endif
  1971.  
  1972. template <class charT, class traits, class Allocator >
  1973. inline bool operator!=(
  1974.   const charT*                                  lhs,
  1975.   const basic_string<charT, traits, Allocator>& rhs)
  1976. {
  1977.    return basic_string<charT,traits,Allocator>(lhs).compare(rhs)!=0?true:false;
  1978. }
  1979.  
  1980. template <class charT, class traits, class Allocator >
  1981. inline bool operator!=(
  1982.   const basic_string<charT, traits, Allocator>& lhs,
  1983.   const charT*                                  rhs)
  1984. {
  1985.    return lhs.compare(basic_string<charT,traits,Allocator>(rhs))!=0?true:false;
  1986. }
  1987.  
  1988. #ifndef RWSTD_NO_PART_SPEC_OVERLOAD
  1989. template <class charT, class traits, class Allocator >
  1990. inline bool operator>(
  1991.   const basic_string<charT, traits, Allocator>& lhs,
  1992.   const basic_string<charT, traits, Allocator>& rhs)
  1993. {
  1994.     return lhs.compare(rhs) > 0 ? true : false;
  1995. }
  1996. #endif
  1997.  
  1998. template <class charT, class traits, class Allocator >
  1999. inline bool operator>(
  2000.   const charT*                                  lhs,
  2001.   const basic_string<charT, traits, Allocator>& rhs)
  2002. {
  2003.    return basic_string<charT,traits,Allocator>(lhs).compare(rhs)>0?true:false;
  2004. }
  2005.  
  2006. template <class charT, class traits, class Allocator >
  2007. inline bool operator>(
  2008.   const basic_string<charT, traits, Allocator>& lhs,
  2009.   const charT*                                  rhs)
  2010. {
  2011.    return lhs.compare(basic_string<charT,traits,Allocator>(rhs))>0?true:false;
  2012. }
  2013.  
  2014. #ifndef RWSTD_NO_PART_SPEC_OVERLOAD
  2015. template <class charT, class traits, class Allocator >
  2016. inline bool operator<=(
  2017.   const basic_string<charT, traits, Allocator>& lhs,
  2018.   const basic_string<charT, traits, Allocator>& rhs)
  2019. {
  2020.     return lhs.compare(rhs) <= 0 ? true : false;
  2021. }
  2022. #endif
  2023.  
  2024. template <class charT, class traits, class Allocator >
  2025. inline bool operator<=(
  2026.   const charT*                                  lhs,
  2027.   const basic_string<charT, traits, Allocator>& rhs)
  2028. {
  2029.   return basic_string<charT,traits,Allocator>(lhs).compare(rhs)<=0?true:false;
  2030. }
  2031.  
  2032. template <class charT, class traits, class Allocator >
  2033. inline bool operator<=(
  2034.   const basic_string<charT, traits, Allocator>& lhs,
  2035.   const charT*                                  rhs)
  2036. {
  2037.   return lhs.compare(basic_string<charT,traits,Allocator>(rhs))<=0?true:false;
  2038. }
  2039.  
  2040. #ifndef RWSTD_NO_PART_SPEC_OVERLOAD
  2041. template <class charT, class traits, class Allocator >
  2042. inline bool operator>=(
  2043.   const basic_string<charT, traits, Allocator>& lhs,
  2044.   const basic_string<charT, traits, Allocator>& rhs)
  2045. {
  2046.     return lhs.compare(rhs) >= 0 ? true:false;
  2047. }
  2048. #endif
  2049.  
  2050. template <class charT, class traits, class Allocator >
  2051. inline bool operator>=(
  2052.   const charT*                                  lhs,
  2053.   const basic_string<charT, traits, Allocator>& rhs)
  2054. {
  2055.    return basic_string<charT,traits,Allocator>(lhs).compare(rhs)>=0?true:false;
  2056. }
  2057.  
  2058. template <class charT, class traits, class Allocator >
  2059. inline bool operator>=(
  2060.   const basic_string<charT, traits, Allocator>& lhs,
  2061.   const charT*                                  rhs)
  2062. {
  2063.    return lhs.compare(basic_string<charT,traits,Allocator>(rhs))>=0?true:false;
  2064. }
  2065.  
  2066. #ifdef RW_STD_IOSTREAM
  2067.  
  2068. template<class charT, class traits, class IS_traits, class Allocator>
  2069. basic_istream<charT, IS_traits > &
  2070. operator >> (
  2071.   basic_istream<charT, IS_traits >& is,
  2072.   basic_string<charT, traits, Allocator >&  str);
  2073.  
  2074. template<class charT, class traits, class IS_traits, class Allocator>
  2075. basic_ostream<charT, IS_traits > &
  2076. operator << (
  2077.   basic_ostream<charT, IS_traits > &     os,
  2078.   const basic_string<charT, traits, Allocator >& str);
  2079.  
  2080. template<class charT, class IS_traits, class STR_traits, class STR_Alloc>
  2081. basic_istream<charT, IS_traits>&
  2082. getline(
  2083.   basic_istream<charT, IS_traits>&            is,
  2084.   basic_string<charT, STR_traits, STR_Alloc>& str,
  2085.   charT delim
  2086. #if 0
  2087. = IS_traits::newline()
  2088. #endif
  2089. );
  2090.  
  2091. #else
  2092.  
  2093. template<class charT, class traits, class Allocator>
  2094. istream & operator >> (
  2095.   istream & is, basic_string<charT, traits, Allocator > & str);
  2096.  
  2097. template<class charT, class traits, class Allocator>
  2098. ostream& operator << (
  2099.   ostream & os, const basic_string<charT, traits, Allocator > & str);
  2100.  
  2101. #ifdef RWSTD_NO_SPEC_OVERLOAD
  2102. ostream& RWSTDExport operator<< (ostream&, const string&);
  2103. #ifndef RWSTD_NO_WSTR
  2104. ostream& RWSTDExport operator <<(ostream&,wstring&);
  2105. #endif
  2106. #endif
  2107.  
  2108. template<class charT, class traits, class Allocator>
  2109. istream& getline(istream& is,
  2110.           basic_string<charT, traits,Allocator>& str, charT delim);
  2111.  
  2112. #endif
  2113. #ifndef RWSTD_NO_NAMESPACE
  2114. }
  2115. #endif
  2116.  
  2117. #ifdef RWSTD_COMPILE_INSTANTIATE
  2118. #include <string.cc>
  2119. #endif
  2120.  
  2121. #endif  /*defined __STD_STRING*/
  2122.  
  2123. #endif  /* __USING_STD_NAMES__ */
  2124.