home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 9 / CDACTUAL9.iso / progs / CB / DATA.Z / STRING.H < prev    next >
Encoding:
C/C++ Source or Header  |  1996-10-11  |  78.4 KB  |  2,111 lines

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