Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

882 lines
21 KiB

  1. //#pragma title( "UString.hpp - Common string and character functions" )
  2. /*
  3. Copyright (c) 1995-1998, Mission Critical Software, Inc. All rights reserved.
  4. ===============================================================================
  5. Module - UString.hpp
  6. System - Common
  7. Author - Tom Bernhardt, Rich Denham
  8. Created - 1995-08-25
  9. Description - Common string and character functions.
  10. Many string and character functions defined in "string.h" are redefined
  11. here as overloaded inline functions with several extensions:
  12. o Both ANSI and UNICODE strings are supported.
  13. o Both ANSI and UNICODE characters are supported.
  14. o For ANSI, characters can be "char signed" or "char unsigned".
  15. o Functions that allow a length field, such as "lstrcpy" vs "lstrcpyn",
  16. are implemented as overloaded functions with optional arguments.
  17. o Some functions, UStrCpy in particular, can perform conversion between
  18. ANSI and UNICODE strings.
  19. The function names defined here consist of "U" concatenated to the base
  20. name from "string.h". The first letter of words or word abbreviations
  21. are capitalized, e.g. "strcpy" becomes "UStrCpy".
  22. Updates -
  23. ===============================================================================
  24. */
  25. #ifndef MCSINC_UString_hpp
  26. #define MCSINC_UString_hpp
  27. #define safecopy(trg,src) ((src) ? UStrCpy(trg,src,DIM(trg)) : trg[0] = 0)
  28. #ifdef WIN16_VERSION
  29. #ifndef UCHAR
  30. #define UCHAR unsigned char
  31. #endif
  32. #include <string.h>
  33. #include <ctype.h>
  34. #endif // WIN16_VERSION
  35. int _inline // ret-length in chars
  36. UStrLen(
  37. char const * s1 // in -ANSI string
  38. )
  39. {
  40. return strlen( s1 );
  41. }
  42. int _inline // ret-length in chars
  43. UStrLen(
  44. UCHAR const * s1 // in -ANSI string
  45. )
  46. {
  47. return strlen( (char const *) s1 );
  48. }
  49. void _inline
  50. UStrCpy(
  51. char * aTarget ,// out-ANSI target string
  52. char const * aSource // in -ANSI source string
  53. )
  54. {
  55. strcpy( aTarget, aSource );
  56. }
  57. void _inline
  58. UStrCpy(
  59. char * aTarget ,// out-ANSI target string
  60. UCHAR const * aSource // in -ANSI source string
  61. )
  62. {
  63. UStrCpy( aTarget, (char const *) aSource );
  64. }
  65. void _inline
  66. UStrCpy(
  67. UCHAR * aTarget ,// out-ANSI target string
  68. char const * aSource // in -ANSI source string
  69. )
  70. {
  71. UStrCpy( (char *) aTarget, aSource );
  72. }
  73. void _inline
  74. UStrCpy(
  75. UCHAR * aTarget ,// out-ANSI target string
  76. UCHAR const * aSource // in -ANSI source string
  77. )
  78. {
  79. UStrCpy( (char *) aTarget, (char const *) aSource );
  80. }
  81. void _inline
  82. UStrCpy(
  83. char * aTarget ,// out-ANSI target string
  84. char const * aSource ,// in -ANSI source string
  85. int len // in -copy length in chars
  86. )
  87. {
  88. int copylen = UStrLen( aSource ) + 1;
  89. copylen = min( copylen, len );
  90. if ( copylen )
  91. {
  92. strncpy( aTarget, aSource, copylen );
  93. aTarget[copylen-1] = '\0';
  94. }
  95. }
  96. void _inline
  97. UStrCpy(
  98. char * aTarget ,// out-ANSI target string
  99. UCHAR const * aSource ,// in -ANSI source string
  100. int len // in -copy length in chars
  101. )
  102. {
  103. UStrCpy( aTarget, (char const *) aSource, len );
  104. }
  105. void _inline
  106. UStrCpy(
  107. UCHAR * aTarget ,// out-ANSI target string
  108. char const * aSource ,// in -ANSI source string
  109. int len // in -copy length in chars
  110. )
  111. {
  112. UStrCpy( (char *) aTarget, aSource, len );
  113. }
  114. void _inline
  115. UStrCpy(
  116. UCHAR * aTarget ,// out-ANSI target string
  117. UCHAR const * aSource ,// in -ANSI source string
  118. int len // in -copy length in chars
  119. )
  120. {
  121. UStrCpy( (char *) aTarget, (char const *) aSource, len );
  122. }
  123. int _inline // ret-compare result
  124. UStrCmp(
  125. char const * s1 ,// in -ANSI string 1
  126. char const * s2 // in -ANSI string 2
  127. )
  128. {
  129. #ifdef WIN16_VERSION
  130. return strcmp( s1, s2 );
  131. #else
  132. return CompareStringA(
  133. LOCALE_SYSTEM_DEFAULT,
  134. 0,
  135. s1,
  136. -1,
  137. s2,
  138. -1 ) - 2;
  139. #endif
  140. }
  141. int _inline // ret-compare result
  142. UStrCmp(
  143. char const * s1 ,// in -ANSI string 1
  144. UCHAR const * s2 // in -ANSI string 2
  145. )
  146. {
  147. #ifdef WIN16_VERSION
  148. return strcmp( s1, (char const *) s2 );
  149. #else
  150. return CompareStringA(
  151. LOCALE_SYSTEM_DEFAULT,
  152. 0,
  153. s1,
  154. -1,
  155. (char const *) s2,
  156. -1 ) - 2;
  157. #endif
  158. }
  159. int _inline // ret-compare result
  160. UStrCmp(
  161. UCHAR const * s1 ,// in -ANSI string 1
  162. char const * s2 // in -ANSI string 2
  163. )
  164. {
  165. #ifdef WIN16_VERSION
  166. return strcmp( (char const *) s1, s2 );
  167. #else
  168. return CompareStringA(
  169. LOCALE_SYSTEM_DEFAULT,
  170. 0,
  171. (char const *) s1,
  172. -1,
  173. s2,
  174. -1 ) - 2;
  175. #endif
  176. }
  177. int _inline // ret-compare result
  178. UStrCmp(
  179. UCHAR const * s1 ,// in -ANSI string 1
  180. UCHAR const * s2 // in -ANSI string 2
  181. )
  182. {
  183. #ifdef WIN16_VERSION
  184. return strcmp( (char const *) s1, (char const *) s2 );
  185. #else
  186. return CompareStringA(
  187. LOCALE_SYSTEM_DEFAULT,
  188. 0,
  189. (char const *) s1,
  190. -1,
  191. (char const *) s2,
  192. -1 ) - 2;
  193. #endif
  194. }
  195. int _inline // ret-compare result
  196. UStrCmp(
  197. char const * s1 ,// in -ANSI string 1
  198. char const * s2 ,// in -ANSI string 2
  199. int len // in -compare length in chars
  200. )
  201. {
  202. #ifdef WIN16_VERSION
  203. return strncmp( s1, s2, len );
  204. #else
  205. return CompareStringA(
  206. LOCALE_SYSTEM_DEFAULT,
  207. 0,
  208. s1,
  209. len,
  210. s2,
  211. len ) - 2;
  212. #endif
  213. }
  214. int _inline // ret-compare result
  215. UStrCmp(
  216. char const * s1 ,// in -ANSI string 1
  217. UCHAR const * s2 ,// in -ANSI string 2
  218. int len // in -compare length in chars
  219. )
  220. {
  221. #ifdef WIN16_VERSION
  222. return strncmp( s1, (char const *) s2, len );
  223. #else
  224. return CompareStringA(
  225. LOCALE_SYSTEM_DEFAULT,
  226. 0,
  227. s1,
  228. len,
  229. (char const *) s2,
  230. len ) - 2;
  231. #endif
  232. }
  233. int _inline // ret-compare result
  234. UStrCmp(
  235. UCHAR const * s1 ,// in -ANSI string 1
  236. char const * s2 ,// in -ANSI string 2
  237. int len // in -compare length in chars
  238. )
  239. {
  240. #ifdef WIN16_VERSION
  241. return strncmp( (char const *) s1, s2, len );
  242. #else
  243. return CompareStringA(
  244. LOCALE_SYSTEM_DEFAULT,
  245. 0,
  246. (char const *) s1,
  247. len,
  248. s2,
  249. len ) - 2;
  250. #endif
  251. }
  252. int _inline // ret-compare result
  253. UStrCmp(
  254. UCHAR const * s1 ,// in -ANSI string 1
  255. UCHAR const * s2 ,// in -ANSI string 2
  256. int len // in -compare length in chars
  257. )
  258. {
  259. #ifdef WIN16_VERSION
  260. return strncmp( (char const *) s1, (char const *) s2, len );
  261. #else
  262. return CompareStringA(
  263. LOCALE_SYSTEM_DEFAULT,
  264. 0,
  265. (char const *) s1,
  266. len,
  267. (char const *) s2,
  268. len ) - 2;
  269. #endif
  270. }
  271. int _inline // ret-compare result
  272. UStrICmp(
  273. char const * s1 ,// in -ANSI string 1
  274. char const * s2 // in -ANSI string 2
  275. )
  276. {
  277. #ifdef WIN16_VERSION
  278. return stricmp( s1, s2 );
  279. #else
  280. return CompareStringA(
  281. LOCALE_SYSTEM_DEFAULT,
  282. NORM_IGNORECASE,
  283. s1,
  284. -1,
  285. s2,
  286. -1 ) - 2;
  287. #endif
  288. }
  289. int _inline // ret-compare result
  290. UStrICmp(
  291. char const * s1 ,// in -ANSI string 1
  292. UCHAR const * s2 // in -ANSI string 2
  293. )
  294. {
  295. #ifdef WIN16_VERSION
  296. return stricmp( s1, (char const *) s2 );
  297. #else
  298. return CompareStringA(
  299. LOCALE_SYSTEM_DEFAULT,
  300. NORM_IGNORECASE,
  301. s1,
  302. -1,
  303. (char const *) s2,
  304. -1 ) - 2;
  305. #endif
  306. }
  307. int _inline // ret-compare result
  308. UStrICmp(
  309. UCHAR const * s1 ,// in -ANSI string 1
  310. char const * s2 // in -ANSI string 2
  311. )
  312. {
  313. #ifdef WIN16_VERSION
  314. return stricmp( (char const *) s1, s2 );
  315. #else
  316. return CompareStringA(
  317. LOCALE_SYSTEM_DEFAULT,
  318. NORM_IGNORECASE,
  319. (char const *) s1,
  320. -1,
  321. s2,
  322. -1 ) - 2;
  323. #endif
  324. }
  325. int _inline // ret-compare result
  326. UStrICmp(
  327. UCHAR const * s1 ,// in -ANSI string 1
  328. UCHAR const * s2 // in -ANSI string 2
  329. )
  330. {
  331. #ifdef WIN16_VERSION
  332. return stricmp( (char const *) s1, (char const *) s2 );
  333. #else
  334. return CompareStringA(
  335. LOCALE_SYSTEM_DEFAULT,
  336. NORM_IGNORECASE,
  337. (char const *) s1,
  338. -1,
  339. (char const *) s2,
  340. -1 ) - 2;
  341. #endif
  342. }
  343. int _inline // ret-compare result
  344. UStrICmp(
  345. char const * s1 ,// in -ANSI string 1
  346. char const * s2 ,// in -ANSI string 2
  347. int len // in -compare length in chars
  348. )
  349. {
  350. #ifdef WIN16_VERSION
  351. return strnicmp( s1, s2, len );
  352. #else
  353. return CompareStringA(
  354. LOCALE_SYSTEM_DEFAULT,
  355. NORM_IGNORECASE,
  356. s1,
  357. len,
  358. s2,
  359. len ) - 2;
  360. #endif
  361. }
  362. int _inline // ret-compare result
  363. UStrICmp(
  364. char const * s1 ,// in -ANSI string 1
  365. UCHAR const * s2 ,// in -ANSI string 2
  366. int len // in -compare length in chars
  367. )
  368. {
  369. #ifdef WIN16_VERSION
  370. return strnicmp( s1, (char const *) s2, len );
  371. #else
  372. return CompareStringA(
  373. LOCALE_SYSTEM_DEFAULT,
  374. NORM_IGNORECASE,
  375. s1,
  376. len,
  377. (char const *) s2,
  378. len ) - 2;
  379. #endif
  380. }
  381. int _inline // ret-compare result
  382. UStrICmp(
  383. UCHAR const * s1 ,// in -ANSI string 1
  384. char const * s2 ,// in -ANSI string 2
  385. int len // in -compare length in chars
  386. )
  387. {
  388. #ifdef WIN16_VERSION
  389. return strnicmp( (char const *) s1, s2, len );
  390. #else
  391. return CompareStringA(
  392. LOCALE_SYSTEM_DEFAULT,
  393. NORM_IGNORECASE,
  394. (char const *) s1,
  395. len,
  396. s2,
  397. len ) - 2;
  398. #endif
  399. }
  400. int _inline // ret-compare result
  401. UStrICmp(
  402. UCHAR const * s1 ,// in -ANSI string 1
  403. UCHAR const * s2 ,// in -ANSI string 2
  404. int len // in -compare length in chars
  405. )
  406. {
  407. #ifdef WIN16_VERSION
  408. return strnicmp( (char const *) s1, (char const *) s2, len );
  409. #else
  410. return CompareStringA(
  411. LOCALE_SYSTEM_DEFAULT,
  412. NORM_IGNORECASE,
  413. (char const *) s1,
  414. len,
  415. (char const *) s2,
  416. len ) - 2;
  417. #endif
  418. }
  419. char _inline *
  420. UStrLwr(
  421. char * s // i/o-ANSI string
  422. )
  423. {
  424. return strlwr( s );
  425. }
  426. UCHAR _inline *
  427. UStrLwr(
  428. UCHAR * s // i/o-ANSI string
  429. )
  430. {
  431. return (UCHAR *) strlwr( (char *) s );
  432. }
  433. char _inline *
  434. UStrUpr(
  435. char * s // i/o-ANSI string
  436. )
  437. {
  438. return strupr( s );
  439. }
  440. UCHAR _inline *
  441. UStrUpr(
  442. UCHAR * s // i/o-ANSI string
  443. )
  444. {
  445. return (UCHAR *) strupr( (char *) s );
  446. }
  447. char _inline
  448. UToLower(
  449. char c // in -ANSI char
  450. )
  451. {
  452. return (char) tolower( c );
  453. }
  454. UCHAR _inline
  455. UToLower(
  456. UCHAR c // in -ANSI char
  457. )
  458. {
  459. return (UCHAR) tolower( (char) c );
  460. }
  461. char _inline
  462. UToUpper(
  463. char c // in -ANSI char
  464. )
  465. {
  466. return (char) toupper( c );
  467. }
  468. UCHAR _inline
  469. UToUpper(
  470. UCHAR c // in -ANSI char
  471. )
  472. {
  473. return (UCHAR) toupper( (char) c );
  474. }
  475. // Left-trim string in place
  476. _inline UCHAR *
  477. LTrim(
  478. UCHAR * s // i/o-ANSI string
  479. )
  480. {
  481. UCHAR * strorg = s;
  482. while ( *strorg == ' ' )
  483. strorg++;
  484. if ( strorg > s )
  485. {
  486. while ( *(strorg-1) )
  487. *s++ = *strorg++;
  488. }
  489. return s;
  490. }
  491. _inline char *
  492. LTrim(
  493. char * s // i/o-ANSI string
  494. )
  495. {
  496. return (char *) LTrim( (UCHAR *) s );
  497. }
  498. // Right-trim string in place
  499. _inline UCHAR *
  500. RTrim(
  501. UCHAR * s // i/o-ANSI string
  502. )
  503. {
  504. UCHAR * strend = s + UStrLen(s);
  505. while ( (strend > s) && (*(strend-1) == ' ') )
  506. strend--;
  507. *strend = '\0';
  508. return s;
  509. }
  510. _inline char *
  511. RTrim(
  512. char * s // i/o-ANSI string
  513. )
  514. {
  515. return (char *) RTrim( (UCHAR *) s );
  516. }
  517. // Trim string in place
  518. _inline UCHAR *
  519. Trim(
  520. UCHAR * s // i/o-ANSI string
  521. )
  522. {
  523. return LTrim( RTrim( s ) );
  524. }
  525. _inline char *
  526. Trim(
  527. char * s // i/o-ANSI string
  528. )
  529. {
  530. return LTrim( RTrim( s ) );
  531. }
  532. #ifndef WIN16_VERSION
  533. int _inline // ret-length in chars
  534. UStrLen(
  535. WCHAR const * s1 // in -UNICODE string
  536. )
  537. {
  538. return lstrlenW( s1 );
  539. }
  540. void _inline
  541. UStrCpy(
  542. char * aTarget ,// out-ANSI target string
  543. WCHAR const * wSource // in -UNICODE source string
  544. )
  545. {
  546. int copylen = UStrLen( wSource ) + 1;
  547. if ( copylen )
  548. {
  549. WideCharToMultiByte( CP_ACP, 0, wSource, copylen, aTarget, copylen, NULL, NULL );
  550. aTarget[copylen-1] = '\0';
  551. }
  552. }
  553. void _inline
  554. UStrCpy(
  555. UCHAR * aTarget ,// out-ANSI target string
  556. WCHAR const * wSource // in -UNICODE source string
  557. )
  558. {
  559. UStrCpy( (char *) aTarget, wSource );
  560. }
  561. void _inline
  562. UStrCpy(
  563. WCHAR * wTarget ,// out-UNICODE target string
  564. char const * aSource // in -ANSI source string
  565. )
  566. {
  567. int copylen = UStrLen( aSource ) + 1;
  568. if ( copylen )
  569. {
  570. MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, aSource, copylen, wTarget, copylen );
  571. wTarget[copylen-1] = L'\0';
  572. }
  573. }
  574. void _inline
  575. UStrCpy(
  576. WCHAR * wTarget ,// out-UNICODE target string
  577. UCHAR const * aSource // in -ANSI source string
  578. )
  579. {
  580. UStrCpy( wTarget, (char const *) aSource );
  581. }
  582. void _inline
  583. UStrCpy(
  584. WCHAR * wTarget ,// out-UNICODE target string
  585. WCHAR const * wSource // in -UNICODE source string
  586. )
  587. {
  588. lstrcpyW( wTarget, wSource );
  589. }
  590. void _inline
  591. UStrCpy(
  592. char * aTarget ,// out-ANSI target string
  593. WCHAR const * wSource ,// in -UNICODE source string
  594. int len // in -copy length in chars
  595. )
  596. {
  597. int copylen = UStrLen( wSource ) + 1;
  598. copylen = min( copylen, len );
  599. if ( copylen )
  600. {
  601. WideCharToMultiByte( CP_ACP, 0, wSource, copylen, aTarget, copylen, NULL, NULL );
  602. aTarget[copylen-1] = '\0';
  603. }
  604. }
  605. void _inline
  606. UStrCpy(
  607. UCHAR * aTarget ,// out-ANSI target string
  608. WCHAR const * wSource ,// in -UNICODE source string
  609. int len // in -copy length in chars
  610. )
  611. {
  612. UStrCpy( (char *) aTarget, wSource, len );
  613. }
  614. void _inline
  615. UStrCpy(
  616. WCHAR * wTarget ,// out-UNICODE target string
  617. char const * aSource ,// in -ANSI source string
  618. int len // in -copy length in chars
  619. )
  620. {
  621. int copylen = UStrLen( aSource ) + 1;
  622. copylen = min( copylen, len );
  623. if ( copylen )
  624. {
  625. MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, aSource, copylen, wTarget, copylen );
  626. wTarget[copylen-1] = L'\0';
  627. }
  628. }
  629. void _inline
  630. UStrCpy(
  631. WCHAR * wTarget ,// out-UNICODE target string
  632. UCHAR const * aSource ,// in -ANSI source string
  633. int len // in -copy length in chars
  634. )
  635. {
  636. UStrCpy( wTarget, (char const *) aSource, len );
  637. }
  638. void _inline
  639. UStrCpy(
  640. WCHAR * wTarget ,// out-UNICODE target string
  641. WCHAR const * wSource ,// in -UNICODE source string
  642. int len // in -copy length in chars
  643. )
  644. {
  645. int copylen = UStrLen( wSource ) + 1;
  646. copylen = min( copylen, len );
  647. if ( copylen )
  648. {
  649. lstrcpynW( wTarget, wSource, copylen );
  650. wTarget[copylen-1] = L'\0';
  651. }
  652. }
  653. int _inline // ret-compare result
  654. UStrCmp(
  655. WCHAR const * s1 ,// in -UNICODE string 1
  656. WCHAR const * s2 // in -UNICODE string 2
  657. )
  658. {
  659. return CompareStringW(
  660. LOCALE_SYSTEM_DEFAULT,
  661. 0,
  662. s1,
  663. -1,
  664. s2,
  665. -1 ) - 2;
  666. // return wcscmp( s1, s2 );
  667. }
  668. int _inline // ret-compare result
  669. UStrCmp(
  670. WCHAR const * s1 ,// in -UNICODE string 1
  671. WCHAR const * s2 ,// in -UNICODE string 2
  672. int len // in -compare length in chars
  673. )
  674. {
  675. return CompareStringW(
  676. LOCALE_SYSTEM_DEFAULT,
  677. 0,
  678. s1,
  679. len,
  680. s2,
  681. len ) - 2;
  682. // return wcsncmp( s1, s2, len );
  683. }
  684. int _inline // ret-compare result
  685. UStrICmp(
  686. WCHAR const * s1 ,// in -UNICODE string 1
  687. WCHAR const * s2 // in -UNICODE string 2
  688. )
  689. {
  690. return CompareStringW(
  691. LOCALE_SYSTEM_DEFAULT,
  692. NORM_IGNORECASE,
  693. s1,
  694. -1,
  695. s2,
  696. -1 ) - 2;
  697. // return wcsicmp( s1, s2 );
  698. }
  699. int _inline // ret-compare result
  700. UStrICmp(
  701. WCHAR const * s1 ,// in -UNICODE string 1
  702. WCHAR const * s2 ,// in -UNICODE string 2
  703. int len // in -compare length in chars
  704. )
  705. {
  706. return CompareStringW(
  707. LOCALE_SYSTEM_DEFAULT,
  708. NORM_IGNORECASE,
  709. s1,
  710. len,
  711. s2,
  712. len ) - 2;
  713. // return wcsnicmp( s1, s2, len );
  714. }
  715. WCHAR _inline *
  716. UStrLwr(
  717. WCHAR * s // i/o-UNICODE string
  718. )
  719. {
  720. return _wcslwr( s );
  721. }
  722. WCHAR _inline *
  723. UStrUpr(
  724. WCHAR * s // i/o-UNICODE string
  725. )
  726. {
  727. return _wcsupr( s );
  728. }
  729. WCHAR _inline
  730. UToLower(
  731. WCHAR c // in -UNICODE char
  732. )
  733. {
  734. return towlower( c );
  735. }
  736. WCHAR _inline
  737. UToUpper(
  738. WCHAR c // in -UNICODE char
  739. )
  740. {
  741. return towupper( c );
  742. }
  743. // Left-trim string in place
  744. _inline WCHAR *
  745. LTrim(
  746. WCHAR * s // i/o-UNICODE string
  747. )
  748. {
  749. WCHAR * strorg = s;
  750. while ( *strorg == L' ' )
  751. strorg++;
  752. if ( strorg > s )
  753. {
  754. while ( *(strorg-1) )
  755. *s++ = *strorg++;
  756. }
  757. return s;
  758. }
  759. // Right-trim string in place
  760. _inline WCHAR *
  761. RTrim(
  762. WCHAR * s // i/o-UNICODE string
  763. )
  764. {
  765. WCHAR * strend = s + UStrLen(s);
  766. while ( (strend > s) && (*(strend-1) == L' ') )
  767. strend--;
  768. *strend = L'\0';
  769. return s;
  770. }
  771. // Trim string in place
  772. _inline WCHAR *
  773. Trim(
  774. WCHAR * s // i/o-UNICODE string
  775. )
  776. {
  777. return LTrim( RTrim( s ) );
  778. }
  779. char * _cdecl // ret-target string
  780. UStrJoin(
  781. char * target ,// out-target string
  782. size_t sizeTarget ,// in -maximum size of target in chars
  783. char const * source1 ,// in -first source string or NULL
  784. ... // in -remainder of source strings
  785. );
  786. WCHAR * _cdecl // ret-target string
  787. UStrJoin(
  788. WCHAR * target ,// out-target string
  789. size_t sizeTarget ,// in -maximum size of target in chars
  790. WCHAR const * source1 ,// in -first source string or NULL
  791. ... // in -remainder of source strings
  792. );
  793. #endif // WIN16_VERSION
  794. #endif // MCSINC_UString_hpp
  795. // UString.hpp - end of file