Windows NT 4.0 source code leak
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.

1941 lines
61 KiB

4 years ago
  1. /*++
  2. Copyright (c) 1991-1996, Microsoft Corporation All rights reserved.
  3. Module Name:
  4. wctest.c
  5. Abstract:
  6. Test module for NLS API WideCharToMultiByte.
  7. NOTE: This code was simply hacked together quickly in order to
  8. test the different code modules of the NLS component.
  9. This is NOT meant to be a formal regression test.
  10. Revision History:
  11. 06-14-91 JulieB Created.
  12. --*/
  13. //
  14. // Include Files.
  15. //
  16. #include "nlstest.h"
  17. //
  18. // Constant Declarations.
  19. //
  20. #define BUFSIZE 50
  21. #define WC_INVALID_FLAGS ((DWORD)(~(WC_DISCARDNS | WC_SEPCHARS | \
  22. WC_DEFAULTCHAR | WC_COMPOSITECHECK)))
  23. //
  24. // Global Variables.
  25. //
  26. #define mbWCStr "This Is A String."
  27. #define wcWCStr L"This Is A String."
  28. WCHAR wcWCStr2[] = L"This Is A String."; // this could get overwritten
  29. #define mbDefStr "t?t"
  30. #define mbDefStr2 "tXt"
  31. #define wcDefStr L"\x0074\xffef\x0074"
  32. #define wcBestFit L"\x0300"
  33. BYTE mbWCDest[BUFSIZE];
  34. //
  35. // Forward Declarations.
  36. //
  37. int
  38. WC_BadParamCheck();
  39. int
  40. WC_NormalCase();
  41. int
  42. WC_TestFlags();
  43. ////////////////////////////////////////////////////////////////////////////
  44. //
  45. // TestWCToMB
  46. //
  47. // Test routine for WideCharToMultiByte API.
  48. //
  49. // 06-14-91 JulieB Created.
  50. ////////////////////////////////////////////////////////////////////////////
  51. int TestWCToMB()
  52. {
  53. int ErrCount = 0; // error count
  54. //
  55. // Print out what's being done.
  56. //
  57. printf("\n\nTESTING WideCharToMultiByte...\n\n");
  58. //
  59. // Test bad parameters.
  60. //
  61. ErrCount += WC_BadParamCheck();
  62. //
  63. // Test normal cases.
  64. //
  65. ErrCount += WC_NormalCase();
  66. //
  67. // Test flags.
  68. //
  69. ErrCount += WC_TestFlags();
  70. //
  71. // Print out result.
  72. //
  73. printf("\nWideCharToMultiByte: ERRORS = %d\n", ErrCount);
  74. //
  75. // Return total number of errors found.
  76. //
  77. return (ErrCount);
  78. }
  79. ////////////////////////////////////////////////////////////////////////////
  80. //
  81. // WC_BadParamCheck
  82. //
  83. // This routine passes in bad parameters to the API routine and checks to
  84. // be sure they are handled properly. The number of errors encountered
  85. // is returned to the caller.
  86. //
  87. // 06-14-91 JulieB Created.
  88. ////////////////////////////////////////////////////////////////////////////
  89. int WC_BadParamCheck()
  90. {
  91. int NumErrors = 0; // error count - to be returned
  92. int rc; // return code
  93. //
  94. // Null Pointers and Equal Pointers.
  95. //
  96. // Variation 1 - lpWideCharStr = NULL
  97. rc = WideCharToMultiByte( 1252,
  98. 0,
  99. NULL,
  100. -1,
  101. mbWCDest,
  102. BUFSIZE,
  103. NULL,
  104. NULL );
  105. CheckReturnBadParam( rc,
  106. 0,
  107. ERROR_INVALID_PARAMETER,
  108. "lpWideCharStr NULL",
  109. &NumErrors );
  110. // Variation 2 - lpMultiByteStr = NULL
  111. rc = WideCharToMultiByte( 1252,
  112. 0,
  113. wcWCStr,
  114. -1,
  115. NULL,
  116. BUFSIZE,
  117. NULL,
  118. NULL );
  119. CheckReturnBadParam( rc,
  120. 0,
  121. ERROR_INVALID_PARAMETER,
  122. "lpMultiByteStr NULL",
  123. &NumErrors );
  124. // Variation 3 - equal pointers
  125. rc = WideCharToMultiByte( 1252,
  126. 0,
  127. wcWCStr2,
  128. -1,
  129. (LPSTR)wcWCStr2,
  130. (sizeof(wcWCStr2) / sizeof(WCHAR)),
  131. NULL,
  132. NULL );
  133. CheckReturnBadParam( rc,
  134. 0,
  135. ERROR_INVALID_PARAMETER,
  136. "equal pointers",
  137. &NumErrors );
  138. //
  139. // Negative or Zero Lengths.
  140. //
  141. // Variation 1 - cchWideChar = 0
  142. rc = WideCharToMultiByte( 1252,
  143. 0,
  144. wcWCStr,
  145. 0,
  146. mbWCDest,
  147. BUFSIZE,
  148. NULL,
  149. NULL );
  150. CheckReturnBadParam( rc,
  151. 0,
  152. ERROR_INVALID_PARAMETER,
  153. "cchWideChar zero",
  154. &NumErrors );
  155. // Variation 2 - cchMultiByte = negative
  156. rc = WideCharToMultiByte( 1252,
  157. 0,
  158. wcWCStr,
  159. -1,
  160. mbWCDest,
  161. -1,
  162. NULL,
  163. NULL );
  164. CheckReturnBadParam( rc,
  165. 0,
  166. ERROR_INVALID_PARAMETER,
  167. "cchMultiByte negative",
  168. &NumErrors );
  169. //
  170. // Invalid Code Page.
  171. //
  172. // Variation 1 - CodePage = invalid
  173. rc = WideCharToMultiByte( 5,
  174. 0,
  175. wcWCStr,
  176. -1,
  177. mbWCDest,
  178. BUFSIZE,
  179. NULL,
  180. NULL );
  181. CheckReturnBadParam( rc,
  182. 0,
  183. ERROR_INVALID_PARAMETER,
  184. "CodePage Invalid",
  185. &NumErrors );
  186. // Variation 2 - CodePage = invalid
  187. rc = WideCharToMultiByte( 65002,
  188. 0,
  189. wcWCStr,
  190. -1,
  191. mbWCDest,
  192. BUFSIZE,
  193. NULL,
  194. NULL );
  195. CheckReturnBadParam( rc,
  196. 0,
  197. ERROR_INVALID_PARAMETER,
  198. "CodePage Invalid 2",
  199. &NumErrors );
  200. //
  201. // Zero or Invalid Flag Values.
  202. //
  203. // Variation 1 - wFlags = 0
  204. rc = WideCharToMultiByte( 1252,
  205. 0,
  206. wcWCStr,
  207. -1,
  208. mbWCDest,
  209. BUFSIZE,
  210. NULL,
  211. NULL );
  212. CheckReturnValidA( rc,
  213. -1,
  214. mbWCDest,
  215. mbWCStr,
  216. NULL,
  217. "dwFlags zero",
  218. &NumErrors );
  219. // Variation 2 - wFlags = invalid
  220. rc = WideCharToMultiByte( 1252,
  221. WC_INVALID_FLAGS,
  222. wcWCStr,
  223. -1,
  224. mbWCDest,
  225. BUFSIZE,
  226. NULL,
  227. NULL );
  228. CheckReturnBadParam( rc,
  229. 0,
  230. ERROR_INVALID_FLAGS,
  231. "wFlags invalid",
  232. &NumErrors );
  233. //
  234. // Buffer Too Small.
  235. //
  236. // Variation 1 - cchMultiByte = too small
  237. rc = WideCharToMultiByte( 1252,
  238. 0,
  239. wcWCStr,
  240. -1,
  241. mbWCDest,
  242. 2,
  243. NULL,
  244. NULL );
  245. CheckReturnBadParam( rc,
  246. 0,
  247. ERROR_INSUFFICIENT_BUFFER,
  248. "cchMultiByte too small",
  249. &NumErrors );
  250. //
  251. // Return total number of errors found.
  252. //
  253. return (NumErrors);
  254. }
  255. ////////////////////////////////////////////////////////////////////////////
  256. //
  257. // WC_NormalCase
  258. //
  259. // This routine tests the normal cases of the API routine.
  260. //
  261. // 06-14-91 JulieB Created.
  262. ////////////////////////////////////////////////////////////////////////////
  263. int WC_NormalCase()
  264. {
  265. int NumErrors = 0; // error count - to be returned
  266. int rc; // return code
  267. BYTE DefChar = 'X'; // default character
  268. BOOL UsedDef; // if default used
  269. #ifdef PERF
  270. DbgBreakPoint();
  271. #endif
  272. //
  273. // cchMultiByte.
  274. //
  275. // Variation 1 - cchMultiByte = length of mbWCDest
  276. rc = WideCharToMultiByte( 1252,
  277. 0,
  278. wcWCStr,
  279. -1,
  280. mbWCDest,
  281. BUFSIZE,
  282. NULL,
  283. NULL );
  284. CheckReturnValidA( rc,
  285. -1,
  286. mbWCDest,
  287. mbWCStr,
  288. NULL,
  289. "cchMultiByte (length)",
  290. &NumErrors );
  291. // Variation 2 - cchMultiByte = 0
  292. mbWCDest[0] = 0;
  293. rc = WideCharToMultiByte( 1252,
  294. 0,
  295. wcWCStr,
  296. -1,
  297. mbWCDest,
  298. 0,
  299. NULL,
  300. NULL );
  301. CheckReturnValidA( rc,
  302. -1,
  303. NULL,
  304. mbWCStr,
  305. NULL,
  306. "cchMultiByte zero",
  307. &NumErrors );
  308. // Variation 3 - cchMultiByte = 0, mbWCDest = NULL
  309. rc = WideCharToMultiByte( 1252,
  310. 0,
  311. wcWCStr,
  312. -1,
  313. NULL,
  314. 0,
  315. NULL,
  316. NULL );
  317. CheckReturnValidA( rc,
  318. -1,
  319. NULL,
  320. mbWCStr,
  321. NULL,
  322. "cchMultiByte zero (NULL ptr)",
  323. &NumErrors );
  324. //
  325. // cchWideChar.
  326. //
  327. // Variation 1 - cchWideChar = length of wcWCStr
  328. rc = WideCharToMultiByte( 1252,
  329. 0,
  330. wcWCStr,
  331. WC_STRING_LEN(wcWCStr),
  332. mbWCDest,
  333. BUFSIZE,
  334. NULL,
  335. NULL );
  336. CheckReturnValidA( rc,
  337. MB_STRING_LEN(mbWCStr),
  338. mbWCDest,
  339. mbWCStr,
  340. NULL,
  341. "cchWideChar (length)",
  342. &NumErrors );
  343. // Variation 2 - cchWideChar = -1
  344. rc = WideCharToMultiByte( 1252,
  345. 0,
  346. wcWCStr,
  347. -1,
  348. mbWCDest,
  349. BUFSIZE,
  350. NULL,
  351. NULL );
  352. CheckReturnValidA( rc,
  353. -1,
  354. mbWCDest,
  355. mbWCStr,
  356. NULL,
  357. "cchWideChar (-1)",
  358. &NumErrors );
  359. // Variation 3 - cchWideChar = length of wcWCStr, no WCDest
  360. rc = WideCharToMultiByte( 1252,
  361. 0,
  362. wcWCStr,
  363. WC_STRING_LEN(wcWCStr),
  364. NULL,
  365. 0,
  366. NULL,
  367. NULL );
  368. CheckReturnValidA( rc,
  369. MB_STRING_LEN(mbWCStr),
  370. NULL,
  371. mbWCStr,
  372. NULL,
  373. "cchWideChar (length), no WCDest",
  374. &NumErrors );
  375. // Variation 4 - cchWideChar = -1, no WCDest
  376. rc = WideCharToMultiByte( 1252,
  377. 0,
  378. wcWCStr,
  379. -1,
  380. NULL,
  381. 0,
  382. NULL,
  383. NULL );
  384. CheckReturnValidA( rc,
  385. -1,
  386. NULL,
  387. mbWCStr,
  388. NULL,
  389. "cchWideChar (-1), no WCDest",
  390. &NumErrors );
  391. //
  392. // CodePage.
  393. //
  394. // Variation 1 - CodePage = CP_ACP
  395. rc = WideCharToMultiByte( CP_ACP,
  396. 0,
  397. wcWCStr,
  398. -1,
  399. mbWCDest,
  400. BUFSIZE,
  401. NULL,
  402. NULL );
  403. CheckReturnValidA( rc,
  404. -1,
  405. mbWCDest,
  406. mbWCStr,
  407. NULL,
  408. "CodePage CP_ACP",
  409. &NumErrors );
  410. // Variation 2 - CodePage = CP_ACP, no WCDest
  411. rc = WideCharToMultiByte( CP_ACP,
  412. 0,
  413. wcWCStr,
  414. -1,
  415. NULL,
  416. 0,
  417. NULL,
  418. NULL );
  419. CheckReturnValidA( rc,
  420. -1,
  421. NULL,
  422. mbWCStr,
  423. NULL,
  424. "CodePage CP_ACP, no WCDest",
  425. &NumErrors );
  426. // Variation 3 - CodePage = CP_OEMCP
  427. rc = WideCharToMultiByte( CP_OEMCP,
  428. 0,
  429. wcWCStr,
  430. -1,
  431. mbWCDest,
  432. BUFSIZE,
  433. NULL,
  434. NULL );
  435. CheckReturnValidA( rc,
  436. -1,
  437. mbWCDest,
  438. mbWCStr,
  439. NULL,
  440. "CodePage CP_OEMCP",
  441. &NumErrors );
  442. // Variation 4 - CodePage = CP_OEMCP, no WCDest
  443. rc = WideCharToMultiByte( CP_OEMCP,
  444. 0,
  445. wcWCStr,
  446. -1,
  447. NULL,
  448. 0,
  449. NULL,
  450. NULL );
  451. CheckReturnValidA( rc,
  452. -1,
  453. NULL,
  454. mbWCStr,
  455. NULL,
  456. "CodePage CP_OEMCP, no WCDest",
  457. &NumErrors );
  458. // Variation 5 - CodePage = 437
  459. rc = WideCharToMultiByte( 437,
  460. 0,
  461. wcWCStr,
  462. -1,
  463. mbWCDest,
  464. BUFSIZE,
  465. NULL,
  466. NULL );
  467. CheckReturnValidA( rc,
  468. -1,
  469. mbWCDest,
  470. mbWCStr,
  471. NULL,
  472. "CodePage 437",
  473. &NumErrors );
  474. // Variation 6 - CodePage = 437, no WCDest
  475. rc = WideCharToMultiByte( 437,
  476. 0,
  477. wcWCStr,
  478. -1,
  479. NULL,
  480. 0,
  481. NULL,
  482. NULL );
  483. CheckReturnValidA( rc,
  484. -1,
  485. NULL,
  486. mbWCStr,
  487. NULL,
  488. "CodePage 437, no WCDest",
  489. &NumErrors );
  490. // Variation 7 - CodePage = 850
  491. rc = WideCharToMultiByte( 850,
  492. 0,
  493. wcWCStr,
  494. -1,
  495. mbWCDest,
  496. BUFSIZE,
  497. NULL,
  498. NULL );
  499. CheckReturnValidA( rc,
  500. -1,
  501. mbWCDest,
  502. mbWCStr,
  503. NULL,
  504. "CodePage 850",
  505. &NumErrors );
  506. // Variation 8 - CodePage = 850, no WCDest
  507. rc = WideCharToMultiByte( 850,
  508. 0,
  509. wcWCStr,
  510. -1,
  511. NULL,
  512. 0,
  513. NULL,
  514. NULL );
  515. CheckReturnValidA( rc,
  516. -1,
  517. NULL,
  518. mbWCStr,
  519. NULL,
  520. "CodePage 850, no WCDest",
  521. &NumErrors );
  522. // Variation 9 - CodePage = 850 best fit
  523. rc = WideCharToMultiByte( 850,
  524. 0,
  525. wcBestFit,
  526. -1,
  527. mbWCDest,
  528. BUFSIZE,
  529. NULL,
  530. NULL );
  531. CheckReturnValidA( rc,
  532. -1,
  533. mbWCDest,
  534. "\x27",
  535. NULL,
  536. "CodePage 850 best fit",
  537. &NumErrors );
  538. // Variation 10 - CodePage = 10000
  539. rc = WideCharToMultiByte( 10000,
  540. 0,
  541. wcWCStr,
  542. -1,
  543. mbWCDest,
  544. BUFSIZE,
  545. NULL,
  546. NULL );
  547. CheckReturnValidA( rc,
  548. -1,
  549. mbWCDest,
  550. mbWCStr,
  551. NULL,
  552. "CodePage 10000",
  553. &NumErrors );
  554. // Variation 11 - CodePage = 10000, no WCDest
  555. rc = WideCharToMultiByte( 10000,
  556. 0,
  557. wcWCStr,
  558. -1,
  559. NULL,
  560. 0,
  561. NULL,
  562. NULL );
  563. CheckReturnValidA( rc,
  564. -1,
  565. NULL,
  566. mbWCStr,
  567. NULL,
  568. "CodePage 10000, no WCDest",
  569. &NumErrors );
  570. //
  571. // UTF 7.
  572. //
  573. // Variation 1 - CodePage = CP_UTF7
  574. rc = WideCharToMultiByte( CP_UTF7,
  575. 0,
  576. L"\x5317\x4eac",
  577. -1,
  578. mbWCDest,
  579. BUFSIZE,
  580. NULL,
  581. NULL );
  582. CheckReturnValidA( rc,
  583. -1,
  584. mbWCDest,
  585. "\x2b\x55\x78\x64\x4f\x72\x41\x2d", // +UxdOrA-
  586. NULL,
  587. "CodePage CP_UTF7 - 1",
  588. &NumErrors );
  589. // Variation 2 - CodePage = CP_UTF7
  590. rc = WideCharToMultiByte( CP_UTF7,
  591. 0,
  592. L"\x4e2d\x570b\x66f8\x5e97",
  593. -1,
  594. mbWCDest,
  595. BUFSIZE,
  596. NULL,
  597. NULL );
  598. CheckReturnValidA( rc,
  599. -1, // +Ti1XC2b4Xpc-
  600. mbWCDest,
  601. "\x2b\x54\x69\x31\x58\x43\x32\x62\x34\x58\x70\x63\x2d",
  602. NULL,
  603. "CodePage CP_UTF7 - 2",
  604. &NumErrors );
  605. // Variation 3 - CodePage = CP_UTF7
  606. rc = WideCharToMultiByte( CP_UTF7,
  607. 0,
  608. L"\x003b",
  609. -1,
  610. mbWCDest,
  611. BUFSIZE,
  612. NULL,
  613. NULL );
  614. CheckReturnValidA( rc,
  615. -1,
  616. mbWCDest,
  617. "\x2b\x41\x44\x73\x2d", // +ADs-
  618. NULL,
  619. "CodePage CP_UTF7 - 3",
  620. &NumErrors );
  621. // Variation 4 - CodePage = CP_UTF7
  622. rc = WideCharToMultiByte( CP_UTF7,
  623. 0,
  624. L"\x5eb7\x7199\x5b57\x5178",
  625. -1,
  626. mbWCDest,
  627. BUFSIZE,
  628. NULL,
  629. NULL );
  630. CheckReturnValidA( rc,
  631. -1, // +XrdxmVtXUXg-
  632. mbWCDest,
  633. "\x2b\x58\x72\x64\x78\x6d\x56\x74\x58\x55\x58\x67\x2d",
  634. NULL,
  635. "CodePage CP_UTF7 - 4",
  636. &NumErrors );
  637. // Variation 5 - CodePage = CP_UTF7
  638. rc = WideCharToMultiByte( CP_UTF7,
  639. 0,
  640. L"\x4e95\x4f5c\x6046",
  641. -1,
  642. mbWCDest,
  643. BUFSIZE,
  644. NULL,
  645. NULL );
  646. CheckReturnValidA( rc,
  647. -1, // +TpVPXGBG-
  648. mbWCDest,
  649. "\x2b\x54\x70\x56\x50\x58\x47\x42\x47\x2d",
  650. NULL,
  651. "CodePage CP_UTF7 - 5",
  652. &NumErrors );
  653. // Variation 6 - CodePage = CP_UTF7
  654. rc = WideCharToMultiByte( CP_UTF7,
  655. 0,
  656. L"\x005f",
  657. -1,
  658. mbWCDest,
  659. BUFSIZE,
  660. NULL,
  661. NULL );
  662. CheckReturnValidA( rc,
  663. -1,
  664. mbWCDest,
  665. "\x2b\x41\x46\x38\x2d", // +AF8-
  666. NULL,
  667. "CodePage CP_UTF7 - 6",
  668. &NumErrors );
  669. // Variation 7 - CodePage = CP_UTF7
  670. rc = WideCharToMultiByte( CP_UTF7,
  671. 0,
  672. L"\x0040",
  673. -1,
  674. mbWCDest,
  675. BUFSIZE,
  676. NULL,
  677. NULL );
  678. CheckReturnValidA( rc,
  679. -1,
  680. mbWCDest,
  681. "\x2b\x41\x45\x41\x2d", // +AEA-
  682. NULL,
  683. "CodePage CP_UTF7 - 7",
  684. &NumErrors );
  685. // Variation 8 - CodePage = CP_UTF7
  686. rc = WideCharToMultiByte( CP_UTF7,
  687. 0,
  688. L"\x002b",
  689. -1,
  690. mbWCDest,
  691. BUFSIZE,
  692. NULL,
  693. NULL );
  694. CheckReturnValidA( rc,
  695. -1,
  696. mbWCDest,
  697. "\x2b\x2d", // +-
  698. NULL,
  699. "CodePage CP_UTF7 - 8",
  700. &NumErrors );
  701. // Variation 9 - CodePage = CP_UTF7
  702. rc = WideCharToMultiByte( CP_UTF7,
  703. 0,
  704. L"\x0041\x002b",
  705. -1,
  706. mbWCDest,
  707. BUFSIZE,
  708. NULL,
  709. NULL );
  710. CheckReturnValidA( rc,
  711. -1,
  712. mbWCDest,
  713. "\x41\x2b\x2d", // A+-
  714. NULL,
  715. "CodePage CP_UTF7 - 9",
  716. &NumErrors );
  717. // Variation 10 - CodePage = CP_UTF7
  718. rc = WideCharToMultiByte( CP_UTF7,
  719. 0,
  720. L"\x0040\x002b",
  721. -1,
  722. mbWCDest,
  723. BUFSIZE,
  724. NULL,
  725. NULL );
  726. CheckReturnValidA( rc,
  727. -1,
  728. mbWCDest,
  729. "\x2b\x41\x45\x41\x2d\x2b\x2d", // +AEA-+-
  730. NULL,
  731. "CodePage CP_UTF7 - 10",
  732. &NumErrors );
  733. //
  734. // UTF 8.
  735. //
  736. // Variation 1 - CodePage = CP_UTF8
  737. rc = WideCharToMultiByte( CP_UTF8,
  738. 0,
  739. L"\x5317\x4eac",
  740. -1,
  741. mbWCDest,
  742. BUFSIZE,
  743. NULL,
  744. NULL );
  745. CheckReturnValidA( rc,
  746. -1,
  747. mbWCDest,
  748. "\xe5\x8c\x97\xe4\xba\xac",
  749. NULL,
  750. "CodePage CP_UTF8 - 1",
  751. &NumErrors );
  752. // Variation 2 - CodePage = CP_UTF8
  753. rc = WideCharToMultiByte( CP_UTF8,
  754. 0,
  755. L"\x4e2d\x570b\x66f8\x5e97",
  756. -1,
  757. mbWCDest,
  758. BUFSIZE,
  759. NULL,
  760. NULL );
  761. CheckReturnValidA( rc,
  762. -1,
  763. mbWCDest,
  764. "\xe4\xb8\xad\xe5\x9c\x8b\xe6\x9b\xb8\xe5\xba\x97",
  765. NULL,
  766. "CodePage CP_UTF8 - 2",
  767. &NumErrors );
  768. // Variation 3 - CodePage = CP_UTF8
  769. rc = WideCharToMultiByte( CP_UTF8,
  770. 0,
  771. L"\x003b",
  772. -1,
  773. mbWCDest,
  774. BUFSIZE,
  775. NULL,
  776. NULL );
  777. CheckReturnValidA( rc,
  778. -1,
  779. mbWCDest,
  780. "\x3b",
  781. NULL,
  782. "CodePage CP_UTF8 - 3",
  783. &NumErrors );
  784. // Variation 4 - CodePage = CP_UTF8
  785. rc = WideCharToMultiByte( CP_UTF8,
  786. 0,
  787. L"\x5eb7\x7199\x5b57\x5178",
  788. -1,
  789. mbWCDest,
  790. BUFSIZE,
  791. NULL,
  792. NULL );
  793. CheckReturnValidA( rc,
  794. -1,
  795. mbWCDest,
  796. "\xe5\xba\xb7\xe7\x86\x99\xe5\xad\x97\xe5\x85\xb8",
  797. NULL,
  798. "CodePage CP_UTF8 - 4",
  799. &NumErrors );
  800. // Variation 5 - CodePage = CP_UTF8
  801. rc = WideCharToMultiByte( CP_UTF8,
  802. 0,
  803. L"\x4e95\x4f5c\x6046",
  804. -1,
  805. mbWCDest,
  806. BUFSIZE,
  807. NULL,
  808. NULL );
  809. CheckReturnValidA( rc,
  810. -1,
  811. mbWCDest,
  812. "\xe4\xba\x95\xe4\xbd\x9c\xe6\x81\x86",
  813. NULL,
  814. "CodePage CP_UTF8 - 5",
  815. &NumErrors );
  816. // Variation 6 - CodePage = CP_UTF8
  817. rc = WideCharToMultiByte( CP_UTF8,
  818. 0,
  819. L"\x005f",
  820. -1,
  821. mbWCDest,
  822. BUFSIZE,
  823. NULL,
  824. NULL );
  825. CheckReturnValidA( rc,
  826. -1,
  827. mbWCDest,
  828. "\x5f",
  829. NULL,
  830. "CodePage CP_UTF8 - 6",
  831. &NumErrors );
  832. // Variation 7 - CodePage = CP_UTF8
  833. rc = WideCharToMultiByte( CP_UTF8,
  834. 0,
  835. L"\x0040",
  836. -1,
  837. mbWCDest,
  838. BUFSIZE,
  839. NULL,
  840. NULL );
  841. CheckReturnValidA( rc,
  842. -1,
  843. mbWCDest,
  844. "\x40",
  845. NULL,
  846. "CodePage CP_UTF8 - 7",
  847. &NumErrors );
  848. // Variation 8 - CodePage = CP_UTF8
  849. rc = WideCharToMultiByte( CP_UTF8,
  850. 0,
  851. L"\x002b",
  852. -1,
  853. mbWCDest,
  854. BUFSIZE,
  855. NULL,
  856. NULL );
  857. CheckReturnValidA( rc,
  858. -1,
  859. mbWCDest,
  860. "\x2b",
  861. NULL,
  862. "CodePage CP_UTF8 - 8",
  863. &NumErrors );
  864. //
  865. // lpDefaultChar and lpUsedDefaultChar.
  866. //
  867. // Variation 1 - default (null, null)
  868. rc = WideCharToMultiByte( 1252,
  869. 0,
  870. wcWCStr,
  871. -1,
  872. mbWCDest,
  873. BUFSIZE,
  874. NULL,
  875. NULL );
  876. CheckReturnValidA( rc,
  877. -1,
  878. mbWCDest,
  879. mbWCStr,
  880. NULL,
  881. "default (null, null)",
  882. &NumErrors );
  883. // Variation 2 - default (null, non-null)
  884. rc = WideCharToMultiByte( 1252,
  885. 0,
  886. wcDefStr,
  887. -1,
  888. mbWCDest,
  889. BUFSIZE,
  890. NULL,
  891. &UsedDef );
  892. CheckReturnValidA( rc,
  893. -1,
  894. mbWCDest,
  895. mbDefStr,
  896. &UsedDef,
  897. "default (null, null)",
  898. &NumErrors );
  899. // Variation 3 - default (non-null, null)
  900. rc = WideCharToMultiByte( 1252,
  901. 0,
  902. wcDefStr,
  903. -1,
  904. mbWCDest,
  905. BUFSIZE,
  906. &DefChar,
  907. NULL );
  908. CheckReturnValidA( rc,
  909. -1,
  910. mbWCDest,
  911. mbDefStr2,
  912. NULL,
  913. "default (non-null, null)",
  914. &NumErrors );
  915. // Variation 4 - default (non-null, non-null)
  916. rc = WideCharToMultiByte( 1252,
  917. 0,
  918. wcDefStr,
  919. -1,
  920. mbWCDest,
  921. BUFSIZE,
  922. &DefChar,
  923. &UsedDef );
  924. CheckReturnValidA( rc,
  925. -1,
  926. mbWCDest,
  927. mbDefStr2,
  928. &UsedDef,
  929. "default (non-null, non-null)",
  930. &NumErrors );
  931. //
  932. // Return total number of errors found.
  933. //
  934. return (NumErrors);
  935. }
  936. ////////////////////////////////////////////////////////////////////////////
  937. //
  938. // WC_TestFlags
  939. //
  940. // This routine tests the different flags of the API routine.
  941. //
  942. // 06-14-91 JulieB Created.
  943. ////////////////////////////////////////////////////////////////////////////
  944. int WC_TestFlags()
  945. {
  946. int NumErrors = 0; // error count - to be returned
  947. int rc; // return code
  948. BYTE DefChar = 'X'; // default character
  949. BOOL UsedDef; // if default used
  950. //
  951. // Precomposed.
  952. //
  953. // Variation 1 - normal
  954. rc = WideCharToMultiByte( 1252,
  955. WC_COMPOSITECHECK | WC_DEFAULTCHAR,
  956. L"\x00c0\x00c1",
  957. -1,
  958. mbWCDest,
  959. BUFSIZE,
  960. NULL,
  961. NULL );
  962. CheckReturnValidA( rc,
  963. -1,
  964. mbWCDest,
  965. "\xc0\xc1",
  966. NULL,
  967. "precomp (a grave, a acute)",
  968. &NumErrors );
  969. // Variation 2 - no WCDest
  970. rc = WideCharToMultiByte( 1252,
  971. WC_COMPOSITECHECK | WC_DEFAULTCHAR,
  972. L"\x00c0\x00c1",
  973. -1,
  974. NULL,
  975. 0,
  976. NULL,
  977. NULL );
  978. CheckReturnValidA( rc,
  979. -1,
  980. NULL,
  981. "\xc0\xc1",
  982. NULL,
  983. "precomp (a grave, a acute), no WCDest",
  984. &NumErrors );
  985. //
  986. // WC_DISCARDNS flag.
  987. //
  988. // Variation 1 - normal
  989. rc = WideCharToMultiByte( 1252,
  990. WC_COMPOSITECHECK | WC_DISCARDNS,
  991. wcWCStr,
  992. -1,
  993. mbWCDest,
  994. BUFSIZE,
  995. &DefChar,
  996. &UsedDef );
  997. CheckReturnValidA( rc,
  998. -1,
  999. mbWCDest,
  1000. mbWCStr,
  1001. NULL,
  1002. "WC_DISCARDNS",
  1003. &NumErrors );
  1004. // Variation 2 - no WCDest
  1005. rc = WideCharToMultiByte( 1252,
  1006. WC_COMPOSITECHECK | WC_DISCARDNS,
  1007. wcWCStr,
  1008. -1,
  1009. NULL,
  1010. 0,
  1011. &DefChar,
  1012. &UsedDef );
  1013. CheckReturnValidA( rc,
  1014. -1,
  1015. NULL,
  1016. mbWCStr,
  1017. NULL,
  1018. "WC_DISCARDNS, no WCDest",
  1019. &NumErrors );
  1020. // Variation 3 - acute
  1021. rc = WideCharToMultiByte( 1252,
  1022. WC_COMPOSITECHECK | WC_DISCARDNS,
  1023. L"\x0045\x0301\x0045\x0301",
  1024. -1,
  1025. mbWCDest,
  1026. BUFSIZE,
  1027. NULL,
  1028. NULL );
  1029. CheckReturnValidA( rc,
  1030. -1,
  1031. mbWCDest,
  1032. "\xc9\xc9",
  1033. NULL,
  1034. "WC_DISCARDNS acute",
  1035. &NumErrors );
  1036. // Variation 4 - acute, default
  1037. rc = WideCharToMultiByte( 1252,
  1038. WC_COMPOSITECHECK | WC_DISCARDNS,
  1039. L"\x0045\x0301\x0045\x0301",
  1040. -1,
  1041. mbWCDest,
  1042. BUFSIZE,
  1043. &DefChar,
  1044. &UsedDef );
  1045. CheckReturnValidA( rc,
  1046. -1,
  1047. mbWCDest,
  1048. "\xc9\xc9",
  1049. NULL,
  1050. "WC_DISCARDNS acute, default",
  1051. &NumErrors );
  1052. // Variation 5 - no precomp form
  1053. rc = WideCharToMultiByte( 932,
  1054. WC_COMPOSITECHECK | WC_DISCARDNS,
  1055. L"\x3093\x309b",
  1056. -1,
  1057. mbWCDest,
  1058. BUFSIZE,
  1059. &DefChar,
  1060. &UsedDef );
  1061. CheckReturnValidA( rc,
  1062. -1,
  1063. mbWCDest,
  1064. "\x82\xf1",
  1065. NULL,
  1066. "WC_DISCARDNS, no precomp",
  1067. &NumErrors );
  1068. // Variation 6 - no precomp form, no WCDest
  1069. rc = WideCharToMultiByte( 932,
  1070. WC_COMPOSITECHECK | WC_DISCARDNS,
  1071. L"\x3093\x309b",
  1072. -1,
  1073. NULL,
  1074. 0,
  1075. &DefChar,
  1076. &UsedDef );
  1077. CheckReturnValidA( rc,
  1078. -1,
  1079. NULL,
  1080. "\x82\xf1",
  1081. NULL,
  1082. "WC_DISCARDNS, no precomp, no WCDest",
  1083. &NumErrors );
  1084. //
  1085. // WC_SEPCHARS flag.
  1086. //
  1087. // Variation 1 - normal
  1088. rc = WideCharToMultiByte( 1252,
  1089. WC_COMPOSITECHECK | WC_SEPCHARS,
  1090. wcWCStr,
  1091. -1,
  1092. mbWCDest,
  1093. BUFSIZE,
  1094. &DefChar,
  1095. &UsedDef );
  1096. CheckReturnValidA( rc,
  1097. -1,
  1098. mbWCDest,
  1099. mbWCStr,
  1100. NULL,
  1101. "WC_SEPCHARS",
  1102. &NumErrors );
  1103. // Variation 2 - no WCDest
  1104. rc = WideCharToMultiByte( 1252,
  1105. WC_COMPOSITECHECK | WC_SEPCHARS,
  1106. wcWCStr,
  1107. -1,
  1108. NULL,
  1109. 0,
  1110. &DefChar,
  1111. &UsedDef );
  1112. CheckReturnValidA( rc,
  1113. -1,
  1114. NULL,
  1115. mbWCStr,
  1116. NULL,
  1117. "WC_SEPCHARS, no WCDest",
  1118. &NumErrors );
  1119. // Variation 3 - no precomp form
  1120. rc = WideCharToMultiByte( 932,
  1121. WC_COMPOSITECHECK | WC_SEPCHARS,
  1122. L"\x3093\x309b",
  1123. -1,
  1124. mbWCDest,
  1125. BUFSIZE,
  1126. &DefChar,
  1127. &UsedDef );
  1128. CheckReturnValidA( rc,
  1129. -1,
  1130. mbWCDest,
  1131. "\x82\xf1\x81\x4a",
  1132. NULL,
  1133. "WC_SEPCHARS, no precomp",
  1134. &NumErrors );
  1135. // Variation 4 - no precomp form, no WCDest
  1136. rc = WideCharToMultiByte( 932,
  1137. WC_COMPOSITECHECK | WC_SEPCHARS,
  1138. L"\x3093\x309b",
  1139. -1,
  1140. NULL,
  1141. 0,
  1142. &DefChar,
  1143. &UsedDef );
  1144. CheckReturnValidA( rc,
  1145. -1,
  1146. NULL,
  1147. "\x82\xf1\x81\x4a",
  1148. NULL,
  1149. "WC_SEPCHARS, no precomp, no WCDest",
  1150. &NumErrors );
  1151. //
  1152. // WC_DEFAULTCHAR flag.
  1153. //
  1154. // Variation 1 - normal
  1155. rc = WideCharToMultiByte( 1252,
  1156. WC_COMPOSITECHECK | WC_DEFAULTCHAR,
  1157. wcWCStr,
  1158. -1,
  1159. mbWCDest,
  1160. BUFSIZE,
  1161. &DefChar,
  1162. &UsedDef );
  1163. CheckReturnValidA( rc,
  1164. -1,
  1165. mbWCDest,
  1166. mbWCStr,
  1167. NULL,
  1168. "WC_DEFAULTCHAR",
  1169. &NumErrors );
  1170. // Variation 2 - no WCDest
  1171. rc = WideCharToMultiByte( 1252,
  1172. WC_COMPOSITECHECK | WC_DEFAULTCHAR,
  1173. wcWCStr,
  1174. -1,
  1175. NULL,
  1176. 0,
  1177. &DefChar,
  1178. &UsedDef );
  1179. CheckReturnValidA( rc,
  1180. -1,
  1181. NULL,
  1182. mbWCStr,
  1183. NULL,
  1184. "WC_DEFAULTCHAR, no WCDest",
  1185. &NumErrors );
  1186. // Variation 3 - no precomp form
  1187. rc = WideCharToMultiByte( 932,
  1188. WC_COMPOSITECHECK | WC_DEFAULTCHAR,
  1189. L"\x3093\x309b",
  1190. -1,
  1191. mbWCDest,
  1192. BUFSIZE,
  1193. &DefChar,
  1194. &UsedDef );
  1195. CheckReturnValidA( rc,
  1196. -1,
  1197. mbWCDest,
  1198. "X",
  1199. NULL,
  1200. "WC_DEFAULTCHAR, no precomp",
  1201. &NumErrors );
  1202. // Variation 4 - no precomp form, no WCDest
  1203. rc = WideCharToMultiByte( 932,
  1204. WC_COMPOSITECHECK | WC_DEFAULTCHAR,
  1205. L"\x3093\x309b",
  1206. -1,
  1207. NULL,
  1208. 0,
  1209. &DefChar,
  1210. &UsedDef );
  1211. CheckReturnValidA( rc,
  1212. -1,
  1213. NULL,
  1214. "X",
  1215. NULL,
  1216. "WC_DEFAULTCHAR, no precomp, no WCDest",
  1217. &NumErrors );
  1218. // Variation 5 - no precomp form, extra nonspace
  1219. rc = WideCharToMultiByte( 932,
  1220. WC_COMPOSITECHECK | WC_DEFAULTCHAR,
  1221. L"\x3093\x309b\x309b",
  1222. -1,
  1223. mbWCDest,
  1224. BUFSIZE,
  1225. &DefChar,
  1226. &UsedDef );
  1227. CheckReturnValidA( rc,
  1228. -1,
  1229. mbWCDest,
  1230. "X",
  1231. NULL,
  1232. "WC_DEFAULTCHAR, no precomp extra nonspace",
  1233. &NumErrors );
  1234. // Variation 6 - no precomp form, extra nonspace, no WCDest
  1235. rc = WideCharToMultiByte( 932,
  1236. WC_COMPOSITECHECK | WC_DEFAULTCHAR,
  1237. L"\x3093\x309b\x309b",
  1238. -1,
  1239. NULL,
  1240. 0,
  1241. &DefChar,
  1242. &UsedDef );
  1243. CheckReturnValidA( rc,
  1244. -1,
  1245. NULL,
  1246. "X",
  1247. NULL,
  1248. "WC_DEFAULTCHAR, no precomp extra nonspace, no WCDest",
  1249. &NumErrors );
  1250. // Variation 7 - no precomp form, no default
  1251. rc = WideCharToMultiByte( 932,
  1252. WC_COMPOSITECHECK | WC_DEFAULTCHAR,
  1253. L"\x3093\x309b\x309b",
  1254. -1,
  1255. mbWCDest,
  1256. BUFSIZE,
  1257. NULL,
  1258. NULL );
  1259. CheckReturnValidA( rc,
  1260. -1,
  1261. mbWCDest,
  1262. "\x3f",
  1263. NULL,
  1264. "WC_DEFAULTCHAR, no precomp no default",
  1265. &NumErrors );
  1266. // Variation 8 - no precomp form, no WCDest, no default
  1267. rc = WideCharToMultiByte( 932,
  1268. WC_COMPOSITECHECK | WC_DEFAULTCHAR,
  1269. L"\x3093\x309b\x309b",
  1270. -1,
  1271. NULL,
  1272. 0,
  1273. NULL,
  1274. NULL );
  1275. CheckReturnValidA( rc,
  1276. -1,
  1277. NULL,
  1278. "\x3f",
  1279. NULL,
  1280. "WC_DEFAULTCHAR, no precomp no default, no WCDest",
  1281. &NumErrors );
  1282. // Variation 9 - no precomp form, extra nonspace
  1283. rc = WideCharToMultiByte( 1252,
  1284. WC_COMPOSITECHECK | WC_DEFAULTCHAR,
  1285. L"\x0065\x0303\x0303",
  1286. -1,
  1287. mbWCDest,
  1288. BUFSIZE,
  1289. &DefChar,
  1290. &UsedDef );
  1291. CheckReturnValidA( rc,
  1292. -1,
  1293. mbWCDest,
  1294. "X",
  1295. NULL,
  1296. "WC_DEFAULTCHAR, no precomp 2, extra nonspace",
  1297. &NumErrors );
  1298. // Variation 10 - no precomp form, extra nonspace, no WCDest
  1299. rc = WideCharToMultiByte( 1252,
  1300. WC_COMPOSITECHECK | WC_DEFAULTCHAR,
  1301. L"\x0065\x0303\x0303",
  1302. -1,
  1303. NULL,
  1304. 0,
  1305. &DefChar,
  1306. &UsedDef );
  1307. CheckReturnValidA( rc,
  1308. -1,
  1309. NULL,
  1310. "X",
  1311. NULL,
  1312. "WC_DEFAULTCHAR, no precomp 2, extra nonspace, no WCDest",
  1313. &NumErrors );
  1314. //
  1315. // Circumflex check.
  1316. //
  1317. // Variation 1 - circumflex (no flag)
  1318. rc = WideCharToMultiByte( 437,
  1319. 0,
  1320. L"\x0045\x0302",
  1321. -1,
  1322. mbWCDest,
  1323. BUFSIZE,
  1324. NULL,
  1325. NULL );
  1326. CheckReturnValidA( rc,
  1327. -1,
  1328. mbWCDest,
  1329. "\x45\x5e",
  1330. NULL,
  1331. "circumflex (no flag)",
  1332. &NumErrors );
  1333. // Variation 2 - circumflex
  1334. rc = WideCharToMultiByte( 437,
  1335. WC_COMPOSITECHECK | WC_SEPCHARS,
  1336. L"\x0045\x0302",
  1337. -1,
  1338. mbWCDest,
  1339. BUFSIZE,
  1340. NULL,
  1341. NULL );
  1342. CheckReturnValidA( rc,
  1343. -1,
  1344. mbWCDest,
  1345. "E",
  1346. NULL,
  1347. "circumflex",
  1348. &NumErrors );
  1349. // Variation 3 - circumflex, no WCDest
  1350. rc = WideCharToMultiByte( 437,
  1351. WC_COMPOSITECHECK | WC_SEPCHARS,
  1352. L"\x0045\x0302",
  1353. -1,
  1354. NULL,
  1355. 0,
  1356. NULL,
  1357. NULL );
  1358. CheckReturnValidA( rc,
  1359. -1,
  1360. NULL,
  1361. "\x88",
  1362. NULL,
  1363. "circumflex, no WCDest",
  1364. &NumErrors );
  1365. //
  1366. // Half Ring Below check.
  1367. //
  1368. // Variation 1 - half ring below
  1369. rc = WideCharToMultiByte( 437,
  1370. WC_COMPOSITECHECK | WC_DISCARDNS,
  1371. L"\x0045\x031c",
  1372. -1,
  1373. mbWCDest,
  1374. BUFSIZE,
  1375. NULL,
  1376. NULL );
  1377. CheckReturnValidA( rc,
  1378. -1,
  1379. mbWCDest,
  1380. "\x45",
  1381. NULL,
  1382. "half ring below",
  1383. &NumErrors );
  1384. // Variation 2 - half ring below, no WCDest
  1385. rc = WideCharToMultiByte( 437,
  1386. WC_COMPOSITECHECK | WC_DISCARDNS,
  1387. L"\x0045\x031c",
  1388. -1,
  1389. NULL,
  1390. 0,
  1391. NULL,
  1392. NULL );
  1393. CheckReturnValidA( rc,
  1394. -1,
  1395. NULL,
  1396. "\x45",
  1397. NULL,
  1398. "half ring below, no WCDest",
  1399. &NumErrors );
  1400. //
  1401. // TILDE check.
  1402. //
  1403. // Variation 1 - tilde, discardns
  1404. rc = WideCharToMultiByte( 437,
  1405. WC_COMPOSITECHECK | WC_DISCARDNS,
  1406. L"\x0042\x0303",
  1407. -1,
  1408. mbWCDest,
  1409. BUFSIZE,
  1410. NULL,
  1411. NULL );
  1412. CheckReturnValidA( rc,
  1413. -1,
  1414. mbWCDest,
  1415. "\x42",
  1416. NULL,
  1417. "tilde, discardns",
  1418. &NumErrors );
  1419. // Variation 2 - tilde, discardns, no WCDest
  1420. rc = WideCharToMultiByte( 437,
  1421. WC_COMPOSITECHECK | WC_DISCARDNS,
  1422. L"\x0042\x0303",
  1423. -1,
  1424. NULL,
  1425. 0,
  1426. NULL,
  1427. NULL );
  1428. CheckReturnValidA( rc,
  1429. -1,
  1430. NULL,
  1431. "\x42",
  1432. NULL,
  1433. "tilde, discardns, no WCDest",
  1434. &NumErrors );
  1435. // Variation 3 - tilde, sepchars
  1436. rc = WideCharToMultiByte( 437,
  1437. WC_COMPOSITECHECK | WC_SEPCHARS,
  1438. L"\x0042\x0303",
  1439. -1,
  1440. mbWCDest,
  1441. BUFSIZE,
  1442. NULL,
  1443. NULL );
  1444. CheckReturnValidA( rc,
  1445. -1,
  1446. mbWCDest,
  1447. "\x42\x7e",
  1448. NULL,
  1449. "tilde, sepchars",
  1450. &NumErrors );
  1451. // Variation 4 - tilde, sepchars, no WCDest
  1452. rc = WideCharToMultiByte( 437,
  1453. WC_COMPOSITECHECK | WC_SEPCHARS,
  1454. L"\x0042\x0303",
  1455. -1,
  1456. NULL,
  1457. 0,
  1458. NULL,
  1459. NULL );
  1460. CheckReturnValidA( rc,
  1461. -1,
  1462. NULL,
  1463. "\x42\x7e",
  1464. NULL,
  1465. "tilde, sepchars, no WCDest",
  1466. &NumErrors );
  1467. // Variation 5 - tilde, defaultchar
  1468. rc = WideCharToMultiByte( 437,
  1469. WC_COMPOSITECHECK | WC_DEFAULTCHAR,
  1470. L"\x0042\x0303",
  1471. -1,
  1472. mbWCDest,
  1473. BUFSIZE,
  1474. NULL,
  1475. NULL );
  1476. CheckReturnValidA( rc,
  1477. -1,
  1478. mbWCDest,
  1479. "\x3f",
  1480. NULL,
  1481. "tilde, defaultchar",
  1482. &NumErrors );
  1483. // Variation 6 - tilde, defaultchar, no WCDest
  1484. rc = WideCharToMultiByte( 437,
  1485. WC_COMPOSITECHECK | WC_DEFAULTCHAR,
  1486. L"\x0042\x0303",
  1487. -1,
  1488. NULL,
  1489. 0,
  1490. NULL,
  1491. NULL );
  1492. CheckReturnValidA( rc,
  1493. -1,
  1494. NULL,
  1495. "\x3f",
  1496. NULL,
  1497. "tilde, defaultchar, no WCDest",
  1498. &NumErrors );
  1499. //
  1500. // CP 437 - Nonspace character first in string.
  1501. //
  1502. // Variation 1 - first char, discardns
  1503. rc = WideCharToMultiByte( 437,
  1504. WC_COMPOSITECHECK | WC_DISCARDNS,
  1505. L"\x0301\x0045",
  1506. -1,
  1507. mbWCDest,
  1508. BUFSIZE,
  1509. NULL,
  1510. NULL );
  1511. CheckReturnValidA( rc,
  1512. -1,
  1513. mbWCDest,
  1514. "\x45",
  1515. NULL,
  1516. "first char, discardns",
  1517. &NumErrors );
  1518. // Variation 2 - first char, sepchars
  1519. rc = WideCharToMultiByte( 437,
  1520. WC_COMPOSITECHECK | WC_SEPCHARS,
  1521. L"\x0301\x0045",
  1522. -1,
  1523. mbWCDest,
  1524. BUFSIZE,
  1525. NULL,
  1526. NULL );
  1527. CheckReturnValidA( rc,
  1528. -1,
  1529. mbWCDest,
  1530. "\x27\x45",
  1531. NULL,
  1532. "first char, sepchars",
  1533. &NumErrors );
  1534. // Variation 3 - first char, defaultchar
  1535. rc = WideCharToMultiByte( 437,
  1536. WC_COMPOSITECHECK | WC_DEFAULTCHAR,
  1537. L"\x0301\x0045",
  1538. -1,
  1539. mbWCDest,
  1540. BUFSIZE,
  1541. NULL,
  1542. NULL );
  1543. CheckReturnValidA( rc,
  1544. -1,
  1545. mbWCDest,
  1546. "\x3f\x45",
  1547. NULL,
  1548. "first char, defaultchar",
  1549. &NumErrors );
  1550. //
  1551. // CP 437 - Composite Check Flags.
  1552. //
  1553. // Variation 1 - composite check - no flags
  1554. rc = WideCharToMultiByte( 437,
  1555. 0,
  1556. L"\x0045\x0302\x0045\x0308\x0045\x0305",
  1557. -1,
  1558. mbWCDest,
  1559. BUFSIZE,
  1560. NULL,
  1561. NULL );
  1562. CheckReturnValidA( rc,
  1563. -1,
  1564. mbWCDest,
  1565. "\x45\x5e\x45\x22\x45\x3f",
  1566. NULL,
  1567. "437 composite check",
  1568. &NumErrors );
  1569. // Variation 2 - composite check - discardns
  1570. rc = WideCharToMultiByte( 437,
  1571. WC_COMPOSITECHECK | WC_DISCARDNS,
  1572. L"\x0045\x0302\x0045\x0308\x0045\x0305",
  1573. -1,
  1574. mbWCDest,
  1575. BUFSIZE,
  1576. NULL,
  1577. NULL );
  1578. CheckReturnValidA( rc,
  1579. -1,
  1580. mbWCDest,
  1581. "EEE",
  1582. NULL,
  1583. "437 composite check - discardns",
  1584. &NumErrors );
  1585. // Variation 3 - composite check - sepchars
  1586. rc = WideCharToMultiByte( 437,
  1587. WC_COMPOSITECHECK | WC_SEPCHARS,
  1588. L"\x0045\x0302\x0045\x0308\x0045\x0305",
  1589. -1,
  1590. mbWCDest,
  1591. BUFSIZE,
  1592. NULL,
  1593. NULL );
  1594. CheckReturnValidA( rc,
  1595. -1,
  1596. mbWCDest,
  1597. "EEE?",
  1598. NULL,
  1599. "437 composite check - sepchars",
  1600. &NumErrors );
  1601. // Variation 4 - composite check - defaultchar
  1602. rc = WideCharToMultiByte( 437,
  1603. WC_COMPOSITECHECK | WC_DEFAULTCHAR,
  1604. L"\x0045\x0302\x0045\x0308\x0045\x0305",
  1605. -1,
  1606. mbWCDest,
  1607. BUFSIZE,
  1608. NULL,
  1609. NULL );
  1610. CheckReturnValidA( rc,
  1611. -1,
  1612. mbWCDest,
  1613. "EE?",
  1614. NULL,
  1615. "437 composite check - defaultchar",
  1616. &NumErrors );
  1617. //
  1618. // CP 437 - Double Nonspacing Chars Check.
  1619. //
  1620. // Variation 1 - double nonspace check - no flags
  1621. rc = WideCharToMultiByte( 437,
  1622. 0,
  1623. L"\x0045\x0302\x0045\x0302\x0302",
  1624. -1,
  1625. mbWCDest,
  1626. BUFSIZE,
  1627. NULL,
  1628. NULL );
  1629. CheckReturnValidA( rc,
  1630. -1,
  1631. mbWCDest,
  1632. "\x45\x5e\x45\x5e\x5e",
  1633. NULL,
  1634. "437 double nonspace check",
  1635. &NumErrors );
  1636. // Variation 2 - double nonspace check - discardns
  1637. rc = WideCharToMultiByte( 437,
  1638. WC_COMPOSITECHECK | WC_DISCARDNS,
  1639. L"\x0045\x0302\x0045\x0302\x0302",
  1640. -1,
  1641. mbWCDest,
  1642. BUFSIZE,
  1643. NULL,
  1644. NULL );
  1645. CheckReturnValidA( rc,
  1646. -1,
  1647. mbWCDest,
  1648. "EE",
  1649. NULL,
  1650. "437 double nonspace check - discardns",
  1651. &NumErrors );
  1652. // Variation 3 - double nonspace check - sepchars
  1653. rc = WideCharToMultiByte( 437,
  1654. WC_COMPOSITECHECK | WC_SEPCHARS,
  1655. L"\x0045\x0302\x0045\x0302\x0302",
  1656. -1,
  1657. mbWCDest,
  1658. BUFSIZE,
  1659. NULL,
  1660. NULL );
  1661. CheckReturnValidA( rc,
  1662. -1,
  1663. mbWCDest,
  1664. "EE^",
  1665. NULL,
  1666. "437 double nonspace check - sepchars",
  1667. &NumErrors );
  1668. // Variation 4 - double nonspace check - defaultchar
  1669. rc = WideCharToMultiByte( 437,
  1670. WC_COMPOSITECHECK | WC_DEFAULTCHAR,
  1671. L"\x0045\x0302\x0045\x0302\x0302",
  1672. -1,
  1673. mbWCDest,
  1674. BUFSIZE,
  1675. NULL,
  1676. NULL );
  1677. CheckReturnValidA( rc,
  1678. -1,
  1679. mbWCDest,
  1680. "E?",
  1681. NULL,
  1682. "437 double nonspace check - defaultchar",
  1683. &NumErrors );
  1684. //
  1685. // CP 936.
  1686. //
  1687. // Variation 1 - ideographic comma
  1688. rc = WideCharToMultiByte( 936,
  1689. WC_COMPOSITECHECK | WC_SEPCHARS,
  1690. L"\x3001",
  1691. -1,
  1692. mbWCDest,
  1693. BUFSIZE,
  1694. NULL,
  1695. NULL );
  1696. CheckReturnValidA( rc,
  1697. -1,
  1698. mbWCDest,
  1699. "\xa1\xa2",
  1700. NULL,
  1701. "cp 936",
  1702. &NumErrors );
  1703. // Variation 2 - ideographic comma, no WCDest
  1704. rc = WideCharToMultiByte( 936,
  1705. WC_COMPOSITECHECK | WC_SEPCHARS,
  1706. L"\x3001",
  1707. -1,
  1708. NULL,
  1709. 0,
  1710. NULL,
  1711. NULL );
  1712. CheckReturnValidA( rc,
  1713. -1,
  1714. NULL,
  1715. "\xa1\xa2",
  1716. NULL,
  1717. "cp 936, no WCDest",
  1718. &NumErrors );
  1719. //
  1720. // Return total number of errors found.
  1721. //
  1722. return (NumErrors);
  1723. }