16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/******************************************************************** 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * COPYRIGHT: 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (c) 1997-2013, International Business Machines Corporation and 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * others. All Rights Reserved. 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************/ 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* file name: cbiditst.c 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* encoding: US-ASCII 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* tab size: 8 (not used) 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* indentation:4 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* created on: 1999sep27 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* created by: Markus W. Scherer, updated by Matitiahu Allouche 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cintltst.h" 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h" 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uchar.h" 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustring.h" 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ubidi.h" 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ushape.h" 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cbiditst.h" 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cstring.h" 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* the following include is needed for sprintf */ 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdio.h> 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define MAXLEN MAX_STRING_LENGTH 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define LENGTHOF(array) (sizeof(array)/sizeof((array)[0])) 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* prototypes ---------------------------------------------------------------*/ 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid addComplexTest(TestNode** root); 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void testCharFromDirProp(void); 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void testBidi(void); 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void doTests(UBiDi *pBiDi, UBiDi *pLine, UBool countRunsFirst); 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void doMisc(void); 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void doTest(UBiDi *pBiDi, int testNumber, const BiDiTestData *test, 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t lineStart, UBool countRunsFirst); 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void _testReordering(UBiDi *pBiDi, int testNumber); 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void testInverse(void); 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void _testManyInverseBidi(UBiDi *pBiDi, UBiDiLevel direction); 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void _testInverseBidi(UBiDi *pBiDi, const UChar *src, int32_t srcLength, 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDiLevel direction, UErrorCode *pErrorCode); 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void _testWriteReverse(void); 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void _testManyAddedPoints(void); 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void _testMisc(void); 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void doArabicShapingTest(void); 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void doLamAlefSpecialVLTRArabicShapingTest(void); 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void doTashkeelSpecialVLTRArabicShapingTest(void); 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void doLOGICALArabicDeShapingTest(void); 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void doArabicShapingTestForBug5421(void); 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void doArabicShapingTestForBug8703(void); 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void doArabicShapingTestForBug9024(void); 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void testReorder(void); 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void testReorderArabicMathSymbols(void); 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void testFailureRecovery(void); 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void testMultipleParagraphs(void); 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void testGetBaseDirection(void); 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void testContext(void); 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void doTailTest(void); 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 87d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.orgstatic void testBracketOverflow(void); 88d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* new BIDI API */ 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void testReorderingMode(void); 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void testReorderRunsOnly(void); 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void testStreaming(void); 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void testClassOverride(void); 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char* inverseBasic(UBiDi *pBiDi, const char *src, int32_t srcLen, 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t option, UBiDiLevel level, char *result); 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool assertRoundTrip(UBiDi *pBiDi, int32_t tc, int32_t outIndex, 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *srcChars, const char *destChars, 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *dest, int32_t destLen, int mode, 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int option, UBiDiLevel level); 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool checkResultLength(UBiDi *pBiDi, const char *srcChars, 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *destChars, 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t destLen, const char *mode, 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *option, UBiDiLevel level); 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool checkMaps(UBiDi *pBiDi, int32_t stringIndex, const char *src, 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *dest, const char *mode, const char* option, 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDiLevel level, UBool forward); 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* helpers ------------------------------------------------------------------ */ 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char *levelString="..............................................................."; 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void initCharFromDirProps(void); 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UChar * 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orggetStringFromDirProps(const uint8_t *dirProps, int32_t length, UChar *buffer); 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void printUnicode(const UChar *s, int32_t length, const UBiDiLevel *levels); 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* regression tests ---------------------------------------------------------*/ 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgaddComplexTest(TestNode** root) { 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, testCharFromDirProp, "complex/bidi/TestCharFromDirProp"); 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, testBidi, "complex/bidi/TestBidi"); 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, testInverse, "complex/bidi/TestInverse"); 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, testReorder,"complex/bidi/TestReorder"); 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, testFailureRecovery,"complex/bidi/TestFailureRecovery"); 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, testMultipleParagraphs,"complex/bidi/TestMultipleParagraphs"); 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, testReorderingMode, "complex/bidi/TestReorderingMode"); 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, testReorderRunsOnly, "complex/bidi/TestReorderRunsOnly"); 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, testStreaming, "complex/bidi/TestStreaming"); 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, testClassOverride, "complex/bidi/TestClassOverride"); 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, testGetBaseDirection, "complex/bidi/testGetBaseDirection"); 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, testContext, "complex/bidi/testContext"); 135d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org addTest(root, testBracketOverflow, "complex/bidi/TestBracketOverflow"); 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, doArabicShapingTest, "complex/arabic-shaping/ArabicShapingTest"); 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, doLamAlefSpecialVLTRArabicShapingTest, "complex/arabic-shaping/lamalef"); 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, doTashkeelSpecialVLTRArabicShapingTest, "complex/arabic-shaping/tashkeel"); 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, doLOGICALArabicDeShapingTest, "complex/arabic-shaping/unshaping"); 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, doArabicShapingTestForBug5421, "complex/arabic-shaping/bug-5421"); 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, doTailTest, "complex/arabic-shaping/tailtest"); 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, doArabicShapingTestForBug8703, "complex/arabic-shaping/bug-8703"); 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, testReorderArabicMathSymbols, "complex/bidi/bug-9024"); 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, doArabicShapingTestForBug9024, "complex/arabic-shaping/bug-9024"); 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtestCharFromDirProp(void) { 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* verify that the exemplar characters have the expected bidi classes */ 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i; 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\nEntering TestCharFromDirProp\n\n"); 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org initCharFromDirProps(); 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<U_CHAR_DIRECTION_COUNT; ++i) { 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(u_charDirection(charFromDirProp[i])!=(UCharDirection)i) { 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nu_charDirection(charFromDirProp[%d]=U+%04x)==%d!=%d\n", 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i, charFromDirProp[i], u_charDirection(charFromDirProp[i]), i); 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\nExiting TestCharFromDirProp\n\n"); 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtestBidi(void) { 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDi *pBiDi, *pLine=NULL; 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode errorCode=U_ZERO_ERROR; 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\nEntering TestBidi\n\n"); 1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pBiDi=ubidi_openSized(MAXLEN, 0, &errorCode); 1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(pBiDi!=NULL) { 1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pLine=ubidi_open(); 1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(pLine!=NULL) { 1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org doTests(pBiDi, pLine, FALSE); 1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org doTests(pBiDi, pLine, TRUE); 1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_open() returned NULL, out of memory\n"); 1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_openSized() returned NULL, errorCode %s\n", myErrorName(errorCode)); 1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org doMisc(); 1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(pLine!=NULL) { 1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(pLine); 1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(pBiDi!=NULL) { 1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(pBiDi); 1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\nExiting TestBidi\n\n"); 1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void 1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgdoTests(UBiDi *pBiDi, UBiDi *pLine, UBool countRunsFirst) { 1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int testNumber; 1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar string[MAXLEN]; 2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode errorCode; 2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t lineStart; 2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDiLevel paraLevel; 2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(testNumber=0; testNumber<bidiTestCount; ++testNumber) { 2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org getStringFromDirProps(tests[testNumber].text, tests[testNumber].length, string); 2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org paraLevel=tests[testNumber].paraLevel; 2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(pBiDi, string, -1, paraLevel, NULL, &errorCode); 2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_SUCCESS(errorCode)) { 2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("ubidi_setPara(tests[%d], paraLevel %d) ok, direction %d paraLevel=%d\n", 2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testNumber, paraLevel, ubidi_getDirection(pBiDi), paraLevel); 2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lineStart=tests[testNumber].lineStart; 2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(lineStart==-1) { 2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org doTest(pBiDi, testNumber, tests+testNumber, 0, countRunsFirst); 2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setLine(pBiDi, lineStart, tests[testNumber].lineLimit, pLine, &errorCode); 2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_SUCCESS(errorCode)) { 2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("ubidi_setLine(%d, %d) ok, direction %d paraLevel=%d\n", 2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lineStart, tests[testNumber].lineLimit, ubidi_getDirection(pLine), ubidi_getParaLevel(pLine)); 2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org doTest(pLine, testNumber, tests+testNumber, lineStart, countRunsFirst); 2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_setLine(tests[%d], %d, %d) failed with errorCode %s\n", 2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testNumber, lineStart, tests[testNumber].lineLimit, myErrorName(errorCode)); 2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_setPara(tests[%d], paraLevel %d) failed with errorCode %s\n", 2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testNumber, paraLevel, myErrorName(errorCode)); 2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char columns[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define TABLE_SIZE 256 2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool tablesInitialized = FALSE; 2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UChar pseudoToUChar[TABLE_SIZE]; 2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic uint8_t UCharToPseudo[TABLE_SIZE]; /* used for Unicode chars < 0x0100 */ 2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic uint8_t UCharToPseud2[TABLE_SIZE]; /* used for Unicode chars >=0x0100 */ 2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void buildPseudoTables(void) 2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org The rules for pseudo-Bidi are as follows: 2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org - [ == LRE 2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org - ] == RLE 2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org - { == LRO 2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org - } == RLO 2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org - ^ == PDF 2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org - @ == LRM 2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org - & == RLM 2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org - A-F == Arabic Letters 0631-0636 2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org - G-V == Hebrew letters 05d7-05e6 2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org - W-Z == Unassigned RTL 08d0-08d3 2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org - 0-5 == western digits 0030-0035 2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org - 6-9 == Arabic-Indic digits 0666-0669 2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org - ` == Combining Grave Accent 0300 (NSM) 2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org - ~ == Delete 007f (BN) 2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org - | == Paragraph Separator 2029 (B) 2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org - _ == Info Separator 1 001f (S) 2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org All other characters represent themselves as Latin-1, with the corresponding 2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Bidi properties. 2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int i; 2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar uchar; 2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint8_t c; 2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* initialize all tables to unknown */ 2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i=0; i < TABLE_SIZE; i++) { 2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[i] = 0xFFFD; 2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCharToPseudo[i] = '?'; 2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCharToPseud2[i] = '?'; 2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* initialize non letters or digits */ 2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t) 0 ] = 0x0000; UCharToPseudo[0x00] = (uint8_t) 0 ; 2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)' '] = 0x0020; UCharToPseudo[0x20] = (uint8_t)' '; 2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)'!'] = 0x0021; UCharToPseudo[0x21] = (uint8_t)'!'; 2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)'"'] = 0x0022; UCharToPseudo[0x22] = (uint8_t)'"'; 2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)'#'] = 0x0023; UCharToPseudo[0x23] = (uint8_t)'#'; 2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)'$'] = 0x0024; UCharToPseudo[0x24] = (uint8_t)'$'; 2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)'%'] = 0x0025; UCharToPseudo[0x25] = (uint8_t)'%'; 2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)'\'']= 0x0027; UCharToPseudo[0x27] = (uint8_t)'\''; 2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)'('] = 0x0028; UCharToPseudo[0x28] = (uint8_t)'('; 2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)')'] = 0x0029; UCharToPseudo[0x29] = (uint8_t)')'; 2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)'*'] = 0x002A; UCharToPseudo[0x2A] = (uint8_t)'*'; 2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)'+'] = 0x002B; UCharToPseudo[0x2B] = (uint8_t)'+'; 2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)','] = 0x002C; UCharToPseudo[0x2C] = (uint8_t)','; 2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)'-'] = 0x002D; UCharToPseudo[0x2D] = (uint8_t)'-'; 2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)'.'] = 0x002E; UCharToPseudo[0x2E] = (uint8_t)'.'; 2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)'/'] = 0x002F; UCharToPseudo[0x2F] = (uint8_t)'/'; 2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)':'] = 0x003A; UCharToPseudo[0x3A] = (uint8_t)':'; 2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)';'] = 0x003B; UCharToPseudo[0x3B] = (uint8_t)';'; 2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)'<'] = 0x003C; UCharToPseudo[0x3C] = (uint8_t)'<'; 2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)'='] = 0x003D; UCharToPseudo[0x3D] = (uint8_t)'='; 2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)'>'] = 0x003E; UCharToPseudo[0x3E] = (uint8_t)'>'; 2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)'?'] = 0x003F; UCharToPseudo[0x3F] = (uint8_t)'?'; 2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)'\\']= 0x005C; UCharToPseudo[0x5C] = (uint8_t)'\\'; 2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* initialize specially used characters */ 2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)'`'] = 0x0300; UCharToPseud2[0x00] = (uint8_t)'`'; /* NSM */ 2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)'@'] = 0x200E; UCharToPseud2[0x0E] = (uint8_t)'@'; /* LRM */ 3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)'&'] = 0x200F; UCharToPseud2[0x0F] = (uint8_t)'&'; /* RLM */ 3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)'_'] = 0x001F; UCharToPseudo[0x1F] = (uint8_t)'_'; /* S */ 3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)'|'] = 0x2029; UCharToPseud2[0x29] = (uint8_t)'|'; /* B */ 3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)'['] = 0x202A; UCharToPseud2[0x2A] = (uint8_t)'['; /* LRE */ 3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)']'] = 0x202B; UCharToPseud2[0x2B] = (uint8_t)']'; /* RLE */ 3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)'^'] = 0x202C; UCharToPseud2[0x2C] = (uint8_t)'^'; /* PDF */ 3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)'{'] = 0x202D; UCharToPseud2[0x2D] = (uint8_t)'{'; /* LRO */ 3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)'}'] = 0x202E; UCharToPseud2[0x2E] = (uint8_t)'}'; /* RLO */ 3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[(uint8_t)'~'] = 0x007F; UCharToPseudo[0x7F] = (uint8_t)'~'; /* BN */ 3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* initialize western digits */ 3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0, uchar = 0x0030; i < 6; i++, uchar++) { 3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org c = (uint8_t)columns[i]; 3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[c] = uchar; 3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCharToPseudo[uchar & 0x00ff] = c; 3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* initialize Hindi digits */ 3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 6, uchar = 0x0666; i < 10; i++, uchar++) { 3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org c = (uint8_t)columns[i]; 3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[c] = uchar; 3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCharToPseud2[uchar & 0x00ff] = c; 3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* initialize Arabic letters */ 3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 10, uchar = 0x0631; i < 16; i++, uchar++) { 3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org c = (uint8_t)columns[i]; 3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[c] = uchar; 3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCharToPseud2[uchar & 0x00ff] = c; 3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* initialize Hebrew letters */ 3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 16, uchar = 0x05D7; i < 32; i++, uchar++) { 3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org c = (uint8_t)columns[i]; 3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[c] = uchar; 3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCharToPseud2[uchar & 0x00ff] = c; 3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* initialize Unassigned code points */ 3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 32, uchar=0x08D0; i < 36; i++, uchar++) { 3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org c = (uint8_t)columns[i]; 3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[c] = uchar; 3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCharToPseud2[uchar & 0x00ff] = c; 3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* initialize Latin lower case letters */ 3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 36, uchar = 0x0061; i < 62; i++, uchar++) { 3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org c = (uint8_t)columns[i]; 3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToUChar[c] = uchar; 3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCharToPseudo[uchar & 0x00ff] = c; 3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tablesInitialized = TRUE; 3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*----------------------------------------------------------------------*/ 3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int pseudoToU16(const int length, const char * input, UChar * output) 3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* This function converts a pseudo-Bidi string into a UChar string. 3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org It returns the length of the UChar string. 3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int i; 3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!tablesInitialized) { 3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org buildPseudoTables(); 3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0; i < length; i++) 3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org output[i] = pseudoToUChar[(uint8_t)input[i]]; 3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org output[length] = 0; 3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return length; 3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*----------------------------------------------------------------------*/ 3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int u16ToPseudo(const int length, const UChar * input, char * output) 3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* This function converts a UChar string into a pseudo-Bidi string. 3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org It returns the length of the pseudo-Bidi string. 3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int i; 3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar uchar; 3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!tablesInitialized) { 3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org buildPseudoTables(); 3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0; i < length; i++) 3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uchar = input[i]; 3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org output[i] = uchar < 0x0100 ? UCharToPseudo[uchar] : 3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCharToPseud2[uchar & 0x00ff]; 3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org output[length] = '\0'; 3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return length; 3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic char * formatLevels(UBiDi *bidi, char *buffer) { 3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode ec = U_ZERO_ERROR; 3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UBiDiLevel* gotLevels = ubidi_getLevels(bidi, &ec); 3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int len = ubidi_getLength(bidi); 3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char c; 3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int i, k; 3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(ec)) { 3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcpy(buffer, "BAD LEVELS"); 3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return buffer; 3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i=0; i<len; i++) { 3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org k = gotLevels[i]; 4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (k >= sizeof(columns)) 4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org c = '+'; 4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else 4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org c = columns[k]; 4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org buffer[i] = c; 4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org buffer[len] = '\0'; 4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return buffer; 4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char *reorderingModeNames[] = { 4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "UBIDI_REORDER_DEFAULT", 4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "UBIDI_REORDER_NUMBERS_SPECIAL", 4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "UBIDI_REORDER_GROUP_NUMBERS_WITH_R", 4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "UBIDI_REORDER_RUNS_ONLY", 4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "UBIDI_REORDER_INVERSE_NUMBERS_AS_L", 4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "UBIDI_REORDER_INVERSE_LIKE_DIRECT", 4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL"}; 4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic char *reorderingOptionNames(char *buffer, int options) { 4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org buffer[0] = 0; 4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (options & UBIDI_OPTION_INSERT_MARKS) { 4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcat(buffer, " UBIDI_OPTION_INSERT_MARKS"); 4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (options & UBIDI_OPTION_REMOVE_CONTROLS) { 4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcat(buffer, " UBIDI_OPTION_REMOVE_CONTROLS"); 4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (options & UBIDI_OPTION_STREAMING) { 4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcat(buffer, " UBIDI_OPTION_STREAMING"); 4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return buffer; 4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void printCaseInfo(UBiDi *bidi, const char *src, const char *dst) 4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* src and dst are char arrays encoded as pseudo Bidi */ 4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Since calls to log_err with a \n within the pattern increment the 4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * error count, new lines are issued via fputs, except when we want the 4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * increment to happen. 4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode errorCode=U_ZERO_ERROR; 4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i, length = ubidi_getProcessedLength(bidi); 4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UBiDiLevel *levels; 4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char levelChars[MAXLEN]; 4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDiLevel lev; 4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t runCount; 4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char buffer[100]; 4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("========================================"); fputs("\n", stderr); 4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org levels = ubidi_getLevels(bidi, &errorCode); 4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(errorCode)) { 4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcpy(levelChars, "BAD LEVELS"); 4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Processed length: %d", length); fputs("\n", stderr); 4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0; i < length; i++) { 4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lev = levels[i]; 4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (lev < sizeof(columns)) { 4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org levelChars[i] = columns[lev]; 4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org levelChars[i] = '+'; 4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org levelChars[length] = 0; 4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Levels: %s", levelChars); fputs("\n", stderr); 4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Source: %s", src); fputs("\n", stderr); 4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Result: %s", dst); fputs("\n", stderr); 4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Direction: %d", ubidi_getDirection(bidi)); fputs("\n", stderr); 4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("paraLevel: %d", ubidi_getParaLevel(bidi)); fputs("\n", stderr); 4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i = ubidi_getReorderingMode(bidi); 4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("reorderingMode: %d = %s", i, reorderingModeNames[i]); 4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fputs("\n", stderr); 4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i = ubidi_getReorderingOptions(bidi); 4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("reorderingOptions: %d = %s", i, reorderingOptionNames(buffer, i)); 4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fputs("\n", stderr); 4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org runCount = ubidi_countRuns(bidi, &errorCode); 4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(errorCode)) { 4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err( "BAD RUNS"); 4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Runs: %d => logicalStart.length/level: ", runCount); 4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0; i < runCount; i++) { 4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDiDirection dir; 4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t start, len; 4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dir = ubidi_getVisualRun(bidi, i, &start, &len); 4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err(" %d.%d/%d", start, len, dir); 4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fputs("\n", stderr); 4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool matchingPair(UBiDi *bidi, int32_t i, char c1, char c2) 4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* No test for []{} since they have special meaning for pseudo Bidi */ 4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static char mates1Chars[] = "<>()"; 4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static char mates2Chars[] = "><)("; 4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDiLevel level; 4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int k, len; 4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (c1 == c2) { 4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* For UBIDI_REORDER_RUNS_ONLY, it would not be correct to check levels[i], 5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org so we use the appropriate run's level, which is good for all cases. 5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_getLogicalRun(bidi, i, NULL, &level); 5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ((level & 1) == 0) { 5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org len = strlen(mates1Chars); 5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (k = 0; k < len; k++) { 5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ((c1 == mates1Chars[k]) && (c2 == mates2Chars[k])) { 5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool checkWhatYouCan(UBiDi *bidi, const char *srcChars, const char *dstChars) 5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* srcChars and dstChars are char arrays encoded as pseudo Bidi */ 5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i, idx, logLimit, visLimit; 5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool testOK, errMap, errDst; 5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode errorCode=U_ZERO_ERROR; 5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t visMap[MAXLEN]; 5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t logMap[MAXLEN]; 5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char accumSrc[MAXLEN]; 5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char accumDst[MAXLEN]; 5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_getVisualMap(bidi, visMap, &errorCode); 5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_getLogicalMap(bidi, logMap, &errorCode); 5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(errorCode)) { 5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Error #1 invoking ICU within checkWhatYouCan\n"); 5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testOK = TRUE; 5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errMap = errDst = FALSE; 5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logLimit = ubidi_getProcessedLength(bidi); 5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org visLimit = ubidi_getResultLength(bidi); 5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org memset(accumSrc, '?', logLimit); 5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org memset(accumDst, '?', visLimit); 5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0; i < logLimit; i++) { 5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org idx = ubidi_getVisualIndex(bidi, i, &errorCode); 5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (idx != logMap[i]) { 5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errMap = TRUE; 5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (idx == UBIDI_MAP_NOWHERE) { 5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (idx >= visLimit) { 5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org accumDst[idx] = srcChars[i]; 5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!matchingPair(bidi, i, srcChars[i], dstChars[idx])) { 5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errDst = TRUE; 5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org accumDst[visLimit] = 0; 5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(errorCode)) { 5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Error #2 invoking ICU within checkWhatYouCan\n"); 5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (errMap) { 5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (testOK) { 5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printCaseInfo(bidi, srcChars, dstChars); 5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testOK = FALSE; 5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Mismatch between getLogicalMap() and getVisualIndex()\n"); 5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Map :"); 5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0; i < logLimit; i++) { 5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err(" %d", logMap[i]); 5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fputs("\n", stderr); 5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Indexes:"); 5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0; i < logLimit; i++) { 5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err(" %d", ubidi_getVisualIndex(bidi, i, &errorCode)); 5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fputs("\n", stderr); 5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (errDst) { 5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (testOK) { 5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printCaseInfo(bidi, srcChars, dstChars); 5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testOK = FALSE; 5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Source does not map to Result\n"); 5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("We got: %s", accumDst); fputs("\n", stderr); 5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errMap = errDst = FALSE; 5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0; i < visLimit; i++) { 5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org idx = ubidi_getLogicalIndex(bidi, i, &errorCode); 5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (idx != visMap[i]) { 5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errMap = TRUE; 5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (idx == UBIDI_MAP_NOWHERE) { 5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (idx >= logLimit) { 5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org accumSrc[idx] = dstChars[i]; 5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!matchingPair(bidi, idx, srcChars[idx], dstChars[i])) { 6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errDst = TRUE; 6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org accumSrc[logLimit] = 0; 6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(errorCode)) { 6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Error #3 invoking ICU within checkWhatYouCan\n"); 6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (errMap) { 6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (testOK) { 6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printCaseInfo(bidi, srcChars, dstChars); 6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testOK = FALSE; 6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Mismatch between getVisualMap() and getLogicalIndex()\n"); 6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Map :"); 6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0; i < visLimit; i++) { 6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err(" %d", visMap[i]); 6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fputs("\n", stderr); 6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Indexes:"); 6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0; i < visLimit; i++) { 6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err(" %d", ubidi_getLogicalIndex(bidi, i, &errorCode)); 6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fputs("\n", stderr); 6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (errDst) { 6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (testOK) { 6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printCaseInfo(bidi, srcChars, dstChars); 6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testOK = FALSE; 6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Result does not map to Source\n"); 6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("We got: %s", accumSrc); 6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fputs("\n", stderr); 6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return testOK; 6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void 6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtestReorder(void) { 6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const char* const logicalOrder[] ={ 6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "del(KC)add(K.C.&)", 6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "del(QDVT) add(BVDL)", 6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "del(PQ)add(R.S.)T)U.&", 6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "del(LV)add(L.V.) L.V.&", 6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "day 0 R DPDHRVR dayabbr", 6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "day 1 H DPHPDHDA dayabbr", 6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "day 2 L DPBLENDA dayabbr", 6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "day 3 J DPJQVM dayabbr", 6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "day 4 I DPIQNF dayabbr", 6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "day 5 M DPMEG dayabbr", 6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "helloDPMEG", 6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "hello WXYZ" 6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const char* const visualOrder[]={ 6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "del(CK)add(&.C.K)", 6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "del(TVDQ) add(LDVB)", 6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "del(QP)add(S.R.)&.U(T", /* updated for Unicode 6.3 matching brackets */ 6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "del(VL)add(V.L.) &.V.L", /* updated for Unicode 6.3 matching brackets */ 6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "day 0 RVRHDPD R dayabbr", 6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "day 1 ADHDPHPD H dayabbr", 6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "day 2 ADNELBPD L dayabbr", 6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "day 3 MVQJPD J dayabbr", 6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "day 4 FNQIPD I dayabbr", 6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "day 5 GEMPD M dayabbr", 6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "helloGEMPD", 6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "hello ZYXW" 6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const char* const visualOrder1[]={ 6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ")K.C.&(dda)KC(led", 6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ")BVDL(dda )QDVT(led", 6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "T(U.&).R.S(dda)PQ(led", /* updated for Unicode 6.3 matching brackets */ 6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "L.V.& ).L.V(dda)LV(led", /* updated for Unicode 6.3 matching brackets */ 6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "rbbayad R DPDHRVR 0 yad", 6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "rbbayad H DPHPDHDA 1 yad", 6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "rbbayad L DPBLENDA 2 yad", 6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "rbbayad J DPJQVM 3 yad", 6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "rbbayad I DPIQNF 4 yad", 6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "rbbayad M DPMEG 5 yad", 6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "DPMEGolleh", 6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "WXYZ olleh" 6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const char* const visualOrder2[]={ 6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "@)@K.C.&@(dda)@KC@(led", 6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "@)@BVDL@(dda )@QDVT@(led", 6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "R.S.)T)U.&@(dda)@PQ@(led", 6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "L.V.) L.V.&@(dda)@LV@(led", 6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "rbbayad @R DPDHRVR@ 0 yad", 6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "rbbayad @H DPHPDHDA@ 1 yad", 6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "rbbayad @L DPBLENDA@ 2 yad", 6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "rbbayad @J DPJQVM@ 3 yad", 6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "rbbayad @I DPIQNF@ 4 yad", 6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "rbbayad @M DPMEG@ 5 yad", 6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "DPMEGolleh", 6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "WXYZ@ olleh" 6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const char* const visualOrder3[]={ 6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ")K.C.&(KC)dda(led", 6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ")BVDL(ddaQDVT) (led", 6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "R.S.)T)U.&(PQ)dda(led", 7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "L.V.) L.V.&(LV)dda(led", 7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "rbbayad DPDHRVR R 0 yad", 7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "rbbayad DPHPDHDA H 1 yad", 7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "rbbayad DPBLENDA L 2 yad", 7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "rbbayad DPJQVM J 3 yad", 7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "rbbayad DPIQNF I 4 yad", 7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "rbbayad DPMEG M 5 yad", 7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "DPMEGolleh", 7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "WXYZ olleh" 7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const char* const visualOrder4[]={ 7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "del(add(CK(.C.K)", 7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "del( (TVDQadd(LDVB)", 7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "del(add(QP(.U(T(.S.R", 7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "del(add(VL(.V.L (.V.L", 7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "day 0 R RVRHDPD dayabbr", 7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "day 1 H ADHDPHPD dayabbr", 7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "day 2 L ADNELBPD dayabbr", 7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "day 3 J MVQJPD dayabbr", 7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "day 4 I FNQIPD dayabbr", 7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "day 5 M GEMPD dayabbr", 7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "helloGEMPD", 7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "hello ZYXW" 7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char formatChars[MAXLEN]; 7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode ec = U_ZERO_ERROR; 7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDi* bidi = ubidi_open(); 7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int i; 7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\nEntering TestReorder\n\n"); 7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0;i<LENGTHOF(logicalOrder);i++){ 7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t srcSize = (int32_t)strlen(logicalOrder[i]); 7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t destSize = srcSize*2; 7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar src[MAXLEN]; 7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar dest[MAXLEN]; 7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char chars[MAXLEN]; 7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Testing L2V #1 for case %d\n", i); 7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToU16(srcSize,logicalOrder[i],src); 7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ec = U_ZERO_ERROR; 7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi,src,srcSize,UBIDI_DEFAULT_LTR ,NULL,&ec); 7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(ec)){ 7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_setPara(tests[%d], paraLevel %d) failed with errorCode %s\n", 7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i, UBIDI_DEFAULT_LTR, u_errorName(ec)); 7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* try pre-flighting */ 7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destSize = ubidi_writeReordered(bidi,dest,0,UBIDI_DO_MIRRORING,&ec); 7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(ec!=U_BUFFER_OVERFLOW_ERROR){ 7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Pre-flighting did not give expected error: Expected: U_BUFFER_OVERFLOW_ERROR. Got: %s \n",u_errorName(ec)); 7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }else if(destSize!=srcSize){ 7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Pre-flighting did not give expected size: Expected: %d. Got: %d \n",srcSize,destSize); 7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }else{ 7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ec= U_ZERO_ERROR; 7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destSize=ubidi_writeReordered(bidi,dest,destSize+1,UBIDI_DO_MIRRORING,&ec); 7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u16ToPseudo(destSize,dest,chars); 7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(destSize!=srcSize){ 7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_writeReordered() destSize and srcSize do not match\n"); 7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }else if(strcmp(visualOrder[i],chars)!=0){ 7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_writeReordered() did not give expected results for UBIDI_DO_MIRRORING.\n" 7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Input : %s\nExpected: %s\nGot : %s\nLevels : %s\nAt Index: %d\n", 7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logicalOrder[i],visualOrder[i],chars,formatLevels(bidi, formatChars),i); 7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org checkWhatYouCan(bidi, logicalOrder[i], chars); 7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0;i<LENGTHOF(logicalOrder);i++){ 7676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t srcSize = (int32_t)strlen(logicalOrder[i]); 7686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t destSize = srcSize*2; 7696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar src[MAXLEN]; 7706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar dest[MAXLEN]; 7716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char chars[MAXLEN]; 7726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Testing L2V #2 for case %d\n", i); 7736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToU16(srcSize,logicalOrder[i],src); 7746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ec = U_ZERO_ERROR; 7756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi,src,srcSize,UBIDI_DEFAULT_LTR ,NULL,&ec); 7766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(ec)){ 7776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_setPara(tests[%d], paraLevel %d) failed with errorCode %s\n", 7786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i, UBIDI_DEFAULT_LTR, u_errorName(ec)); 7796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* try pre-flighting */ 7816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destSize = ubidi_writeReordered(bidi,dest,0,UBIDI_DO_MIRRORING+UBIDI_OUTPUT_REVERSE,&ec); 7826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(ec!=U_BUFFER_OVERFLOW_ERROR){ 7836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Pre-flighting did not give expected error: Expected: U_BUFFER_OVERFLOW_ERROR. Got: %s \n",u_errorName(ec)); 7846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }else if(destSize!=srcSize){ 7856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Pre-flighting did not give expected size: Expected: %d. Got: %d \n",srcSize,destSize); 7866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }else{ 7876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ec= U_ZERO_ERROR; 7886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destSize=ubidi_writeReordered(bidi,dest,destSize+1,UBIDI_DO_MIRRORING+UBIDI_OUTPUT_REVERSE,&ec); 7906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u16ToPseudo(destSize,dest,chars); 7916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(destSize!=srcSize){ 7926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_writeReordered() destSize and srcSize do not match\n"); 7936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }else if(strcmp(visualOrder1[i],chars)!=0){ 7946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_writeReordered() did not give expected results for UBIDI_DO_MIRRORING+UBIDI_OUTPUT_REVERSE.\n" 7956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Input : %s\nExpected: %s\nGot : %s\nLevels : %s\nAt Index: %d\n", 7966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logicalOrder[i],visualOrder1[i],chars,formatLevels(bidi, formatChars),i); 7976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0;i<LENGTHOF(logicalOrder);i++){ 8016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t srcSize = (int32_t)strlen(logicalOrder[i]); 8026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t destSize = srcSize*2; 8036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar src[MAXLEN]; 8046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar dest[MAXLEN]; 8056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char chars[MAXLEN]; 8066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Testing V2L #3 for case %d\n", i); 8076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToU16(srcSize,logicalOrder[i],src); 8086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ec = U_ZERO_ERROR; 8096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setInverse(bidi,TRUE); 8106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi,src,srcSize,UBIDI_DEFAULT_LTR ,NULL,&ec); 8116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(ec)){ 8126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_setPara(tests[%d], paraLevel %d) failed with errorCode %s\n", 8136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i, UBIDI_DEFAULT_LTR, u_errorName(ec)); 8146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* try pre-flighting */ 8166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destSize = ubidi_writeReordered(bidi,dest,0,UBIDI_INSERT_LRM_FOR_NUMERIC+UBIDI_OUTPUT_REVERSE,&ec); 8176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(ec!=U_BUFFER_OVERFLOW_ERROR){ 8186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Pre-flighting did not give expected error: Expected: U_BUFFER_OVERFLOW_ERROR. Got: %s \n",u_errorName(ec)); 8196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }else{ 8206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ec= U_ZERO_ERROR; 8216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destSize=ubidi_writeReordered(bidi,dest,destSize+1,UBIDI_INSERT_LRM_FOR_NUMERIC+UBIDI_OUTPUT_REVERSE,&ec); 8236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u16ToPseudo(destSize,dest,chars); 8246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(strcmp(visualOrder2[i],chars)!=0){ 8256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_writeReordered() did not give expected results for UBIDI_INSERT_LRM_FOR_NUMERIC+UBIDI_OUTPUT_REVERSE.\n" 8266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Input : %s\nExpected: %s\nGot : %s\nLevels : %s\nAt Index: %d\n", 8276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logicalOrder[i],visualOrder2[i],chars,formatLevels(bidi, formatChars),i); 8286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Max Explicit level */ 8316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0;i<LENGTHOF(logicalOrder);i++){ 8326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t srcSize = (int32_t)strlen(logicalOrder[i]); 8336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t destSize = srcSize*2; 8346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar src[MAXLEN]; 8356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar dest[MAXLEN]; 8366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char chars[MAXLEN]; 8376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDiLevel levels[UBIDI_MAX_EXPLICIT_LEVEL]={1,2,3,4,5,6,7,8,9,10}; 8386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Testing V2L #4 for case %d\n", i); 8396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToU16(srcSize,logicalOrder[i],src); 8406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ec = U_ZERO_ERROR; 8416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi,src,srcSize,UBIDI_DEFAULT_LTR,levels,&ec); 8426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(ec)){ 8436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_setPara(tests[%d], paraLevel %d) failed with errorCode %s\n", 8446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i, UBIDI_MAX_EXPLICIT_LEVEL, u_errorName(ec)); 8456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* try pre-flighting */ 8476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destSize = ubidi_writeReordered(bidi,dest,0,UBIDI_OUTPUT_REVERSE,&ec); 8486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(ec!=U_BUFFER_OVERFLOW_ERROR){ 8496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Pre-flighting did not give expected error: Expected: U_BUFFER_OVERFLOW_ERROR. Got: %s \n",u_errorName(ec)); 8506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }else if(destSize!=srcSize){ 8516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Pre-flighting did not give expected size: Expected: %d. Got: %d \n",srcSize,destSize); 8526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }else{ 8536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ec = U_ZERO_ERROR; 8546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destSize=ubidi_writeReordered(bidi,dest,destSize+1,UBIDI_OUTPUT_REVERSE,&ec); 8566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u16ToPseudo(destSize,dest,chars); 8576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(destSize!=srcSize){ 8586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_writeReordered() destSize and srcSize do not match. Dest Size = %d Source Size = %d\n",destSize,srcSize ); 8596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }else if(strcmp(visualOrder3[i],chars)!=0){ 8606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_writeReordered() did not give expected results for UBIDI_OUTPUT_REVERSE.\n" 8616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Input : %s\nExpected: %s\nGot : %s\nLevels : %s\nAt Index: %d\n", 8626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logicalOrder[i],visualOrder3[i],chars,formatLevels(bidi, formatChars),i); 8636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0;i<LENGTHOF(logicalOrder);i++){ 8666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t srcSize = (int32_t)strlen(logicalOrder[i]); 8676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t destSize = srcSize*2; 8686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar src[MAXLEN]; 8696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar dest[MAXLEN]; 8706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char chars[MAXLEN]; 8716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDiLevel levels[UBIDI_MAX_EXPLICIT_LEVEL]={1,2,3,4,5,6,7,8,9,10}; 8726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Testing V2L #5 for case %d\n", i); 8736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToU16(srcSize,logicalOrder[i],src); 8746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ec = U_ZERO_ERROR; 8756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi,src,srcSize,UBIDI_DEFAULT_LTR,levels,&ec); 8766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(ec)){ 8776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_setPara(tests[%d], paraLevel %d) failed with errorCode %s\n", 8786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i, UBIDI_MAX_EXPLICIT_LEVEL, u_errorName(ec)); 8796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* try pre-flighting */ 8816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destSize = ubidi_writeReordered(bidi,dest,0,UBIDI_DO_MIRRORING+UBIDI_REMOVE_BIDI_CONTROLS,&ec); 8826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(ec!=U_BUFFER_OVERFLOW_ERROR){ 8836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Pre-flighting did not give expected error: Expected: U_BUFFER_OVERFLOW_ERROR. Got: %s \n",u_errorName(ec)); 8846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }else{ 8856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ec= U_ZERO_ERROR; 8866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destSize=ubidi_writeReordered(bidi,dest,destSize+1,UBIDI_DO_MIRRORING+UBIDI_REMOVE_BIDI_CONTROLS,&ec); 8886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u16ToPseudo(destSize,dest,chars); 8896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(strcmp(visualOrder4[i],chars)!=0){ 8906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_writeReordered() did not give expected results for UBIDI_DO_MIRRORING+UBIDI_REMOVE_BIDI_CONTROLS.\n" 8916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Input : %s\nExpected: %s\nGot : %s\nLevels : %s\nAt Index: %d\n", 8926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logicalOrder[i],visualOrder4[i],chars,formatLevels(bidi, formatChars),i); 8936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(bidi); 8966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\nExiting TestReorder\n\n"); 8986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 8996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void 9016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtestReorderArabicMathSymbols(void) { 9026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar logicalOrder[][MAXLEN]={ 9036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Arabic mathematical Symbols 0x1EE00 - 0x1EE1B */ 9046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {0xD83B, 0xDE00, 0xD83B, 0xDE01, 0xD83B, 0xDE02, 0xD83B, 0xDE03, 0x20, 9056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE24, 0xD83B, 0xDE05, 0xD83B, 0xDE06, 0x20, 9066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE07, 0xD83B, 0xDE08, 0xD83B, 0xDE09, 0x20, 9076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE0A, 0xD83B, 0xDE0B, 0xD83B, 0xDE0C, 0xD83B, 0xDE0D, 0x20, 9086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE0E, 0xD83B, 0xDE0F, 0xD83B, 0xDE10, 0xD83B, 0xDE11, 0x20, 9096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE12, 0xD83B, 0xDE13, 0xD83B, 0xDE14, 0xD83B, 0xDE15, 0x20, 9106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE16, 0xD83B, 0xDE17, 0xD83B, 0xDE18, 0x20, 9116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE19, 0xD83B, 0xDE1A, 0xD83B, 0xDE1B}, 9126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Arabic mathematical Symbols - Looped Symbols, 0x1EE80 - 0x1EE9B */ 9136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {0xD83B, 0xDE80, 0xD83B, 0xDE81, 0xD83B, 0xDE82, 0xD83B, 0xDE83, 0x20, 9146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE84, 0xD83B, 0xDE85, 0xD83B, 0xDE86, 0x20, 9156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE87, 0xD83B, 0xDE88, 0xD83B, 0xDE89, 0x20, 9166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE8B, 0xD83B, 0xDE8C, 0xD83B, 0xDE8D, 0x20, 9176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE8E, 0xD83B, 0xDE8F, 0xD83B, 0xDE90, 0xD83B, 0xDE91, 0x20, 9186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE92, 0xD83B, 0xDE93, 0xD83B, 0xDE94, 0xD83B, 0xDE95, 0x20, 9196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE96, 0xD83B, 0xDE97, 0xD83B, 0xDE98, 0x20, 9206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE99, 0xD83B, 0xDE9A, 0xD83B, 0xDE9B}, 9216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Arabic mathematical Symbols - Double-struck Symbols, 0x1EEA1 - 0x1EEBB */ 9226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {0xD83B, 0xDEA1, 0xD83B, 0xDEA2, 0xD83B, 0xDEA3, 0x20, 9236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDEA5, 0xD83B, 0xDEA6, 0x20, 9246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDEA7, 0xD83B, 0xDEA8, 0xD83B, 0xDEA9, 0x20, 9256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDEAB, 0xD83B, 0xDEAC, 0xD83B, 0xDEAD, 0x20, 9266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDEAE, 0xD83B, 0xDEAF, 0xD83B, 0xDEB0, 0xD83B, 0xDEB1, 0x20, 9276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDEB2, 0xD83B, 0xDEB3, 0xD83B, 0xDEB4, 0xD83B, 0xDEB5, 0x20, 9286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDEB6, 0xD83B, 0xDEB7, 0xD83B, 0xDEB8, 0x20, 9296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDEB9, 0xD83B, 0xDEBA, 0xD83B, 0xDEBB}, 9306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Arabic mathematical Symbols - Initial Symbols, 0x1EE21 - 0x1EE3B */ 9316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {0xD83B, 0xDE21, 0xD83B, 0xDE22, 0x20, 9326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE27, 0xD83B, 0xDE29, 0x20, 9336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE2A, 0xD83B, 0xDE2B, 0xD83B, 0xDE2C, 0xD83B, 0xDE2D, 0x20, 9346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE2E, 0xD83B, 0xDE2F, 0xD83B, 0xDE30, 0xD83B, 0xDE31, 0x20, 9356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE32, 0xD83B, 0xDE34, 0xD83B, 0xDE35, 0x20, 9366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE36, 0xD83B, 0xDE37, 0x20, 9376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE39, 0xD83B, 0xDE3B}, 9386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Arabic mathematical Symbols - Tailed Symbols */ 9396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {0xD83B, 0xDE42, 0xD83B, 0xDE47, 0xD83B, 0xDE49, 0xD83B, 0xDE4B, 0x20, 9406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE4D, 0xD83B, 0xDE4E, 0xD83B, 0xDE4F, 0x20, 9416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE51, 0xD83B, 0xDE52, 0xD83B, 0xDE54, 0xD83B, 0xDE57, 0x20, 9426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE59, 0xD83B, 0xDE5B, 0xD83B, 0xDE5D, 0xD83B, 0xDE5F} 9436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 9446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar visualOrder[][MAXLEN]={ 9456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Arabic mathematical Symbols 0x1EE00 - 0x1EE1B */ 9466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {0xD83B, 0xDE1B, 0xD83B, 0xDE1A, 0xD83B, 0xDE19, 0x20, 9476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE18, 0xD83B, 0xDE17, 0xD83B, 0xDE16, 0x20, 9486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE15, 0xD83B, 0xDE14, 0xD83B, 0xDE13, 0xD83B, 0xDE12, 0x20, 9496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE11, 0xD83B, 0xDE10, 0xD83B, 0xDE0F, 0xD83B, 0xDE0E, 0x20, 9506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE0D, 0xD83B, 0xDE0C, 0xD83B, 0xDE0B, 0xD83B, 0xDE0A, 0x20, 9516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE09, 0xD83B, 0xDE08, 0xD83B, 0xDE07, 0x20, 9526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE06, 0xD83B, 0xDE05, 0xD83B, 0xDE24, 0x20, 9536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE03, 0xD83B, 0xDE02, 0xD83B, 0xDE01, 0xD83B, 0xDE00}, 9546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Arabic mathematical Symbols - Looped Symbols, 0x1EE80 - 0x1EE9B */ 9556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {0xD83B, 0xDE9B, 0xD83B, 0xDE9A, 0xD83B, 0xDE99, 0x20, 9566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE98, 0xD83B, 0xDE97, 0xD83B, 0xDE96, 0x20, 9576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE95, 0xD83B, 0xDE94, 0xD83B, 0xDE93, 0xD83B, 0xDE92, 0x20, 9586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE91, 0xD83B, 0xDE90, 0xD83B, 0xDE8F, 0xD83B, 0xDE8E, 0x20, 9596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE8D, 0xD83B, 0xDE8C, 0xD83B, 0xDE8B, 0x20, 9606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE89, 0xD83B, 0xDE88, 0xD83B, 0xDE87, 0x20, 9616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE86, 0xD83B, 0xDE85, 0xD83B, 0xDE84, 0x20, 9626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE83, 0xD83B, 0xDE82, 0xD83B, 0xDE81, 0xD83B, 0xDE80}, 9636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Arabic mathematical Symbols - Double-struck Symbols, 0x1EEA1 - 0x1EEBB */ 9646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {0xD83B, 0xDEBB, 0xD83B, 0xDEBA, 0xD83B, 0xDEB9, 0x20, 9656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDEB8, 0xD83B, 0xDEB7, 0xD83B, 0xDEB6, 0x20, 9666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDEB5, 0xD83B, 0xDEB4, 0xD83B, 0xDEB3, 0xD83B, 0xDEB2, 0x20, 9676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDEB1, 0xD83B, 0xDEB0, 0xD83B, 0xDEAF, 0xD83B, 0xDEAE, 0x20, 9686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDEAD, 0xD83B, 0xDEAC, 0xD83B, 0xDEAB, 0x20, 9696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDEA9, 0xD83B, 0xDEA8, 0xD83B, 0xDEA7, 0x20, 9706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDEA6, 0xD83B, 0xDEA5, 0x20, 9716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDEA3, 0xD83B, 0xDEA2, 0xD83B, 0xDEA1}, 9726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Arabic mathematical Symbols - Initial Symbols, 0x1EE21 - 0x1EE3B */ 9736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {0xD83B, 0xDE3B, 0xD83B, 0xDE39, 0x20, 9746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE37, 0xD83B, 0xDE36, 0x20, 9756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE35, 0xD83B, 0xDE34, 0xD83B, 0xDE32, 0x20, 9766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE31, 0xD83B, 0xDE30, 0xD83B, 0xDE2F, 0xD83B, 0xDE2E, 0x20, 9776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE2D, 0xD83B, 0xDE2C, 0xD83B, 0xDE2B, 0xD83B, 0xDE2A, 0x20, 9786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE29, 0xD83B, 0xDE27, 0x20, 9796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE22, 0xD83B, 0xDE21}, 9806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Arabic mathematical Symbols - Tailed Symbols */ 9816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {0xD83B, 0xDE5F, 0xD83B, 0xDE5D, 0xD83B, 0xDE5B, 0xD83B, 0xDE59, 0x20, 9826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE57, 0xD83B, 0xDE54, 0xD83B, 0xDE52, 0xD83B, 0xDE51, 0x20, 9836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE4F, 0xD83B, 0xDE4E, 0xD83B, 0xDE4D, 0x20, 9846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE4B, 0xD83B, 0xDE49, 0xD83B, 0xDE47, 0xD83B, 0xDE42} 9856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 9866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char formatChars[MAXLEN]; 9876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode ec = U_ZERO_ERROR; 9886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDi* bidi = ubidi_open(); 9896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int i; 9906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\nEntering TestReorderArabicMathSymbols\n\n"); 9926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0;i<LENGTHOF(logicalOrder);i++){ 9946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t srcSize = u_strlen(logicalOrder[i]); 9956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t destSize = srcSize*2; 9966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar dest[MAXLEN]; 9976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Testing L2V #1 for case %d\n", i); 9986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ec = U_ZERO_ERROR; 9996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi,logicalOrder[i],srcSize,UBIDI_DEFAULT_LTR ,NULL,&ec); 10006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(ec)){ 10016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_setPara(tests[%d], paraLevel %d) failed with errorCode %s\n", 10026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i, UBIDI_DEFAULT_LTR, u_errorName(ec)); 10036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* try pre-flighting */ 10056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destSize = ubidi_writeReordered(bidi,dest,0,UBIDI_DO_MIRRORING,&ec); 10066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(ec!=U_BUFFER_OVERFLOW_ERROR){ 10076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Pre-flighting did not give expected error: Expected: U_BUFFER_OVERFLOW_ERROR. Got: %s \n",u_errorName(ec)); 10086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }else if(destSize!=srcSize){ 10096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Pre-flighting did not give expected size: Expected: %d. Got: %d \n",srcSize,destSize); 10106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }else{ 10116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ec= U_ZERO_ERROR; 10126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destSize=ubidi_writeReordered(bidi,dest,destSize+1,UBIDI_DO_MIRRORING,&ec); 10146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(destSize!=srcSize){ 10156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_writeReordered() destSize and srcSize do not match\n"); 10166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }else if(memcmp(dest, visualOrder[i], destSize*U_SIZEOF_UCHAR)!=0){ 10176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_writeReordered() did not give expected results for UBIDI_DO_MIRRORING.\n" 10186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Input : %s\nExpected: %s\nGot : %s\nLevels : %s\nAt Index: %d\n", 10196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logicalOrder[i],visualOrder[i],dest,formatLevels(bidi, formatChars),i); 10206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(bidi); 10246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\nExiting TestReorderArabicMathSymbols\n\n"); 10266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 10276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void 10296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgdoTest(UBiDi *pBiDi, int testNumber, const BiDiTestData *test, int32_t lineStart, UBool countRunsFirst) { 10306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const uint8_t *dirProps=test->text+lineStart; 10316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UBiDiLevel *levels=test->levels; 10326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const uint8_t *visualMap=test->visualMap; 10336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i, len=ubidi_getLength(pBiDi), logicalIndex, runCount = 0; 10346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode errorCode=U_ZERO_ERROR; 10356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDiLevel level, level2; 10366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (countRunsFirst) { 10386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Calling ubidi_countRuns() first.\n"); 10396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org runCount = ubidi_countRuns(pBiDi, &errorCode); 10416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode)) { 10436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_countRuns(tests[%d]): error %s\n", testNumber, myErrorName(errorCode)); 10446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 10456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 10476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Calling ubidi_getLogicalMap() first.\n"); 10486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org _testReordering(pBiDi, testNumber); 10516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<len; ++i) { 10536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("%3d %3d %.*s%-3s @%d\n", 10546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i, ubidi_getLevelAt(pBiDi, i), ubidi_getLevelAt(pBiDi, i), levelString, 10556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dirPropNames[dirProps[i]], 10566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_getVisualIndex(pBiDi, i, &errorCode)); 10576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\n-----levels:"); 10606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<len; ++i) { 10616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(i>0) { 10626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose(","); 10636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose(" %d", ubidi_getLevelAt(pBiDi, i)); 10656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\n--reordered:"); 10686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<len; ++i) { 10696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(i>0) { 10706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose(","); 10716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose(" %d", ubidi_getVisualIndex(pBiDi, i, &errorCode)); 10736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\n"); 10756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test->direction!=ubidi_getDirection(pBiDi)) { 10776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_getDirection(tests[%d]): wrong direction %d\n", testNumber, ubidi_getDirection(pBiDi)); 10786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test->resultLevel!=ubidi_getParaLevel(pBiDi)) { 10816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_getParaLevel(tests[%d]): wrong paragraph level %d\n", testNumber, ubidi_getParaLevel(pBiDi)); 10826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<len; ++i) { 10856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(levels[i]!=ubidi_getLevelAt(pBiDi, i)) { 10866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_getLevelAt(tests[%d], %d): wrong level %d, expected %d\n", testNumber, i, ubidi_getLevelAt(pBiDi, i), levels[i]); 10876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 10886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<len; ++i) { 10926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logicalIndex=ubidi_getVisualIndex(pBiDi, i, &errorCode); 10936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode)) { 10946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_getVisualIndex(tests[%d], %d): error %s\n", testNumber, i, myErrorName(errorCode)); 10956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 10966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(visualMap[i]!=logicalIndex) { 10986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_getVisualIndex(tests[%d], %d): wrong index %d\n", testNumber, i, logicalIndex); 10996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 11006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (! countRunsFirst) { 11046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org runCount=ubidi_countRuns(pBiDi, &errorCode); 11056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode)) { 11066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_countRuns(tests[%d]): error %s\n", testNumber, myErrorName(errorCode)); 11076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 11086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(logicalIndex=0; logicalIndex<len;) { 11126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org level=ubidi_getLevelAt(pBiDi, logicalIndex); 11136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_getLogicalRun(pBiDi, logicalIndex, &logicalIndex, &level2); 11146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(level!=level2) { 11156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_getLogicalRun(tests[%d], run ending at index %d): " 11166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "wrong level %d instead of %d\n", 11176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testNumber, logicalIndex, level, level2); 11186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(--runCount<0) { 11206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nubidi_getLogicalRun(tests[%d]): wrong number of runs " 11216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "compared to %d=ubidi_countRuns()\n", 11226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testNumber, ubidi_countRuns(pBiDi, &errorCode)); 11236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 11246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(runCount!=0) { 11276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nubidi_getLogicalRun(tests[%d]): wrong number of runs " 11286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "compared to %d=ubidi_getRunCount()\n", 11296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testNumber, ubidi_countRuns(pBiDi, &errorCode)); 11306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 11316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\n\n"); 11346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 11356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void 11376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org_testReordering(UBiDi *pBiDi, int testNumber) { 11386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t 11396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logicalMap1[MAXLEN], logicalMap2[MAXLEN], logicalMap3[MAXLEN], 11406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org visualMap1[MAXLEN], visualMap2[MAXLEN], visualMap3[MAXLEN], visualMap4[MAXLEN]; 11416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode errorCode=U_ZERO_ERROR; 11426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UBiDiLevel *levels; 11436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i, length=ubidi_getLength(pBiDi), 11446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destLength=ubidi_getResultLength(pBiDi); 11456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t runCount, visualIndex, logicalStart, runLength; 11466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool odd; 11476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(length<=0) { 11496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 11506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* get the logical and visual maps from the object */ 11536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_getLogicalMap(pBiDi, logicalMap1, &errorCode); 11546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode)) { 11556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_getLogicalMap(tests[%d]): error %s\n", testNumber, myErrorName(errorCode)); 11566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 11576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_getVisualMap(pBiDi, visualMap1, &errorCode); 11606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode)) { 11616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_getVisualMap(tests[%d]): error %s\n", testNumber, myErrorName(errorCode)); 11626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 11636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* invert them both */ 11666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_invertMap(logicalMap1, visualMap2, length); 11676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_invertMap(visualMap1, logicalMap2, destLength); 11686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* get them from the levels array, too */ 11706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org levels=ubidi_getLevels(pBiDi, &errorCode); 11716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode)) { 11736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_getLevels(tests[%d]): error %s\n", testNumber, myErrorName(errorCode)); 11746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 11756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_reorderLogical(levels, length, logicalMap3); 11786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_reorderVisual(levels, length, visualMap3); 11796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* get the visual map from the runs, too */ 11816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org runCount=ubidi_countRuns(pBiDi, &errorCode); 11826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode)) { 11836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_countRuns(tests[%d]): error %s\n", testNumber, myErrorName(errorCode)); 11846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 11856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\n----%2d runs:", runCount); 11876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org visualIndex=0; 11886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<runCount; ++i) { 11896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org odd=(UBool)ubidi_getVisualRun(pBiDi, i, &logicalStart, &runLength); 11906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose(" (%c @%d[%d])", odd ? 'R' : 'L', logicalStart, runLength); 11916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(UBIDI_LTR==odd) { 11926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org do { /* LTR */ 11936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org visualMap4[visualIndex++]=logicalStart++; 11946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } while(--runLength>0); 11956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 11966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logicalStart+=runLength; /* logicalLimit */ 11976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org do { /* RTL */ 11986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org visualMap4[visualIndex++]=--logicalStart; 11996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } while(--runLength>0); 12006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\n"); 12036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* print all the maps */ 12056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("logical maps:\n"); 12066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<length; ++i) { 12076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("%4d", logicalMap1[i]); 12086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\n"); 12106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<length; ++i) { 12116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("%4d", logicalMap2[i]); 12126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\n"); 12146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<length; ++i) { 12156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("%4d", logicalMap3[i]); 12166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\nvisual maps:\n"); 12196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<destLength; ++i) { 12206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("%4d", visualMap1[i]); 12216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\n"); 12236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<destLength; ++i) { 12246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("%4d", visualMap2[i]); 12256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\n"); 12276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<length; ++i) { 12286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("%4d", visualMap3[i]); 12296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\n"); 12316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<length; ++i) { 12326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("%4d", visualMap4[i]); 12336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\n"); 12356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* check that the indexes are the same between these and ubidi_getLogical/VisualIndex() */ 12376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<length; ++i) { 12386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(logicalMap1[i]!=logicalMap2[i]) { 12396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("bidi reordering error in tests[%d]: logicalMap1[i]!=logicalMap2[i] at i=%d\n", testNumber, i); 12406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 12416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(logicalMap1[i]!=logicalMap3[i]) { 12436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("bidi reordering error in tests[%d]: logicalMap1[i]!=logicalMap3[i] at i=%d\n", testNumber, i); 12446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 12456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(visualMap1[i]!=visualMap2[i]) { 12486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("bidi reordering error in tests[%d]: visualMap1[i]!=visualMap2[i] at i=%d\n", testNumber, i); 12496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 12506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(visualMap1[i]!=visualMap3[i]) { 12526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("bidi reordering error in tests[%d]: visualMap1[i]!=visualMap3[i] at i=%d\n", testNumber, i); 12536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 12546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(visualMap1[i]!=visualMap4[i]) { 12566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("bidi reordering error in tests[%d]: visualMap1[i]!=visualMap4[i] at i=%d\n", testNumber, i); 12576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 12586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(logicalMap1[i]!=ubidi_getVisualIndex(pBiDi, i, &errorCode)) { 12616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("bidi reordering error in tests[%d]: logicalMap1[i]!=ubidi_getVisualIndex(i) at i=%d\n", testNumber, i); 12626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 12636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode)) { 12656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_getVisualIndex(tests[%d], %d): error %s\n", testNumber, i, myErrorName(errorCode)); 12666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 12676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(visualMap1[i]!=ubidi_getLogicalIndex(pBiDi, i, &errorCode)) { 12696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("bidi reordering error in tests[%d]: visualMap1[i]!=ubidi_getLogicalIndex(i) at i=%d\n", testNumber, i); 12706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 12716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode)) { 12736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_getLogicalIndex(tests[%d], %d): error %s\n", testNumber, i, myErrorName(errorCode)); 12746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 12756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 12786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define RETURN_IF_BAD_ERRCODE(x) \ 12806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(errorCode)) { \ 12816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nbad errorCode %d at %s\n", errorCode, (x)); \ 12826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; \ 12836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } \ 12846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define STRING_TEST_CASE(s) { (s), LENGTHOF(s) } 12866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void testGetBaseDirection(void) { 12886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDiDirection dir; 12896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int i; 12906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Test Data */ 12926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar 12936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*Mixed Start with L*/ 12946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stringMixedEnglishFirst[]={ 0x61, 0x627, 0x32, 0x6f3, 0x61, 0x34, 0 }, 12956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*Mixed Start with AL*/ 12966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stringMixedArabicFirst[]={ 0x661, 0x627, 0x662, 0x6f3, 0x61, 0x664, 0 }, 12976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*Mixed Start with R*/ 12986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stringMixedHebrewFirst[]={ 0x05EA, 0x627, 0x662, 0x6f3, 0x61, 0x664, 0 }, 12996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*All AL (Arabic. Persian)*/ 13006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stringPersian[]={0x0698, 0x067E, 0x0686, 0x06AF, 0}, 13016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*All R (Hebrew etc.)*/ 13026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stringHebrew[]={0x0590, 0x05D5, 0x05EA, 0x05F1, 0}, 13036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*All L (English)*/ 13046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stringEnglish[]={0x71, 0x61, 0x66, 0}, 13056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*Mixed Start with weak AL an then L*/ 13066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stringStartWeakAL[]={ 0x0663, 0x71, 0x61, 0x66, 0}, 13076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*Mixed Start with weak L and then AL*/ 13086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stringStartWeakL[]={0x31, 0x0698, 0x067E, 0x0686, 0x06AF, 0}, 13096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*Empty*/ 13106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stringEmpty[]={0}, 13116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*Surrogate Char.*/ 13126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stringSurrogateChar[]={0xD800, 0xDC00, 0}, 13136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*Invalid UChar*/ 13146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stringInvalidUchar[]={-1}, 13156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*All weak L (English Digits)*/ 13166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stringAllEnglishDigits[]={0x31, 0x32, 0x33, 0}, 13176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*All weak AL (Arabic Digits)*/ 13186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stringAllArabicDigits[]={0x0663, 0x0664, 0x0665, 0}, 13196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*First L (English) others are R (Hebrew etc.) */ 13206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stringFirstL[] = {0x71, 0x0590, 0x05D5, 0x05EA, 0x05F1, 0}, 13216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*Last R (Hebrew etc.) others are weak L (English Digits)*/ 13226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stringLastR[] = {0x31, 0x32, 0x33, 0x05F1, 0}; 13236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const struct { 13256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *s; 13266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length; 13276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } testCases[]={ 13286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org STRING_TEST_CASE(stringMixedEnglishFirst), 13296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org STRING_TEST_CASE(stringMixedArabicFirst), 13306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org STRING_TEST_CASE(stringMixedHebrewFirst), 13316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org STRING_TEST_CASE(stringPersian), 13326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org STRING_TEST_CASE(stringHebrew), 13336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org STRING_TEST_CASE(stringEnglish), 13346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org STRING_TEST_CASE(stringStartWeakAL), 13356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org STRING_TEST_CASE(stringStartWeakL), 13366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org STRING_TEST_CASE(stringEmpty), 13376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org STRING_TEST_CASE(stringSurrogateChar), 13386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org STRING_TEST_CASE(stringInvalidUchar), 13396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org STRING_TEST_CASE(stringAllEnglishDigits), 13406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org STRING_TEST_CASE(stringAllArabicDigits), 13416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org STRING_TEST_CASE(stringFirstL), 13426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org STRING_TEST_CASE(stringLastR), 13436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 13446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Expected results */ 13466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UBiDiDirection expectedDir[] ={ 13476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBIDI_LTR, UBIDI_RTL, UBIDI_RTL, 13486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBIDI_RTL, UBIDI_RTL, UBIDI_LTR, 13496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBIDI_LTR, UBIDI_RTL, UBIDI_NEUTRAL, 13506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBIDI_LTR, UBIDI_NEUTRAL, UBIDI_NEUTRAL, 13516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBIDI_NEUTRAL, UBIDI_LTR, UBIDI_RTL 13526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 13536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("testGetBaseDirection() with %u test cases ---\n", 13556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LENGTHOF(testCases)); 13566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Run Tests */ 13576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<LENGTHOF(testCases); ++i) { 13586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dir = ubidi_getBaseDirection(testCases[i].s, testCases[i].length ); 13596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Testing case %d\tReceived dir %d\n", i, dir); 13606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (dir != expectedDir[i]) 13616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nFailed getBaseDirection case %d Expected %d \tReceived %d\n", 13626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i, expectedDir[i], dir); 13636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Misc. tests */ 13666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* NULL string */ 13676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dir = ubidi_getBaseDirection(NULL, 3); 13686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (dir != UBIDI_NEUTRAL ) 13696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nFailed getBaseDirection for NULL string " , 13706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\nExpected %d \nReceived %d", UBIDI_NEUTRAL, dir); 13716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*All L- English string and length=-3 */ 13726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dir = ubidi_getBaseDirection( stringEnglish, -3); 13736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (dir != UBIDI_NEUTRAL ) 13746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nFailed getBaseDirection for string w length= -3 ", 13756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\nExpected %d \nReceived %d", UBIDI_NEUTRAL, dir); 13766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*All L- English string and length=-1 */ 13776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dir = ubidi_getBaseDirection( stringEnglish, -1); 13786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (dir != UBIDI_LTR ) 13796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nFailed getBaseDirection for English string w length= -1 ", 13806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\nExpected %d \nReceived %d", UBIDI_LTR, dir); 13816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*All AL- Persian string and length=-1 */ 13826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dir = ubidi_getBaseDirection( stringPersian, -1); 13836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (dir != UBIDI_RTL ) 13846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nFailed getBaseDirection for Persian string w length= -1 ", 13856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\nExpected %d \nReceived %d", UBIDI_RTL, dir); 13866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*All R- Hebrew string and length=-1 */ 13876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dir = ubidi_getBaseDirection( stringHebrew, -1); 13886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (dir != UBIDI_RTL ) 13896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nFailed getBaseDirection for Hebrew string w length= -1 ", 13906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\nExpected %d \nReceived %d", UBIDI_RTL, dir); 13916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*All weak L- English digits string and length=-1 */ 13926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dir = ubidi_getBaseDirection(stringAllEnglishDigits, -1); 13936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (dir != UBIDI_NEUTRAL ) 13946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nFailed getBaseDirection for English digits string w length= -1 ", 13956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\nExpected %d \nReceived %d", UBIDI_NEUTRAL, dir); 13966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*All weak AL- Arabic digits string and length=-1 */ 13976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dir = ubidi_getBaseDirection(stringAllArabicDigits, -1); 13986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (dir != UBIDI_NEUTRAL ) 13996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nFailed getBaseDirection for Arabic string w length= -1 ", 14006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\nExpected %d \nReceived %d", UBIDI_NEUTRAL, dir); 14016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 14036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void doMisc(void) { 14066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Miscellaneous tests to exercize less popular code paths */ 14076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDi *bidi, *bidiLine; 14086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar src[MAXLEN], dest[MAXLEN]; 14096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t srcLen, destLen, runCount, i; 14106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDiLevel level; 14116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDiDirection dir; 14126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t map[MAXLEN]; 14136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode errorCode=U_ZERO_ERROR; 14146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const int32_t srcMap[6] = {0,1,-1,5,4}; 14156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const int32_t dstMap[6] = {0,1,-1,-1,4,3}; 14166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org bidi = ubidi_openSized(120, 66, &errorCode); 14186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (bidi == NULL) { 14196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Error with openSized(120, 66)\n"); 14206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 14216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org bidiLine = ubidi_open(); 14236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (bidi == NULL) { 14246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Error with open()\n"); 14256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 14266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destLen = ubidi_writeReverse(src, 0, dest, MAXLEN, 0, &errorCode); 14296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (destLen != 0) { 14306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nwriteReverse should return zero length, ", 14316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "returned %d instead\n", destLen); 14326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RETURN_IF_BAD_ERRCODE("#1#"); 14346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, src, 0, UBIDI_LTR, NULL, &errorCode); 14366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode); 14376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (destLen != 0) { 14386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nwriteReordered should return zero length, ", 14396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "returned %d instead\n", destLen); 14406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RETURN_IF_BAD_ERRCODE("#2#"); 14426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("abc ", src, MAXLEN); 14446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode); 14456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode); 14466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 3; i < 6; i++) { 14476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org level = ubidi_getLevelAt(bidiLine, i); 14486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (level != UBIDI_RTL) { 14496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nTrailing space at index %d should get paragraph level" 14506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "%d, got %d instead\n", i, UBIDI_RTL, level); 14516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RETURN_IF_BAD_ERRCODE("#3#"); 14546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("abc def", src, MAXLEN); 14566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode); 14576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode); 14586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 3; i < 6; i++) { 14596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org level = ubidi_getLevelAt(bidiLine, i); 14606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (level != UBIDI_RTL) { 14616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nTrailing space at index %d should get paragraph level" 14626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "%d, got %d instead\n", i, UBIDI_RTL, level); 14636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RETURN_IF_BAD_ERRCODE("#4#"); 14666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("abcdefghi ", src, MAXLEN); 14686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode); 14696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode); 14706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 3; i < 6; i++) { 14716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org level = ubidi_getLevelAt(bidiLine, i); 14726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (level != 2) { 14736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nTrailing char at index %d should get level 2, " 14746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "got %d instead\n", i, level); 14756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RETURN_IF_BAD_ERRCODE("#5#"); 14786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setReorderingOptions(bidi, UBIDI_OPTION_REMOVE_CONTROLS); 14806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("\\u200eabc def", src, MAXLEN); 14816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode); 14826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode); 14836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destLen = ubidi_getResultLength(bidiLine); 14846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (destLen != 5) { 14856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nWrong result length, should be 5, got %d\n", destLen); 14866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RETURN_IF_BAD_ERRCODE("#6#"); 14886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("abcdefghi", src, MAXLEN); 14906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, src, srcLen, UBIDI_LTR, NULL, &errorCode); 14916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode); 14926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dir = ubidi_getDirection(bidiLine); 14936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (dir != UBIDI_LTR) { 14946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nWrong direction #1, should be %d, got %d\n", 14956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBIDI_LTR, dir); 14966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RETURN_IF_BAD_ERRCODE("#7#"); 14986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, src, 0, UBIDI_LTR, NULL, &errorCode); 15006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org runCount = ubidi_countRuns(bidi, &errorCode); 15016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (runCount != 0) { 15026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nWrong number of runs #1, should be 0, got %d\n", runCount); 15036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RETURN_IF_BAD_ERRCODE("#8#"); 15056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape(" ", src, MAXLEN); 15076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode); 15086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode); 15096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org runCount = ubidi_countRuns(bidiLine, &errorCode); 15106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (runCount != 1) { 15116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nWrong number of runs #2, should be 1, got %d\n", runCount); 15126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RETURN_IF_BAD_ERRCODE("#9#"); 15146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("a\\u05d0 bc", src, MAXLEN); 15166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode); 15176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode); 15186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dir = ubidi_getDirection(bidi); 15196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (dir != UBIDI_MIXED) { 15206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nWrong direction #2, should be %d, got %d\n", 15216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBIDI_MIXED, dir); 15226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dir = ubidi_getDirection(bidiLine); 15246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (dir != UBIDI_MIXED) { 15256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nWrong direction #3, should be %d, got %d\n", 15266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBIDI_MIXED, dir); 15276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org runCount = ubidi_countRuns(bidiLine, &errorCode); 15296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (runCount != 2) { 15306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nWrong number of runs #3, should be 2, got %d\n", runCount); 15316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RETURN_IF_BAD_ERRCODE("#10#"); 15336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_invertMap(srcMap, map, 5); 15356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (memcmp(dstMap, map, sizeof(dstMap))) { 15366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nUnexpected inverted Map, got "); 15376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0; i < 6; i++) { 15386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("%d ", map[i]); 15396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\n"); 15416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* test REMOVE_BIDI_CONTROLS together with DO_MIRRORING */ 15446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("abc\\u200e", src, MAXLEN); 15456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, src, srcLen, UBIDI_LTR, NULL, &errorCode); 15466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 15476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBIDI_REMOVE_BIDI_CONTROLS | UBIDI_DO_MIRRORING, &errorCode); 15486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (destLen != 3 || memcmp(dest, src, 3 * sizeof(UChar))) { 15496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nWrong result #1, should be 'abc', got '%s'\n", 15506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org aescstrdup(dest, destLen)); 15516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RETURN_IF_BAD_ERRCODE("#11#"); 15536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* test inverse Bidi with marks and contextual orientation */ 15556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setReorderingMode(bidi, UBIDI_REORDER_INVERSE_LIKE_DIRECT); 15566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setReorderingOptions(bidi, UBIDI_OPTION_INSERT_MARKS); 15576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, src, 0, UBIDI_DEFAULT_RTL, NULL, &errorCode); 15586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode); 15596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (destLen != 0) { 15606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nWrong result #2, length should be 0, got %d\n", destLen); 15616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RETURN_IF_BAD_ERRCODE("#12#"); 15636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape(" ", src, MAXLEN); 15646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_RTL, NULL, &errorCode); 15656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode); 15666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (destLen != 3 || memcmp(dest, src, destLen * sizeof(UChar))) { 15676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nWrong result #3, should be ' ', got '%s'\n", 15686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org aescstrdup(dest, destLen)); 15696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RETURN_IF_BAD_ERRCODE("#13#"); 15716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("abc", src, MAXLEN); 15726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_RTL, NULL, &errorCode); 15736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode); 15746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (destLen != 3 || memcmp(dest, src, destLen * sizeof(UChar))) { 15756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nWrong result #4, should be 'abc', got '%s'\n", 15766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org aescstrdup(dest, destLen)); 15776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RETURN_IF_BAD_ERRCODE("#14#"); 15796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("\\u05d0\\u05d1", src, MAXLEN); 15806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_RTL, NULL, &errorCode); 15816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode); 15826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("\\u05d1\\u05d0", src, MAXLEN); 15836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (destLen != 2 || memcmp(dest, src, destLen * sizeof(UChar))) { 15846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nWrong result #5, should be '%s', got '%s'\n", 15856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org aescstrdup(src, srcLen), aescstrdup(dest, destLen)); 15866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RETURN_IF_BAD_ERRCODE("#15#"); 15886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("abc \\u05d0\\u05d1", src, MAXLEN); 15896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_RTL, NULL, &errorCode); 15906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode); 15916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("\\u05d1\\u05d0 abc", src, MAXLEN); 15926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (destLen != 6 || memcmp(dest, src, destLen * sizeof(UChar))) { 15936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nWrong result #6, should be '%s', got '%s'\n", 15946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org aescstrdup(src, srcLen), aescstrdup(dest, destLen)); 15956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RETURN_IF_BAD_ERRCODE("#16#"); 15976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("\\u05d0\\u05d1 abc", src, MAXLEN); 15986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_RTL, NULL, &errorCode); 15996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode); 16006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("\\u200fabc \\u05d1\\u05d0", src, MAXLEN); 16016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (destLen != 7 || memcmp(dest, src, destLen * sizeof(UChar))) { 16026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nWrong result #7, should be '%s', got '%s'\n", 16036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org aescstrdup(src, srcLen), aescstrdup(dest, destLen)); 16046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RETURN_IF_BAD_ERRCODE("#17#"); 16066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("\\u05d0\\u05d1 abc .-=", src, MAXLEN); 16076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_RTL, NULL, &errorCode); 16086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode); 16096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("\\u200f=-. abc \\u05d1\\u05d0", src, MAXLEN); 16106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (destLen != 11 || memcmp(dest, src, destLen * sizeof(UChar))) { 16116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nWrong result #8, should be '%s', got '%s'\n", 16126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org aescstrdup(src, srcLen), aescstrdup(dest, destLen)); 16136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RETURN_IF_BAD_ERRCODE("#18#"); 16156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_orderParagraphsLTR(bidi, TRUE); 16166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("\n\r \n\rabc\n\\u05d0\\u05d1\rabc \\u05d2\\u05d3\n\r" 16176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u05d4\\u05d5 abc\n\\u05d6\\u05d7 abc .-=\r\n" 16186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "-* \\u05d8\\u05d9 abc .-=", src, MAXLEN); 16196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_RTL, NULL, &errorCode); 16206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode); 16216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("\n\r \n\rabc\n\\u05d1\\u05d0\r\\u05d3\\u05d2 abc\n\r" 16226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u200fabc \\u05d5\\u05d4\n\\u200f=-. abc \\u05d7\\u05d6\r\n" 16236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u200f=-. abc \\u05d9\\u05d8 *-", src, MAXLEN); 16246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (destLen != 57 || memcmp(dest, src, destLen * sizeof(UChar))) { 16256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nWrong result #9, should be '%s', got '%s'\n", 16266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org aescstrdup(src, srcLen), aescstrdup(dest, destLen)); 16276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RETURN_IF_BAD_ERRCODE("#19#"); 16296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("\\u05d0 \t", src, MAXLEN); 16306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, src, srcLen, UBIDI_LTR, NULL, &errorCode); 16316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode); 16326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("\\u05D0\\u200e \t", src, MAXLEN); 16336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (destLen != 4 || memcmp(dest, src, destLen * sizeof(UChar))) { 16346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nWrong result #10, should be '%s', got '%s'\n", 16356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org aescstrdup(src, srcLen), aescstrdup(dest, destLen)); 16366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RETURN_IF_BAD_ERRCODE("#20#"); 16386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("\\u05d0 123 \t\\u05d1 123 \\u05d2", src, MAXLEN); 16396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, src, srcLen, UBIDI_LTR, NULL, &errorCode); 16406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode); 16416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("\\u05d0 \\u200e123\\u200e \t\\u05d2 123 \\u05d1", src, MAXLEN); 16426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (destLen != 16 || memcmp(dest, src, destLen * sizeof(UChar))) { 16436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nWrong result #11, should be '%s', got '%s'\n", 16446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org aescstrdup(src, srcLen), aescstrdup(dest, destLen)); 16456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RETURN_IF_BAD_ERRCODE("#21#"); 16476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("\\u05d0 123 \\u0660\\u0661 ab", src, MAXLEN); 16486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, src, srcLen, UBIDI_LTR, NULL, &errorCode); 16496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode); 16506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("\\u05d0 \\u200e123 \\u200e\\u0660\\u0661 ab", src, MAXLEN); 16516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (destLen != 13 || memcmp(dest, src, destLen * sizeof(UChar))) { 16526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nWrong result #12, should be '%s', got '%s'\n", 16536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org aescstrdup(src, srcLen), aescstrdup(dest, destLen)); 16546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RETURN_IF_BAD_ERRCODE("#22#"); 16566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("ab \t", src, MAXLEN); 16576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode); 16586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode); 16596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("\\u200f\t ab", src, MAXLEN); 16606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (destLen != 5 || memcmp(dest, src, destLen * sizeof(UChar))) { 16616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nWrong result #13, should be '%s', got '%s'\n", 16626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org aescstrdup(src, srcLen), aescstrdup(dest, destLen)); 16636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RETURN_IF_BAD_ERRCODE("#23#"); 16656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* check exceeding para level */ 16676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(bidi); 16686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org bidi = ubidi_open(); 16696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("A\\u202a\\u05d0\\u202aC\\u202c\\u05d1\\u202cE", src, MAXLEN); 16706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, src, srcLen, UBIDI_MAX_EXPLICIT_LEVEL - 1, NULL, &errorCode); 16716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org level = ubidi_getLevelAt(bidi, 2); 16726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (level != UBIDI_MAX_EXPLICIT_LEVEL) { 16736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nWrong level at index 2\n, should be %d, got %d\n", UBIDI_MAX_EXPLICIT_LEVEL, level); 16746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RETURN_IF_BAD_ERRCODE("#24#"); 16766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* check 1-char runs with RUNS_ONLY */ 16786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setReorderingMode(bidi, UBIDI_REORDER_RUNS_ONLY); 16796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("a \\u05d0 b \\u05d1 c \\u05d2 d ", src, MAXLEN); 16806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, src, srcLen, UBIDI_LTR, NULL, &errorCode); 16816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org runCount = ubidi_countRuns(bidi, &errorCode); 16826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (runCount != 14) { 16836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nWrong number of runs #3, should be 14, got %d\n", runCount); 16846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RETURN_IF_BAD_ERRCODE("#25#"); 16866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(bidi); 16886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(bidiLine); 16896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 16906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void 16926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtestFailureRecovery(void) { 16936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode errorCode; 16946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDi *bidi, *bidiLine; 16956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar src[MAXLEN]; 16966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t srcLen; 16976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDiLevel level; 16986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDiReorderingMode rm; 16996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static UBiDiLevel myLevels[3] = {6,5,4}; 17006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 17016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\nEntering TestFailureRecovery\n\n"); 17026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode = U_FILE_ACCESS_ERROR; 17036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ubidi_writeReordered(NULL, NULL, 0, 0, &errorCode) != 0) { 17046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_writeReordered did not return 0 when passed a failing UErrorCode\n"); 17056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ubidi_writeReverse(NULL, 0, NULL, 0, 0, &errorCode) != 0) { 17076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_writeReverse did not return 0 when passed a failing UErrorCode\n"); 17086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode = U_ZERO_ERROR; 17106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ubidi_writeReordered(NULL, NULL, 0, 0, &errorCode) != 0 || errorCode != U_ILLEGAL_ARGUMENT_ERROR) { 17116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_writeReordered did not fail as expected\n"); 17126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 17146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org bidi = ubidi_open(); 17156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("abc", src, MAXLEN); 17166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode = U_ZERO_ERROR; 17176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_LTR - 1, NULL, &errorCode); 17186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(errorCode)) { 17196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nubidi_setPara did not fail when passed too big para level\n"); 17206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode = U_ZERO_ERROR; 17226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ubidi_writeReverse(NULL, 0, NULL, 0, 0, &errorCode) != 0 || errorCode != U_ILLEGAL_ARGUMENT_ERROR) { 17236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_writeReverse did not fail as expected\n"); 17246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org bidiLine = ubidi_open(); 17266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode = U_ZERO_ERROR; 17276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode); 17286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(errorCode)) { 17296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nubidi_setLine did not fail when called before valid setPara()\n"); 17306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode = U_ZERO_ERROR; 17326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("abc", src, MAXLEN); 17336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, src, srcLen, UBIDI_LTR + 4, NULL, &errorCode); 17346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org level = ubidi_getLevelAt(bidi, 3); 17356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (level != 0) { 17366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nubidi_getLevelAt did not fail when called with bad argument\n"); 17376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode = U_ZERO_ERROR; 17396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(bidi); 17406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org bidi = ubidi_openSized(-1, 0, &errorCode); 17416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(errorCode)) { 17426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nubidi_openSized did not fail when called with bad argument\n"); 17436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(bidi); 17456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org bidi = ubidi_openSized(2, 1, &errorCode); 17466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode = U_ZERO_ERROR; 17476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("abc", src, MAXLEN); 17486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, src, srcLen, UBIDI_LTR, NULL, &errorCode); 17496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(errorCode)) { 17506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nsetPara did not fail when called with text too long\n"); 17516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode = U_ZERO_ERROR; 17536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("=2", src, MAXLEN); 17546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode); 17556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_countRuns(bidi, &errorCode); 17566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(errorCode)) { 17576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nsetPara did not fail when called for too many runs\n"); 17586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(bidi); 17606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org bidi = ubidi_open(); 17616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rm = ubidi_getReorderingMode(bidi); 17626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setReorderingMode(bidi, UBIDI_REORDER_DEFAULT - 1); 17636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (rm != ubidi_getReorderingMode(bidi)) { 17646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nsetReorderingMode with bad argument #1 should have no effect\n"); 17656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setReorderingMode(bidi, 9999); 17676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (rm != ubidi_getReorderingMode(bidi)) { 17686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nsetReorderingMode with bad argument #2 should have no effect\n"); 17696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 17716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Try a surrogate char */ 17726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode = U_ZERO_ERROR; 17736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("\\uD800\\uDC00", src, MAXLEN); 17746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode); 17756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ubidi_getDirection(bidi) != UBIDI_MIXED) { 17766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\ngetDirection for 1st surrogate char should be MIXED\n"); 17776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode = U_ZERO_ERROR; 17796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("abc", src, MAXLEN); 17806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, src, srcLen, 5, myLevels, &errorCode); 17816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(errorCode)) { 17826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nsetPara did not fail when called with bad levels\n"); 17836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(bidi); 17856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(bidiLine); 17866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 17876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\nExiting TestFailureRecovery\n\n"); 17886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 17896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 17906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void 17916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtestMultipleParagraphs(void) { 17926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const char* const text = "__ABC\\u001c" /* Para #0 offset 0 */ 17936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "__\\u05d0DE\\u001c" /* 1 6 */ 17946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "__123\\u001c" /* 2 12 */ 17956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u000d\\u000a" /* 3 18 */ 17966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "FG\\u000d" /* 4 20 */ 17976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u000d" /* 5 23 */ 17986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "HI\\u000d\\u000a" /* 6 24 */ 17996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u000d\\u000a" /* 7 28 */ 18006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u000a" /* 8 30 */ 18016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u000a" /* 9 31 */ 18026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "JK\\u001c"; /* 10 32 */ 18036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const int32_t paraCount=11; 18046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const int32_t paraBounds[]={0, 6, 12, 18, 20, 23, 24, 28, 30, 31, 32, 35}; 18056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UBiDiLevel paraLevels[]={UBIDI_LTR, UBIDI_RTL, UBIDI_DEFAULT_LTR, UBIDI_DEFAULT_RTL, 22, 23}; 18066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UBiDiLevel multiLevels[6][11] = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 18076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, 18086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 18096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0}, 18106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22}, 18116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23}}; 18126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const char* const text2 = "\\u05d0 1-2\\u001c\\u0630 1-2\\u001c1-2"; 18136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UBiDiLevel levels2[] = {1,1,2,2,2,0, 1,1,2,1,2,0, 2,2,2}; 18146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static UBiDiLevel myLevels[10] = {0,0,0,0,0,0,0,0,0,0}; 18156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar multiparaTestString[] = { 18166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x5de, 0x5e0, 0x5e1, 0x5d4, 0x20, 0x5e1, 0x5e4, 0x5da, 18176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x20, 0xa, 0xa, 0x41, 0x72, 0x74, 0x69, 0x73, 18186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x74, 0x3a, 0x20, 0x5de, 0x5e0, 0x5e1, 0x5d4, 0x20, 18196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x5e1, 0x5e4, 0x5da, 0x20, 0xa, 0xa, 0x41, 0x6c, 18206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x62, 0x75, 0x6d, 0x3a, 0x20, 0x5de, 0x5e0, 0x5e1, 18216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x5d4, 0x20, 0x5e1, 0x5e4, 0x5da, 0x20, 0xa, 0xa, 18226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x54, 0x69, 0x6d, 0x65, 0x3a, 0x20, 0x32, 0x3a, 18236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x32, 0x37, 0xa, 0xa 18246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 18256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UBiDiLevel multiparaTestLevels[] = { 18266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1, 1, 1, 1, 1, 1, 1, 1, 18276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1, 1, 0, 0, 0, 0, 0, 0, 18286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0, 0, 0, 1, 1, 1, 1, 1, 18296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1, 1, 1, 0, 0, 0, 0, 0, 18306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0, 0, 0, 0, 0, 1, 1, 1, 18316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1, 1, 1, 1, 1, 0, 0, 0, 18326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0, 0, 0, 0, 0, 0, 0, 0, 18336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0, 0, 0, 0 18346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 18356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDiLevel gotLevel; 18366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UBiDiLevel* gotLevels; 18376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool orderParagraphsLTR; 18386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar src[MAXLEN], dest[MAXLEN]; 18396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode errorCode=U_ZERO_ERROR; 18406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDi* pBidi=ubidi_open(); 18416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDi* pLine; 18426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t srcSize, count, paraStart, paraLimit, paraIndex, length; 18436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t srcLen, destLen; 18446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int i, j, k; 18456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 18466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\nEntering TestMultipleParagraphs\n\n"); 18476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_unescape(text, src, MAXLEN); 18486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcSize=u_strlen(src); 18496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(pBidi, src, srcSize, UBIDI_LTR, NULL, &errorCode); 18506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode)){ 18516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_setPara failed, paraLevel=%d, errorCode %s\n", 18526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBIDI_LTR, u_errorName(errorCode)); 18536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(pBidi); 18546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 18556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 18566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* check paragraph count and boundaries */ 18576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (paraCount!=(count=ubidi_countParagraphs(pBidi))) { 18586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_countParagraphs returned %d, should be %d\n", 18596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count, paraCount); 18606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 18616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i=0; i<paraCount; i++) { 18626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_getParagraphByIndex(pBidi, i, ¶Start, ¶Limit, NULL, &errorCode); 18636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ((paraStart!=paraBounds[i]) || (paraLimit!=paraBounds[i+1])) { 18646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Found boundaries of paragraph %d: %d-%d; expected: %d-%d\n", 18656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i, paraStart, paraLimit, paraBounds[i], paraBounds[i+1]); 18666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 18676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 18686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 18696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* check with last paragraph not terminated by B */ 18706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src[srcSize-1]='L'; 18716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(pBidi, src, srcSize, UBIDI_LTR, NULL, &errorCode); 18726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode)){ 18736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("2nd ubidi_setPara failed, paraLevel=%d, errorCode %s\n", 18746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBIDI_LTR, u_errorName(errorCode)); 18756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(pBidi); 18766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 18776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 18786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (paraCount!=(count=ubidi_countParagraphs(pBidi))) { 18796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("2nd ubidi_countParagraphs returned %d, should be %d\n", 18806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count, paraCount); 18816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 18826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i=paraCount-1; 18836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_getParagraphByIndex(pBidi, i, ¶Start, ¶Limit, NULL, &errorCode); 18846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ((paraStart!=paraBounds[i]) || (paraLimit!=paraBounds[i+1])) { 18856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("2nd Found boundaries of paragraph %d: %d-%d; expected: %d-%d\n", 18866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i, paraStart, paraLimit, paraBounds[i], paraBounds[i+1]); 18876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 18886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 18896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* check paraLevel for all paragraphs under various paraLevel specs */ 18906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (k=0; k<6; k++) { 18916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(pBidi, src, srcSize, paraLevels[k], NULL, &errorCode); 18926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i=0; i<paraCount; i++) { 18936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org paraIndex=ubidi_getParagraph(pBidi, paraBounds[i], NULL, NULL, &gotLevel, &errorCode); 18946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (paraIndex!=i) { 18956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("For paraLevel=%d paragraph=%d, found paragraph index=%d expected=%d\n", 18966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org paraLevels[k], i, paraIndex, i); 18976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 18986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (gotLevel!=multiLevels[k][i]) { 18996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("For paraLevel=%d paragraph=%d, found level=%d expected %d\n", 19006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org paraLevels[k], i, gotLevel, multiLevels[k][i]); 19016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gotLevel=ubidi_getParaLevel(pBidi); 19046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (gotLevel!=multiLevels[k][0]) { 19056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("For paraLevel=%d getParaLevel=%d, expected %d\n", 19066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org paraLevels[k], gotLevel, multiLevels[k][0]); 19076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 19106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* check that the result of ubidi_getParaLevel changes if the first 19116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * paragraph has a different level 19126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 19136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src[0]=0x05d2; /* Hebrew letter Gimel */ 19146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(pBidi, src, srcSize, UBIDI_DEFAULT_LTR, NULL, &errorCode); 19156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gotLevel=ubidi_getParaLevel(pBidi); 19166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (gotLevel!=UBIDI_RTL) { 19176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("For paraLevel=UBIDI_DEFAULT_LTR getParaLevel=%d, expected=%d\n", 19186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gotLevel, UBIDI_RTL); 19196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 19216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* check that line cannot overlap paragraph boundaries */ 19226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pLine=ubidi_open(); 19236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i=paraBounds[1]; 19246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org k=paraBounds[2]+1; 19256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setLine(pBidi, i, k, pLine, &errorCode); 19266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(errorCode)) { 19276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("For line limits %d-%d got success %s\n", 19286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i, k, u_errorName(errorCode)); 19296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 19316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i=paraBounds[1]; 19326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org k=paraBounds[2]; 19336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setLine(pBidi, i, k, pLine, &errorCode); 19346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(errorCode)) { 19356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("For line limits %d-%d got error %s\n", 19366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i, k, u_errorName(errorCode)); 19376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 19386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* check level of block separator at end of paragraph when orderParagraphsLTR==FALSE */ 19406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(pBidi, src, srcSize, UBIDI_RTL, NULL, &errorCode); 19416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* get levels through para Bidi block */ 19426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gotLevels=ubidi_getLevels(pBidi, &errorCode); 19436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(errorCode)) { 19446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Error on Para getLevels %s\n", u_errorName(errorCode)); 19456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(pLine); 19466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(pBidi); 19476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 19486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i=26; i<32; i++) { 19506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (gotLevels[i]!=UBIDI_RTL) { 19516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("For char %d(%04x), level=%d, expected=%d\n", 19526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i, src[i], gotLevels[i], UBIDI_RTL); 19536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* get levels through para Line block */ 19566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i=paraBounds[1]; 19576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org k=paraBounds[2]; 19586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setLine(pBidi, i, k, pLine, &errorCode); 19596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(errorCode)) { 19606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("For line limits %d-%d got error %s\n", 19616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i, k, u_errorName(errorCode)); 19626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(pLine); 19636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(pBidi); 19646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 19656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org paraIndex=ubidi_getParagraph(pLine, i, ¶Start, ¶Limit, &gotLevel, &errorCode); 19676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gotLevels=ubidi_getLevels(pLine, &errorCode); 19686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(errorCode)) { 19696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Error on Line getLevels %s\n", u_errorName(errorCode)); 19706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(pLine); 19716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(pBidi); 19726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 19736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=ubidi_getLength(pLine); 19756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ((gotLevel!=UBIDI_RTL) || (gotLevels[length-1]!=UBIDI_RTL)) { 19766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("For paragraph %d with limits %d-%d, paraLevel=%d expected=%d, " 19776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "level of separator=%d expected=%d\n", 19786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org paraIndex, paraStart, paraLimit, gotLevel, UBIDI_RTL, gotLevels[length-1], UBIDI_RTL); 19796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org orderParagraphsLTR=ubidi_isOrderParagraphsLTR(pBidi); 19816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (orderParagraphsLTR) { 19826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Found orderParagraphsLTR=%d expected=%d\n", orderParagraphsLTR, FALSE); 19836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_orderParagraphsLTR(pBidi, TRUE); 19856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org orderParagraphsLTR=ubidi_isOrderParagraphsLTR(pBidi); 19866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!orderParagraphsLTR) { 19876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Found orderParagraphsLTR=%d expected=%d\n", orderParagraphsLTR, TRUE); 19886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* check level of block separator at end of paragraph when orderParagraphsLTR==TRUE */ 19906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(pBidi, src, srcSize, UBIDI_RTL, NULL, &errorCode); 19916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* get levels through para Bidi block */ 19926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gotLevels=ubidi_getLevels(pBidi, &errorCode); 19936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i=26; i<32; i++) { 19946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (gotLevels[i]!=0) { 19956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("For char %d(%04x), level=%d, expected=%d\n", 19966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i, src[i], gotLevels[i], 0); 19976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 20006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* get levels through para Line block */ 20016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i=paraBounds[1]; 20026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org k=paraBounds[2]; 20036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setLine(pBidi, paraStart, paraLimit, pLine, &errorCode); 20046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org paraIndex=ubidi_getParagraph(pLine, i, ¶Start, ¶Limit, &gotLevel, &errorCode); 20056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gotLevels=ubidi_getLevels(pLine, &errorCode); 20066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=ubidi_getLength(pLine); 20076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ((gotLevel!=UBIDI_RTL) || (gotLevels[length-1]!=0)) { 20086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("For paragraph %d with limits %d-%d, paraLevel=%d expected=%d, " 20096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "level of separator=%d expected=%d\n", 20106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org paraIndex, paraStart, paraLimit, gotLevel, UBIDI_RTL, gotLevels[length-1], 0); 20116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("levels="); 20126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (count=0; count<length; count++) { 20136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose(" %d", gotLevels[count]); 20146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\n"); 20166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 20186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* test that the concatenation of separate invocations of the bidi code 20196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * on each individual paragraph in order matches the levels array that 20206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * results from invoking bidi once over the entire multiparagraph tests 20216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (with orderParagraphsLTR false, of course) 20226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 20236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_unescape(text, src, MAXLEN); /* restore original content */ 20246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcSize=u_strlen(src); 20256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_orderParagraphsLTR(pBidi, FALSE); 20266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(pBidi, src, srcSize, UBIDI_DEFAULT_RTL, NULL, &errorCode); 20276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gotLevels=ubidi_getLevels(pBidi, &errorCode); 20286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i=0; i<paraCount; i++) { 20296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* use pLine for individual paragraphs */ 20306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org paraStart = paraBounds[i]; 20316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length = paraBounds[i+1] - paraStart; 20326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(pLine, src+paraStart, length, UBIDI_DEFAULT_RTL, NULL, &errorCode); 20336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (j=0; j<length; j++) { 20346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ((k=ubidi_getLevelAt(pLine, j)) != (gotLevel=gotLevels[paraStart+j])) { 20356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Checking paragraph concatenation: for paragraph=%d, " 20366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "char=%d(%04x), level=%d, expected=%d\n", 20376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i, j, src[paraStart+j], k, gotLevel); 20386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 20426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* ensure that leading numerics in a paragraph are not treated as arabic 20436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org numerals because of arabic text in a preceding paragraph 20446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 20456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_unescape(text2, src, MAXLEN); 20466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcSize=u_strlen(src); 20476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_orderParagraphsLTR(pBidi, TRUE); 20486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(pBidi, src, srcSize, UBIDI_RTL, NULL, &errorCode); 20496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gotLevels=ubidi_getLevels(pBidi, &errorCode); 20506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(errorCode)) { 20516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Can't get levels. %s\n", u_errorName(errorCode)); 20526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 20536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i=0; i<srcSize; i++) { 20556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (gotLevels[i]!=levels2[i]) { 20566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Checking leading numerics: for char %d(%04x), level=%d, expected=%d\n", 20576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i, src[i], gotLevels[i], levels2[i]); 20586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 20616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* check handling of whitespace before end of paragraph separator when 20626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * orderParagraphsLTR==TRUE, when last paragraph has, and lacks, a terminating B 20636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 20646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_memset(src, 0x0020, MAXLEN); 20656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcSize = 5; 20666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_orderParagraphsLTR(pBidi, TRUE); 20676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i=0x001c; i<=0x0020; i+=(0x0020-0x001c)) { 20686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src[4]=(UChar)i; /* with and without terminating B */ 20696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (j=0x0041; j<=0x05d0; j+=(0x05d0-0x0041)) { 20706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src[0]=(UChar)j; /* leading 'A' or Alef */ 20716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (gotLevel=4; gotLevel<=5; gotLevel++) { 20726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* test even and odd paraLevel */ 20736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(pBidi, src, srcSize, gotLevel, NULL, &errorCode); 20746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gotLevels=ubidi_getLevels(pBidi, &errorCode); 20756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (k=1; k<=3; k++) { 20766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (gotLevels[k]!=gotLevel) { 20776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Checking trailing spaces: for leading_char=%04x, " 20786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "last_char=%04x, index=%d, level=%d, expected=%d\n", 20796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src[0], src[4], k, gotLevels[k], gotLevel); 20806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 20866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* check default orientation when inverse bidi and paragraph starts 20876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * with LTR strong char and ends with RTL strong char, with and without 20886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * a terminating B 20896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 20906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setReorderingMode(pBidi, UBIDI_REORDER_INVERSE_LIKE_DIRECT); 20916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("abc \\u05d2\\u05d1\n", src, MAXLEN); 20926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(pBidi, src, srcLen, UBIDI_DEFAULT_LTR, NULL, &errorCode); 20936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destLen = ubidi_writeReordered(pBidi, dest, MAXLEN, 0, &errorCode); 20946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("\\u05d1\\u05d2 abc\n", src, MAXLEN); 20956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (memcmp(src, dest, destLen * sizeof(UChar))) { 20966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nInvalid output #0, should be '%s', got '%s'\n", 20976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org aescstrdup(src, srcLen), aescstrdup(dest, destLen)); 20986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("abc \\u05d2\\u05d1", src, MAXLEN); 21006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(pBidi, src, srcLen, UBIDI_DEFAULT_LTR, NULL, &errorCode); 21016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destLen = ubidi_writeReordered(pBidi, dest, MAXLEN, 0, &errorCode); 21026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("\\u05d1\\u05d2 abc", src, MAXLEN); 21036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (memcmp(src, dest, destLen * sizeof(UChar))) { 21046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nInvalid output #1, should be '%s', got '%s'\n", 21056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org aescstrdup(src, srcLen), aescstrdup(dest, destLen)); 21066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 21076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 21086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* check multiple paragraphs together with explicit levels 21096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 21106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setReorderingMode(pBidi, UBIDI_REORDER_DEFAULT); 21116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("ab\\u05d1\\u05d2\n\\u05d3\\u05d4123", src, MAXLEN); 21126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(pBidi, src, srcLen, UBIDI_LTR, myLevels, &errorCode); 21136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destLen = ubidi_writeReordered(pBidi, dest, MAXLEN, 0, &errorCode); 21146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape("ab\\u05d2\\u05d1\\n123\\u05d4\\u05d3", src, MAXLEN); 21156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (memcmp(src, dest, destLen * sizeof(UChar))) { 21166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nInvalid output #2, should be '%s', got '%s'\n", 21176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org aescstrdup(src, srcLen), aescstrdup(dest, destLen)); 21186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 21196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count = ubidi_countParagraphs(pBidi); 21206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (count != 2) { 21216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nInvalid number of paras, should be 2, got %d\n", count); 21226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 21236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 21246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(pLine); 21256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(pBidi); 21266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\nExiting TestMultipleParagraphs\n\n"); 21276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 21286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* check levels in multiple paragraphs with default para level 21296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 21306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pBidi = ubidi_open(); 21316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode = U_ZERO_ERROR; 21326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(pBidi, multiparaTestString, LENGTHOF(multiparaTestString), 21336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBIDI_DEFAULT_LTR, NULL, &errorCode); 21346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(errorCode)) { 21356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_setPara failed for multiparaTestString\n"); 21366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(pBidi); 21376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 21386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 21396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gotLevels = ubidi_getLevels(pBidi, &errorCode); 21406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(errorCode)) { 21416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ubidi_getLevels failed for multiparaTestString\n"); 21426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(pBidi); 21436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 21446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 21456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0; i < LENGTHOF(multiparaTestString); i++) { 21466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (gotLevels[i] != multiparaTestLevels[i]) { 21476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Error on level for multiparaTestString at index %d, " 21486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "expected=%d, actual=%d\n", 21496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i, multiparaTestLevels[i], gotLevels[i]); 21506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 21516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 21526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(pBidi); 21536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 21546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 21556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 21566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 21576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* inverse BiDi ------------------------------------------------------------- */ 21586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 21596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int countRoundtrips=0, countNonRoundtrips=0; 21606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 21616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define STRING_TEST_CASE(s) { (s), LENGTHOF(s) } 21626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 21636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void 21646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtestInverse(void) { 21656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar 21666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org string0[]={ 0x6c, 0x61, 0x28, 0x74, 0x69, 0x6e, 0x20, 0x5d0, 0x5d1, 0x29, 0x5d2, 0x5d3 }, 21676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org string1[]={ 0x6c, 0x61, 0x74, 0x20, 0x5d0, 0x5d1, 0x5d2, 0x20, 0x31, 0x32, 0x33 }, 21686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org string2[]={ 0x6c, 0x61, 0x74, 0x20, 0x5d0, 0x28, 0x5d1, 0x5d2, 0x20, 0x31, 0x29, 0x32, 0x33 }, 21696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org string3[]={ 0x31, 0x32, 0x33, 0x20, 0x5d0, 0x5d1, 0x5d2, 0x20, 0x34, 0x35, 0x36 }, 21706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org string4[]={ 0x61, 0x62, 0x20, 0x61, 0x62, 0x20, 0x661, 0x662 }; 21716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 21726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const struct { 21736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *s; 21746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length; 21756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } testCases[]={ 21766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org STRING_TEST_CASE(string0), 21776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org STRING_TEST_CASE(string1), 21786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org STRING_TEST_CASE(string2), 21796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org STRING_TEST_CASE(string3), 21806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org STRING_TEST_CASE(string4) 21816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 21826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 21836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDi *pBiDi; 21846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode errorCode; 21856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int i; 21866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 21876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\nEntering TestInverse\n\n"); 21886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pBiDi=ubidi_open(); 21896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(pBiDi==NULL) { 21906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("unable to open a UBiDi object (out of memory)\n"); 21916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 21926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 21936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 21946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("inverse Bidi: testInverse(L) with %u test cases ---\n", LENGTHOF(testCases)); 21956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<LENGTHOF(testCases); ++i) { 21966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Testing case %d\n", i); 21976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 21986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org _testInverseBidi(pBiDi, testCases[i].s, testCases[i].length, 0, &errorCode); 21996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 22006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 22016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("inverse Bidi: testInverse(R) with %u test cases ---\n", LENGTHOF(testCases)); 22026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<LENGTHOF(testCases); ++i) { 22036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Testing case %d\n", i); 22046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 22056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org _testInverseBidi(pBiDi, testCases[i].s, testCases[i].length, 1, &errorCode); 22066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 22076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 22086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org _testManyInverseBidi(pBiDi, 0); 22096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org _testManyInverseBidi(pBiDi, 1); 22106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 22116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(pBiDi); 22126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 22136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("inverse Bidi: rountrips: %5u\nnon-roundtrips: %5u\n", countRoundtrips, countNonRoundtrips); 22146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 22156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org _testWriteReverse(); 22166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 22176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org _testManyAddedPoints(); 22186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 22196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org _testMisc(); 22206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 22216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\nExiting TestInverse\n\n"); 22226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 22236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 22246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define COUNT_REPEAT_SEGMENTS 6 22256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 22266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar repeatSegments[COUNT_REPEAT_SEGMENTS][2]={ 22276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0x61, 0x62 }, /* L */ 22286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0x5d0, 0x5d1 }, /* R */ 22296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0x627, 0x628 }, /* AL */ 22306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0x31, 0x32 }, /* EN */ 22316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0x661, 0x662 }, /* AN */ 22326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0x20, 0x20 } /* WS (N) */ 22336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 22346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 22356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void 22366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org_testManyInverseBidi(UBiDi *pBiDi, UBiDiLevel direction) { 22376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar text[8]={ 0, 0, 0x20, 0, 0, 0x20, 0, 0 }; 22386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int i, j, k; 22396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode errorCode; 22406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 22416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("inverse Bidi: testManyInverseBidi(%c) - test permutations of text snippets ---\n", 22426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org direction==0 ? 'L' : 'R'); 22436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<COUNT_REPEAT_SEGMENTS; ++i) { 22446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org text[0]=repeatSegments[i][0]; 22456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org text[1]=repeatSegments[i][1]; 22466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(j=0; j<COUNT_REPEAT_SEGMENTS; ++j) { 22476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org text[3]=repeatSegments[j][0]; 22486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org text[4]=repeatSegments[j][1]; 22496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(k=0; k<COUNT_REPEAT_SEGMENTS; ++k) { 22506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org text[6]=repeatSegments[k][0]; 22516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org text[7]=repeatSegments[k][1]; 22526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 22536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 22546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("inverse Bidi: testManyInverseBidi()[%u %u %u]\n", i, j, k); 22556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org _testInverseBidi(pBiDi, text, 8, direction, &errorCode); 22566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 22576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 22586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 22596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 22606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 22616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void 22626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org_testInverseBidi(UBiDi *pBiDi, const UChar *src, int32_t srcLength, 22636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDiLevel direction, UErrorCode *pErrorCode) { 22646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar visualLTR[MAXLEN], logicalDest[MAXLEN], visualDest[MAXLEN]; 22656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t ltrLength, logicalLength, visualLength; 22666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 22676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(direction==0) { 22686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("inverse Bidi: testInverse(L)\n"); 22696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 22706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* convert visual to logical */ 22716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setInverse(pBiDi, TRUE); 22726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!ubidi_isInverse(pBiDi)) { 22736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Error while doing ubidi_setInverse(TRUE)\n"); 22746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 22756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(pBiDi, src, srcLength, 0, NULL, pErrorCode); 22766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (src != ubidi_getText(pBiDi)) { 22776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Wrong value returned by ubidi_getText\n"); 22786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 22796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logicalLength=ubidi_writeReordered(pBiDi, logicalDest, LENGTHOF(logicalDest), 22806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBIDI_DO_MIRRORING|UBIDI_INSERT_LRM_FOR_NUMERIC, pErrorCode); 22816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose(" v "); 22826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printUnicode(src, srcLength, ubidi_getLevels(pBiDi, pErrorCode)); 22836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\n"); 22846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 22856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* convert back to visual LTR */ 22866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setInverse(pBiDi, FALSE); 22876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ubidi_isInverse(pBiDi)) { 22886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Error while doing ubidi_setInverse(FALSE)\n"); 22896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 22906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(pBiDi, logicalDest, logicalLength, 0, NULL, pErrorCode); 22916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org visualLength=ubidi_writeReordered(pBiDi, visualDest, LENGTHOF(visualDest), 22926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBIDI_DO_MIRRORING|UBIDI_REMOVE_BIDI_CONTROLS, pErrorCode); 22936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 22946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("inverse Bidi: testInverse(R)\n"); 22956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 22966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* reverse visual from RTL to LTR */ 22976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ltrLength=ubidi_writeReverse(src, srcLength, visualLTR, LENGTHOF(visualLTR), 0, pErrorCode); 22986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose(" vr"); 22996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printUnicode(src, srcLength, NULL); 23006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\n"); 23016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 23026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* convert visual RTL to logical */ 23036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setInverse(pBiDi, TRUE); 23046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(pBiDi, visualLTR, ltrLength, 0, NULL, pErrorCode); 23056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logicalLength=ubidi_writeReordered(pBiDi, logicalDest, LENGTHOF(logicalDest), 23066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBIDI_DO_MIRRORING|UBIDI_INSERT_LRM_FOR_NUMERIC, pErrorCode); 23076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose(" vl"); 23086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printUnicode(visualLTR, ltrLength, ubidi_getLevels(pBiDi, pErrorCode)); 23096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\n"); 23106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 23116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* convert back to visual RTL */ 23126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setInverse(pBiDi, FALSE); 23136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(pBiDi, logicalDest, logicalLength, 0, NULL, pErrorCode); 23146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org visualLength=ubidi_writeReordered(pBiDi, visualDest, LENGTHOF(visualDest), 23156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBIDI_DO_MIRRORING|UBIDI_REMOVE_BIDI_CONTROLS|UBIDI_OUTPUT_REVERSE, pErrorCode); 23166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 23176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose(" l "); 23186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printUnicode(logicalDest, logicalLength, ubidi_getLevels(pBiDi, pErrorCode)); 23196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\n"); 23206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose(" v "); 23216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printUnicode(visualDest, visualLength, NULL); 23226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\n"); 23236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 23246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* check and print results */ 23256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(*pErrorCode)) { 23266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("inverse BiDi: *** error %s\n" 23276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " turn on verbose mode to see details\n", u_errorName(*pErrorCode)); 23286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if(srcLength==visualLength && memcmp(src, visualDest, srcLength*U_SIZEOF_UCHAR)==0) { 23296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++countRoundtrips; 23306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose(" + roundtripped\n"); 23316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 23326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++countNonRoundtrips; 23336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose(" * did not roundtrip\n"); 23346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("inverse BiDi: transformation visual->logical->visual did not roundtrip the text;\n" 23356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " turn on verbose mode to see details\n"); 23366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 23376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 23386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 23396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void 23406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org_testWriteReverse(void) { 23416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* U+064e and U+0650 are combining marks (Mn) */ 23426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar forward[]={ 23436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x200f, 0x627, 0x64e, 0x650, 0x20, 0x28, 0x31, 0x29 23446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, reverseKeepCombining[]={ 23456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x29, 0x31, 0x28, 0x20, 0x627, 0x64e, 0x650, 0x200f 23466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, reverseRemoveControlsKeepCombiningDoMirror[]={ 23476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x28, 0x31, 0x29, 0x20, 0x627, 0x64e, 0x650 23486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 23496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar reverse[10]; 23506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode errorCode; 23516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length; 23526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 23536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* test ubidi_writeReverse() with "interesting" options */ 23546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 23556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=ubidi_writeReverse(forward, LENGTHOF(forward), 23566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org reverse, LENGTHOF(reverse), 23576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBIDI_KEEP_BASE_COMBINING, 23586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 23596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(reverseKeepCombining) || memcmp(reverse, reverseKeepCombining, length*U_SIZEOF_UCHAR)!=0) { 23606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in ubidi_writeReverse(UBIDI_KEEP_BASE_COMBINING): length=%d (should be %d), error code %s\n", 23616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length, LENGTHOF(reverseKeepCombining), u_errorName(errorCode)); 23626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 23636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 23646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org memset(reverse, 0xa5, LENGTHOF(reverse)*U_SIZEOF_UCHAR); 23656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 23666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=ubidi_writeReverse(forward, LENGTHOF(forward), 23676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org reverse, LENGTHOF(reverse), 23686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBIDI_REMOVE_BIDI_CONTROLS|UBIDI_DO_MIRRORING|UBIDI_KEEP_BASE_COMBINING, 23696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 23706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(reverseRemoveControlsKeepCombiningDoMirror) || memcmp(reverse, reverseRemoveControlsKeepCombiningDoMirror, length*U_SIZEOF_UCHAR)!=0) { 23716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in ubidi_writeReverse(UBIDI_REMOVE_BIDI_CONTROLS|UBIDI_DO_MIRRORING|UBIDI_KEEP_BASE_COMBINING):\n" 23726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " length=%d (should be %d), error code %s\n", 23736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length, LENGTHOF(reverseRemoveControlsKeepCombiningDoMirror), u_errorName(errorCode)); 23746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 23756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 23766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 23776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void _testManyAddedPoints(void) { 23786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode errorCode = U_ZERO_ERROR; 23796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDi *bidi = ubidi_open(); 23806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar text[90], dest[MAXLEN], expected[120]; 23816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int destLen, i; 23826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0; i < LENGTHOF(text); i+=3) { 23836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org text[i] = 0x0061; /* 'a' */ 23846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org text[i+1] = 0x05d0; 23856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org text[i+2] = 0x0033; /* '3' */ 23866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 23876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setReorderingMode(bidi, UBIDI_REORDER_INVERSE_LIKE_DIRECT); 23886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setReorderingOptions(bidi, UBIDI_OPTION_INSERT_MARKS); 23896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, text, LENGTHOF(text), UBIDI_LTR, NULL, &errorCode); 23906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode); 23916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0; i < LENGTHOF(expected); i+=4) { 23926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expected[i] = 0x0061; /* 'a' */ 23936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expected[i+1] = 0x05d0; 23946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expected[i+2] = 0x200e; 23956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expected[i+3] = 0x0033; /* '3' */ 23966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 23976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (memcmp(dest, expected, destLen * sizeof(UChar))) { 23986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nInvalid output with many added points, " 23996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "expected '%s', got '%s'\n", 24006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org aescstrdup(expected, LENGTHOF(expected)), 24016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org aescstrdup(dest, destLen)); 24026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 24036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(bidi); 24046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 24056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 24066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void _testMisc(void) { 24076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode errorCode = U_ZERO_ERROR; 24086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDi *bidi = ubidi_open(); 24096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar src[3], dest[MAXLEN], expected[5]; 24106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int destLen; 24116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setInverse(bidi, TRUE); 24126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src[0] = src[1] = src[2] = 0x0020; 24136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(bidi, src, LENGTHOF(src), UBIDI_RTL, NULL, &errorCode); 24146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 24156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBIDI_OUTPUT_REVERSE | UBIDI_INSERT_LRM_FOR_NUMERIC, 24166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 24176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_unescape("\\u200f \\u200f", expected, 5); 24186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (memcmp(dest, expected, destLen * sizeof(UChar))) { 24196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nInvalid output with RLM at both sides, " 24206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "expected '%s', got '%s'\n", 24216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org aescstrdup(expected, LENGTHOF(expected)), 24226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org aescstrdup(dest, destLen)); 24236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 24246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(bidi); 24256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 24266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 24276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* arabic shaping ----------------------------------------------------------- */ 24286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 24296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void 24306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgdoArabicShapingTest(void) { 24316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar 24326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org source[]={ 24336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x31, /* en:1 */ 24346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x627, /* arabic:alef */ 24356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x32, /* en:2 */ 24366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x6f3, /* an:3 */ 24376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x61, /* latin:a */ 24386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x34, /* en:4 */ 24396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0 24406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, en2an[]={ 24416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x661, 0x627, 0x662, 0x6f3, 0x61, 0x664, 0 24426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, an2en[]={ 24436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x31, 0x627, 0x32, 0x33, 0x61, 0x34, 0 24446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, logical_alen2an_init_lr[]={ 24456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x31, 0x627, 0x662, 0x6f3, 0x61, 0x34, 0 24466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, logical_alen2an_init_al[]={ 24476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x6f1, 0x627, 0x6f2, 0x6f3, 0x61, 0x34, 0 24486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, reverse_alen2an_init_lr[]={ 24496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x661, 0x627, 0x32, 0x6f3, 0x61, 0x34, 0 24506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, reverse_alen2an_init_al[]={ 24516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x6f1, 0x627, 0x32, 0x6f3, 0x61, 0x6f4, 0 24526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, lamalef[]={ 24536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xfefb, 0 24546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 24556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar dest[8]; 24566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode errorCode; 24576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length; 24586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 24596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* test number shaping */ 24606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 24616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* european->arabic */ 24626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 24636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(source, LENGTHOF(source), 24646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 24656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN, 24666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 24676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(source) || memcmp(dest, en2an, length*U_SIZEOF_UCHAR)!=0) { 24686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(en2an)\n"); 24696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 24706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 24716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* arabic->european */ 24726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 24736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(source, -1, 24746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 24756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_DIGITS_AN2EN|U_SHAPE_DIGIT_TYPE_AN_EXTENDED, 24766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 24776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=u_strlen(source) || memcmp(dest, an2en, length*U_SIZEOF_UCHAR)!=0) { 24786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(an2en)\n"); 24796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 24806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 24816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* european->arabic with context, logical order, initial state not AL */ 24826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 24836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(source, LENGTHOF(source), 24846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 24856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_DIGITS_ALEN2AN_INIT_LR|U_SHAPE_DIGIT_TYPE_AN, 24866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 24876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(source) || memcmp(dest, logical_alen2an_init_lr, length*U_SIZEOF_UCHAR)!=0) { 24886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(logical_alen2an_init_lr)\n"); 24896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 24906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 24916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* european->arabic with context, logical order, initial state AL */ 24926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 24936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(source, LENGTHOF(source), 24946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 24956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_DIGITS_ALEN2AN_INIT_AL|U_SHAPE_DIGIT_TYPE_AN_EXTENDED, 24966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 24976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(source) || memcmp(dest, logical_alen2an_init_al, length*U_SIZEOF_UCHAR)!=0) { 24986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(logical_alen2an_init_al)\n"); 24996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 25006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 25016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* european->arabic with context, reverse order, initial state not AL */ 25026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 25036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(source, LENGTHOF(source), 25046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 25056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_DIGITS_ALEN2AN_INIT_LR|U_SHAPE_DIGIT_TYPE_AN|U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 25066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 25076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(source) || memcmp(dest, reverse_alen2an_init_lr, length*U_SIZEOF_UCHAR)!=0) { 25086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(reverse_alen2an_init_lr)\n"); 25096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 25106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 25116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* european->arabic with context, reverse order, initial state AL */ 25126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 25136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(source, LENGTHOF(source), 25146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 25156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_DIGITS_ALEN2AN_INIT_AL|U_SHAPE_DIGIT_TYPE_AN_EXTENDED|U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 25166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 25176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(source) || memcmp(dest, reverse_alen2an_init_al, length*U_SIZEOF_UCHAR)!=0) { 25186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(reverse_alen2an_init_al)\n"); 25196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 25206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 25216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* test noop */ 25226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 25236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(source, LENGTHOF(source), 25246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 25256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0, 25266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 25276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(source) || memcmp(dest, source, length*U_SIZEOF_UCHAR)!=0) { 25286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(noop)\n"); 25296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 25306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 25316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 25326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(source, 0, 25336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 25346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN, 25356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 25366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=0) { 25376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(en2an, sourceLength=0), returned %d/%s\n", u_errorName(errorCode), LENGTHOF(source)); 25386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 25396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 25406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* preflight digit shaping */ 25416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 25426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(source, LENGTHOF(source), 25436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org NULL, 0, 25446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN, 25456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 25466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=LENGTHOF(source)) { 25476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(en2an preflighting), returned %d/%s instead of %d/U_BUFFER_OVERFLOW_ERROR\n", 25486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length, u_errorName(errorCode), LENGTHOF(source)); 25496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 25506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 25516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* test illegal arguments */ 25526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 25536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(NULL, LENGTHOF(source), 25546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 25556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN, 25566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 25576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 25586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(source=NULL), returned %s instead of U_ILLEGAL_ARGUMENT_ERROR\n", u_errorName(errorCode)); 25596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 25606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 25616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 25626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(source, -2, 25636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 25646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN, 25656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 25666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 25676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(sourceLength=-2), returned %s instead of U_ILLEGAL_ARGUMENT_ERROR\n", u_errorName(errorCode)); 25686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 25696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 25706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 25716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(source, LENGTHOF(source), 25726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org NULL, LENGTHOF(dest), 25736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN, 25746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 25756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 25766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(dest=NULL), returned %s instead of U_ILLEGAL_ARGUMENT_ERROR\n", u_errorName(errorCode)); 25776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 25786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 25796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 25806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(source, LENGTHOF(source), 25816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, -1, 25826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN, 25836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 25846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 25856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(destSize=-1), returned %s instead of U_ILLEGAL_ARGUMENT_ERROR\n", u_errorName(errorCode)); 25866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 25876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 25886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 25896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(source, LENGTHOF(source), 25906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 25916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_DIGITS_RESERVED|U_SHAPE_DIGIT_TYPE_AN, 25926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 25936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 25946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(U_SHAPE_DIGITS_RESERVED), returned %s instead of U_ILLEGAL_ARGUMENT_ERROR\n", u_errorName(errorCode)); 25956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 25966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 25976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 25986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(source, LENGTHOF(source), 25996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 26006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_RESERVED, 26016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 26026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 26036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(U_SHAPE_DIGIT_TYPE_RESERVED), returned %s instead of U_ILLEGAL_ARGUMENT_ERROR\n", u_errorName(errorCode)); 26046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 26056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 26066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 26076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(source, LENGTHOF(source), 26086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (UChar *)(source+2), LENGTHOF(dest), /* overlap source and destination */ 26096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN, 26106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 26116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 26126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(U_SHAPE_DIGIT_TYPE_RESERVED), returned %s instead of U_ILLEGAL_ARGUMENT_ERROR\n", u_errorName(errorCode)); 26136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 26146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 26156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 26166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(lamalef, LENGTHOF(lamalef), 26176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 26186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_LETTERS_UNSHAPE | U_SHAPE_LENGTH_GROW_SHRINK | U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 26196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 26206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length == LENGTHOF(lamalef)) { 26216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(U_SHAPE_LETTERS_UNSHAPE | U_SHAPE_LENGTH_GROW_SHRINK | U_SHAPE_TEXT_DIRECTION_VISUAL_LTR)\n"); 26226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("returned %s instead of U_ZERO_ERROR or returned length %d instead of 3\n", u_errorName(errorCode), length); 26236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 26246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 26256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 26266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void 26276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgdoLamAlefSpecialVLTRArabicShapingTest(void) { 26286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar 26296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org source[]={ 26306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*a*/ 0x20 ,0x646,0x622,0x644,0x627,0x20, 26316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*b*/ 0x646,0x623,0x64E,0x644,0x627,0x20, 26326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*c*/ 0x646,0x627,0x670,0x644,0x627,0x20, 26336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*d*/ 0x646,0x622,0x653,0x644,0x627,0x20, 26346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*e*/ 0x646,0x625,0x655,0x644,0x627,0x20, 26356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*f*/ 0x646,0x622,0x654,0x644,0x627,0x20, 26366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*g*/ 0xFEFC,0x639 26376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, shape_near[]={ 26386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x20,0xfee5,0x20,0xfef5,0xfe8d,0x20,0xfee5,0x20,0xfe76,0xfef7,0xfe8d,0x20, 26396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xfee5,0x20,0x670,0xfefb,0xfe8d,0x20,0xfee5,0x20,0x653,0xfef5,0xfe8d,0x20, 26406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xfee5,0x20,0x655,0xfef9,0xfe8d,0x20,0xfee5,0x20,0x654,0xfef5,0xfe8d,0x20, 26416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xfefc,0xfecb 26426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, shape_at_end[]={ 26436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x20,0xfee5,0xfef5,0xfe8d,0x20,0xfee5,0xfe76,0xfef7,0xfe8d,0x20,0xfee5,0x670, 26446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xfefb,0xfe8d,0x20,0xfee5,0x653,0xfef5,0xfe8d,0x20,0xfee5,0x655,0xfef9,0xfe8d, 26456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x20,0xfee5,0x654,0xfef5,0xfe8d,0x20,0xfefc,0xfecb,0x20,0x20,0x20,0x20,0x20,0x20 26466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, shape_at_begin[]={ 26476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xfee5,0xfef5,0xfe8d,0x20,0xfee5,0xfe76, 26486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xfef7,0xfe8d,0x20,0xfee5,0x670,0xfefb,0xfe8d,0x20,0xfee5,0x653,0xfef5,0xfe8d, 26496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x20,0xfee5,0x655,0xfef9,0xfe8d,0x20,0xfee5,0x654,0xfef5,0xfe8d,0x20,0xfefc,0xfecb 26506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, shape_grow_shrink[]={ 26516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x20,0xfee5,0xfef5,0xfe8d,0x20,0xfee5,0xfe76,0xfef7,0xfe8d,0x20,0xfee5, 26526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x670,0xfefb,0xfe8d,0x20,0xfee5,0x653,0xfef5,0xfe8d,0x20,0xfee5,0x655,0xfef9, 26536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xfe8d,0x20,0xfee5,0x654,0xfef5,0xfe8d,0x20,0xfefc,0xfecb 26546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, shape_excepttashkeel_near[]={ 26556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x20,0xfee5,0x20,0xfef5,0xfe8d,0x20,0xfee5,0x20,0xfe76,0xfef7,0xfe8d,0x20, 26566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xfee5,0x20,0x670,0xfefb,0xfe8d,0x20,0xfee5,0x20,0x653,0xfef5,0xfe8d,0x20, 26576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xfee5,0x20,0x655,0xfef9,0xfe8d,0x20,0xfee5,0x20,0x654,0xfef5,0xfe8d,0x20, 26586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xfefc,0xfecb 26596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, shape_excepttashkeel_at_end[]={ 26606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x20,0xfee5,0xfef5,0xfe8d,0x20,0xfee5,0xfe76,0xfef7,0xfe8d,0x20,0xfee5, 26616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x670,0xfefb,0xfe8d,0x20,0xfee5,0x653,0xfef5,0xfe8d,0x20,0xfee5,0x655,0xfef9, 26626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xfe8d,0x20,0xfee5,0x654,0xfef5,0xfe8d,0x20,0xfefc,0xfecb,0x20,0x20,0x20, 26636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x20,0x20,0x20 26646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, shape_excepttashkeel_at_begin[]={ 26656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xfee5,0xfef5,0xfe8d,0x20,0xfee5,0xfe76, 26666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xfef7,0xfe8d,0x20,0xfee5,0x670,0xfefb,0xfe8d,0x20,0xfee5,0x653,0xfef5,0xfe8d, 26676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x20,0xfee5,0x655,0xfef9,0xfe8d,0x20,0xfee5,0x654,0xfef5,0xfe8d,0x20,0xfefc,0xfecb 26686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, shape_excepttashkeel_grow_shrink[]={ 26696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x20,0xfee5,0xfef5,0xfe8d,0x20,0xfee5,0xfe76,0xfef7,0xfe8d,0x20,0xfee5,0x670, 26706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xfefb,0xfe8d,0x20,0xfee5,0x653,0xfef5,0xfe8d,0x20,0xfee5,0x655,0xfef9,0xfe8d, 26716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x20,0xfee5,0x654,0xfef5,0xfe8d,0x20,0xfefc,0xfecb 26726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 26736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 26746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar dest[38]; 26756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode errorCode; 26766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length; 26776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 26786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 26796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 26806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(source, LENGTHOF(source), 26816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 26826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_LETTERS_SHAPE|U_SHAPE_LENGTH_FIXED_SPACES_NEAR| 26836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 26846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 26856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 26866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(shape_near) || memcmp(dest, shape_near, length*U_SIZEOF_UCHAR)!=0) { 26876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(LAMALEF shape_near)\n"); 26886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 26896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 26906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 26916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 26926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(source, LENGTHOF(source), 26936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 26946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_LETTERS_SHAPE|U_SHAPE_LENGTH_FIXED_SPACES_AT_END| 26956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 26966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 26976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 26986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(shape_at_end) || memcmp(dest, shape_at_end, length*U_SIZEOF_UCHAR)!=0) { 26996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(LAMALEF shape_at_end)\n"); 27006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 27016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 27026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 27036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 27046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(source, LENGTHOF(source), 27056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 27066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_LETTERS_SHAPE|U_SHAPE_LENGTH_FIXED_SPACES_AT_BEGINNING| 27076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 27086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 27096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 27106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(shape_at_begin) || memcmp(dest, shape_at_begin, length*U_SIZEOF_UCHAR)!=0) { 27116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(LAMALEF shape_at_begin)\n"); 27126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 27136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 27146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 27156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 27166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(source, LENGTHOF(source), 27176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 27186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_LETTERS_SHAPE|U_SHAPE_LENGTH_GROW_SHRINK| 27196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 27206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 27216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 27226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || memcmp(dest, shape_grow_shrink, length*U_SIZEOF_UCHAR)!=0) { 27236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(LAMALEF shape_grow_shrink)\n"); 27246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 27256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 27266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* ==================== U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED ==================== */ 27276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 27286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 27296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 27306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(source, LENGTHOF(source), 27316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 27326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED|U_SHAPE_LENGTH_FIXED_SPACES_NEAR| 27336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 27346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 27356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 27366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(shape_excepttashkeel_near) || memcmp(dest, shape_excepttashkeel_near, length*U_SIZEOF_UCHAR)!=0) { 27376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(LAMALEF shape_excepttashkeel_near)\n"); 27386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 27396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 27406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 27416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 27426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(source, LENGTHOF(source), 27436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 27446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED|U_SHAPE_LENGTH_FIXED_SPACES_AT_END| 27456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 27466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 27476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 27486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(shape_excepttashkeel_at_end) || memcmp(dest,shape_excepttashkeel_at_end , length*U_SIZEOF_UCHAR)!=0) { 27496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(LAMALEF shape_excepttashkeel_at_end)\n"); 27506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 27516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 27526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 27536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 27546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(source, LENGTHOF(source), 27556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 27566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED|U_SHAPE_LENGTH_FIXED_SPACES_AT_BEGINNING| 27576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 27586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 27596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 27606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(shape_excepttashkeel_at_begin) || memcmp(dest, shape_excepttashkeel_at_begin, length*U_SIZEOF_UCHAR)!=0) { 27616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(LAMALEF shape_excepttashkeel_at_begin)\n"); 27626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 27636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 27646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 27656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 27666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(source, LENGTHOF(source), 27676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 27686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED|U_SHAPE_LENGTH_GROW_SHRINK| 27696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 27706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 27716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 27726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || memcmp(dest, shape_excepttashkeel_grow_shrink, length*U_SIZEOF_UCHAR)!=0) { 27736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(LAMALEF shape_excepttashkeel_grow_shrink)\n"); 27746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 27756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 27766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 27776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void 27786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgdoTashkeelSpecialVLTRArabicShapingTest(void) { 27796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar 27806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org source[]={ 27816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x64A,0x628,0x631,0x639,0x20, 27826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x64A,0x628,0x651,0x631,0x64E,0x639,0x20, 27836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x64C,0x64A,0x628,0x631,0x64F,0x639,0x20, 27846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x628,0x670,0x631,0x670,0x639,0x20, 27856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x628,0x653,0x631,0x653,0x639,0x20, 27866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x628,0x654,0x631,0x654,0x639,0x20, 27876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x628,0x655,0x631,0x655,0x639,0x20, 27886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, shape_near[]={ 27896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xfef2,0xfe91,0xfeae,0xfecb,0x20,0xfef2,0xfe91,0xfe7c,0xfeae,0xfe77,0xfecb, 27906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x20,0xfe72,0xfef2,0xfe91,0xfeae,0xfe79,0xfecb,0x20,0xfe8f,0x670,0xfeae,0x670, 27916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xfecb,0x20,0xfe8f,0x653,0xfeae,0x653,0xfecb,0x20,0xfe8f,0x654,0xfeae,0x654, 27926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xfecb,0x20,0xfe8f,0x655,0xfeae,0x655,0xfecb,0x20 27936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, shape_excepttashkeel_near[]={ 27946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xfef2,0xfe91,0xfeae,0xfecb,0x20,0xfef2,0xfe91,0xfe7c,0xfeae,0xfe76,0xfecb,0x20, 27956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xfe72,0xfef2,0xfe91,0xfeae,0xfe78,0xfecb,0x20,0xfe8f,0x670,0xfeae,0x670,0xfecb, 27966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x20,0xfe8f,0x653,0xfeae,0x653,0xfecb,0x20,0xfe8f,0x654,0xfeae,0x654,0xfecb,0x20, 27976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xfe8f,0x655,0xfeae,0x655,0xfecb,0x20 27986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 27996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 28006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar dest[43]; 28016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode errorCode; 28026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length; 28036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 28046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 28056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 28066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(source, LENGTHOF(source), 28076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 28086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_LETTERS_SHAPE|U_SHAPE_LENGTH_FIXED_SPACES_NEAR| 28096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 28106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 28116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 28126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(shape_near) || memcmp(dest, shape_near, length*U_SIZEOF_UCHAR)!=0) { 28136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(TASHKEEL shape_near)\n"); 28146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 28156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 28166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 28176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 28186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(source, LENGTHOF(source), 28196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 28206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED|U_SHAPE_LENGTH_FIXED_SPACES_NEAR| 28216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 28226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 28236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 28246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(shape_excepttashkeel_near) || memcmp(dest, shape_excepttashkeel_near, length*U_SIZEOF_UCHAR)!=0) { 28256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(TASHKEEL shape_excepttashkeel_near)\n"); 28266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 28276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 28286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 28296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void 28306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgdoLOGICALArabicDeShapingTest(void) { 28316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar 28326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org source[]={ 28336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0020,0x0020,0x0020,0xFE8D,0xFEF5,0x0020,0xFEE5,0x0020,0xFE8D,0xFEF7,0x0020, 28346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xFED7,0xFEFC,0x0020,0xFEE1,0x0020,0xFE8D,0xFEDF,0xFECC,0xFEAE,0xFE91,0xFEF4, 28356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xFE94,0x0020,0xFE8D,0xFEDF,0xFEA4,0xFEAE,0xFE93,0x0020,0x0020,0x0020,0x0020 28366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, unshape_near[]={ 28376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x20,0x20,0x20,0x627,0x644,0x622,0x646,0x20,0x627,0x644,0x623,0x642,0x644,0x627, 28386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x645,0x20,0x627,0x644,0x639,0x631,0x628,0x64a,0x629,0x20,0x627,0x644,0x62d,0x631, 28396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x629,0x20,0x20,0x20,0x20 28406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, unshape_at_end[]={ 28416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x20,0x20,0x20,0x627,0x644,0x622,0x20,0x646,0x20,0x627,0x644,0x623,0x20,0x642, 28426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x644,0x627,0x20,0x645,0x20,0x627,0x644,0x639,0x631,0x628,0x64a,0x629,0x20,0x627, 28436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x644,0x62d,0x631,0x629,0x20 28446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, unshape_at_begin[]={ 28456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x627,0x644,0x622,0x20,0x646,0x20,0x627,0x644,0x623,0x20,0x642,0x644,0x627,0x20, 28466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x645,0x20,0x627,0x644,0x639,0x631,0x628,0x64a,0x629,0x20,0x627,0x644,0x62d,0x631, 28476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x629,0x20,0x20,0x20,0x20 28486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, unshape_grow_shrink[]={ 28496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x20,0x20,0x20,0x627,0x644,0x622,0x20,0x646,0x20,0x627,0x644,0x623,0x20,0x642, 28506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x644,0x627,0x20,0x645,0x20,0x627,0x644,0x639,0x631,0x628,0x64a,0x629,0x20,0x627, 28516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x644,0x62d,0x631,0x629,0x20,0x20,0x20,0x20 28526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 28536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 28546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar dest[36]; 28556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode errorCode; 28566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length; 28576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 28586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 28596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 28606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(source, LENGTHOF(source), 28616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 28626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_LETTERS_UNSHAPE|U_SHAPE_LENGTH_FIXED_SPACES_NEAR| 28636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_TEXT_DIRECTION_LOGICAL, 28646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 28656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 28666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(unshape_near) || memcmp(dest, unshape_near, length*U_SIZEOF_UCHAR)!=0) { 28676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(unshape_near)\n"); 28686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 28696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 28706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 28716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 28726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(source, LENGTHOF(source), 28736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 28746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_LETTERS_UNSHAPE|U_SHAPE_LENGTH_FIXED_SPACES_AT_END| 28756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_TEXT_DIRECTION_LOGICAL, 28766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 28776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 28786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(unshape_at_end) || memcmp(dest, unshape_at_end, length*U_SIZEOF_UCHAR)!=0) { 28796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(unshape_at_end)\n"); 28806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 28816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 28826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 28836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 28846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(source, LENGTHOF(source), 28856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 28866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_LETTERS_UNSHAPE|U_SHAPE_LENGTH_FIXED_SPACES_AT_BEGINNING| 28876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_TEXT_DIRECTION_LOGICAL, 28886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 28896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 28906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(unshape_at_begin) || memcmp(dest, unshape_at_begin, length*U_SIZEOF_UCHAR)!=0) { 28916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(unshape_at_begin)\n"); 28926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 28936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 28946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 28956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 28966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(source, LENGTHOF(source), 28976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 28986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_LETTERS_UNSHAPE|U_SHAPE_LENGTH_GROW_SHRINK| 28996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_TEXT_DIRECTION_LOGICAL, 29006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 29016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 29026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || memcmp(dest, unshape_grow_shrink, length*U_SIZEOF_UCHAR)!=0) { 29036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(unshape_grow_shrink)\n"); 29046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 29056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 29066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 29076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 29086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void 29096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgdoTailTest(void) { 29106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar src[] = { 0x0020, 0x0633, 0 }; 29116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar dst_old[] = { 0xFEB1, 0x200B,0 }; 29126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar dst_new[] = { 0xFEB1, 0xFE73,0 }; 29136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar dst[3] = { 0x0000, 0x0000,0 }; 29146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length; 29156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status; 29166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 29176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("SRC: U+%04X U+%04X\n", src[0],src[1]); 29186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 29196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Trying old tail\n"); 29206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 29216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length = u_shapeArabic(src, -1, dst, LENGTHOF(dst), 29226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_LETTERS_SHAPE|U_SHAPE_SEEN_TWOCELL_NEAR, &status); 29236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)) { 29246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Fail: status %s\n", u_errorName(status)); 29256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if(length!=2) { 29266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Fail: len %d expected 3\n", length); 29276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if(u_strncmp(dst,dst_old,LENGTHOF(dst))) { 29286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Fail: got U+%04X U+%04X expected U+%04X U+%04X\n", 29296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dst[0],dst[1],dst_old[0],dst_old[1]); 29306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 29316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("OK: U+%04X U+%04X len %d err %s\n", 29326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dst[0],dst[1],length,u_errorName(status)); 29336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 29346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 29356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 29366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Trying new tail\n"); 29376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 29386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length = u_shapeArabic(src, -1, dst, LENGTHOF(dst), 29396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_LETTERS_SHAPE|U_SHAPE_SEEN_TWOCELL_NEAR|U_SHAPE_TAIL_NEW_UNICODE, &status); 29406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)) { 29416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Fail: status %s\n", u_errorName(status)); 29426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if(length!=2) { 29436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Fail: len %d expected 3\n", length); 29446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if(u_strncmp(dst,dst_new,LENGTHOF(dst))) { 29456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Fail: got U+%04X U+%04X expected U+%04X U+%04X\n", 29466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dst[0],dst[1],dst_new[0],dst_new[1]); 29476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 29486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("OK: U+%04X U+%04X len %d err %s\n", 29496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dst[0],dst[1],length,u_errorName(status)); 29506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 29516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 29526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 29536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void 29546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgdoArabicShapingTestForBug5421(void) { 29556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar 29566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org persian_letters_source[]={ 29576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0020, 0x0698, 0x067E, 0x0686, 0x06AF, 0x0020 29586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, persian_letters[]={ 29596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0020, 0xFB8B, 0xFB59, 0xFB7D, 0xFB94, 0x0020 29606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, tashkeel_aggregation_source[]={ 29616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0020, 0x0628, 0x0651, 0x064E, 0x062A, 0x0631, 0x0645, 0x0020, 29626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0628, 0x064E, 0x0651, 0x062A, 0x0631, 0x0645, 0x0020 29636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, tashkeel_aggregation[]={ 29646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0020, 0xFE90, 0xFC60, 0xFE97, 0xFEAE, 0xFEE3, 29656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0020, 0xFE90, 0xFC60, 0xFE97, 0xFEAE, 0xFEE3, 0x0020 29666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, untouched_presentation_source[]={ 29676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0020 ,0x0627, 0xfe90,0x0020 29686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, untouched_presentation[]={ 29696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0020,0xfe8D, 0xfe90,0x0020 29706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, untouched_presentation_r_source[]={ 29716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0020 ,0xfe90, 0x0627, 0x0020 29726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, untouched_presentation_r[]={ 29736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0020, 0xfe90,0xfe8D,0x0020 29746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 29756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 29766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar dest[38]; 29776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode errorCode; 29786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length; 29796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 29806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 29816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 29826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(persian_letters_source, LENGTHOF(persian_letters_source), 29836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 29846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_LETTERS_SHAPE|U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 29856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 29866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 29876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(persian_letters) || memcmp(dest, persian_letters, length*U_SIZEOF_UCHAR)!=0) { 29886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(persian_letters)\n"); 29896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 29906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 29916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 29926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 29936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(tashkeel_aggregation_source, LENGTHOF(tashkeel_aggregation_source), 29946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 29956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_AGGREGATE_TASHKEEL|U_SHAPE_PRESERVE_PRESENTATION| 29966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED|U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 29976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 29986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 29996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(tashkeel_aggregation) || memcmp(dest, tashkeel_aggregation, length*U_SIZEOF_UCHAR)!=0) { 30006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(tashkeel_aggregation)\n"); 30016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 30026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 30036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 30046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 30056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(untouched_presentation_source, LENGTHOF(untouched_presentation_source), 30066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 30076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_PRESERVE_PRESENTATION| 30086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_LETTERS_SHAPE|U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 30096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 30106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 30116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(untouched_presentation) || memcmp(dest, untouched_presentation, length*U_SIZEOF_UCHAR)!=0) { 30126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(untouched_presentation)\n"); 30136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 30146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 30156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 30166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 30176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(untouched_presentation_r_source, LENGTHOF(untouched_presentation_r_source), 30186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 30196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_PRESERVE_PRESENTATION| 30206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_LETTERS_SHAPE|U_SHAPE_TEXT_DIRECTION_LOGICAL, 30216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 30226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 30236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(untouched_presentation_r) || memcmp(dest, untouched_presentation_r, length*U_SIZEOF_UCHAR)!=0) { 30246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(untouched_presentation_r)\n"); 30256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 30266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 30276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 30286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void 30296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgdoArabicShapingTestForBug8703(void) { 30306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar 30316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org letters_source1[]={ 30326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0634,0x0651,0x0645,0x0652,0x0633 30336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, letters_source2[]={ 30346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0634,0x0651,0x0645,0x0652,0x0633 30356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, letters_source3[]={ 30366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0634,0x0651,0x0645,0x0652,0x0633 30376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, letters_source4[]={ 30386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0634,0x0651,0x0645,0x0652,0x0633 30396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, letters_source5[]={ 30406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0633,0x0652,0x0645,0x0651,0x0634 30416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, letters_source6[]={ 30426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0633,0x0652,0x0645,0x0651,0x0634 30436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, letters_source7[]={ 30446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0633,0x0652,0x0645,0x0651,0x0634 30456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, letters_source8[]={ 30466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0633,0x0652,0x0645,0x0651,0x0634 30476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, letters_dest1[]={ 30486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0020,0xFEB7,0xFE7D,0xFEE4,0xFEB2 30496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, letters_dest2[]={ 30506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xFEB7,0xFE7D,0xFEE4,0xFEB2,0x0020 30516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, letters_dest3[]={ 30526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xFEB7,0xFE7D,0xFEE4,0xFEB2 30536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, letters_dest4[]={ 30546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xFEB7,0xFE7D,0xFEE4,0x0640,0xFEB2 30556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, letters_dest5[]={ 30566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0020,0xFEB2,0xFEE4,0xFE7D,0xFEB7 30576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, letters_dest6[]={ 30586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xFEB2,0xFEE4,0xFE7D,0xFEB7,0x0020 30596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, letters_dest7[]={ 30606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xFEB2,0xFEE4,0xFE7D,0xFEB7 30616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, letters_dest8[]={ 30626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xFEB2,0x0640,0xFEE4,0xFE7D,0xFEB7 30636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 30646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 30656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar dest[20]; 30666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode errorCode; 30676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length; 30686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 30696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 30706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 30716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(letters_source1, LENGTHOF(letters_source1), 30726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 30736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_BEGIN | U_SHAPE_LETTERS_SHAPE, 30746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 30756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 30766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest1) || memcmp(dest, letters_dest1, length*U_SIZEOF_UCHAR)!=0) { 30776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(letters_source1)\n"); 30786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 30796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 30806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 30816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 30826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(letters_source2, LENGTHOF(letters_source2), 30836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 30846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_END | U_SHAPE_LETTERS_SHAPE, 30856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 30866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 30876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest2) || memcmp(dest, letters_dest2, length*U_SIZEOF_UCHAR)!=0) { 30886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(letters_source2)\n"); 30896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 30906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 30916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 30926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 30936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(letters_source3, LENGTHOF(letters_source3), 30946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 30956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_RESIZE | U_SHAPE_LETTERS_SHAPE, 30966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 30976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 30986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest3) || memcmp(dest, letters_dest3, length*U_SIZEOF_UCHAR)!=0) { 30996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(letters_source3)\n"); 31006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 31016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 31026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 31036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 31046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(letters_source4, LENGTHOF(letters_source4), 31056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 31066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_REPLACE_BY_TATWEEL | U_SHAPE_LETTERS_SHAPE, 31076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 31086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 31096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest4) || memcmp(dest, letters_dest4, length*U_SIZEOF_UCHAR)!=0) { 31106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(letters_source4)\n"); 31116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 31126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 31136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 31146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 31156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(letters_source5, LENGTHOF(letters_source5), 31166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 31176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_TEXT_DIRECTION_VISUAL_LTR | U_SHAPE_TASHKEEL_BEGIN | U_SHAPE_LETTERS_SHAPE, 31186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 31196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 31206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest5) || memcmp(dest, letters_dest5, length*U_SIZEOF_UCHAR)!=0) { 31216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(letters_source5)\n"); 31226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 31236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 31246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 31256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 31266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(letters_source6, LENGTHOF(letters_source6), 31276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 31286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_TEXT_DIRECTION_VISUAL_LTR | U_SHAPE_TASHKEEL_END | U_SHAPE_LETTERS_SHAPE, 31296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 31306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 31316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest6) || memcmp(dest, letters_dest6, length*U_SIZEOF_UCHAR)!=0) { 31326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(letters_source6)\n"); 31336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 31346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 31356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 31366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 31376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(letters_source7, LENGTHOF(letters_source7), 31386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 31396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_TEXT_DIRECTION_VISUAL_LTR | U_SHAPE_TASHKEEL_RESIZE | U_SHAPE_LETTERS_SHAPE, 31406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 31416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 31426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest7) || memcmp(dest, letters_dest7, length*U_SIZEOF_UCHAR)!=0) { 31436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(letters_source7)\n"); 31446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 31456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 31466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 31476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 31486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(letters_source8, LENGTHOF(letters_source8), 31496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 31506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_TEXT_DIRECTION_VISUAL_LTR | U_SHAPE_TASHKEEL_REPLACE_BY_TATWEEL | U_SHAPE_LETTERS_SHAPE, 31516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 31526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 31536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest8) || memcmp(dest, letters_dest8, length*U_SIZEOF_UCHAR)!=0) { 31546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(letters_source8)\n"); 31556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 31566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 31576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 31586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void 31596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgdoArabicShapingTestForBug9024(void) { 31606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar 31616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org letters_source1[]={ /* Arabic mathematical Symbols 0x1EE00 - 0x1EE1B */ 31626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE00, 0xD83B, 0xDE01, 0xD83B, 0xDE02, 0xD83B, 0xDE03, 0x20, 31636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE24, 0xD83B, 0xDE05, 0xD83B, 0xDE06, 0x20, 31646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE07, 0xD83B, 0xDE08, 0xD83B, 0xDE09, 0x20, 31656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE0A, 0xD83B, 0xDE0B, 0xD83B, 0xDE0C, 0xD83B, 0xDE0D, 0x20, 31666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE0E, 0xD83B, 0xDE0F, 0xD83B, 0xDE10, 0xD83B, 0xDE11, 0x20, 31676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE12, 0xD83B, 0xDE13, 0xD83B, 0xDE14, 0xD83B, 0xDE15, 0x20, 31686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE16, 0xD83B, 0xDE17, 0xD83B, 0xDE18, 0x20, 31696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE19, 0xD83B, 0xDE1A, 0xD83B, 0xDE1B 31706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, letters_source2[]={/* Arabic mathematical Symbols - Looped Symbols, 0x1EE80 - 0x1EE9B */ 31716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE80, 0xD83B, 0xDE81, 0xD83B, 0xDE82, 0xD83B, 0xDE83, 0x20, 31726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE84, 0xD83B, 0xDE85, 0xD83B, 0xDE86, 0x20, 31736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE87, 0xD83B, 0xDE88, 0xD83B, 0xDE89, 0x20, 31746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE8B, 0xD83B, 0xDE8C, 0xD83B, 0xDE8D, 0x20, 31756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE8E, 0xD83B, 0xDE8F, 0xD83B, 0xDE90, 0xD83B, 0xDE91, 0x20, 31766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE92, 0xD83B, 0xDE93, 0xD83B, 0xDE94, 0xD83B, 0xDE95, 0x20, 31776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE96, 0xD83B, 0xDE97, 0xD83B, 0xDE98, 0x20, 31786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE99, 0xD83B, 0xDE9A, 0xD83B, 0xDE9B 31796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, letters_source3[]={/* Arabic mathematical Symbols - Double-struck Symbols, 0x1EEA1 - 0x1EEBB */ 31806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDEA1, 0xD83B, 0xDEA2, 0xD83B, 0xDEA3, 0x20, 31816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDEA5, 0xD83B, 0xDEA6, 0x20, 31826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDEA7, 0xD83B, 0xDEA8, 0xD83B, 0xDEA9, 0x20, 31836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDEAB, 0xD83B, 0xDEAC, 0xD83B, 0xDEAD, 0x20, 31846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDEAE, 0xD83B, 0xDEAF, 0xD83B, 0xDEB0, 0xD83B, 0xDEB1, 0x20, 31856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDEB2, 0xD83B, 0xDEB3, 0xD83B, 0xDEB4, 0xD83B, 0xDEB5, 0x20, 31866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDEB6, 0xD83B, 0xDEB7, 0xD83B, 0xDEB8, 0x20, 31876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDEB9, 0xD83B, 0xDEBA, 0xD83B, 0xDEBB 31886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, letters_source4[]={/* Arabic mathematical Symbols - Initial Symbols, 0x1EE21 - 0x1EE3B */ 31896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE21, 0xD83B, 0xDE22, 0x20, 31906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE27, 0xD83B, 0xDE29, 0x20, 31916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE2A, 0xD83B, 0xDE2B, 0xD83B, 0xDE2C, 0xD83B, 0xDE2D, 0x20, 31926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE2E, 0xD83B, 0xDE2F, 0xD83B, 0xDE30, 0xD83B, 0xDE31, 0x20, 31936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE32, 0xD83B, 0xDE34, 0xD83B, 0xDE35, 0x20, 31946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE36, 0xD83B, 0xDE37, 0x20, 31956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE39, 0xD83B, 0xDE3B 31966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, letters_source5[]={/* Arabic mathematical Symbols - Tailed Symbols */ 31976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE42, 0xD83B, 0xDE47, 0xD83B, 0xDE49, 0xD83B, 0xDE4B, 0x20, 31986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE4D, 0xD83B, 0xDE4E, 0xD83B, 0xDE4F, 0x20, 31996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE51, 0xD83B, 0xDE52, 0xD83B, 0xDE54, 0xD83B, 0xDE57, 0x20, 32006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE59, 0xD83B, 0xDE5B, 0xD83B, 0xDE5D, 0xD83B, 0xDE5F 32016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, letters_source6[]={/* Arabic mathematical Symbols - Stretched Symbols with 06 range */ 32026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE21, 0x0633, 0xD83B, 0xDE62, 0x0647 32036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, letters_dest1[]={ 32046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE00, 0xD83B, 0xDE01, 0xD83B, 0xDE02, 0xD83B, 0xDE03, 0x20, 32056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE24, 0xD83B, 0xDE05, 0xD83B, 0xDE06, 0x20, 32066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE07, 0xD83B, 0xDE08, 0xD83B, 0xDE09, 0x20, 32076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE0A, 0xD83B, 0xDE0B, 0xD83B, 0xDE0C, 0xD83B, 0xDE0D, 0x20, 32086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE0E, 0xD83B, 0xDE0F, 0xD83B, 0xDE10, 0xD83B, 0xDE11, 0x20, 32096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE12, 0xD83B, 0xDE13, 0xD83B, 0xDE14, 0xD83B, 0xDE15, 0x20, 32106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE16, 0xD83B, 0xDE17, 0xD83B, 0xDE18, 0x20, 32116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE19, 0xD83B, 0xDE1A, 0xD83B, 0xDE1B 32126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, letters_dest2[]={ 32136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE80, 0xD83B, 0xDE81, 0xD83B, 0xDE82, 0xD83B, 0xDE83, 0x20, 32146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE84, 0xD83B, 0xDE85, 0xD83B, 0xDE86, 0x20, 32156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE87, 0xD83B, 0xDE88, 0xD83B, 0xDE89, 0x20, 32166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE8B, 0xD83B, 0xDE8C, 0xD83B, 0xDE8D, 0x20, 32176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE8E, 0xD83B, 0xDE8F, 0xD83B, 0xDE90, 0xD83B, 0xDE91, 0x20, 32186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE92, 0xD83B, 0xDE93, 0xD83B, 0xDE94, 0xD83B, 0xDE95, 0x20, 32196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE96, 0xD83B, 0xDE97, 0xD83B, 0xDE98, 0x20, 32206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE99, 0xD83B, 0xDE9A, 0xD83B, 0xDE9B 32216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, letters_dest3[]={ 32226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDEA1, 0xD83B, 0xDEA2, 0xD83B, 0xDEA3, 0x20, 32236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDEA5, 0xD83B, 0xDEA6, 0x20, 32246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDEA7, 0xD83B, 0xDEA8, 0xD83B, 0xDEA9, 0x20, 32256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDEAB, 0xD83B, 0xDEAC, 0xD83B, 0xDEAD, 0x20, 32266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDEAE, 0xD83B, 0xDEAF, 0xD83B, 0xDEB0, 0xD83B, 0xDEB1, 0x20, 32276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDEB2, 0xD83B, 0xDEB3, 0xD83B, 0xDEB4, 0xD83B, 0xDEB5, 0x20, 32286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDEB6, 0xD83B, 0xDEB7, 0xD83B, 0xDEB8, 0x20, 32296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDEB9, 0xD83B, 0xDEBA, 0xD83B, 0xDEBB 32306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, letters_dest4[]={ 32316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE21, 0xD83B, 0xDE22, 0x20, 32326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE27, 0xD83B, 0xDE29, 0x20, 32336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE2A, 0xD83B, 0xDE2B, 0xD83B, 0xDE2C, 0xD83B, 0xDE2D, 0x20, 32346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE2E, 0xD83B, 0xDE2F, 0xD83B, 0xDE30, 0xD83B, 0xDE31, 0x20, 32356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE32, 0xD83B, 0xDE34, 0xD83B, 0xDE35, 0x20, 32366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE36, 0xD83B, 0xDE37, 0x20, 32376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE39, 0xD83B, 0xDE3B 32386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, letters_dest5[]={ 32396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE42, 0xD83B, 0xDE47, 0xD83B, 0xDE49, 0xD83B, 0xDE4B, 0x20, 32406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE4D, 0xD83B, 0xDE4E, 0xD83B, 0xDE4F, 0x20, 32416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE51, 0xD83B, 0xDE52, 0xD83B, 0xDE54, 0xD83B, 0xDE57, 0x20, 32426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE59, 0xD83B, 0xDE5B, 0xD83B, 0xDE5D, 0xD83B, 0xDE5F 32436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, letters_dest6[]={ 32446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xD83B, 0xDE21, 0xFEB1, 0xD83B, 0xDE62, 0xFEE9 32456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 32466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 32476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar dest[MAXLEN]; 32486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode errorCode; 32496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length; 32506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 32516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 32526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 32536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(letters_source1, LENGTHOF(letters_source1), 32546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 32556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_BEGIN | U_SHAPE_LETTERS_SHAPE, 32566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 32576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 32586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest1) || memcmp(dest, letters_dest1, length*U_SIZEOF_UCHAR)!=0) { 32596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(letters_source1)\n"); 32606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 32616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 32626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 32636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 32646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(letters_source2, LENGTHOF(letters_source2), 32656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 32666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_END | U_SHAPE_LETTERS_SHAPE, 32676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 32686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 32696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest2) || memcmp(dest, letters_dest2, length*U_SIZEOF_UCHAR)!=0) { 32706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(letters_source2)\n"); 32716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 32726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 32736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 32746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 32756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(letters_source3, LENGTHOF(letters_source3), 32766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 32776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_RESIZE | U_SHAPE_LETTERS_SHAPE, 32786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 32796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 32806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest3) || memcmp(dest, letters_dest3, length*U_SIZEOF_UCHAR)!=0) { 32816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(letters_source3)\n"); 32826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 32836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 32846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 32856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 32866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(letters_source4, LENGTHOF(letters_source4), 32876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 32886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_REPLACE_BY_TATWEEL | U_SHAPE_LETTERS_SHAPE, 32896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 32906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 32916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest4) || memcmp(dest, letters_dest4, length*U_SIZEOF_UCHAR)!=0) { 32926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(letters_source4)\n"); 32936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 32946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 32956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 32966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 32976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(letters_source5, LENGTHOF(letters_source5), 32986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 32996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_TEXT_DIRECTION_VISUAL_LTR | U_SHAPE_TASHKEEL_BEGIN | U_SHAPE_LETTERS_SHAPE, 33006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 33016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 33026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest5) || memcmp(dest, letters_dest5, length*U_SIZEOF_UCHAR)!=0) { 33036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(letters_source5)\n"); 33046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 33056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 33066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 33076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 33086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=u_shapeArabic(letters_source6, LENGTHOF(letters_source6), 33096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest, LENGTHOF(dest), 33106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_TEXT_DIRECTION_VISUAL_LTR | U_SHAPE_TASHKEEL_END | U_SHAPE_LETTERS_SHAPE, 33116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &errorCode); 33126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 33136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest6) || memcmp(dest, letters_dest6, length*U_SIZEOF_UCHAR)!=0) { 33146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("failure in u_shapeArabic(letters_source6)\n"); 33156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 33166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 33176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 33186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 33196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* helpers ------------------------------------------------------------------ */ 33206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 33216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void initCharFromDirProps(void) { 33226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UVersionInfo ucd401={ 4, 0, 1, 0 }; 33236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static UVersionInfo ucdVersion={ 0, 0, 0, 0 }; 33246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 33256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* lazy initialization */ 33266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(ucdVersion[0]>0) { 33276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 33286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 33296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 33306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_getUnicodeVersion(ucdVersion); 33316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(memcmp(ucdVersion, ucd401, sizeof(UVersionInfo))>=0) { 33326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Unicode 4.0.1 changes bidi classes for +-/ */ 33336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org charFromDirProp[U_EUROPEAN_NUMBER_SEPARATOR]=0x2b; /* change ES character from / to + */ 33346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 33356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 33366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 33376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* return a string with characters according to the desired directional properties */ 33386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UChar * 33396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orggetStringFromDirProps(const uint8_t *dirProps, int32_t length, UChar *buffer) { 33406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i; 33416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 33426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org initCharFromDirProps(); 33436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 33446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* this part would have to be modified for UTF-x */ 33456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<length; ++i) { 33466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org buffer[i]=charFromDirProp[dirProps[i]]; 33476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 33486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org buffer[length]=0; 33496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return buffer; 33506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 33516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 33526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void printUnicode(const UChar *s, int32_t length, const UBiDiLevel *levels) { 33536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i; 33546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 33556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("{ "); 33566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<length; ++i) { 33576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(levels!=NULL) { 33586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("%4x.%u ", s[i], levels[i]); 33596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 33606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("%4x ", s[i]); 33616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 33626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 33636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose(" }"); 33646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 33656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 33666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* new BIDI API */ 33676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 33686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Reordering Mode BiDi --------------------------------------------------------- */ 33696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 33706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UBiDiLevel paraLevels[] = { UBIDI_LTR, UBIDI_RTL }; 33716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 33726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool 33736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgassertSuccessful(const char* message, UErrorCode* rc) { 33746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (rc != NULL && U_FAILURE(*rc)) { 33756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("%s() failed with error %s.\n", message, myErrorName(*rc)); 33766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 33776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 33786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 33796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 33806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 33816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool 33826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgassertStringsEqual(const char* expected, const char* actual, const char* src, 33836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char* mode, const char* option, UBiDi* pBiDi) { 33846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (uprv_strcmp(expected, actual)) { 33856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char formatChars[MAXLEN]; 33866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nActual and expected output mismatch.\n" 33876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "%20s %s\n%20s %s\n%20s %s\n%20s %s\n%20s %d %s\n%20s %u\n%20s %d %s\n", 33886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Input:", src, 33896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Actual output:", actual, 33906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Expected output:", expected, 33916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Levels:", formatLevels(pBiDi, formatChars), 33926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Reordering mode:", ubidi_getReorderingMode(pBiDi), mode, 33936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Paragraph level:", ubidi_getParaLevel(pBiDi), 33946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Reordering option:", ubidi_getReorderingOptions(pBiDi), option); 33956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 33966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 33976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 33986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 33996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 34006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBiDi* 34016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orggetBiDiObject(void) { 34026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDi* pBiDi = ubidi_open(); 34036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (pBiDi == NULL) { 34046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Unable to allocate a UBiDi object. Tests are skipped.\n"); 34056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 34066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return pBiDi; 34076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 34086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 34096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define MAKE_ITEMS(val) val, #val 34106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 34116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const struct { 34126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDiReorderingMode value; 34136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char* description; 34146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 34156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgmodes[] = { 34166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { MAKE_ITEMS(UBIDI_REORDER_GROUP_NUMBERS_WITH_R) }, 34176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { MAKE_ITEMS(UBIDI_REORDER_INVERSE_LIKE_DIRECT) }, 34186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { MAKE_ITEMS(UBIDI_REORDER_NUMBERS_SPECIAL) }, 34196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { MAKE_ITEMS(UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL) }, 34206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { MAKE_ITEMS(UBIDI_REORDER_INVERSE_NUMBERS_AS_L) } 34216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 34226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const struct { 34236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t value; 34246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char* description; 34256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 34266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgoptions[] = { 34276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { MAKE_ITEMS(UBIDI_OPTION_INSERT_MARKS) }, 34286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { MAKE_ITEMS(0) } 34296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 34306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 34316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define TC_COUNT LENGTHOF(textIn) 34326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define MODES_COUNT LENGTHOF(modes) 34336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define OPTIONS_COUNT LENGTHOF(options) 34346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define LEVELS_COUNT LENGTHOF(paraLevels) 34356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 34366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char* const textIn[] = { 34376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* (0) 123 */ 34386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "123", 34396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* (1) .123->4.5 */ 34406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ".123->4.5", 34416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* (2) 678 */ 34426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "678", 34436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* (3) .678->8.9 */ 34446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ".678->8.9", 34456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* (4) JIH1.2,3MLK */ 34466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "JIH1.2,3MLK", 34476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* (5) FE.>12-> */ 34486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "FE.>12->", 34496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* (6) JIH.>12->a */ 34506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "JIH.>12->a", 34516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* (7) CBA.>67->89=a */ 34526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "CBA.>67->89=a", 34536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* (8) CBA.123->xyz */ 34546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "CBA.123->xyz", 34556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* (9) .>12->xyz */ 34566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ".>12->xyz", 34576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* (10) a.>67->xyz */ 34586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "a.>67->xyz", 34596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* (11) 123JIH */ 34606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "123JIH", 34616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* (12) 123 JIH */ 34626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "123 JIH" 34636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 34646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 34656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char* const textOut[] = { 34666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 0: 123 */ 34676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "123", /* (0) */ 34686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 1: .123->4.5 */ 34696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ".123->4.5", /* (1) */ 34706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "4.5<-123.", /* (2) */ 34716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 2: 678 */ 34726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "678", /* (3) */ 34736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 3: .678->8.9 */ 34746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ".8.9<-678", /* (4) */ 34756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "8.9<-678.", /* (5) */ 34766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ".678->8.9", /* (6) */ 34776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 4: MLK1.2,3JIH */ 34786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "KLM1.2,3HIJ", /* (7) */ 34796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 5: FE.>12-> */ 34806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "12<.EF->", /* (8) */ 34816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "<-12<.EF", /* (9) */ 34826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "EF.>@12->", /* (10) */ 34836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 6: JIH.>12->a */ 34846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "12<.HIJ->a", /* (11) */ 34856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "a<-12<.HIJ", /* (12) */ 34866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "HIJ.>@12->a", /* (13) */ 34876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "a&<-12<.HIJ", /* (14) */ 34886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 7: CBA.>67->89=a */ 34896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "ABC.>@67->89=a", /* (15) */ 34906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "a=89<-67<.ABC", /* (16) */ 34916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "a&=89<-67<.ABC", /* (17) */ 34926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "89<-67<.ABC=a", /* (18) */ 34936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 8: CBA.123->xyz */ 34946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "123.ABC->xyz", /* (19) */ 34956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "xyz<-123.ABC", /* (20) */ 34966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "ABC.@123->xyz", /* (21) */ 34976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "xyz&<-123.ABC", /* (22) */ 34986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 9: .>12->xyz */ 34996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ".>12->xyz", /* (23) */ 35006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "xyz<-12<.", /* (24) */ 35016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "xyz&<-12<.", /* (25) */ 35026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 10: a.>67->xyz */ 35036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "a.>67->xyz", /* (26) */ 35046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "a.>@67@->xyz", /* (27) */ 35056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "xyz<-67<.a", /* (28) */ 35066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 11: 123JIH */ 35076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "123HIJ", /* (29) */ 35086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "HIJ123", /* (30) */ 35096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 12: 123 JIH */ 35106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "123 HIJ", /* (31) */ 35116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "HIJ 123", /* (32) */ 35126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 35136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 35146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define NO UBIDI_MAP_NOWHERE 35156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define MAX_MAP_LENGTH 20 35166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 35176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int32_t forwardMap[][MAX_MAP_LENGTH] = { 35186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 0: 123 */ 35196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0, 1, 2 }, /* (0) */ 35206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 1: .123->4.5 */ 35216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, /* (1) */ 35226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 8, 5, 6, 7, 4, 3, 0, 1, 2 }, /* (2) */ 35236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 2: 678 */ 35246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0, 1, 2 }, /* (3) */ 35256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 3: .678->8.9 */ 35266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0, 6, 7, 8, 5, 4, 1, 2, 3 }, /* (4) */ 35276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 8, 5, 6, 7, 4, 3, 0, 1, 2 }, /* (5) */ 35286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, /* (6) */ 35296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 4: MLK1.2,3JIH */ 35306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 10, 9, 8, 3, 4, 5, 6, 7, 2, 1, 0 }, /* (7) */ 35316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 5: FE.>12-> */ 35326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 5, 4, 3, 2, 0, 1, 6, 7 }, /* (8) */ 35336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 7, 6, 5, 4, 2, 3, 1, 0 }, /* (9) */ 35346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1, 0, 2, 3, 5, 6, 7, 8 }, /* (10) */ 35356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 6: JIH.>12->a */ 35366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 6, 5, 4, 3, 2, 0, 1, 7, 8, 9 }, /* (11) */ 35376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 9, 8, 7, 6, 5, 3, 4, 2, 1, 0 }, /* (12) */ 35386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2, 1, 0, 3, 4, 6, 7, 8, 9, 10 }, /* (13) */ 35396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 10, 9, 8, 7, 6, 4, 5, 3, 2, 0 }, /* (14) */ 35406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 7: CBA.>67->89=a */ 35416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2, 1, 0, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13 }, /* (15) */ 35426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 12, 11, 10, 9, 8, 6, 7, 5, 4, 2, 3, 1, 0 }, /* (16) */ 35436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 13, 12, 11, 10, 9, 7, 8, 6, 5, 3, 4, 2, 0 }, /* (17) */ 35446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 10, 9, 8, 7, 6, 4, 5, 3, 2, 0, 1, 11, 12 }, /* (18) */ 35456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 8: CBA.123->xyz */ 35466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 6, 5, 4, 3, 0, 1, 2, 7, 8, 9, 10, 11 }, /* (19) */ 35476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 11, 10, 9, 8, 5, 6, 7, 4, 3, 0, 1, 2 }, /* (20) */ 35486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2, 1, 0, 3, 5, 6, 7, 8, 9, 10, 11, 12 }, /* (21) */ 35496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 12, 11, 10, 9, 6, 7, 8, 5, 4, 0, 1, 2 }, /* (22) */ 35506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 9: .>12->xyz */ 35516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, /* (23) */ 35526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 8, 7, 5, 6, 4, 3, 0, 1, 2 }, /* (24) */ 35536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 9, 8, 6, 7, 5, 4, 0, 1, 2 }, /* (25) */ 35546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 10: a.>67->xyz */ 35556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, /* (26) */ 35566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0, 1, 2, 4, 5, 7, 8, 9, 10, 11 }, /* (27) */ 35576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 9, 8, 7, 5, 6, 4, 3, 0, 1, 2 }, /* (28) */ 35586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 11: 123JIH */ 35596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0, 1, 2, 5, 4, 3 }, /* (29) */ 35606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 3, 4, 5, 2, 1, 0 }, /* (30) */ 35616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 12: 123 JIH */ 35626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0, 1, 2, 3, 6, 5, 4 }, /* (31) */ 35636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 4, 5, 6, 3, 2, 1, 0 }, /* (32) */ 35646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 35656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 35666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int32_t inverseMap[][MAX_MAP_LENGTH] = { 35676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 0: 123 */ 35686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0, 1, 2 }, /* (0) */ 35696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 1: .123->4.5 */ 35706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, /* (1) */ 35716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 6, 7, 8, 5, 4, 1, 2, 3, 0 }, /* (2) */ 35726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 2: 678 */ 35736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0, 1, 2 }, /* (3) */ 35746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 3: .678->8.9 */ 35756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0, 6, 7, 8, 5, 4, 1, 2, 3 }, /* (4) */ 35766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 6, 7, 8, 5, 4, 1, 2, 3, 0 }, /* (5) */ 35776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, /* (6) */ 35786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 4: MLK1.2,3JIH */ 35796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 10, 9, 8, 3, 4, 5, 6, 7, 2, 1, 0 }, /* (7) */ 35806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 5: FE.>12-> */ 35816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 4, 5, 3, 2, 1, 0, 6, 7 }, /* (8) */ 35826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 7, 6, 4, 5, 3, 2, 1, 0 }, /* (9) */ 35836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1, 0, 2, 3, NO, 4, 5, 6, 7 }, /* (10) */ 35846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 6: JIH.>12->a */ 35856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 5, 6, 4, 3, 2, 1, 0, 7, 8, 9 }, /* (11) */ 35866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 9, 8, 7, 5, 6, 4, 3, 2, 1, 0 }, /* (12) */ 35876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2, 1, 0, 3, 4, NO, 5, 6, 7, 8, 9 }, /* (13) */ 35886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 9, NO, 8, 7, 5, 6, 4, 3, 2, 1, 0 }, /* (14) */ 35896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 7: CBA.>67->89=a */ 35906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2, 1, 0, 3, 4, NO, 5, 6, 7, 8, 9, 10, 11, 12 }, /* (15) */ 35916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 12, 11, 9, 10, 8, 7, 5, 6, 4, 3, 2, 1, 0 }, /* (16) */ 35926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 12, NO, 11, 9, 10, 8, 7, 5, 6, 4, 3, 2, 1, 0 }, /* (17) */ 35936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 9, 10, 8, 7, 5, 6, 4, 3, 2, 1, 0, 11, 12 }, /* (18) */ 35946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 8: CBA.123->xyz */ 35956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 4, 5, 6, 3, 2, 1, 0, 7, 8, 9, 10, 11 }, /* (19) */ 35966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 9, 10, 11, 8, 7, 4, 5, 6, 3, 2, 1, 0 }, /* (20) */ 35976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2, 1, 0, 3, NO, 4, 5, 6, 7, 8, 9, 10, 11 }, /* (21) */ 35986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 9, 10, 11, NO, 8, 7, 4, 5, 6, 3, 2, 1, 0 }, /* (22) */ 35996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 9: .>12->xyz */ 36006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, /* (23) */ 36016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 6, 7, 8, 5, 4, 2, 3, 1, 0 }, /* (24) */ 36026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 6, 7, 8, NO, 5, 4, 2, 3, 1, 0 }, /* (25) */ 36036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 10: a.>67->xyz */ 36046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, /* (26) */ 36056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0, 1, 2, NO, 3, 4, NO, 5, 6, 7, 8, 9 }, /* (27) */ 36066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 7, 8, 9, 6, 5, 3, 4, 2, 1, 0 }, /* (28) */ 36076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 11: 123JIH */ 36086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0, 1, 2, 5, 4, 3 }, /* (29) */ 36096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 5, 4, 3, 0, 1, 2 }, /* (30) */ 36106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 12: 123 JIH */ 36116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0, 1, 2, 3, 6, 5, 4 }, /* (31) */ 36126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 6, 5, 4, 3, 0, 1, 2 }, /* (32) */ 36136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 36146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 36156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char outIndices[TC_COUNT][MODES_COUNT - 1][OPTIONS_COUNT] 36166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org [LEVELS_COUNT] = { 36176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { /* TC 0: 123 */ 36186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 0, 0}, { 0, 0}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 36196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 0, 0}, { 0, 0}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 36206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 0, 0}, { 0, 0}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 36216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 0, 0}, { 0, 0}} /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 36226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, 36236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { /* TC 1: .123->4.5 */ 36246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 2}, { 1, 2}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 36256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 2}, { 1, 2}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 36266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 2}, { 1, 2}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 36276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 2}, { 1, 2}} /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 36286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, 36296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { /* TC 2: 678 */ 36306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 3, 3}, { 3, 3}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 36316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 3, 3}, { 3, 3}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 36326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 3, 3}, { 3, 3}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 36336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 3, 3}, { 3, 3}} /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 36346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, 36356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { /* TC 3: .678->8.9 */ 36366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 6, 5}, { 6, 5}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 36376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 4, 5}, { 4, 5}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 36386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 6, 5}, { 6, 5}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 36396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 6, 5}, { 6, 5}} /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 36406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, 36416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { /* TC 4: MLK1.2,3JIH */ 36426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 7, 7}, { 7, 7}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 36436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 7, 7}, { 7, 7}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 36446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 7, 7}, { 7, 7}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 36456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 7, 7}, { 7, 7}} /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 36466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, 36476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { /* TC 5: FE.>12-> */ 36486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 8, 9}, { 8, 9}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 36496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{10, 9}, { 8, 9}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 36506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 8, 9}, { 8, 9}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 36516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{10, 9}, { 8, 9}} /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 36526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, 36536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { /* TC 6: JIH.>12->a */ 36546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{11, 12}, {11, 12}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 36556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{13, 14}, {11, 12}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 36566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{11, 12}, {11, 12}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 36576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{13, 14}, {11, 12}} /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 36586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, 36596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { /* TC 7: CBA.>67->89=a */ 36606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{18, 16}, {18, 16}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 36616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{18, 17}, {18, 16}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 36626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{18, 16}, {18, 16}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 36636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{15, 17}, {18, 16}} /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 36646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, 36656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { /* TC 8: CBA.>124->xyz */ 36666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{19, 20}, {19, 20}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 36676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{21, 22}, {19, 20}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 36686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{19, 20}, {19, 20}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 36696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{21, 22}, {19, 20}} /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 36706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, 36716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { /* TC 9: .>12->xyz */ 36726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{23, 24}, {23, 24}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 36736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{23, 25}, {23, 24}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 36746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{23, 24}, {23, 24}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 36756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{23, 25}, {23, 24}} /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 36766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, 36776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { /* TC 10: a.>67->xyz */ 36786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{26, 26}, {26, 26}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 36796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{26, 27}, {26, 28}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 36806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{26, 28}, {26, 28}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 36816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{26, 27}, {26, 28}} /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 36826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, 36836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { /* TC 11: 124JIH */ 36846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{30, 30}, {30, 30}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 36856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{29, 30}, {29, 30}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 36866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{30, 30}, {30, 30}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 36876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{30, 30}, {30, 30}} /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 36886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, 36896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { /* TC 12: 124 JIH */ 36906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{32, 32}, {32, 32}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 36916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{31, 32}, {31, 32}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 36926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{31, 32}, {31, 32}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 36936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{31, 32}, {31, 32}} /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 36946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 36956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 36966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 36976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool 36986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgassertRoundTrip(UBiDi *pBiDi, int32_t tc, int32_t outIndex, const char *srcChars, 36996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *destChars, const UChar *dest, int32_t destLen, 37006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int mode, int option, UBiDiLevel level) { 37016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 37026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const char roundtrip[TC_COUNT][MODES_COUNT][OPTIONS_COUNT] 37036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org [LEVELS_COUNT] = { 37046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { /* TC 0: 123 */ 37056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 37066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 37076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 37086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 37096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}} /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */ 37106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, 37116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { /* TC 1: .123->4.5 */ 37126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 37136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 37146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 37156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 37166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}} /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */ 37176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, 37186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { /* TC 2: 678 */ 37196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 37206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 37216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 37226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 37236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}} /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */ 37246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, 37256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { /* TC 3: .678->8.9 */ 37266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 37276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 37286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 37296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 37306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 0, 0}, { 1, 1}} /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */ 37316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, 37326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { /* TC 4: MLK1.2,3JIH */ 37336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 37346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 37356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 37366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 37376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}} /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */ 37386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, 37396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { /* TC 5: FE.>12-> */ 37406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 37416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 37426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 0, 1}, { 1, 1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 37436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 37446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}} /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */ 37456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, 37466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { /* TC 6: JIH.>12->a */ 37476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 37486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 37496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 0, 0}, { 1, 1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 37506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 37516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}} /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */ 37526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, 37536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { /* TC 7: CBA.>67->89=a */ 37546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 37556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 37566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 0, 1}, { 1, 1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 37576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 37586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 0, 0}, { 1, 1}} /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */ 37596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, 37606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { /* TC 8: CBA.>123->xyz */ 37616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 37626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 37636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 0, 0}, { 1, 1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 37646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 37656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}} /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */ 37666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, 37676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { /* TC 9: .>12->xyz */ 37686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 37696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 37706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 0}, { 1, 1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 37716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 37726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}} /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */ 37736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, 37746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { /* TC 10: a.>67->xyz */ 37756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 37766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 37776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 37786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 37796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 0}, { 1, 1}} /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */ 37806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, 37816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { /* TC 11: 123JIH */ 37826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 37836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 37846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 37856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 37866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}} /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */ 37876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, 37886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { /* TC 12: 123 JIH */ 37896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 37906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 37916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 37926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 37936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {{ 1, 1}, { 1, 1}} /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */ 37946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 37956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 37966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 37976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org #define SET_ROUND_TRIP_MODE(mode) \ 37986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setReorderingMode(pBiDi, mode); \ 37996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org desc = #mode; \ 38006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 38016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 38026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode rc = U_ZERO_ERROR; 38036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar dest2[MAXLEN]; 38046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t destLen2; 38056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char* desc; 38066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char destChars2[MAXLEN]; 38076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char destChars3[MAXLEN]; 38086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 38096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org switch (modes[mode].value) { 38106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case UBIDI_REORDER_NUMBERS_SPECIAL: 38116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SET_ROUND_TRIP_MODE(UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL) 38126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case UBIDI_REORDER_GROUP_NUMBERS_WITH_R: 38136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SET_ROUND_TRIP_MODE(UBIDI_REORDER_GROUP_NUMBERS_WITH_R) 38146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case UBIDI_REORDER_RUNS_ONLY: 38156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SET_ROUND_TRIP_MODE(UBIDI_REORDER_RUNS_ONLY) 38166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case UBIDI_REORDER_INVERSE_NUMBERS_AS_L: 38176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SET_ROUND_TRIP_MODE(UBIDI_REORDER_DEFAULT) 38186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case UBIDI_REORDER_INVERSE_LIKE_DIRECT: 38196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SET_ROUND_TRIP_MODE(UBIDI_REORDER_DEFAULT) 38206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL: 38216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SET_ROUND_TRIP_MODE(UBIDI_REORDER_NUMBERS_SPECIAL) 38226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org default: 38236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SET_ROUND_TRIP_MODE(UBIDI_REORDER_INVERSE_LIKE_DIRECT) 38246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 38256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setReorderingOptions(pBiDi, UBIDI_OPTION_REMOVE_CONTROLS); 38266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 38276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(pBiDi, dest, destLen, level, NULL, &rc); 38286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertSuccessful("ubidi_setPara", &rc); 38296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *dest2 = 0; 38306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destLen2 = ubidi_writeReordered(pBiDi, dest2, MAXLEN, UBIDI_DO_MIRRORING, 38316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org &rc); 38326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertSuccessful("ubidi_writeReordered", &rc); 38336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 38346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u16ToPseudo(destLen, dest, destChars3); 38356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u16ToPseudo(destLen2, dest2, destChars2); 38366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org checkWhatYouCan(pBiDi, destChars3, destChars2); 38376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (strcmp(srcChars, destChars2)) { 38386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (roundtrip[tc][mode][option][level]) { 38396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nRound trip failed for case=%d mode=%d option=%d.\n" 38406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "%20s %s\n%20s %s\n%20s %s\n%20s %s\n%20s %s" 38416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\n%20s %u\n", tc, mode, option, 38426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Original text:", srcChars, 38436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Round-tripped text:", destChars2, 38446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Intermediate text:", destChars3, 38456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Reordering mode:", modes[mode].description, 38466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Reordering option:", options[option].description, 38476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Paragraph level:", level); 38486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 38496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else { 38506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\nExpected round trip failure for case=%d mode=%d option=%d.\n" 38516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "%20s %s\n%20s %s\n%20s %s\n%20s %s\n%20s %s" 38526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\n%20s %u\n", tc, mode, option, 38536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Original text:", srcChars, 38546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Round-tripped text:", destChars2, 38556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Intermediate text:", destChars3, 38566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Reordering mode:", modes[mode].description, 38576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Reordering option:", options[option].description, 38586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Paragraph level:", level); 38596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 38606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 38616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 38626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!checkResultLength(pBiDi, destChars, destChars2, destLen2, 38636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org desc, "UBIDI_OPTION_REMOVE_CONTROLS", level)) { 38646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 38656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 38666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (outIndex > -1 && !checkMaps(pBiDi, outIndex, srcChars, destChars, 38676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org desc, "UBIDI_OPTION_REMOVE_CONTROLS", 38686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org level, FALSE)) { 38696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 38706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 38716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 38726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 38736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 38746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool 38756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgcheckResultLength(UBiDi *pBiDi, const char *srcChars, const char *destChars, 38766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t destLen, const char* mode, 38776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char* option, UBiDiLevel level) { 38786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t actualLen; 38796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (strcmp(mode, "UBIDI_REORDER_INVERSE_NUMBERS_AS_L") == 0) 38806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org actualLen = strlen(destChars); 38816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else 38826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org actualLen = ubidi_getResultLength(pBiDi); 38836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (actualLen != destLen) { 38846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nubidi_getResultLength failed.\n%20s %7d\n%20s %7d\n" 38856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "%20s %s\n%20s %s\n%20s %s\n%20s %s\n%20s %u\n", 38866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Expected:", destLen, "Actual:", actualLen, 38876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Input:", srcChars, "Output:", destChars, 38886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Reordering mode:", mode, "Reordering option:", option, 38896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Paragraph level:", level); 38906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 38916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 38926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 38936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 38946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 38956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void 38966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtestReorderRunsOnly(void) { 38976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const struct { 38986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char* textIn; 38996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char* textOut[2][2]; 39006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char noroundtrip[2]; 39016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } testCases[] = { 39026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"ab 234 896 de", {{"de 896 ab 234", "de 896 ab 234"}, /*0*/ 39036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"ab 234 @896@ de", "de 896 ab 234"}}, {0, 0}}, 39046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"abcGHI", {{"GHIabc", "GHIabc"}, {"GHIabc", "GHIabc"}}, {0, 0}}, /*1*/ 39056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"a.>67->", {{"<-67<.a", "<-67<.a"}, {"<-67<.a", "<-67<.a"}}, {0, 0}}, /*2*/ 39066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"-=%$123/ *", {{"* /%$123=-", "* /%$123=-"}, /*3*/ 39076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"* /%$123=-", "* /%$123=-"}}, {0, 0}}, 39086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"abc->12..>JKL", {{"JKL<..12<-abc", "JKL<..abc->12"}, /*4*/ 39096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"JKL<..12<-abc", "JKL<..abc->12"}}, {0, 0}}, 39106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"JKL->12..>abc", {{"abc<..JKL->12", "abc<..12<-JKL"}, /*5*/ 39116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"abc<..JKL->12", "abc<..12<-JKL"}}, {0, 0}}, 39126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"123->abc", {{"abc<-123", "abc<-123"}, /*6*/ 39136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"abc&<-123", "abc<-123"}}, {1, 0}}, 39146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"123->JKL", {{"JKL<-123", "123->JKL"}, /*7*/ 39156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"JKL<-123", "JKL<-@123"}}, {0, 1}}, 39166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"*>12.>34->JKL", {{"JKL<-34<.12<*", "12.>34->JKL<*"}, /*8*/ 39176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"JKL<-34<.12<*", "JKL<-@34<.12<*"}}, {0, 1}}, 39186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"*>67.>89->JKL", {{"67.>89->JKL<*", "67.>89->JKL<*"}, /*9*/ 39196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"67.>89->JKL<*", "67.>89->JKL<*"}}, {0, 0}}, 39206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"* /abc-=$%123", {{"$%123=-abc/ *", "abc-=$%123/ *"}, /*10*/ 39216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"$%123=-abc/ *", "abc-=$%123/ *"}}, {0, 0}}, 39226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"* /$%def-=123", {{"123=-def%$/ *", "def-=123%$/ *"}, /*11*/ 39236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"123=-def%$/ *", "def-=123%$/ *"}}, {0, 0}}, 39246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"-=GHI* /123%$", {{"GHI* /123%$=-", "123%$/ *GHI=-"}, /*12*/ 39256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"GHI* /123%$=-", "123%$/ *GHI=-"}}, {0, 0}}, 39266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"-=%$JKL* /123", {{"JKL* /%$123=-", "123/ *JKL$%=-"}, /*13*/ 39276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"JKL* /%$123=-", "123/ *JKL$%=-"}}, {0, 0}}, 39286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"ab =#CD *?450", {{"CD *?450#= ab", "450?* CD#= ab"}, /*14*/ 39296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"CD *?450#= ab", "450?* CD#= ab"}}, {0, 0}}, 39306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"ab 234 896 de", {{"de 896 ab 234", "de 896 ab 234"}, /*15*/ 39316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"ab 234 @896@ de", "de 896 ab 234"}}, {0, 0}}, 39326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"abc-=%$LMN* /123", {{"LMN* /%$123=-abc", "123/ *LMN$%=-abc"}, /*16*/ 39336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"LMN* /%$123=-abc", "123/ *LMN$%=-abc"}}, {0, 0}}, 39346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"123->JKL&MN&P", {{"JKLMNP<-123", "123->JKLMNP"}, /*17*/ 39356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"JKLMNP<-123", "JKLMNP<-@123"}}, {0, 1}}, 39366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"123", {{"123", "123"}, /* just one run */ /*18*/ 39376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"123", "123"}}, {0, 0}} 39386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 39396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDi *pBiDi = getBiDiObject(); 39406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDi *pL2VBiDi = getBiDiObject(); 39416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar src[MAXLEN], dest[MAXLEN], visual1[MAXLEN], visual2[MAXLEN]; 39426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char destChars[MAXLEN], vis1Chars[MAXLEN], vis2Chars[MAXLEN]; 39436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t srcLen, destLen, vis1Len, vis2Len, option, i, j, nCases, paras; 39446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode rc = U_ZERO_ERROR; 39456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDiLevel level; 39466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 39476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\nEntering TestReorderRunsOnly\n\n"); 39486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 39496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!pL2VBiDi) { 39506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(pBiDi); /* in case this one was allocated */ 39516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 39526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 39536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setReorderingMode(pBiDi, UBIDI_REORDER_RUNS_ONLY); 39546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setReorderingOptions(pL2VBiDi, UBIDI_OPTION_REMOVE_CONTROLS); 39556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 39566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (option = 0; option < 2; option++) { 39576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setReorderingOptions(pBiDi, option==0 ? UBIDI_OPTION_REMOVE_CONTROLS 39586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org : UBIDI_OPTION_INSERT_MARKS); 39596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0, nCases = LENGTHOF(testCases); i < nCases; i++) { 39606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = strlen(testCases[i].textIn); 39616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToU16(srcLen, testCases[i].textIn, src); 39626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(j = 0; j < 2; j++) { 39636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Now doing test for option %d, case %d, level %d\n", 39646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i, option, j); 39656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org level = paraLevels[j]; 39666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(pBiDi, src, srcLen, level, NULL, &rc); 39676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertSuccessful("ubidi_setPara", &rc); 39686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *dest = 0; 39696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destLen = ubidi_writeReordered(pBiDi, dest, MAXLEN, UBIDI_DO_MIRRORING, &rc); 39706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertSuccessful("ubidi_writeReordered", &rc); 39716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u16ToPseudo(destLen, dest, destChars); 39726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org checkWhatYouCan(pBiDi, testCases[i].textIn, destChars); 39736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertStringsEqual(testCases[i].textOut[option][level], destChars, 39746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testCases[i].textIn, "UBIDI_REORDER_RUNS_ONLY", 39756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org option==0 ? "0" : "UBIDI_OPTION_INSERT_MARKS", 39766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pBiDi); 39776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 39786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if((option==0) && testCases[i].noroundtrip[level]) { 39796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 39806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 39816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(pL2VBiDi, src, srcLen, level, NULL, &rc); 39826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertSuccessful("ubidi_setPara1", &rc); 39836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *visual1 = 0; 39846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org vis1Len = ubidi_writeReordered(pL2VBiDi, visual1, MAXLEN, UBIDI_DO_MIRRORING, &rc); 39856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertSuccessful("ubidi_writeReordered1", &rc); 39866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u16ToPseudo(vis1Len, visual1, vis1Chars); 39876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org checkWhatYouCan(pL2VBiDi, testCases[i].textIn, vis1Chars); 39886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(pL2VBiDi, dest, destLen, level^1, NULL, &rc); 39896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertSuccessful("ubidi_setPara2", &rc); 39906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *visual2 = 0; 39916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org vis2Len = ubidi_writeReordered(pL2VBiDi, visual2, MAXLEN, UBIDI_DO_MIRRORING, &rc); 39926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertSuccessful("ubidi_writeReordered2", &rc); 39936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u16ToPseudo(vis2Len, visual2, vis2Chars); 39946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org checkWhatYouCan(pL2VBiDi, destChars, vis2Chars); 39956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertStringsEqual(vis1Chars, vis2Chars, 39966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testCases[i].textIn, "UBIDI_REORDER_RUNS_ONLY (2)", 39976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org option==0 ? "0" : "UBIDI_OPTION_INSERT_MARKS", 39986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pBiDi); 39996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 40006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 40016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 40026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 40036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* test with null or empty text */ 40046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(pBiDi, src, 0, UBIDI_LTR, NULL, &rc); 40056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertSuccessful("ubidi_setPara3", &rc); 40066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org paras = ubidi_countParagraphs(pBiDi); 40076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (paras != 0) { 40086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nInvalid number of paras (should be 0): %d\n", paras); 40096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 40106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 40116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(pBiDi); 40126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(pL2VBiDi); 40136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 40146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\nExiting TestReorderRunsOnly\n\n"); 40156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 40166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 40176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void 40186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtestReorderingMode(void) { 40196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 40206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar src[MAXLEN], dest[MAXLEN]; 40216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char destChars[MAXLEN]; 40226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDi *pBiDi = NULL, *pBiDi2 = NULL, *pBiDi3 = NULL; 40236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode rc; 40246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int tc, mode, option, level; 40256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t optionValue, optionBack; 40266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDiReorderingMode modeValue, modeBack; 40276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t srcLen, destLen, idx; 40286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *expectedChars; 40296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool testOK = TRUE; 40306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 40316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\nEntering TestReorderingMode\n\n"); 40326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 40336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pBiDi = getBiDiObject(); 40346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pBiDi2 = getBiDiObject(); 40356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pBiDi3 = getBiDiObject(); 40366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!pBiDi3) { 40376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(pBiDi); /* in case this one was allocated */ 40386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(pBiDi2); /* in case this one was allocated */ 40396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 40406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 40416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 40426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setInverse(pBiDi2, TRUE); 40436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 40446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (tc = 0; tc < TC_COUNT; tc++) { 40456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *srcChars = textIn[tc]; 40466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = strlen(srcChars); 40476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToU16(srcLen, srcChars, src); 40486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 40496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (mode = 0; mode < MODES_COUNT; mode++) { 40506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org modeValue = modes[mode].value; 40516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setReorderingMode(pBiDi, modeValue); 40526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org modeBack = ubidi_getReorderingMode(pBiDi); 40536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (modeValue != modeBack) { 40546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Error while setting reordering mode to %d, returned %d\n", 40556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org modeValue, modeBack); 40566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 40576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 40586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (option = 0; option < OPTIONS_COUNT; option++) { 40596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org optionValue = options[option].value; 40606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setReorderingOptions(pBiDi, optionValue); 40616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org optionBack = ubidi_getReorderingOptions(pBiDi); 40626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (optionValue != optionBack) { 40636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Error while setting reordering option to %d, returned %d\n", 40646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org optionValue, optionBack); 40656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 40666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 40676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (level = 0; level < LEVELS_COUNT; level++) { 40686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("starting test %d mode=%d option=%d level=%d\n", 40696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tc, modes[mode].value, options[option].value, level); 40706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rc = U_ZERO_ERROR; 40716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(pBiDi, src, srcLen, paraLevels[level], NULL, &rc); 40726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertSuccessful("ubidi_setPara", &rc); 40736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 40746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *dest = 0; 40756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destLen = ubidi_writeReordered(pBiDi, dest, MAXLEN, 40766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBIDI_DO_MIRRORING, &rc); 40776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertSuccessful("ubidi_writeReordered", &rc); 40786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u16ToPseudo(destLen, dest, destChars); 40796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!((modes[mode].value == UBIDI_REORDER_INVERSE_NUMBERS_AS_L) && 40806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (options[option].value == UBIDI_OPTION_INSERT_MARKS))) { 40816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org checkWhatYouCan(pBiDi, srcChars, destChars); 40826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 40836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 40846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (modes[mode].value == UBIDI_REORDER_INVERSE_NUMBERS_AS_L) { 40856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org idx = -1; 40866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expectedChars = inverseBasic(pBiDi2, srcChars, srcLen, 40876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org options[option].value, paraLevels[level], destChars); 40886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 40896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else { 40906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org idx = outIndices[tc][mode][option][level]; 40916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expectedChars = textOut[idx]; 40926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 40936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!assertStringsEqual(expectedChars, destChars, srcChars, 40946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org modes[mode].description, 40956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org options[option].description, 40966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pBiDi)) { 40976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testOK = FALSE; 40986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 40996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (options[option].value == UBIDI_OPTION_INSERT_MARKS && 41006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org !assertRoundTrip(pBiDi3, tc, idx, srcChars, 41016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destChars, dest, destLen, 41026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org mode, option, paraLevels[level])) { 41036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testOK = FALSE; 41046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 41056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else if (!checkResultLength(pBiDi, srcChars, destChars, 41066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destLen, modes[mode].description, 41076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org options[option].description, 41086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org paraLevels[level])) { 41096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testOK = FALSE; 41106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 41116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else if (idx > -1 && !checkMaps(pBiDi, idx, srcChars, 41126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destChars, modes[mode].description, 41136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org options[option].description, paraLevels[level], 41146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TRUE)) { 41156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testOK = FALSE; 41166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 41176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 41186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 41196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 41206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 41216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (testOK == TRUE) { 41226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\nReordering mode test OK\n"); 41236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 41246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(pBiDi3); 41256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(pBiDi2); 41266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(pBiDi); 41276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 41286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\nExiting TestReorderingMode\n\n"); 41296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 41306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 41316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char* inverseBasic(UBiDi *pBiDi, const char *srcChars, int32_t srcLen, 41326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t option, UBiDiLevel level, char *result) { 41336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode rc = U_ZERO_ERROR; 41346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t destLen; 41356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar src[MAXLEN], dest2[MAXLEN]; 41366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 41376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (pBiDi == NULL || src == NULL) { 41386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 41396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 41406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setReorderingOptions(pBiDi, option); 41416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToU16(srcLen, srcChars, src); 41426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(pBiDi, src, srcLen, level, NULL, &rc); 41436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertSuccessful("ubidi_setPara", &rc); 41446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 41456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *dest2 = 0; 41466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destLen = ubidi_writeReordered(pBiDi, dest2, MAXLEN, 41476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBIDI_DO_MIRRORING, &rc); 41486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertSuccessful("ubidi_writeReordered", &rc); 41496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u16ToPseudo(destLen, dest2, result); 41506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!(option == UBIDI_OPTION_INSERT_MARKS)) { 41516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org checkWhatYouCan(pBiDi, srcChars, result); 41526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 41536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return result; 41546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 41556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 41566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define NULL_CHAR '\0' 41576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 41586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void 41596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtestStreaming(void) { 41606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define MAXPORTIONS 10 41616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 41626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const struct { 41636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char* textIn; 41646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org short int chunk; 41656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org short int nPortions[2]; 41666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char portionLens[2][MAXPORTIONS]; 41676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char* message[2]; 41686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } testData[] = { 41696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { "123\\u000A" 41706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "abc45\\u000D" 41716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "67890\\u000A" 41726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u000D" 41736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "02468\\u000D" 41746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "ghi", 41756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6, { 6, 6 }, {{ 4, 6, 6, 1, 6, 3}, { 4, 6, 6, 1, 6, 3 }}, 41766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"4, 6, 6, 1, 6, 3", "4, 6, 6, 1, 6, 3"} 41776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, 41786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { "abcd\\u000Afgh\\u000D12345\\u000A456", 41796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6, { 4, 4 }, {{ 5, 4, 6, 3 }, { 5, 4, 6, 3 }}, 41806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"5, 4, 6, 3", "5, 4, 6, 3"} 41816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, 41826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { "abcd\\u000Afgh\\u000D12345\\u000A45\\u000D", 41836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6, { 4, 4 }, {{ 5, 4, 6, 3 }, { 5, 4, 6, 3 }}, 41846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"5, 4, 6, 3", "5, 4, 6, 3"} 41856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, 41866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { "abcde\\u000Afghi", 41876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10, { 2, 2 }, {{ 6, 4 }, { 6, 4 }}, 41886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {"6, 4", "6, 4"} 41896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 41906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 41916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar src[MAXLEN]; 41926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDi *pBiDi = NULL; 41936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar *pSrc; 41946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode rc = U_ZERO_ERROR; 41956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t srcLen, processedLen, chunk, len, nPortions; 41966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int i, j, levelIndex; 41976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDiLevel level; 41986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int nTests = LENGTHOF(testData), nLevels = LENGTHOF(paraLevels); 41996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool mismatch, testOK = TRUE; 42006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char processedLenStr[MAXPORTIONS * 5]; 42016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 42026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\nEntering TestStreaming\n\n"); 42036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 42046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pBiDi = getBiDiObject(); 42056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 42066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_orderParagraphsLTR(pBiDi, TRUE); 42076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 42086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (levelIndex = 0; levelIndex < nLevels; levelIndex++) { 42096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0; i < nTests; i++) { 42106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape(testData[i].textIn, src, MAXLEN); 42116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org chunk = testData[i].chunk; 42126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org nPortions = testData[i].nPortions[levelIndex]; 42136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org level = paraLevels[levelIndex]; 42146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org processedLenStr[0] = NULL_CHAR; 42156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Testing level %d, case %d\n", level, i); 42166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 42176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org mismatch = FALSE; 42186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 42196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setReorderingOptions(pBiDi, UBIDI_OPTION_STREAMING); 42206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (j = 0, pSrc = src; j < MAXPORTIONS && srcLen > 0; j++) { 42216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 42226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org len = chunk < srcLen ? chunk : srcLen; 42236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(pBiDi, pSrc, len, level, NULL, &rc); 42246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!assertSuccessful("ubidi_setPara", &rc)) { 42256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 42266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 42276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 42286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org processedLen = ubidi_getProcessedLength(pBiDi); 42296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (processedLen == 0) { 42306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setReorderingOptions(pBiDi, UBIDI_OPTION_DEFAULT); 42316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org j--; 42326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 42336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 42346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setReorderingOptions(pBiDi, UBIDI_OPTION_STREAMING); 42356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 42366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org mismatch |= (UBool)(j >= nPortions || 42376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org processedLen != testData[i].portionLens[levelIndex][j]); 42386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 42396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sprintf(processedLenStr + j * 4, "%4d", processedLen); 42406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen -= processedLen, pSrc += processedLen; 42416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 42426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 42436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (mismatch || j != nPortions) { 42446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testOK = FALSE; 42456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nProcessed lengths mismatch.\n" 42466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\tParagraph level: %u\n" 42476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\tInput string: %s\n" 42486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\tActually processed portion lengths: { %s }\n" 42496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\tExpected portion lengths : { %s }\n", 42506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org paraLevels[levelIndex], testData[i].textIn, 42516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org processedLenStr, testData[i].message[levelIndex]); 42526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 42536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 42546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 42556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(pBiDi); 42566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (testOK == TRUE) { 42576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\nBiDi streaming test OK\n"); 42586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 42596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\nExiting TestStreaming\n\n"); 42606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 42616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 42626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CDECL_BEGIN 42636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 42646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UCharDirection U_CALLCONV 42656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgoverrideBidiClass(const void *context, UChar32 c) { 42666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 42676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define DEF U_BIDI_CLASS_DEFAULT 42686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 42696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UCharDirection customClasses[] = { 42706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 0/8 1/9 2/A 3/B 4/C 5/D 6/E 7/F */ 42716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DEF, DEF, DEF, DEF, DEF, DEF, DEF, DEF, /* 00-07 */ 42726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DEF, DEF, DEF, DEF, DEF, DEF, DEF, DEF, /* 08-0F */ 42736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DEF, DEF, DEF, DEF, DEF, DEF, DEF, DEF, /* 10-17 */ 42746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DEF, DEF, DEF, DEF, DEF, DEF, DEF, DEF, /* 18-1F */ 42756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DEF, DEF, DEF, DEF, DEF, DEF, R, DEF, /* 20-27 */ 42766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DEF, DEF, DEF, DEF, DEF, DEF, DEF, DEF, /* 28-2F */ 42776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org EN, EN, EN, EN, EN, EN, AN, AN, /* 30-37 */ 42786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org AN, AN, DEF, DEF, DEF, DEF, DEF, DEF, /* 38-3F */ 42796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org L, AL, AL, AL, AL, AL, AL, R, /* 40-47 */ 42806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org R, R, R, R, R, R, R, R, /* 48-4F */ 42816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org R, R, R, R, R, R, R, R, /* 50-57 */ 42826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org R, R, R, LRE, DEF, RLE, PDF, S, /* 58-5F */ 42836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org NSM, DEF, DEF, DEF, DEF, DEF, DEF, DEF, /* 60-67 */ 42846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DEF, DEF, DEF, DEF, DEF, DEF, DEF, DEF, /* 68-6F */ 42856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DEF, DEF, DEF, DEF, DEF, DEF, DEF, DEF, /* 70-77 */ 42866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DEF, DEF, DEF, LRO, B, RLO, BN, DEF /* 78-7F */ 42876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 42886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const int nEntries = LENGTHOF(customClasses); 42896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *dummy = context; /* just to avoid a compiler warning */ 42906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dummy++; 42916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 42926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return c >= nEntries ? U_BIDI_CLASS_DEFAULT : customClasses[c]; 42936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 42946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 42956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CDECL_END 42966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 42976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void verifyCallbackParams(UBiDiClassCallback* fn, const void* context, 42986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDiClassCallback* expectedFn, 42996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const void* expectedContext, 43006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t sizeOfContext) { 43016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (fn != expectedFn) { 43026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Class callback pointer is not set properly.\n"); 43036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 43046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (context != expectedContext) { 43056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Class callback context is not set properly.\n"); 43066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 43076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else if (context != NULL && 43086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org memcmp(context, expectedContext, sizeOfContext)) { 43096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Callback context content doesn't match the expected one.\n"); 43106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 43116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 43126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 43136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void 43146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtestClassOverride(void) { 43156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const char* const textSrc = "JIH.>12->a \\u05D0\\u05D1 6 ABC78"; 43166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const char* const textResult = "12<.HIJ->a 78CBA 6 \\u05D1\\u05D0"; 43176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 43186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar src[MAXLEN], dest[MAXLEN]; 43196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode rc = U_ZERO_ERROR; 43206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDi *pBiDi = NULL; 43216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDiClassCallback* oldFn = NULL; 43226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDiClassCallback* newFn = overrideBidiClass; 43236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const void* oldContext = NULL; 43246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t srcLen, destLen, textSrcSize = (int32_t)uprv_strlen(textSrc); 43256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char* destChars = NULL; 43266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 43276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\nEntering TestClassOverride\n\n"); 43286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 43296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pBiDi = getBiDiObject(); 43306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!pBiDi) { 43316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 43326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 43336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 43346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_getClassCallback(pBiDi, &oldFn, &oldContext); 43356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org verifyCallbackParams(oldFn, oldContext, NULL, NULL, 0); 43366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 43376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setClassCallback(pBiDi, newFn, textSrc, &oldFn, &oldContext, &rc); 43386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!assertSuccessful("ubidi_setClassCallback", &rc)) { 43396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(pBiDi); 43406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 43416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 43426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org verifyCallbackParams(oldFn, oldContext, NULL, NULL, 0); 43436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 43446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_getClassCallback(pBiDi, &oldFn, &oldContext); 43456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org verifyCallbackParams(oldFn, oldContext, newFn, textSrc, textSrcSize); 43466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 43476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setClassCallback(pBiDi, newFn, textSrc, &oldFn, &oldContext, &rc); 43486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!assertSuccessful("ubidi_setClassCallback", &rc)) { 43496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(pBiDi); 43506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 43516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 43526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org verifyCallbackParams(oldFn, oldContext, newFn, textSrc, textSrcSize); 43536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 43546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = u_unescape(textSrc, src, MAXLEN); 43556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(pBiDi, src, srcLen, UBIDI_LTR, NULL, &rc); 43566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertSuccessful("ubidi_setPara", &rc); 43576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 43586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destLen = ubidi_writeReordered(pBiDi, dest, MAXLEN, 43596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBIDI_DO_MIRRORING, &rc); 43606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertSuccessful("ubidi_writeReordered", &rc); 43616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 43626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destChars = aescstrdup(dest, destLen); 43636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (uprv_strcmp(textResult, destChars)) { 43646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nActual and expected output mismatch.\n" 43656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "%20s %s\n%20s %s\n%20s %s\n", 43666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Input:", textSrc, "Actual output:", destChars, 43676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Expected output:", textResult); 43686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 43696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else { 43706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\nClass override test OK\n"); 43716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 43726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(pBiDi); 43736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\nExiting TestClassOverride\n\n"); 43746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 43756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 43766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic char * formatMap(const int32_t * map, int len, char * buffer) 43776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 43786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i, k; 43796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char c; 43806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0; i < len; i++) { 43816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org k = map[i]; 43826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (k < 0) 43836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org c = '-'; 43846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else if (k >= sizeof(columns)) 43856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org c = '+'; 43866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else 43876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org c = columns[k]; 43886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org buffer[i] = c; 43896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 43906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org buffer[len] = '\0'; 43916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return buffer; 43926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 43936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 43946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool 43956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgcheckMaps(UBiDi *pBiDi, int32_t stringIndex, const char *src, const char *dest, 43966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *mode, const char* option, UBiDiLevel level, UBool forward) 43976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 43986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t actualLogicalMap[MAX_MAP_LENGTH]; 43996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t actualVisualMap[MAX_MAP_LENGTH]; 44006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t getIndexMap[MAX_MAP_LENGTH]; 44016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i, srcLen, resLen, idx; 44026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const int32_t *expectedLogicalMap, *expectedVisualMap; 44036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode rc = U_ZERO_ERROR; 44046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool testOK = TRUE; 44056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 44066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (forward) { 44076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expectedLogicalMap = forwardMap[stringIndex]; 44086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expectedVisualMap = inverseMap[stringIndex]; 44096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 44106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else { 44116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expectedLogicalMap = inverseMap[stringIndex]; 44126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expectedVisualMap = forwardMap[stringIndex]; 44136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 44146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_getLogicalMap(pBiDi, actualLogicalMap, &rc); 44156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!assertSuccessful("ubidi_getLogicalMap", &rc)) { 44166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testOK = FALSE; 44176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 44186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = ubidi_getProcessedLength(pBiDi); 44196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (memcmp(expectedLogicalMap, actualLogicalMap, srcLen * sizeof(int32_t))) { 44206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char expChars[MAX_MAP_LENGTH]; 44216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char actChars[MAX_MAP_LENGTH]; 44226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nubidi_getLogicalMap() returns unexpected map for output string " 44236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "index %d\n" 44246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "source: %s\n" 44256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "dest : %s\n" 44266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Scale : %s\n" 44276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "ExpMap: %s\n" 44286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Actual: %s\n" 44296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Paragraph level : %d == %d\n" 44306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Reordering mode : %s == %d\n" 44316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Reordering option: %s == %d\n" 44326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Forward flag : %d\n", 44336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stringIndex, src, dest, columns, 44346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org formatMap(expectedLogicalMap, srcLen, expChars), 44356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org formatMap(actualLogicalMap, srcLen, actChars), 44366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org level, ubidi_getParaLevel(pBiDi), 44376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org mode, ubidi_getReorderingMode(pBiDi), 44386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org option, ubidi_getReorderingOptions(pBiDi), 44396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org forward 44406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ); 44416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testOK = FALSE; 44426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 44436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org resLen = ubidi_getResultLength(pBiDi); 44446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_getVisualMap(pBiDi, actualVisualMap, &rc); 44456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertSuccessful("ubidi_getVisualMap", &rc); 44466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (memcmp(expectedVisualMap, actualVisualMap, resLen * sizeof(int32_t))) { 44476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char expChars[MAX_MAP_LENGTH]; 44486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char actChars[MAX_MAP_LENGTH]; 44496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nubidi_getVisualMap() returns unexpected map for output string " 44506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "index %d\n" 44516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "source: %s\n" 44526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "dest : %s\n" 44536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Scale : %s\n" 44546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "ExpMap: %s\n" 44556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Actual: %s\n" 44566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Paragraph level : %d == %d\n" 44576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Reordering mode : %s == %d\n" 44586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Reordering option: %s == %d\n" 44596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Forward flag : %d\n", 44606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stringIndex, src, dest, columns, 44616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org formatMap(expectedVisualMap, resLen, expChars), 44626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org formatMap(actualVisualMap, resLen, actChars), 44636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org level, ubidi_getParaLevel(pBiDi), 44646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org mode, ubidi_getReorderingMode(pBiDi), 44656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org option, ubidi_getReorderingOptions(pBiDi), 44666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org forward 44676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ); 44686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testOK = FALSE; 44696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 44706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0; i < srcLen; i++) { 44716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org idx = ubidi_getVisualIndex(pBiDi, i, &rc); 44726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertSuccessful("ubidi_getVisualIndex", &rc); 44736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org getIndexMap[i] = idx; 44746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 44756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (memcmp(actualLogicalMap, getIndexMap, srcLen * sizeof(int32_t))) { 44766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char actChars[MAX_MAP_LENGTH]; 44776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char gotChars[MAX_MAP_LENGTH]; 44786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nMismatch between ubidi_getLogicalMap and ubidi_getVisualIndex for output string " 44796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "index %d\n" 44806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "source: %s\n" 44816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "dest : %s\n" 44826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Scale : %s\n" 44836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "ActMap: %s\n" 44846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "IdxMap: %s\n" 44856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Paragraph level : %d == %d\n" 44866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Reordering mode : %s == %d\n" 44876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Reordering option: %s == %d\n" 44886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Forward flag : %d\n", 44896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stringIndex, src, dest, columns, 44906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org formatMap(actualLogicalMap, srcLen, actChars), 44916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org formatMap(getIndexMap, srcLen, gotChars), 44926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org level, ubidi_getParaLevel(pBiDi), 44936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org mode, ubidi_getReorderingMode(pBiDi), 44946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org option, ubidi_getReorderingOptions(pBiDi), 44956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org forward 44966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ); 44976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testOK = FALSE; 44986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 44996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0; i < resLen; i++) { 45006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org idx = ubidi_getLogicalIndex(pBiDi, i, &rc); 45016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertSuccessful("ubidi_getLogicalIndex", &rc); 45026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org getIndexMap[i] = idx; 45036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 45046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (memcmp(actualVisualMap, getIndexMap, resLen * sizeof(int32_t))) { 45056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char actChars[MAX_MAP_LENGTH]; 45066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char gotChars[MAX_MAP_LENGTH]; 45076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nMismatch between ubidi_getVisualMap and ubidi_getLogicalIndex for output string " 45086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "index %d\n" 45096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "source: %s\n" 45106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "dest : %s\n" 45116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Scale : %s\n" 45126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "ActMap: %s\n" 45136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "IdxMap: %s\n" 45146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Paragraph level : %d == %d\n" 45156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Reordering mode : %s == %d\n" 45166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Reordering option: %s == %d\n" 45176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Forward flag : %d\n", 45186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stringIndex, src, dest, columns, 45196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org formatMap(actualVisualMap, resLen, actChars), 45206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org formatMap(getIndexMap, resLen, gotChars), 45216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org level, ubidi_getParaLevel(pBiDi), 45226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org mode, ubidi_getReorderingMode(pBiDi), 45236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org option, ubidi_getReorderingOptions(pBiDi), 45246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org forward 45256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ); 45266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testOK = FALSE; 45276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 45286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return testOK; 45296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 45306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 45316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool 45326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgassertIllegalArgument(const char* message, UErrorCode* rc) { 45336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (*rc != U_ILLEGAL_ARGUMENT_ERROR) { 45346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("%s() failed with error %s.\n", message, myErrorName(*rc)); 45356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 45366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 45376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 45386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 45396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 45406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct { 45416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char* prologue; 45426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char* source; 45436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char* epilogue; 45446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char* expected; 45456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDiLevel paraLevel; 45466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} contextCase; 45476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 45486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const contextCase contextData[] = { 45496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*00*/ {"", "", "", "", UBIDI_LTR}, 45506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*01*/ {"", ".-=JKL-+*", "", ".-=LKJ-+*", UBIDI_LTR}, 45516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*02*/ {" ", ".-=JKL-+*", " ", ".-=LKJ-+*", UBIDI_LTR}, 45526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*03*/ {"a", ".-=JKL-+*", "b", ".-=LKJ-+*", UBIDI_LTR}, 45536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*04*/ {"D", ".-=JKL-+*", "", "LKJ=-.-+*", UBIDI_LTR}, 45546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*05*/ {"", ".-=JKL-+*", " D", ".-=*+-LKJ", UBIDI_LTR}, 45556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*06*/ {"", ".-=JKL-+*", " 2", ".-=*+-LKJ", UBIDI_LTR}, 45566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*07*/ {"", ".-=JKL-+*", " 7", ".-=*+-LKJ", UBIDI_LTR}, 45576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*08*/ {" G 1", ".-=JKL-+*", " H", "*+-LKJ=-.", UBIDI_LTR}, 45586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*09*/ {"7", ".-=JKL-+*", " H", ".-=*+-LKJ", UBIDI_LTR}, 45596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*10*/ {"", ".-=abc-+*", "", "*+-abc=-.", UBIDI_RTL}, 45606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*11*/ {" ", ".-=abc-+*", " ", "*+-abc=-.", UBIDI_RTL}, 45616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*12*/ {"D", ".-=abc-+*", "G", "*+-abc=-.", UBIDI_RTL}, 45626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*13*/ {"x", ".-=abc-+*", "", "*+-.-=abc", UBIDI_RTL}, 45636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*14*/ {"", ".-=abc-+*", " y", "abc-+*=-.", UBIDI_RTL}, 45646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*15*/ {"", ".-=abc-+*", " 2", "abc-+*=-.", UBIDI_RTL}, 45656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*16*/ {" x 1", ".-=abc-+*", " 2", ".-=abc-+*", UBIDI_RTL}, 45666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*17*/ {" x 7", ".-=abc-+*", " 8", "*+-.-=abc", UBIDI_RTL}, 45676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*18*/ {"x|", ".-=abc-+*", " 8", "*+-abc=-.", UBIDI_RTL}, 45686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*19*/ {"G|y", ".-=abc-+*", " 8", "*+-.-=abc", UBIDI_RTL}, 45696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*20*/ {"", ".-=", "", ".-=", UBIDI_DEFAULT_LTR}, 45706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*21*/ {"D", ".-=", "", "=-.", UBIDI_DEFAULT_LTR}, 45716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*22*/ {"G", ".-=", "", "=-.", UBIDI_DEFAULT_LTR}, 45726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*23*/ {"xG", ".-=", "", ".-=", UBIDI_DEFAULT_LTR}, 45736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*24*/ {"x|G", ".-=", "", "=-.", UBIDI_DEFAULT_LTR}, 45746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*25*/ {"x|G", ".-=|-+*", "", "=-.|-+*", UBIDI_DEFAULT_LTR}, 45756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 45766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define CONTEXT_COUNT LENGTHOF(contextData) 45776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 45786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void 45796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtestContext(void) { 45806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 45816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar prologue[MAXLEN], epilogue[MAXLEN], src[MAXLEN], dest[MAXLEN]; 45826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char destChars[MAXLEN]; 45836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBiDi *pBiDi = NULL; 45846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode rc; 45856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t proLength, epiLength, srcLen, destLen, tc; 45866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org contextCase cc; 45876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool testOK = TRUE; 45886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 45896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\nEntering TestContext \n\n"); 45906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 45916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* test null BiDi object */ 45926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rc = U_ZERO_ERROR; 45936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setContext(pBiDi, NULL, 0, NULL, 0, &rc); 45946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testOK &= assertIllegalArgument("Error when BiDi object is null", &rc); 45956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 45966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pBiDi = getBiDiObject(); 45976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_orderParagraphsLTR(pBiDi, TRUE); 45986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 45996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* test proLength < -1 */ 46006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rc = U_ZERO_ERROR; 46016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setContext(pBiDi, NULL, -2, NULL, 0, &rc); 46026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testOK &= assertIllegalArgument("Error when proLength < -1", &rc); 46036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* test epiLength < -1 */ 46046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rc = U_ZERO_ERROR; 46056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setContext(pBiDi, NULL, 0, NULL, -2, &rc); 46066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testOK &= assertIllegalArgument("Error when epiLength < -1", &rc); 46076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* test prologue == NULL */ 46086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rc = U_ZERO_ERROR; 46096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setContext(pBiDi, NULL, 3, NULL, 0, &rc); 46106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testOK &= assertIllegalArgument("Prologue is NULL", &rc); 46116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* test epilogue == NULL */ 46126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rc = U_ZERO_ERROR; 46136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setContext(pBiDi, NULL, 0, NULL, 4, &rc); 46146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testOK &= assertIllegalArgument("Epilogue is NULL", &rc); 46156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 46166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (tc = 0; tc < CONTEXT_COUNT; tc++) { 46176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org cc = contextData[tc]; 46186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org proLength = strlen(cc.prologue); 46196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToU16(proLength, cc.prologue, prologue); 46206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org epiLength = strlen(cc.epilogue); 46216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToU16(epiLength, cc.epilogue, epilogue); 46226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* in the call below, prologue and epilogue are swapped to show 46236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org that the next call will override this call */ 46246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rc = U_ZERO_ERROR; 46256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setContext(pBiDi, epilogue, epiLength, prologue, proLength, &rc); 46266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testOK &= assertSuccessful("swapped ubidi_setContext", &rc); 46276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setContext(pBiDi, prologue, -1, epilogue, -1, &rc); 46286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testOK &= assertSuccessful("regular ubidi_setContext", &rc); 46296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcLen = strlen(cc.source); 46306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pseudoToU16(srcLen, cc.source, src); 46316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_setPara(pBiDi, src, srcLen, cc.paraLevel, NULL, &rc); 46326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testOK &= assertSuccessful("ubidi_setPara", &rc); 46336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org destLen = ubidi_writeReordered(pBiDi, dest, MAXLEN, UBIDI_DO_MIRRORING, &rc); 46346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertSuccessful("ubidi_writeReordered", &rc); 46356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u16ToPseudo(destLen, dest, destChars); 46366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (uprv_strcmp(cc.expected, destChars)) { 46376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char formatChars[MAXLEN]; 46386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("\nActual and expected output mismatch on case %d.\n" 46396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "%20s %s\n%20s %s\n%20s %s\n%20s %s\n%20s %s\n%20s %s\n%20s %d\n%20s %u\n%20s %d\n", 46406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tc, 46416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Prologue:", cc.prologue, 46426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Input:", cc.source, 46436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Epilogue:", cc.epilogue, 46446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Expected output:", cc.expected, 46456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Actual output:", destChars, 46466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Levels:", formatLevels(pBiDi, formatChars), 46476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Reordering mode:", ubidi_getReorderingMode(pBiDi), 46486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Paragraph level:", ubidi_getParaLevel(pBiDi), 46496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Reordering option:", ubidi_getReorderingOptions(pBiDi)); 46506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testOK = FALSE; 46516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 46526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 46536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (testOK == TRUE) { 46546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\nContext test OK\n"); 46556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 46566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ubidi_close(pBiDi); 46576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 46586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("\nExiting TestContext \n\n"); 46596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4660d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org 4661d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org/* Ticket#11054 ubidi_setPara crash with heavily nested brackets */ 4662d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.orgstatic void 4663d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.orgtestBracketOverflow(void) { 4664d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org static const char* TEXT = "(((((((((((((((((((((((((((((((((((((((((a)(A)))))))))))))))))))))))))))))))))))))))))"; 4665d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 4666d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org UBiDi* bidi; 4667d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org UChar src[100]; 4668d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org UChar dest[100]; 4669d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org int32_t len; 4670d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org 4671d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org bidi = ubidi_open(); 4672d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org len = uprv_strlen(TEXT); 4673d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org pseudoToU16(len, TEXT, src); 4674d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org ubidi_setPara(bidi, src, len, UBIDI_DEFAULT_LTR , NULL, &status); 4675d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org if (U_FAILURE(status)) { 4676d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org log_err("setPara failed with heavily nested brackets - %s", u_errorName(status)); 4677d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org } 4678d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org 4679d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org ubidi_close(bidi); 4680d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org} 4681d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org 4682