10596faeddefbf198de137d5e893708495ab1584cFredrik Roubert// © 2016 and later: Unicode, Inc. and others. 264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html 3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/******************************************************************** 4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT: 5fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius * Copyright (c) 1997-2014, International Business Machines Corporation and 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved. 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/ 859d709d503bab6e2b61931737e662dd293b40578ccornelius/* file name: cbiditst.c 90596faeddefbf198de137d5e893708495ab1584cFredrik Roubert* encoding: UTF-8 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* tab size: 8 (not used) 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* indentation:4 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* created on: 1999sep27 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* created by: Markus W. Scherer, updated by Matitiahu Allouche 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cintltst.h" 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h" 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uchar.h" 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h" 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ubidi.h" 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ushape.h" 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cbiditst.h" 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h" 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* the following include is needed for sprintf */ 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdio.h> 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define MAXLEN MAX_STRING_LENGTH 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* prototypes ---------------------------------------------------------------*/ 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addComplexTest(TestNode** root); 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testCharFromDirProp(void); 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testBidi(void); 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void doTests(UBiDi *pBiDi, UBiDi *pLine, UBool countRunsFirst); 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void doMisc(void); 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void doTest(UBiDi *pBiDi, int testNumber, const BiDiTestData *test, 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t lineStart, UBool countRunsFirst); 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void _testReordering(UBiDi *pBiDi, int testNumber); 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testInverse(void); 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void _testManyInverseBidi(UBiDi *pBiDi, UBiDiLevel direction); 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void _testInverseBidi(UBiDi *pBiDi, const UChar *src, int32_t srcLength, 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDiLevel direction, UErrorCode *pErrorCode); 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void _testWriteReverse(void); 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void _testManyAddedPoints(void); 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void _testMisc(void); 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void doArabicShapingTest(void); 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void doLamAlefSpecialVLTRArabicShapingTest(void); 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void doTashkeelSpecialVLTRArabicShapingTest(void); 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void doLOGICALArabicDeShapingTest(void); 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void doArabicShapingTestForBug5421(void); 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 7054dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic void doArabicShapingTestForBug8703(void); 7154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 7254dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic void doArabicShapingTestForBug9024(void); 7354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 7459d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic void _testPresentationForms(const UChar *in); 7559d709d503bab6e2b61931737e662dd293b40578ccornelius 7659d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic void doArabicShapingTestForNewCharacters(void); 7759d709d503bab6e2b61931737e662dd293b40578ccornelius 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testReorder(void); 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 8054dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic void testReorderArabicMathSymbols(void); 8154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testFailureRecovery(void); 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testMultipleParagraphs(void); 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 8627f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void testGetBaseDirection(void); 8727f654740f2a26ad62a5c155af9199af9e69b889claireho 88b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void testContext(void); 89b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 90b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void doTailTest(void); 91b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 92f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusstatic void testBracketOverflow(void); 930596faeddefbf198de137d5e893708495ab1584cFredrik Roubertstatic void TestExplicitLevel0(); 94f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* new BIDI API */ 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testReorderingMode(void); 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testReorderRunsOnly(void); 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testStreaming(void); 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testClassOverride(void); 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* inverseBasic(UBiDi *pBiDi, const char *src, int32_t srcLen, 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t option, UBiDiLevel level, char *result); 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool assertRoundTrip(UBiDi *pBiDi, int32_t tc, int32_t outIndex, 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *srcChars, const char *destChars, 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *dest, int32_t destLen, int mode, 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int option, UBiDiLevel level); 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool checkResultLength(UBiDi *pBiDi, const char *srcChars, 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *destChars, 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t destLen, const char *mode, 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *option, UBiDiLevel level); 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool checkMaps(UBiDi *pBiDi, int32_t stringIndex, const char *src, 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *dest, const char *mode, const char* option, 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDiLevel level, UBool forward); 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* helpers ------------------------------------------------------------------ */ 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char *levelString="..............................................................."; 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void initCharFromDirProps(void); 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UChar * 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerugetStringFromDirProps(const uint8_t *dirProps, int32_t length, UChar *buffer); 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void printUnicode(const UChar *s, int32_t length, const UBiDiLevel *levels); 124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* regression tests ---------------------------------------------------------*/ 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruaddComplexTest(TestNode** root) { 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, testCharFromDirProp, "complex/bidi/TestCharFromDirProp"); 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, testBidi, "complex/bidi/TestBidi"); 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, testInverse, "complex/bidi/TestInverse"); 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, testReorder,"complex/bidi/TestReorder"); 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, testFailureRecovery,"complex/bidi/TestFailureRecovery"); 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, testMultipleParagraphs,"complex/bidi/TestMultipleParagraphs"); 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, testReorderingMode, "complex/bidi/TestReorderingMode"); 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, testReorderRunsOnly, "complex/bidi/TestReorderRunsOnly"); 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, testStreaming, "complex/bidi/TestStreaming"); 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, testClassOverride, "complex/bidi/TestClassOverride"); 139b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho addTest(root, testGetBaseDirection, "complex/bidi/testGetBaseDirection"); 140b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho addTest(root, testContext, "complex/bidi/testContext"); 141f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius addTest(root, testBracketOverflow, "complex/bidi/TestBracketOverflow"); 1420596faeddefbf198de137d5e893708495ab1584cFredrik Roubert addTest(root, &TestExplicitLevel0, "complex/bidi/TestExplicitLevel0"); 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, doArabicShapingTest, "complex/arabic-shaping/ArabicShapingTest"); 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, doLamAlefSpecialVLTRArabicShapingTest, "complex/arabic-shaping/lamalef"); 146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, doTashkeelSpecialVLTRArabicShapingTest, "complex/arabic-shaping/tashkeel"); 147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, doLOGICALArabicDeShapingTest, "complex/arabic-shaping/unshaping"); 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, doArabicShapingTestForBug5421, "complex/arabic-shaping/bug-5421"); 149b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho addTest(root, doTailTest, "complex/arabic-shaping/tailtest"); 15054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius addTest(root, doArabicShapingTestForBug8703, "complex/arabic-shaping/bug-8703"); 15154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius addTest(root, testReorderArabicMathSymbols, "complex/bidi/bug-9024"); 15254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius addTest(root, doArabicShapingTestForBug9024, "complex/arabic-shaping/bug-9024"); 15359d709d503bab6e2b61931737e662dd293b40578ccornelius addTest(root, doArabicShapingTestForNewCharacters, "complex/arabic-shaping/shaping2"); 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerutestCharFromDirProp(void) { 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* verify that the exemplar characters have the expected bidi classes */ 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i; 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\nEntering TestCharFromDirProp\n\n"); 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru initCharFromDirProps(); 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<U_CHAR_DIRECTION_COUNT; ++i) { 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u_charDirection(charFromDirProp[i])!=(UCharDirection)i) { 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nu_charDirection(charFromDirProp[%d]=U+%04x)==%d!=%d\n", 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, charFromDirProp[i], u_charDirection(charFromDirProp[i]), i); 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\nExiting TestCharFromDirProp\n\n"); 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerutestBidi(void) { 175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDi *pBiDi, *pLine=NULL; 176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode=U_ZERO_ERROR; 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\nEntering TestBidi\n\n"); 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pBiDi=ubidi_openSized(MAXLEN, 0, &errorCode); 181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(pBiDi!=NULL) { 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pLine=ubidi_open(); 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(pLine!=NULL) { 184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTests(pBiDi, pLine, FALSE); 185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTests(pBiDi, pLine, TRUE); 186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_open() returned NULL, out of memory\n"); 188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_openSized() returned NULL, errorCode %s\n", myErrorName(errorCode)); 191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doMisc(); 193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(pLine!=NULL) { 195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(pLine); 196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(pBiDi!=NULL) { 198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(pBiDi); 199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\nExiting TestBidi\n\n"); 202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerudoTests(UBiDi *pBiDi, UBiDi *pLine, UBool countRunsFirst) { 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int testNumber; 207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar string[MAXLEN]; 208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t lineStart; 210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDiLevel paraLevel; 211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(testNumber=0; testNumber<bidiTestCount; ++testNumber) { 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru getStringFromDirProps(tests[testNumber].text, tests[testNumber].length, string); 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru paraLevel=tests[testNumber].paraLevel; 216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(pBiDi, string, -1, paraLevel, NULL, &errorCode); 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(errorCode)) { 218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("ubidi_setPara(tests[%d], paraLevel %d) ok, direction %d paraLevel=%d\n", 219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testNumber, paraLevel, ubidi_getDirection(pBiDi), paraLevel); 220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lineStart=tests[testNumber].lineStart; 221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(lineStart==-1) { 222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(pBiDi, testNumber, tests+testNumber, 0, countRunsFirst); 223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setLine(pBiDi, lineStart, tests[testNumber].lineLimit, pLine, &errorCode); 225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(errorCode)) { 226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("ubidi_setLine(%d, %d) ok, direction %d paraLevel=%d\n", 227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lineStart, tests[testNumber].lineLimit, ubidi_getDirection(pLine), ubidi_getParaLevel(pLine)); 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(pLine, testNumber, tests+testNumber, lineStart, countRunsFirst); 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_setLine(tests[%d], %d, %d) failed with errorCode %s\n", 231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testNumber, lineStart, tests[testNumber].lineLimit, myErrorName(errorCode)); 232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_setPara(tests[%d], paraLevel %d) failed with errorCode %s\n", 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testNumber, paraLevel, myErrorName(errorCode)); 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char columns[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TABLE_SIZE 256 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool tablesInitialized = FALSE; 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UChar pseudoToUChar[TABLE_SIZE]; 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic uint8_t UCharToPseudo[TABLE_SIZE]; /* used for Unicode chars < 0x0100 */ 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic uint8_t UCharToPseud2[TABLE_SIZE]; /* used for Unicode chars >=0x0100 */ 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void buildPseudoTables(void) 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru The rules for pseudo-Bidi are as follows: 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru - [ == LRE 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru - ] == RLE 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru - { == LRO 255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru - } == RLO 256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru - ^ == PDF 257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru - @ == LRM 258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru - & == RLM 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru - A-F == Arabic Letters 0631-0636 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru - G-V == Hebrew letters 05d7-05e6 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru - W-Z == Unassigned RTL 08d0-08d3 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru - 0-5 == western digits 0030-0035 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru - 6-9 == Arabic-Indic digits 0666-0669 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru - ` == Combining Grave Accent 0300 (NSM) 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru - ~ == Delete 007f (BN) 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru - | == Paragraph Separator 2029 (B) 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru - _ == Info Separator 1 001f (S) 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru All other characters represent themselves as Latin-1, with the corresponding 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Bidi properties. 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i; 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar uchar; 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t c; 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* initialize all tables to unknown */ 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=0; i < TABLE_SIZE; i++) { 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[i] = 0xFFFD; 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCharToPseudo[i] = '?'; 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCharToPseud2[i] = '?'; 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* initialize non letters or digits */ 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t) 0 ] = 0x0000; UCharToPseudo[0x00] = (uint8_t) 0 ; 283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)' '] = 0x0020; UCharToPseudo[0x20] = (uint8_t)' '; 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)'!'] = 0x0021; UCharToPseudo[0x21] = (uint8_t)'!'; 285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)'"'] = 0x0022; UCharToPseudo[0x22] = (uint8_t)'"'; 286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)'#'] = 0x0023; UCharToPseudo[0x23] = (uint8_t)'#'; 287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)'$'] = 0x0024; UCharToPseudo[0x24] = (uint8_t)'$'; 288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)'%'] = 0x0025; UCharToPseudo[0x25] = (uint8_t)'%'; 289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)'\'']= 0x0027; UCharToPseudo[0x27] = (uint8_t)'\''; 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)'('] = 0x0028; UCharToPseudo[0x28] = (uint8_t)'('; 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)')'] = 0x0029; UCharToPseudo[0x29] = (uint8_t)')'; 292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)'*'] = 0x002A; UCharToPseudo[0x2A] = (uint8_t)'*'; 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)'+'] = 0x002B; UCharToPseudo[0x2B] = (uint8_t)'+'; 294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)','] = 0x002C; UCharToPseudo[0x2C] = (uint8_t)','; 295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)'-'] = 0x002D; UCharToPseudo[0x2D] = (uint8_t)'-'; 296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)'.'] = 0x002E; UCharToPseudo[0x2E] = (uint8_t)'.'; 297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)'/'] = 0x002F; UCharToPseudo[0x2F] = (uint8_t)'/'; 298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)':'] = 0x003A; UCharToPseudo[0x3A] = (uint8_t)':'; 299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)';'] = 0x003B; UCharToPseudo[0x3B] = (uint8_t)';'; 300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)'<'] = 0x003C; UCharToPseudo[0x3C] = (uint8_t)'<'; 301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)'='] = 0x003D; UCharToPseudo[0x3D] = (uint8_t)'='; 302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)'>'] = 0x003E; UCharToPseudo[0x3E] = (uint8_t)'>'; 303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)'?'] = 0x003F; UCharToPseudo[0x3F] = (uint8_t)'?'; 304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)'\\']= 0x005C; UCharToPseudo[0x5C] = (uint8_t)'\\'; 305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* initialize specially used characters */ 306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)'`'] = 0x0300; UCharToPseud2[0x00] = (uint8_t)'`'; /* NSM */ 307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)'@'] = 0x200E; UCharToPseud2[0x0E] = (uint8_t)'@'; /* LRM */ 308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)'&'] = 0x200F; UCharToPseud2[0x0F] = (uint8_t)'&'; /* RLM */ 309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)'_'] = 0x001F; UCharToPseudo[0x1F] = (uint8_t)'_'; /* S */ 310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)'|'] = 0x2029; UCharToPseud2[0x29] = (uint8_t)'|'; /* B */ 311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)'['] = 0x202A; UCharToPseud2[0x2A] = (uint8_t)'['; /* LRE */ 312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)']'] = 0x202B; UCharToPseud2[0x2B] = (uint8_t)']'; /* RLE */ 313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)'^'] = 0x202C; UCharToPseud2[0x2C] = (uint8_t)'^'; /* PDF */ 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)'{'] = 0x202D; UCharToPseud2[0x2D] = (uint8_t)'{'; /* LRO */ 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)'}'] = 0x202E; UCharToPseud2[0x2E] = (uint8_t)'}'; /* RLO */ 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[(uint8_t)'~'] = 0x007F; UCharToPseudo[0x7F] = (uint8_t)'~'; /* BN */ 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* initialize western digits */ 318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0, uchar = 0x0030; i < 6; i++, uchar++) { 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = (uint8_t)columns[i]; 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[c] = uchar; 321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCharToPseudo[uchar & 0x00ff] = c; 322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* initialize Hindi digits */ 324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 6, uchar = 0x0666; i < 10; i++, uchar++) { 325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = (uint8_t)columns[i]; 326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[c] = uchar; 327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCharToPseud2[uchar & 0x00ff] = c; 328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* initialize Arabic letters */ 330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 10, uchar = 0x0631; i < 16; i++, uchar++) { 331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = (uint8_t)columns[i]; 332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[c] = uchar; 333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCharToPseud2[uchar & 0x00ff] = c; 334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* initialize Hebrew letters */ 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 16, uchar = 0x05D7; i < 32; i++, uchar++) { 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = (uint8_t)columns[i]; 338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[c] = uchar; 339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCharToPseud2[uchar & 0x00ff] = c; 340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* initialize Unassigned code points */ 342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 32, uchar=0x08D0; i < 36; i++, uchar++) { 343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = (uint8_t)columns[i]; 344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[c] = uchar; 345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCharToPseud2[uchar & 0x00ff] = c; 346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* initialize Latin lower case letters */ 348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 36, uchar = 0x0061; i < 62; i++, uchar++) { 349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = (uint8_t)columns[i]; 350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToUChar[c] = uchar; 351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCharToPseudo[uchar & 0x00ff] = c; 352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tablesInitialized = TRUE; 354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*----------------------------------------------------------------------*/ 357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int pseudoToU16(const int length, const char * input, UChar * output) 359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* This function converts a pseudo-Bidi string into a UChar string. 360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru It returns the length of the UChar string. 361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i; 364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!tablesInitialized) { 365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buildPseudoTables(); 366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < length; i++) 368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru output[i] = pseudoToUChar[(uint8_t)input[i]]; 369b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho output[length] = 0; 370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return length; 371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*----------------------------------------------------------------------*/ 374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int u16ToPseudo(const int length, const UChar * input, char * output) 376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* This function converts a UChar string into a pseudo-Bidi string. 377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru It returns the length of the pseudo-Bidi string. 378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i; 381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar uchar; 382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!tablesInitialized) { 383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buildPseudoTables(); 384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < length; i++) 386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uchar = input[i]; 388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru output[i] = uchar < 0x0100 ? UCharToPseudo[uchar] : 389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCharToPseud2[uchar & 0x00ff]; 390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru output[length] = '\0'; 392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return length; 393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic char * formatLevels(UBiDi *bidi, char *buffer) { 396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UBiDiLevel* gotLevels = ubidi_getLevels(bidi, &ec); 398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int len = ubidi_getLength(bidi); 399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char c; 400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i, k; 401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(ec)) { 403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcpy(buffer, "BAD LEVELS"); 404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return buffer; 405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=0; i<len; i++) { 407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru k = gotLevels[i]; 408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (k >= sizeof(columns)) 409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = '+'; 410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else 411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = columns[k]; 412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[i] = c; 413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[len] = '\0'; 415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return buffer; 416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char *reorderingModeNames[] = { 418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "UBIDI_REORDER_DEFAULT", 419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "UBIDI_REORDER_NUMBERS_SPECIAL", 420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "UBIDI_REORDER_GROUP_NUMBERS_WITH_R", 421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "UBIDI_REORDER_RUNS_ONLY", 422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "UBIDI_REORDER_INVERSE_NUMBERS_AS_L", 423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "UBIDI_REORDER_INVERSE_LIKE_DIRECT", 424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL"}; 425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic char *reorderingOptionNames(char *buffer, int options) { 427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[0] = 0; 428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (options & UBIDI_OPTION_INSERT_MARKS) { 429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(buffer, " UBIDI_OPTION_INSERT_MARKS"); 430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (options & UBIDI_OPTION_REMOVE_CONTROLS) { 432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(buffer, " UBIDI_OPTION_REMOVE_CONTROLS"); 433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (options & UBIDI_OPTION_STREAMING) { 435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(buffer, " UBIDI_OPTION_STREAMING"); 436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return buffer; 438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void printCaseInfo(UBiDi *bidi, const char *src, const char *dst) 441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* src and dst are char arrays encoded as pseudo Bidi */ 442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Since calls to log_err with a \n within the pattern increment the 444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * error count, new lines are issued via fputs, except when we want the 445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * increment to happen. 446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode=U_ZERO_ERROR; 448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i, length = ubidi_getProcessedLength(bidi); 449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UBiDiLevel *levels; 450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char levelChars[MAXLEN]; 451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDiLevel lev; 452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t runCount; 453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char buffer[100]; 454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("========================================"); fputs("\n", stderr); 455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru levels = ubidi_getLevels(bidi, &errorCode); 456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(errorCode)) { 457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcpy(levelChars, "BAD LEVELS"); 458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Processed length: %d", length); fputs("\n", stderr); 460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < length; i++) { 461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lev = levels[i]; 462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (lev < sizeof(columns)) { 463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru levelChars[i] = columns[lev]; 464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru levelChars[i] = '+'; 466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru levelChars[length] = 0; 469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Levels: %s", levelChars); fputs("\n", stderr); 471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Source: %s", src); fputs("\n", stderr); 472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Result: %s", dst); fputs("\n", stderr); 473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Direction: %d", ubidi_getDirection(bidi)); fputs("\n", stderr); 474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("paraLevel: %d", ubidi_getParaLevel(bidi)); fputs("\n", stderr); 475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i = ubidi_getReorderingMode(bidi); 476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("reorderingMode: %d = %s", i, reorderingModeNames[i]); 477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fputs("\n", stderr); 478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i = ubidi_getReorderingOptions(bidi); 479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("reorderingOptions: %d = %s", i, reorderingOptionNames(buffer, i)); 480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fputs("\n", stderr); 481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru runCount = ubidi_countRuns(bidi, &errorCode); 482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(errorCode)) { 483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err( "BAD RUNS"); 484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Runs: %d => logicalStart.length/level: ", runCount); 486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < runCount; i++) { 487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDiDirection dir; 488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t start, len; 489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dir = ubidi_getVisualRun(bidi, i, &start, &len); 490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err(" %d.%d/%d", start, len, dir); 491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fputs("\n", stderr); 494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool matchingPair(UBiDi *bidi, int32_t i, char c1, char c2) 497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* No test for []{} since they have special meaning for pseudo Bidi */ 499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static char mates1Chars[] = "<>()"; 500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static char mates2Chars[] = "><)("; 501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDiLevel level; 502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int k, len; 503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c1 == c2) { 505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* For UBIDI_REORDER_RUNS_ONLY, it would not be correct to check levels[i], 508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru so we use the appropriate run's level, which is good for all cases. 509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_getLogicalRun(bidi, i, NULL, &level); 511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((level & 1) == 0) { 512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru len = strlen(mates1Chars); 515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (k = 0; k < len; k++) { 516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((c1 == mates1Chars[k]) && (c2 == mates2Chars[k])) { 517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool checkWhatYouCan(UBiDi *bidi, const char *srcChars, const char *dstChars) 524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* srcChars and dstChars are char arrays encoded as pseudo Bidi */ 525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i, idx, logLimit, visLimit; 527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool testOK, errMap, errDst; 528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode=U_ZERO_ERROR; 529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t visMap[MAXLEN]; 530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t logMap[MAXLEN]; 531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char accumSrc[MAXLEN]; 532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char accumDst[MAXLEN]; 533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_getVisualMap(bidi, visMap, &errorCode); 534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_getLogicalMap(bidi, logMap, &errorCode); 535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(errorCode)) { 536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error #1 invoking ICU within checkWhatYouCan\n"); 537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testOK = TRUE; 541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errMap = errDst = FALSE; 542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logLimit = ubidi_getProcessedLength(bidi); 543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru visLimit = ubidi_getResultLength(bidi); 544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru memset(accumSrc, '?', logLimit); 545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru memset(accumDst, '?', visLimit); 546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < logLimit; i++) { 548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru idx = ubidi_getVisualIndex(bidi, i, &errorCode); 549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (idx != logMap[i]) { 550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errMap = TRUE; 551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (idx == UBIDI_MAP_NOWHERE) { 553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (idx >= visLimit) { 556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru accumDst[idx] = srcChars[i]; 559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!matchingPair(bidi, i, srcChars[i], dstChars[idx])) { 560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errDst = TRUE; 561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru accumDst[visLimit] = 0; 564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(errorCode)) { 565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error #2 invoking ICU within checkWhatYouCan\n"); 566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (errMap) { 569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (testOK) { 570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printCaseInfo(bidi, srcChars, dstChars); 571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testOK = FALSE; 572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Mismatch between getLogicalMap() and getVisualIndex()\n"); 574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Map :"); 575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < logLimit; i++) { 576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err(" %d", logMap[i]); 577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fputs("\n", stderr); 579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Indexes:"); 580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < logLimit; i++) { 581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err(" %d", ubidi_getVisualIndex(bidi, i, &errorCode)); 582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fputs("\n", stderr); 584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (errDst) { 586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (testOK) { 587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printCaseInfo(bidi, srcChars, dstChars); 588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testOK = FALSE; 589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Source does not map to Result\n"); 591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("We got: %s", accumDst); fputs("\n", stderr); 592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errMap = errDst = FALSE; 595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < visLimit; i++) { 596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru idx = ubidi_getLogicalIndex(bidi, i, &errorCode); 597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (idx != visMap[i]) { 598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errMap = TRUE; 599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (idx == UBIDI_MAP_NOWHERE) { 601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (idx >= logLimit) { 604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru accumSrc[idx] = dstChars[i]; 607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!matchingPair(bidi, idx, srcChars[idx], dstChars[i])) { 608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errDst = TRUE; 609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru accumSrc[logLimit] = 0; 612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(errorCode)) { 613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error #3 invoking ICU within checkWhatYouCan\n"); 614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (errMap) { 617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (testOK) { 618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printCaseInfo(bidi, srcChars, dstChars); 619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testOK = FALSE; 620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Mismatch between getVisualMap() and getLogicalIndex()\n"); 622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Map :"); 623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < visLimit; i++) { 624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err(" %d", visMap[i]); 625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fputs("\n", stderr); 627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Indexes:"); 628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < visLimit; i++) { 629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err(" %d", ubidi_getLogicalIndex(bidi, i, &errorCode)); 630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fputs("\n", stderr); 632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (errDst) { 634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (testOK) { 635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printCaseInfo(bidi, srcChars, dstChars); 636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testOK = FALSE; 637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Result does not map to Source\n"); 639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("We got: %s", accumSrc); 640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fputs("\n", stderr); 641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return testOK; 643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerutestReorder(void) { 647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* const logicalOrder[] ={ 648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "del(KC)add(K.C.&)", 649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "del(QDVT) add(BVDL)", 650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "del(PQ)add(R.S.)T)U.&", 651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "del(LV)add(L.V.) L.V.&", 652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "day 0 R DPDHRVR dayabbr", 653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "day 1 H DPHPDHDA dayabbr", 654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "day 2 L DPBLENDA dayabbr", 655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "day 3 J DPJQVM dayabbr", 656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "day 4 I DPIQNF dayabbr", 657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "day 5 M DPMEG dayabbr", 658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "helloDPMEG", 659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "hello WXYZ" 660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* const visualOrder[]={ 662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "del(CK)add(&.C.K)", 663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "del(TVDQ) add(LDVB)", 66459d709d503bab6e2b61931737e662dd293b40578ccornelius "del(QP)add(S.R.)&.U(T", /* updated for Unicode 6.3 matching brackets */ 66559d709d503bab6e2b61931737e662dd293b40578ccornelius "del(VL)add(V.L.) &.V.L", /* updated for Unicode 6.3 matching brackets */ 666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "day 0 RVRHDPD R dayabbr", 667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "day 1 ADHDPHPD H dayabbr", 668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "day 2 ADNELBPD L dayabbr", 669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "day 3 MVQJPD J dayabbr", 670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "day 4 FNQIPD I dayabbr", 671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "day 5 GEMPD M dayabbr", 672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "helloGEMPD", 673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "hello ZYXW" 674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* const visualOrder1[]={ 676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ")K.C.&(dda)KC(led", 677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ")BVDL(dda )QDVT(led", 67859d709d503bab6e2b61931737e662dd293b40578ccornelius "T(U.&).R.S(dda)PQ(led", /* updated for Unicode 6.3 matching brackets */ 67959d709d503bab6e2b61931737e662dd293b40578ccornelius "L.V.& ).L.V(dda)LV(led", /* updated for Unicode 6.3 matching brackets */ 680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "rbbayad R DPDHRVR 0 yad", 681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "rbbayad H DPHPDHDA 1 yad", 682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "rbbayad L DPBLENDA 2 yad", 683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "rbbayad J DPJQVM 3 yad", 684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "rbbayad I DPIQNF 4 yad", 685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "rbbayad M DPMEG 5 yad", 686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "DPMEGolleh", 687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "WXYZ olleh" 688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* const visualOrder2[]={ 691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "@)@K.C.&@(dda)@KC@(led", 692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "@)@BVDL@(dda )@QDVT@(led", 693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "R.S.)T)U.&@(dda)@PQ@(led", 694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "L.V.) L.V.&@(dda)@LV@(led", 695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "rbbayad @R DPDHRVR@ 0 yad", 696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "rbbayad @H DPHPDHDA@ 1 yad", 697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "rbbayad @L DPBLENDA@ 2 yad", 698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "rbbayad @J DPJQVM@ 3 yad", 699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "rbbayad @I DPIQNF@ 4 yad", 700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "rbbayad @M DPMEG@ 5 yad", 701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "DPMEGolleh", 702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "WXYZ@ olleh" 703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* const visualOrder3[]={ 705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ")K.C.&(KC)dda(led", 706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ")BVDL(ddaQDVT) (led", 707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "R.S.)T)U.&(PQ)dda(led", 708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "L.V.) L.V.&(LV)dda(led", 709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "rbbayad DPDHRVR R 0 yad", 710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "rbbayad DPHPDHDA H 1 yad", 711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "rbbayad DPBLENDA L 2 yad", 712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "rbbayad DPJQVM J 3 yad", 713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "rbbayad DPIQNF I 4 yad", 714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "rbbayad DPMEG M 5 yad", 715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "DPMEGolleh", 716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "WXYZ olleh" 717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* const visualOrder4[]={ 719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "del(add(CK(.C.K)", 720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "del( (TVDQadd(LDVB)", 721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "del(add(QP(.U(T(.S.R", 722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "del(add(VL(.V.L (.V.L", 723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "day 0 R RVRHDPD dayabbr", 724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "day 1 H ADHDPHPD dayabbr", 725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "day 2 L ADNELBPD dayabbr", 726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "day 3 J MVQJPD dayabbr", 727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "day 4 I FNQIPD dayabbr", 728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "day 5 M GEMPD dayabbr", 729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "helloGEMPD", 730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "hello ZYXW" 731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char formatChars[MAXLEN]; 733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDi* bidi = ubidi_open(); 735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i; 736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\nEntering TestReorder\n\n"); 738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 739f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius for(i=0;i<UPRV_LENGTHOF(logicalOrder);i++){ 740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t srcSize = (int32_t)strlen(logicalOrder[i]); 741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t destSize = srcSize*2; 742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar src[MAXLEN]; 743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar dest[MAXLEN]; 744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char chars[MAXLEN]; 745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing L2V #1 for case %d\n", i); 746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToU16(srcSize,logicalOrder[i],src); 747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ec = U_ZERO_ERROR; 748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi,src,srcSize,UBIDI_DEFAULT_LTR ,NULL,&ec); 749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(ec)){ 750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_setPara(tests[%d], paraLevel %d) failed with errorCode %s\n", 751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, UBIDI_DEFAULT_LTR, u_errorName(ec)); 752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* try pre-flighting */ 754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destSize = ubidi_writeReordered(bidi,dest,0,UBIDI_DO_MIRRORING,&ec); 755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(ec!=U_BUFFER_OVERFLOW_ERROR){ 756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Pre-flighting did not give expected error: Expected: U_BUFFER_OVERFLOW_ERROR. Got: %s \n",u_errorName(ec)); 757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else if(destSize!=srcSize){ 758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Pre-flighting did not give expected size: Expected: %d. Got: %d \n",srcSize,destSize); 759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else{ 760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ec= U_ZERO_ERROR; 761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destSize=ubidi_writeReordered(bidi,dest,destSize+1,UBIDI_DO_MIRRORING,&ec); 763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u16ToPseudo(destSize,dest,chars); 764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(destSize!=srcSize){ 765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_writeReordered() destSize and srcSize do not match\n"); 766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else if(strcmp(visualOrder[i],chars)!=0){ 767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_writeReordered() did not give expected results for UBIDI_DO_MIRRORING.\n" 768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Input : %s\nExpected: %s\nGot : %s\nLevels : %s\nAt Index: %d\n", 769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logicalOrder[i],visualOrder[i],chars,formatLevels(bidi, formatChars),i); 770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru checkWhatYouCan(bidi, logicalOrder[i], chars); 772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 774f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius for(i=0;i<UPRV_LENGTHOF(logicalOrder);i++){ 775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t srcSize = (int32_t)strlen(logicalOrder[i]); 776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t destSize = srcSize*2; 777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar src[MAXLEN]; 778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar dest[MAXLEN]; 779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char chars[MAXLEN]; 780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing L2V #2 for case %d\n", i); 781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToU16(srcSize,logicalOrder[i],src); 782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ec = U_ZERO_ERROR; 783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi,src,srcSize,UBIDI_DEFAULT_LTR ,NULL,&ec); 784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(ec)){ 785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_setPara(tests[%d], paraLevel %d) failed with errorCode %s\n", 786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, UBIDI_DEFAULT_LTR, u_errorName(ec)); 787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* try pre-flighting */ 789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destSize = ubidi_writeReordered(bidi,dest,0,UBIDI_DO_MIRRORING+UBIDI_OUTPUT_REVERSE,&ec); 790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(ec!=U_BUFFER_OVERFLOW_ERROR){ 791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Pre-flighting did not give expected error: Expected: U_BUFFER_OVERFLOW_ERROR. Got: %s \n",u_errorName(ec)); 792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else if(destSize!=srcSize){ 793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Pre-flighting did not give expected size: Expected: %d. Got: %d \n",srcSize,destSize); 794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else{ 795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ec= U_ZERO_ERROR; 796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destSize=ubidi_writeReordered(bidi,dest,destSize+1,UBIDI_DO_MIRRORING+UBIDI_OUTPUT_REVERSE,&ec); 798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u16ToPseudo(destSize,dest,chars); 799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(destSize!=srcSize){ 800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_writeReordered() destSize and srcSize do not match\n"); 801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else if(strcmp(visualOrder1[i],chars)!=0){ 802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_writeReordered() did not give expected results for UBIDI_DO_MIRRORING+UBIDI_OUTPUT_REVERSE.\n" 803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Input : %s\nExpected: %s\nGot : %s\nLevels : %s\nAt Index: %d\n", 804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logicalOrder[i],visualOrder1[i],chars,formatLevels(bidi, formatChars),i); 805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 808f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius for(i=0;i<UPRV_LENGTHOF(logicalOrder);i++){ 809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t srcSize = (int32_t)strlen(logicalOrder[i]); 810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t destSize = srcSize*2; 811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar src[MAXLEN]; 812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar dest[MAXLEN]; 813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char chars[MAXLEN]; 814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing V2L #3 for case %d\n", i); 815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToU16(srcSize,logicalOrder[i],src); 816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ec = U_ZERO_ERROR; 817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setInverse(bidi,TRUE); 818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi,src,srcSize,UBIDI_DEFAULT_LTR ,NULL,&ec); 819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(ec)){ 820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_setPara(tests[%d], paraLevel %d) failed with errorCode %s\n", 821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, UBIDI_DEFAULT_LTR, u_errorName(ec)); 822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* try pre-flighting */ 824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destSize = ubidi_writeReordered(bidi,dest,0,UBIDI_INSERT_LRM_FOR_NUMERIC+UBIDI_OUTPUT_REVERSE,&ec); 825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(ec!=U_BUFFER_OVERFLOW_ERROR){ 826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Pre-flighting did not give expected error: Expected: U_BUFFER_OVERFLOW_ERROR. Got: %s \n",u_errorName(ec)); 827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else{ 828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ec= U_ZERO_ERROR; 829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destSize=ubidi_writeReordered(bidi,dest,destSize+1,UBIDI_INSERT_LRM_FOR_NUMERIC+UBIDI_OUTPUT_REVERSE,&ec); 831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u16ToPseudo(destSize,dest,chars); 832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(strcmp(visualOrder2[i],chars)!=0){ 833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_writeReordered() did not give expected results for UBIDI_INSERT_LRM_FOR_NUMERIC+UBIDI_OUTPUT_REVERSE.\n" 834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Input : %s\nExpected: %s\nGot : %s\nLevels : %s\nAt Index: %d\n", 835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logicalOrder[i],visualOrder2[i],chars,formatLevels(bidi, formatChars),i); 836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Max Explicit level */ 839f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius for(i=0;i<UPRV_LENGTHOF(logicalOrder);i++){ 840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t srcSize = (int32_t)strlen(logicalOrder[i]); 841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t destSize = srcSize*2; 842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar src[MAXLEN]; 843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar dest[MAXLEN]; 844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char chars[MAXLEN]; 845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDiLevel levels[UBIDI_MAX_EXPLICIT_LEVEL]={1,2,3,4,5,6,7,8,9,10}; 846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing V2L #4 for case %d\n", i); 847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToU16(srcSize,logicalOrder[i],src); 848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ec = U_ZERO_ERROR; 849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi,src,srcSize,UBIDI_DEFAULT_LTR,levels,&ec); 850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(ec)){ 851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_setPara(tests[%d], paraLevel %d) failed with errorCode %s\n", 852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, UBIDI_MAX_EXPLICIT_LEVEL, u_errorName(ec)); 853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* try pre-flighting */ 855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destSize = ubidi_writeReordered(bidi,dest,0,UBIDI_OUTPUT_REVERSE,&ec); 856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(ec!=U_BUFFER_OVERFLOW_ERROR){ 857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Pre-flighting did not give expected error: Expected: U_BUFFER_OVERFLOW_ERROR. Got: %s \n",u_errorName(ec)); 858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else if(destSize!=srcSize){ 859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Pre-flighting did not give expected size: Expected: %d. Got: %d \n",srcSize,destSize); 860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else{ 861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ec = U_ZERO_ERROR; 862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destSize=ubidi_writeReordered(bidi,dest,destSize+1,UBIDI_OUTPUT_REVERSE,&ec); 864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u16ToPseudo(destSize,dest,chars); 865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(destSize!=srcSize){ 866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_writeReordered() destSize and srcSize do not match. Dest Size = %d Source Size = %d\n",destSize,srcSize ); 867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else if(strcmp(visualOrder3[i],chars)!=0){ 868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_writeReordered() did not give expected results for UBIDI_OUTPUT_REVERSE.\n" 869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Input : %s\nExpected: %s\nGot : %s\nLevels : %s\nAt Index: %d\n", 870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logicalOrder[i],visualOrder3[i],chars,formatLevels(bidi, formatChars),i); 871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 873f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius for(i=0;i<UPRV_LENGTHOF(logicalOrder);i++){ 874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t srcSize = (int32_t)strlen(logicalOrder[i]); 875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t destSize = srcSize*2; 876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar src[MAXLEN]; 877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar dest[MAXLEN]; 878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char chars[MAXLEN]; 879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDiLevel levels[UBIDI_MAX_EXPLICIT_LEVEL]={1,2,3,4,5,6,7,8,9,10}; 880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing V2L #5 for case %d\n", i); 881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToU16(srcSize,logicalOrder[i],src); 882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ec = U_ZERO_ERROR; 883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi,src,srcSize,UBIDI_DEFAULT_LTR,levels,&ec); 884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(ec)){ 885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_setPara(tests[%d], paraLevel %d) failed with errorCode %s\n", 886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, UBIDI_MAX_EXPLICIT_LEVEL, u_errorName(ec)); 887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* try pre-flighting */ 889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destSize = ubidi_writeReordered(bidi,dest,0,UBIDI_DO_MIRRORING+UBIDI_REMOVE_BIDI_CONTROLS,&ec); 890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(ec!=U_BUFFER_OVERFLOW_ERROR){ 891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Pre-flighting did not give expected error: Expected: U_BUFFER_OVERFLOW_ERROR. Got: %s \n",u_errorName(ec)); 892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else{ 893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ec= U_ZERO_ERROR; 894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destSize=ubidi_writeReordered(bidi,dest,destSize+1,UBIDI_DO_MIRRORING+UBIDI_REMOVE_BIDI_CONTROLS,&ec); 896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u16ToPseudo(destSize,dest,chars); 897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(strcmp(visualOrder4[i],chars)!=0){ 898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_writeReordered() did not give expected results for UBIDI_DO_MIRRORING+UBIDI_REMOVE_BIDI_CONTROLS.\n" 899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Input : %s\nExpected: %s\nGot : %s\nLevels : %s\nAt Index: %d\n", 900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logicalOrder[i],visualOrder4[i],chars,formatLevels(bidi, formatChars),i); 901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(bidi); 904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\nExiting TestReorder\n\n"); 906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 90954dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliustestReorderArabicMathSymbols(void) { 91054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius static const UChar logicalOrder[][MAXLEN]={ 91154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius /* Arabic mathematical Symbols 0x1EE00 - 0x1EE1B */ 91259d709d503bab6e2b61931737e662dd293b40578ccornelius {0xD83B, 0xDE00, 0xD83B, 0xDE01, 0xD83B, 0xDE02, 0xD83B, 0xDE03, 0x20, 91359d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE24, 0xD83B, 0xDE05, 0xD83B, 0xDE06, 0x20, 91459d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE07, 0xD83B, 0xDE08, 0xD83B, 0xDE09, 0x20, 91559d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE0A, 0xD83B, 0xDE0B, 0xD83B, 0xDE0C, 0xD83B, 0xDE0D, 0x20, 91659d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE0E, 0xD83B, 0xDE0F, 0xD83B, 0xDE10, 0xD83B, 0xDE11, 0x20, 91759d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE12, 0xD83B, 0xDE13, 0xD83B, 0xDE14, 0xD83B, 0xDE15, 0x20, 91859d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE16, 0xD83B, 0xDE17, 0xD83B, 0xDE18, 0x20, 91954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE19, 0xD83B, 0xDE1A, 0xD83B, 0xDE1B}, 92054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius /* Arabic mathematical Symbols - Looped Symbols, 0x1EE80 - 0x1EE9B */ 92159d709d503bab6e2b61931737e662dd293b40578ccornelius {0xD83B, 0xDE80, 0xD83B, 0xDE81, 0xD83B, 0xDE82, 0xD83B, 0xDE83, 0x20, 92259d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE84, 0xD83B, 0xDE85, 0xD83B, 0xDE86, 0x20, 92359d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE87, 0xD83B, 0xDE88, 0xD83B, 0xDE89, 0x20, 92459d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE8B, 0xD83B, 0xDE8C, 0xD83B, 0xDE8D, 0x20, 92559d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE8E, 0xD83B, 0xDE8F, 0xD83B, 0xDE90, 0xD83B, 0xDE91, 0x20, 92659d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE92, 0xD83B, 0xDE93, 0xD83B, 0xDE94, 0xD83B, 0xDE95, 0x20, 92759d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE96, 0xD83B, 0xDE97, 0xD83B, 0xDE98, 0x20, 92854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE99, 0xD83B, 0xDE9A, 0xD83B, 0xDE9B}, 92954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius /* Arabic mathematical Symbols - Double-struck Symbols, 0x1EEA1 - 0x1EEBB */ 93059d709d503bab6e2b61931737e662dd293b40578ccornelius {0xD83B, 0xDEA1, 0xD83B, 0xDEA2, 0xD83B, 0xDEA3, 0x20, 93159d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDEA5, 0xD83B, 0xDEA6, 0x20, 93259d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDEA7, 0xD83B, 0xDEA8, 0xD83B, 0xDEA9, 0x20, 93359d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDEAB, 0xD83B, 0xDEAC, 0xD83B, 0xDEAD, 0x20, 93459d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDEAE, 0xD83B, 0xDEAF, 0xD83B, 0xDEB0, 0xD83B, 0xDEB1, 0x20, 93559d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDEB2, 0xD83B, 0xDEB3, 0xD83B, 0xDEB4, 0xD83B, 0xDEB5, 0x20, 93659d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDEB6, 0xD83B, 0xDEB7, 0xD83B, 0xDEB8, 0x20, 93754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDEB9, 0xD83B, 0xDEBA, 0xD83B, 0xDEBB}, 93854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius /* Arabic mathematical Symbols - Initial Symbols, 0x1EE21 - 0x1EE3B */ 93959d709d503bab6e2b61931737e662dd293b40578ccornelius {0xD83B, 0xDE21, 0xD83B, 0xDE22, 0x20, 94059d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE27, 0xD83B, 0xDE29, 0x20, 94159d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE2A, 0xD83B, 0xDE2B, 0xD83B, 0xDE2C, 0xD83B, 0xDE2D, 0x20, 94259d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE2E, 0xD83B, 0xDE2F, 0xD83B, 0xDE30, 0xD83B, 0xDE31, 0x20, 94359d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE32, 0xD83B, 0xDE34, 0xD83B, 0xDE35, 0x20, 94459d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE36, 0xD83B, 0xDE37, 0x20, 94554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE39, 0xD83B, 0xDE3B}, 94654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius /* Arabic mathematical Symbols - Tailed Symbols */ 94759d709d503bab6e2b61931737e662dd293b40578ccornelius {0xD83B, 0xDE42, 0xD83B, 0xDE47, 0xD83B, 0xDE49, 0xD83B, 0xDE4B, 0x20, 94859d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE4D, 0xD83B, 0xDE4E, 0xD83B, 0xDE4F, 0x20, 94959d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE51, 0xD83B, 0xDE52, 0xD83B, 0xDE54, 0xD83B, 0xDE57, 0x20, 95054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE59, 0xD83B, 0xDE5B, 0xD83B, 0xDE5D, 0xD83B, 0xDE5F} 95154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }; 95254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius static const UChar visualOrder[][MAXLEN]={ 95354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius /* Arabic mathematical Symbols 0x1EE00 - 0x1EE1B */ 95459d709d503bab6e2b61931737e662dd293b40578ccornelius {0xD83B, 0xDE1B, 0xD83B, 0xDE1A, 0xD83B, 0xDE19, 0x20, 95559d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE18, 0xD83B, 0xDE17, 0xD83B, 0xDE16, 0x20, 95654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE15, 0xD83B, 0xDE14, 0xD83B, 0xDE13, 0xD83B, 0xDE12, 0x20, 95754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE11, 0xD83B, 0xDE10, 0xD83B, 0xDE0F, 0xD83B, 0xDE0E, 0x20, 95854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE0D, 0xD83B, 0xDE0C, 0xD83B, 0xDE0B, 0xD83B, 0xDE0A, 0x20, 95959d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE09, 0xD83B, 0xDE08, 0xD83B, 0xDE07, 0x20, 96059d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE06, 0xD83B, 0xDE05, 0xD83B, 0xDE24, 0x20, 96154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE03, 0xD83B, 0xDE02, 0xD83B, 0xDE01, 0xD83B, 0xDE00}, 96254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius /* Arabic mathematical Symbols - Looped Symbols, 0x1EE80 - 0x1EE9B */ 96359d709d503bab6e2b61931737e662dd293b40578ccornelius {0xD83B, 0xDE9B, 0xD83B, 0xDE9A, 0xD83B, 0xDE99, 0x20, 96459d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE98, 0xD83B, 0xDE97, 0xD83B, 0xDE96, 0x20, 96554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE95, 0xD83B, 0xDE94, 0xD83B, 0xDE93, 0xD83B, 0xDE92, 0x20, 96654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE91, 0xD83B, 0xDE90, 0xD83B, 0xDE8F, 0xD83B, 0xDE8E, 0x20, 96759d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE8D, 0xD83B, 0xDE8C, 0xD83B, 0xDE8B, 0x20, 96859d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE89, 0xD83B, 0xDE88, 0xD83B, 0xDE87, 0x20, 96959d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE86, 0xD83B, 0xDE85, 0xD83B, 0xDE84, 0x20, 97054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE83, 0xD83B, 0xDE82, 0xD83B, 0xDE81, 0xD83B, 0xDE80}, 97154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius /* Arabic mathematical Symbols - Double-struck Symbols, 0x1EEA1 - 0x1EEBB */ 97259d709d503bab6e2b61931737e662dd293b40578ccornelius {0xD83B, 0xDEBB, 0xD83B, 0xDEBA, 0xD83B, 0xDEB9, 0x20, 97359d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDEB8, 0xD83B, 0xDEB7, 0xD83B, 0xDEB6, 0x20, 97454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDEB5, 0xD83B, 0xDEB4, 0xD83B, 0xDEB3, 0xD83B, 0xDEB2, 0x20, 97554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDEB1, 0xD83B, 0xDEB0, 0xD83B, 0xDEAF, 0xD83B, 0xDEAE, 0x20, 97659d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDEAD, 0xD83B, 0xDEAC, 0xD83B, 0xDEAB, 0x20, 97759d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDEA9, 0xD83B, 0xDEA8, 0xD83B, 0xDEA7, 0x20, 97859d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDEA6, 0xD83B, 0xDEA5, 0x20, 97954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDEA3, 0xD83B, 0xDEA2, 0xD83B, 0xDEA1}, 98054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius /* Arabic mathematical Symbols - Initial Symbols, 0x1EE21 - 0x1EE3B */ 98159d709d503bab6e2b61931737e662dd293b40578ccornelius {0xD83B, 0xDE3B, 0xD83B, 0xDE39, 0x20, 98259d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE37, 0xD83B, 0xDE36, 0x20, 98359d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE35, 0xD83B, 0xDE34, 0xD83B, 0xDE32, 0x20, 98454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE31, 0xD83B, 0xDE30, 0xD83B, 0xDE2F, 0xD83B, 0xDE2E, 0x20, 98554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE2D, 0xD83B, 0xDE2C, 0xD83B, 0xDE2B, 0xD83B, 0xDE2A, 0x20, 98659d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE29, 0xD83B, 0xDE27, 0x20, 98754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE22, 0xD83B, 0xDE21}, 98854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius /* Arabic mathematical Symbols - Tailed Symbols */ 98954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius {0xD83B, 0xDE5F, 0xD83B, 0xDE5D, 0xD83B, 0xDE5B, 0xD83B, 0xDE59, 0x20, 99054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE57, 0xD83B, 0xDE54, 0xD83B, 0xDE52, 0xD83B, 0xDE51, 0x20, 99159d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE4F, 0xD83B, 0xDE4E, 0xD83B, 0xDE4D, 0x20, 99254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE4B, 0xD83B, 0xDE49, 0xD83B, 0xDE47, 0xD83B, 0xDE42} 99354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }; 99454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius char formatChars[MAXLEN]; 99554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UErrorCode ec = U_ZERO_ERROR; 99654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UBiDi* bidi = ubidi_open(); 99754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int i; 99854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 99954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius log_verbose("\nEntering TestReorderArabicMathSymbols\n\n"); 100054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 1001f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius for(i=0;i<UPRV_LENGTHOF(logicalOrder);i++){ 100254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int32_t srcSize = u_strlen(logicalOrder[i]); 100354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int32_t destSize = srcSize*2; 100454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UChar dest[MAXLEN]; 100554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius log_verbose("Testing L2V #1 for case %d\n", i); 100654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius ec = U_ZERO_ERROR; 100754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius ubidi_setPara(bidi,logicalOrder[i],srcSize,UBIDI_DEFAULT_LTR ,NULL,&ec); 100854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(U_FAILURE(ec)){ 100954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius log_err("ubidi_setPara(tests[%d], paraLevel %d) failed with errorCode %s\n", 101054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius i, UBIDI_DEFAULT_LTR, u_errorName(ec)); 101154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 101254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius /* try pre-flighting */ 101354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius destSize = ubidi_writeReordered(bidi,dest,0,UBIDI_DO_MIRRORING,&ec); 101454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(ec!=U_BUFFER_OVERFLOW_ERROR){ 101554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius log_err("Pre-flighting did not give expected error: Expected: U_BUFFER_OVERFLOW_ERROR. Got: %s \n",u_errorName(ec)); 101654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }else if(destSize!=srcSize){ 101754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius log_err("Pre-flighting did not give expected size: Expected: %d. Got: %d \n",srcSize,destSize); 101854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }else{ 101954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius ec= U_ZERO_ERROR; 102054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 102154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius destSize=ubidi_writeReordered(bidi,dest,destSize+1,UBIDI_DO_MIRRORING,&ec); 102254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(destSize!=srcSize){ 102354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius log_err("ubidi_writeReordered() destSize and srcSize do not match\n"); 102454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }else if(memcmp(dest, visualOrder[i], destSize*U_SIZEOF_UCHAR)!=0){ 102554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius log_err("ubidi_writeReordered() did not give expected results for UBIDI_DO_MIRRORING.\n" 102654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius "Input : %s\nExpected: %s\nGot : %s\nLevels : %s\nAt Index: %d\n", 102754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius logicalOrder[i],visualOrder[i],dest,formatLevels(bidi, formatChars),i); 102854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 102954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 103054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 103154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius ubidi_close(bidi); 103254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 103354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius log_verbose("\nExiting TestReorderArabicMathSymbols\n\n"); 103454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} 103554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 103654dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic void 1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerudoTest(UBiDi *pBiDi, int testNumber, const BiDiTestData *test, int32_t lineStart, UBool countRunsFirst) { 1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const uint8_t *dirProps=test->text+lineStart; 1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UBiDiLevel *levels=test->levels; 1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const uint8_t *visualMap=test->visualMap; 1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i, len=ubidi_getLength(pBiDi), logicalIndex, runCount = 0; 1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode=U_ZERO_ERROR; 1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDiLevel level, level2; 1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (countRunsFirst) { 1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Calling ubidi_countRuns() first.\n"); 1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru runCount = ubidi_countRuns(pBiDi, &errorCode); 1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)) { 1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_countRuns(tests[%d]): error %s\n", testNumber, myErrorName(errorCode)); 1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Calling ubidi_getLogicalMap() first.\n"); 1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testReordering(pBiDi, testNumber); 1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<len; ++i) { 1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("%3d %3d %.*s%-3s @%d\n", 1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, ubidi_getLevelAt(pBiDi, i), ubidi_getLevelAt(pBiDi, i), levelString, 1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dirPropNames[dirProps[i]], 1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_getVisualIndex(pBiDi, i, &errorCode)); 1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\n-----levels:"); 1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<len; ++i) { 1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(i>0) { 1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose(","); 1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose(" %d", ubidi_getLevelAt(pBiDi, i)); 1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\n--reordered:"); 1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<len; ++i) { 1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(i>0) { 1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose(","); 1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose(" %d", ubidi_getVisualIndex(pBiDi, i, &errorCode)); 1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\n"); 1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test->direction!=ubidi_getDirection(pBiDi)) { 1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_getDirection(tests[%d]): wrong direction %d\n", testNumber, ubidi_getDirection(pBiDi)); 1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test->resultLevel!=ubidi_getParaLevel(pBiDi)) { 1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_getParaLevel(tests[%d]): wrong paragraph level %d\n", testNumber, ubidi_getParaLevel(pBiDi)); 1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<len; ++i) { 1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(levels[i]!=ubidi_getLevelAt(pBiDi, i)) { 1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_getLevelAt(tests[%d], %d): wrong level %d, expected %d\n", testNumber, i, ubidi_getLevelAt(pBiDi, i), levels[i]); 1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<len; ++i) { 1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logicalIndex=ubidi_getVisualIndex(pBiDi, i, &errorCode); 1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)) { 1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_getVisualIndex(tests[%d], %d): error %s\n", testNumber, i, myErrorName(errorCode)); 1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(visualMap[i]!=logicalIndex) { 1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_getVisualIndex(tests[%d], %d): wrong index %d\n", testNumber, i, logicalIndex); 1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (! countRunsFirst) { 1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru runCount=ubidi_countRuns(pBiDi, &errorCode); 1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)) { 1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_countRuns(tests[%d]): error %s\n", testNumber, myErrorName(errorCode)); 1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(logicalIndex=0; logicalIndex<len;) { 1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru level=ubidi_getLevelAt(pBiDi, logicalIndex); 1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_getLogicalRun(pBiDi, logicalIndex, &logicalIndex, &level2); 1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(level!=level2) { 1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_getLogicalRun(tests[%d], run ending at index %d): " 1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "wrong level %d instead of %d\n", 1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testNumber, logicalIndex, level, level2); 1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(--runCount<0) { 1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nubidi_getLogicalRun(tests[%d]): wrong number of runs " 1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "compared to %d=ubidi_countRuns()\n", 1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testNumber, ubidi_countRuns(pBiDi, &errorCode)); 1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(runCount!=0) { 1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nubidi_getLogicalRun(tests[%d]): wrong number of runs " 1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "compared to %d=ubidi_getRunCount()\n", 1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testNumber, ubidi_countRuns(pBiDi, &errorCode)); 1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\n\n"); 1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru_testReordering(UBiDi *pBiDi, int testNumber) { 1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t 1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logicalMap1[MAXLEN], logicalMap2[MAXLEN], logicalMap3[MAXLEN], 1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru visualMap1[MAXLEN], visualMap2[MAXLEN], visualMap3[MAXLEN], visualMap4[MAXLEN]; 1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode=U_ZERO_ERROR; 1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UBiDiLevel *levels; 1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i, length=ubidi_getLength(pBiDi), 1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength=ubidi_getResultLength(pBiDi); 1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t runCount, visualIndex, logicalStart, runLength; 1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool odd; 1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(length<=0) { 1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* get the logical and visual maps from the object */ 1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_getLogicalMap(pBiDi, logicalMap1, &errorCode); 1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)) { 1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_getLogicalMap(tests[%d]): error %s\n", testNumber, myErrorName(errorCode)); 1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_getVisualMap(pBiDi, visualMap1, &errorCode); 1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)) { 1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_getVisualMap(tests[%d]): error %s\n", testNumber, myErrorName(errorCode)); 1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* invert them both */ 1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_invertMap(logicalMap1, visualMap2, length); 1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_invertMap(visualMap1, logicalMap2, destLength); 1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* get them from the levels array, too */ 1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru levels=ubidi_getLevels(pBiDi, &errorCode); 1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)) { 1181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_getLevels(tests[%d]): error %s\n", testNumber, myErrorName(errorCode)); 1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_reorderLogical(levels, length, logicalMap3); 1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_reorderVisual(levels, length, visualMap3); 1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* get the visual map from the runs, too */ 1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru runCount=ubidi_countRuns(pBiDi, &errorCode); 1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)) { 1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_countRuns(tests[%d]): error %s\n", testNumber, myErrorName(errorCode)); 1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\n----%2d runs:", runCount); 1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru visualIndex=0; 1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<runCount; ++i) { 1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru odd=(UBool)ubidi_getVisualRun(pBiDi, i, &logicalStart, &runLength); 1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose(" (%c @%d[%d])", odd ? 'R' : 'L', logicalStart, runLength); 1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(UBIDI_LTR==odd) { 1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru do { /* LTR */ 1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru visualMap4[visualIndex++]=logicalStart++; 1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } while(--runLength>0); 1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logicalStart+=runLength; /* logicalLimit */ 1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru do { /* RTL */ 1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru visualMap4[visualIndex++]=--logicalStart; 1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } while(--runLength>0); 1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\n"); 1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* print all the maps */ 1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("logical maps:\n"); 1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<length; ++i) { 1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("%4d", logicalMap1[i]); 1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\n"); 1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<length; ++i) { 1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("%4d", logicalMap2[i]); 1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\n"); 1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<length; ++i) { 1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("%4d", logicalMap3[i]); 1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\nvisual maps:\n"); 1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<destLength; ++i) { 1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("%4d", visualMap1[i]); 1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\n"); 1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<destLength; ++i) { 1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("%4d", visualMap2[i]); 1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\n"); 1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<length; ++i) { 1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("%4d", visualMap3[i]); 1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\n"); 1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<length; ++i) { 1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("%4d", visualMap4[i]); 1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\n"); 1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* check that the indexes are the same between these and ubidi_getLogical/VisualIndex() */ 1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<length; ++i) { 1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(logicalMap1[i]!=logicalMap2[i]) { 1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("bidi reordering error in tests[%d]: logicalMap1[i]!=logicalMap2[i] at i=%d\n", testNumber, i); 1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(logicalMap1[i]!=logicalMap3[i]) { 1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("bidi reordering error in tests[%d]: logicalMap1[i]!=logicalMap3[i] at i=%d\n", testNumber, i); 1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(visualMap1[i]!=visualMap2[i]) { 1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("bidi reordering error in tests[%d]: visualMap1[i]!=visualMap2[i] at i=%d\n", testNumber, i); 1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(visualMap1[i]!=visualMap3[i]) { 1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("bidi reordering error in tests[%d]: visualMap1[i]!=visualMap3[i] at i=%d\n", testNumber, i); 1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(visualMap1[i]!=visualMap4[i]) { 1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("bidi reordering error in tests[%d]: visualMap1[i]!=visualMap4[i] at i=%d\n", testNumber, i); 1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(logicalMap1[i]!=ubidi_getVisualIndex(pBiDi, i, &errorCode)) { 1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("bidi reordering error in tests[%d]: logicalMap1[i]!=ubidi_getVisualIndex(i) at i=%d\n", testNumber, i); 1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)) { 1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_getVisualIndex(tests[%d], %d): error %s\n", testNumber, i, myErrorName(errorCode)); 1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(visualMap1[i]!=ubidi_getLogicalIndex(pBiDi, i, &errorCode)) { 1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("bidi reordering error in tests[%d]: visualMap1[i]!=ubidi_getLogicalIndex(i) at i=%d\n", testNumber, i); 1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)) { 1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_getLogicalIndex(tests[%d], %d): error %s\n", testNumber, i, myErrorName(errorCode)); 1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define RETURN_IF_BAD_ERRCODE(x) \ 1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(errorCode)) { \ 1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nbad errorCode %d at %s\n", errorCode, (x)); \ 1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; \ 1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } \ 1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1293f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius#define STRING_TEST_CASE(s) { (s), UPRV_LENGTHOF(s) } 129427f654740f2a26ad62a5c155af9199af9e69b889claireho 129527f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void testGetBaseDirection(void) { 129627f654740f2a26ad62a5c155af9199af9e69b889claireho UBiDiDirection dir; 129727f654740f2a26ad62a5c155af9199af9e69b889claireho int i; 129827f654740f2a26ad62a5c155af9199af9e69b889claireho 129927f654740f2a26ad62a5c155af9199af9e69b889claireho/* Test Data */ 130027f654740f2a26ad62a5c155af9199af9e69b889claireho static const UChar 130127f654740f2a26ad62a5c155af9199af9e69b889claireho/*Mixed Start with L*/ 130227f654740f2a26ad62a5c155af9199af9e69b889claireho stringMixedEnglishFirst[]={ 0x61, 0x627, 0x32, 0x6f3, 0x61, 0x34, 0 }, 130327f654740f2a26ad62a5c155af9199af9e69b889claireho/*Mixed Start with AL*/ 130427f654740f2a26ad62a5c155af9199af9e69b889claireho stringMixedArabicFirst[]={ 0x661, 0x627, 0x662, 0x6f3, 0x61, 0x664, 0 }, 130527f654740f2a26ad62a5c155af9199af9e69b889claireho/*Mixed Start with R*/ 130627f654740f2a26ad62a5c155af9199af9e69b889claireho stringMixedHebrewFirst[]={ 0x05EA, 0x627, 0x662, 0x6f3, 0x61, 0x664, 0 }, 130727f654740f2a26ad62a5c155af9199af9e69b889claireho/*All AL (Arabic. Persian)*/ 130827f654740f2a26ad62a5c155af9199af9e69b889claireho stringPersian[]={0x0698, 0x067E, 0x0686, 0x06AF, 0}, 130927f654740f2a26ad62a5c155af9199af9e69b889claireho/*All R (Hebrew etc.)*/ 131027f654740f2a26ad62a5c155af9199af9e69b889claireho stringHebrew[]={0x0590, 0x05D5, 0x05EA, 0x05F1, 0}, 131127f654740f2a26ad62a5c155af9199af9e69b889claireho/*All L (English)*/ 131227f654740f2a26ad62a5c155af9199af9e69b889claireho stringEnglish[]={0x71, 0x61, 0x66, 0}, 131327f654740f2a26ad62a5c155af9199af9e69b889claireho/*Mixed Start with weak AL an then L*/ 131427f654740f2a26ad62a5c155af9199af9e69b889claireho stringStartWeakAL[]={ 0x0663, 0x71, 0x61, 0x66, 0}, 131527f654740f2a26ad62a5c155af9199af9e69b889claireho/*Mixed Start with weak L and then AL*/ 131627f654740f2a26ad62a5c155af9199af9e69b889claireho stringStartWeakL[]={0x31, 0x0698, 0x067E, 0x0686, 0x06AF, 0}, 131727f654740f2a26ad62a5c155af9199af9e69b889claireho/*Empty*/ 131827f654740f2a26ad62a5c155af9199af9e69b889claireho stringEmpty[]={0}, 131927f654740f2a26ad62a5c155af9199af9e69b889claireho/*Surrogate Char.*/ 132027f654740f2a26ad62a5c155af9199af9e69b889claireho stringSurrogateChar[]={0xD800, 0xDC00, 0}, 132127f654740f2a26ad62a5c155af9199af9e69b889claireho/*Invalid UChar*/ 132227f654740f2a26ad62a5c155af9199af9e69b889claireho stringInvalidUchar[]={-1}, 132327f654740f2a26ad62a5c155af9199af9e69b889claireho/*All weak L (English Digits)*/ 132427f654740f2a26ad62a5c155af9199af9e69b889claireho stringAllEnglishDigits[]={0x31, 0x32, 0x33, 0}, 132527f654740f2a26ad62a5c155af9199af9e69b889claireho/*All weak AL (Arabic Digits)*/ 132627f654740f2a26ad62a5c155af9199af9e69b889claireho stringAllArabicDigits[]={0x0663, 0x0664, 0x0665, 0}, 132727f654740f2a26ad62a5c155af9199af9e69b889claireho/*First L (English) others are R (Hebrew etc.) */ 132827f654740f2a26ad62a5c155af9199af9e69b889claireho stringFirstL[] = {0x71, 0x0590, 0x05D5, 0x05EA, 0x05F1, 0}, 132927f654740f2a26ad62a5c155af9199af9e69b889claireho/*Last R (Hebrew etc.) others are weak L (English Digits)*/ 133027f654740f2a26ad62a5c155af9199af9e69b889claireho stringLastR[] = {0x31, 0x32, 0x33, 0x05F1, 0}; 133127f654740f2a26ad62a5c155af9199af9e69b889claireho 133227f654740f2a26ad62a5c155af9199af9e69b889claireho static const struct { 133327f654740f2a26ad62a5c155af9199af9e69b889claireho const UChar *s; 133427f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t length; 133527f654740f2a26ad62a5c155af9199af9e69b889claireho } testCases[]={ 133627f654740f2a26ad62a5c155af9199af9e69b889claireho STRING_TEST_CASE(stringMixedEnglishFirst), 133727f654740f2a26ad62a5c155af9199af9e69b889claireho STRING_TEST_CASE(stringMixedArabicFirst), 133827f654740f2a26ad62a5c155af9199af9e69b889claireho STRING_TEST_CASE(stringMixedHebrewFirst), 133927f654740f2a26ad62a5c155af9199af9e69b889claireho STRING_TEST_CASE(stringPersian), 134027f654740f2a26ad62a5c155af9199af9e69b889claireho STRING_TEST_CASE(stringHebrew), 134127f654740f2a26ad62a5c155af9199af9e69b889claireho STRING_TEST_CASE(stringEnglish), 134227f654740f2a26ad62a5c155af9199af9e69b889claireho STRING_TEST_CASE(stringStartWeakAL), 134327f654740f2a26ad62a5c155af9199af9e69b889claireho STRING_TEST_CASE(stringStartWeakL), 134427f654740f2a26ad62a5c155af9199af9e69b889claireho STRING_TEST_CASE(stringEmpty), 134527f654740f2a26ad62a5c155af9199af9e69b889claireho STRING_TEST_CASE(stringSurrogateChar), 134627f654740f2a26ad62a5c155af9199af9e69b889claireho STRING_TEST_CASE(stringInvalidUchar), 134727f654740f2a26ad62a5c155af9199af9e69b889claireho STRING_TEST_CASE(stringAllEnglishDigits), 134827f654740f2a26ad62a5c155af9199af9e69b889claireho STRING_TEST_CASE(stringAllArabicDigits), 134927f654740f2a26ad62a5c155af9199af9e69b889claireho STRING_TEST_CASE(stringFirstL), 135027f654740f2a26ad62a5c155af9199af9e69b889claireho STRING_TEST_CASE(stringLastR), 135127f654740f2a26ad62a5c155af9199af9e69b889claireho }; 135227f654740f2a26ad62a5c155af9199af9e69b889claireho 135327f654740f2a26ad62a5c155af9199af9e69b889claireho/* Expected results */ 135427f654740f2a26ad62a5c155af9199af9e69b889claireho static const UBiDiDirection expectedDir[] ={ 135527f654740f2a26ad62a5c155af9199af9e69b889claireho UBIDI_LTR, UBIDI_RTL, UBIDI_RTL, 135627f654740f2a26ad62a5c155af9199af9e69b889claireho UBIDI_RTL, UBIDI_RTL, UBIDI_LTR, 135727f654740f2a26ad62a5c155af9199af9e69b889claireho UBIDI_LTR, UBIDI_RTL, UBIDI_NEUTRAL, 135827f654740f2a26ad62a5c155af9199af9e69b889claireho UBIDI_LTR, UBIDI_NEUTRAL, UBIDI_NEUTRAL, 135927f654740f2a26ad62a5c155af9199af9e69b889claireho UBIDI_NEUTRAL, UBIDI_LTR, UBIDI_RTL 136027f654740f2a26ad62a5c155af9199af9e69b889claireho }; 136127f654740f2a26ad62a5c155af9199af9e69b889claireho 136227f654740f2a26ad62a5c155af9199af9e69b889claireho log_verbose("testGetBaseDirection() with %u test cases ---\n", 1363f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius UPRV_LENGTHOF(testCases)); 136427f654740f2a26ad62a5c155af9199af9e69b889claireho/* Run Tests */ 1365f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius for(i=0; i<UPRV_LENGTHOF(testCases); ++i) { 136627f654740f2a26ad62a5c155af9199af9e69b889claireho dir = ubidi_getBaseDirection(testCases[i].s, testCases[i].length ); 136727f654740f2a26ad62a5c155af9199af9e69b889claireho log_verbose("Testing case %d\tReceived dir %d\n", i, dir); 1368b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (dir != expectedDir[i]) 1369b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err("\nFailed getBaseDirection case %d Expected %d \tReceived %d\n", 137027f654740f2a26ad62a5c155af9199af9e69b889claireho i, expectedDir[i], dir); 137127f654740f2a26ad62a5c155af9199af9e69b889claireho } 137227f654740f2a26ad62a5c155af9199af9e69b889claireho 137327f654740f2a26ad62a5c155af9199af9e69b889claireho/* Misc. tests */ 137427f654740f2a26ad62a5c155af9199af9e69b889claireho/* NULL string */ 137527f654740f2a26ad62a5c155af9199af9e69b889claireho dir = ubidi_getBaseDirection(NULL, 3); 137627f654740f2a26ad62a5c155af9199af9e69b889claireho if (dir != UBIDI_NEUTRAL ) 137727f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("\nFailed getBaseDirection for NULL string " , 137827f654740f2a26ad62a5c155af9199af9e69b889claireho "\nExpected %d \nReceived %d", UBIDI_NEUTRAL, dir); 137927f654740f2a26ad62a5c155af9199af9e69b889claireho/*All L- English string and length=-3 */ 138027f654740f2a26ad62a5c155af9199af9e69b889claireho dir = ubidi_getBaseDirection( stringEnglish, -3); 138127f654740f2a26ad62a5c155af9199af9e69b889claireho if (dir != UBIDI_NEUTRAL ) 138227f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("\nFailed getBaseDirection for string w length= -3 ", 138327f654740f2a26ad62a5c155af9199af9e69b889claireho "\nExpected %d \nReceived %d", UBIDI_NEUTRAL, dir); 138427f654740f2a26ad62a5c155af9199af9e69b889claireho/*All L- English string and length=-1 */ 138527f654740f2a26ad62a5c155af9199af9e69b889claireho dir = ubidi_getBaseDirection( stringEnglish, -1); 138627f654740f2a26ad62a5c155af9199af9e69b889claireho if (dir != UBIDI_LTR ) 138727f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("\nFailed getBaseDirection for English string w length= -1 ", 138827f654740f2a26ad62a5c155af9199af9e69b889claireho "\nExpected %d \nReceived %d", UBIDI_LTR, dir); 138927f654740f2a26ad62a5c155af9199af9e69b889claireho/*All AL- Persian string and length=-1 */ 139027f654740f2a26ad62a5c155af9199af9e69b889claireho dir = ubidi_getBaseDirection( stringPersian, -1); 139127f654740f2a26ad62a5c155af9199af9e69b889claireho if (dir != UBIDI_RTL ) 139227f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("\nFailed getBaseDirection for Persian string w length= -1 ", 139327f654740f2a26ad62a5c155af9199af9e69b889claireho "\nExpected %d \nReceived %d", UBIDI_RTL, dir); 139427f654740f2a26ad62a5c155af9199af9e69b889claireho/*All R- Hebrew string and length=-1 */ 139527f654740f2a26ad62a5c155af9199af9e69b889claireho dir = ubidi_getBaseDirection( stringHebrew, -1); 139627f654740f2a26ad62a5c155af9199af9e69b889claireho if (dir != UBIDI_RTL ) 139727f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("\nFailed getBaseDirection for Hebrew string w length= -1 ", 139827f654740f2a26ad62a5c155af9199af9e69b889claireho "\nExpected %d \nReceived %d", UBIDI_RTL, dir); 139927f654740f2a26ad62a5c155af9199af9e69b889claireho/*All weak L- English digits string and length=-1 */ 140027f654740f2a26ad62a5c155af9199af9e69b889claireho dir = ubidi_getBaseDirection(stringAllEnglishDigits, -1); 140127f654740f2a26ad62a5c155af9199af9e69b889claireho if (dir != UBIDI_NEUTRAL ) 140227f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("\nFailed getBaseDirection for English digits string w length= -1 ", 140327f654740f2a26ad62a5c155af9199af9e69b889claireho "\nExpected %d \nReceived %d", UBIDI_NEUTRAL, dir); 140427f654740f2a26ad62a5c155af9199af9e69b889claireho/*All weak AL- Arabic digits string and length=-1 */ 140527f654740f2a26ad62a5c155af9199af9e69b889claireho dir = ubidi_getBaseDirection(stringAllArabicDigits, -1); 140627f654740f2a26ad62a5c155af9199af9e69b889claireho if (dir != UBIDI_NEUTRAL ) 140727f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("\nFailed getBaseDirection for Arabic string w length= -1 ", 140827f654740f2a26ad62a5c155af9199af9e69b889claireho "\nExpected %d \nReceived %d", UBIDI_NEUTRAL, dir); 140927f654740f2a26ad62a5c155af9199af9e69b889claireho 141027f654740f2a26ad62a5c155af9199af9e69b889claireho} 141127f654740f2a26ad62a5c155af9199af9e69b889claireho 1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void doMisc(void) { 1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Miscellaneous tests to exercize less popular code paths */ 1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDi *bidi, *bidiLine; 1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar src[MAXLEN], dest[MAXLEN]; 1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t srcLen, destLen, runCount, i; 1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDiLevel level; 1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDiDirection dir; 1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t map[MAXLEN]; 1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode=U_ZERO_ERROR; 1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const int32_t srcMap[6] = {0,1,-1,5,4}; 1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const int32_t dstMap[6] = {0,1,-1,-1,4,3}; 1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bidi = ubidi_openSized(120, 66, &errorCode); 1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (bidi == NULL) { 1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error with openSized(120, 66)\n"); 1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bidiLine = ubidi_open(); 1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (bidi == NULL) { 1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error with open()\n"); 1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLen = ubidi_writeReverse(src, 0, dest, MAXLEN, 0, &errorCode); 1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (destLen != 0) { 1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nwriteReverse should return zero length, ", 1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "returned %d instead\n", destLen); 1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RETURN_IF_BAD_ERRCODE("#1#"); 1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi, src, 0, UBIDI_LTR, NULL, &errorCode); 1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode); 1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (destLen != 0) { 1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nwriteReordered should return zero length, ", 1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "returned %d instead\n", destLen); 1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RETURN_IF_BAD_ERRCODE("#2#"); 1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("abc ", src, MAXLEN); 1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode); 1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode); 1454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 3; i < 6; i++) { 1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru level = ubidi_getLevelAt(bidiLine, i); 1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (level != UBIDI_RTL) { 1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nTrailing space at index %d should get paragraph level" 1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "%d, got %d instead\n", i, UBIDI_RTL, level); 1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RETURN_IF_BAD_ERRCODE("#3#"); 1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("abc def", src, MAXLEN); 1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode); 1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode); 1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 3; i < 6; i++) { 1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru level = ubidi_getLevelAt(bidiLine, i); 1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (level != UBIDI_RTL) { 1469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nTrailing space at index %d should get paragraph level" 1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "%d, got %d instead\n", i, UBIDI_RTL, level); 1471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RETURN_IF_BAD_ERRCODE("#4#"); 1474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("abcdefghi ", src, MAXLEN); 1476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode); 1477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode); 1478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 3; i < 6; i++) { 1479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru level = ubidi_getLevelAt(bidiLine, i); 1480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (level != 2) { 1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nTrailing char at index %d should get level 2, " 1482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "got %d instead\n", i, level); 1483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RETURN_IF_BAD_ERRCODE("#5#"); 1486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setReorderingOptions(bidi, UBIDI_OPTION_REMOVE_CONTROLS); 1488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("\\u200eabc def", src, MAXLEN); 1489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode); 1490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode); 1491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLen = ubidi_getResultLength(bidiLine); 1492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (destLen != 5) { 1493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nWrong result length, should be 5, got %d\n", destLen); 1494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RETURN_IF_BAD_ERRCODE("#6#"); 1496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("abcdefghi", src, MAXLEN); 1498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi, src, srcLen, UBIDI_LTR, NULL, &errorCode); 1499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode); 1500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dir = ubidi_getDirection(bidiLine); 1501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (dir != UBIDI_LTR) { 1502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nWrong direction #1, should be %d, got %d\n", 1503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBIDI_LTR, dir); 1504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RETURN_IF_BAD_ERRCODE("#7#"); 1506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi, src, 0, UBIDI_LTR, NULL, &errorCode); 1508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru runCount = ubidi_countRuns(bidi, &errorCode); 1509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (runCount != 0) { 1510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nWrong number of runs #1, should be 0, got %d\n", runCount); 1511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RETURN_IF_BAD_ERRCODE("#8#"); 1513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape(" ", src, MAXLEN); 1515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode); 1516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode); 1517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru runCount = ubidi_countRuns(bidiLine, &errorCode); 1518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (runCount != 1) { 1519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nWrong number of runs #2, should be 1, got %d\n", runCount); 1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RETURN_IF_BAD_ERRCODE("#9#"); 1522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("a\\u05d0 bc", src, MAXLEN); 1524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode); 1525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode); 1526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dir = ubidi_getDirection(bidi); 1527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (dir != UBIDI_MIXED) { 1528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nWrong direction #2, should be %d, got %d\n", 1529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBIDI_MIXED, dir); 1530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dir = ubidi_getDirection(bidiLine); 1532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (dir != UBIDI_MIXED) { 1533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nWrong direction #3, should be %d, got %d\n", 1534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBIDI_MIXED, dir); 1535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru runCount = ubidi_countRuns(bidiLine, &errorCode); 1537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (runCount != 2) { 1538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nWrong number of runs #3, should be 2, got %d\n", runCount); 1539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RETURN_IF_BAD_ERRCODE("#10#"); 1541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_invertMap(srcMap, map, 5); 1543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (memcmp(dstMap, map, sizeof(dstMap))) { 1544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nUnexpected inverted Map, got "); 1545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < 6; i++) { 1546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%d ", map[i]); 1547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\n"); 1549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test REMOVE_BIDI_CONTROLS together with DO_MIRRORING */ 1552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("abc\\u200e", src, MAXLEN); 1553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi, src, srcLen, UBIDI_LTR, NULL, &errorCode); 1554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 1555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBIDI_REMOVE_BIDI_CONTROLS | UBIDI_DO_MIRRORING, &errorCode); 1556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (destLen != 3 || memcmp(dest, src, 3 * sizeof(UChar))) { 1557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nWrong result #1, should be 'abc', got '%s'\n", 1558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru aescstrdup(dest, destLen)); 1559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RETURN_IF_BAD_ERRCODE("#11#"); 1561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test inverse Bidi with marks and contextual orientation */ 1563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setReorderingMode(bidi, UBIDI_REORDER_INVERSE_LIKE_DIRECT); 1564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setReorderingOptions(bidi, UBIDI_OPTION_INSERT_MARKS); 1565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi, src, 0, UBIDI_DEFAULT_RTL, NULL, &errorCode); 1566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode); 1567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (destLen != 0) { 1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nWrong result #2, length should be 0, got %d\n", destLen); 1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RETURN_IF_BAD_ERRCODE("#12#"); 1571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape(" ", src, MAXLEN); 1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_RTL, NULL, &errorCode); 1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode); 1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (destLen != 3 || memcmp(dest, src, destLen * sizeof(UChar))) { 1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nWrong result #3, should be ' ', got '%s'\n", 1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru aescstrdup(dest, destLen)); 1577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RETURN_IF_BAD_ERRCODE("#13#"); 1579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("abc", src, MAXLEN); 1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_RTL, NULL, &errorCode); 1581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode); 1582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (destLen != 3 || memcmp(dest, src, destLen * sizeof(UChar))) { 1583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nWrong result #4, should be 'abc', got '%s'\n", 1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru aescstrdup(dest, destLen)); 1585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RETURN_IF_BAD_ERRCODE("#14#"); 1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("\\u05d0\\u05d1", src, MAXLEN); 1588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_RTL, NULL, &errorCode); 1589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode); 1590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("\\u05d1\\u05d0", src, MAXLEN); 1591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (destLen != 2 || memcmp(dest, src, destLen * sizeof(UChar))) { 1592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nWrong result #5, should be '%s', got '%s'\n", 1593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru aescstrdup(src, srcLen), aescstrdup(dest, destLen)); 1594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RETURN_IF_BAD_ERRCODE("#15#"); 1596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("abc \\u05d0\\u05d1", src, MAXLEN); 1597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_RTL, NULL, &errorCode); 1598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode); 1599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("\\u05d1\\u05d0 abc", src, MAXLEN); 1600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (destLen != 6 || memcmp(dest, src, destLen * sizeof(UChar))) { 1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nWrong result #6, should be '%s', got '%s'\n", 1602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru aescstrdup(src, srcLen), aescstrdup(dest, destLen)); 1603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RETURN_IF_BAD_ERRCODE("#16#"); 1605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("\\u05d0\\u05d1 abc", src, MAXLEN); 1606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_RTL, NULL, &errorCode); 1607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode); 1608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("\\u200fabc \\u05d1\\u05d0", src, MAXLEN); 1609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (destLen != 7 || memcmp(dest, src, destLen * sizeof(UChar))) { 1610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nWrong result #7, should be '%s', got '%s'\n", 1611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru aescstrdup(src, srcLen), aescstrdup(dest, destLen)); 1612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RETURN_IF_BAD_ERRCODE("#17#"); 1614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("\\u05d0\\u05d1 abc .-=", src, MAXLEN); 1615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_RTL, NULL, &errorCode); 1616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode); 1617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("\\u200f=-. abc \\u05d1\\u05d0", src, MAXLEN); 1618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (destLen != 11 || memcmp(dest, src, destLen * sizeof(UChar))) { 1619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nWrong result #8, should be '%s', got '%s'\n", 1620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru aescstrdup(src, srcLen), aescstrdup(dest, destLen)); 1621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RETURN_IF_BAD_ERRCODE("#18#"); 1623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_orderParagraphsLTR(bidi, TRUE); 1624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("\n\r \n\rabc\n\\u05d0\\u05d1\rabc \\u05d2\\u05d3\n\r" 1625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u05d4\\u05d5 abc\n\\u05d6\\u05d7 abc .-=\r\n" 1626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "-* \\u05d8\\u05d9 abc .-=", src, MAXLEN); 1627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_RTL, NULL, &errorCode); 1628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode); 1629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("\n\r \n\rabc\n\\u05d1\\u05d0\r\\u05d3\\u05d2 abc\n\r" 1630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u200fabc \\u05d5\\u05d4\n\\u200f=-. abc \\u05d7\\u05d6\r\n" 1631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u200f=-. abc \\u05d9\\u05d8 *-", src, MAXLEN); 1632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (destLen != 57 || memcmp(dest, src, destLen * sizeof(UChar))) { 1633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nWrong result #9, should be '%s', got '%s'\n", 1634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru aescstrdup(src, srcLen), aescstrdup(dest, destLen)); 1635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RETURN_IF_BAD_ERRCODE("#19#"); 1637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("\\u05d0 \t", src, MAXLEN); 1638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi, src, srcLen, UBIDI_LTR, NULL, &errorCode); 1639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode); 1640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("\\u05D0\\u200e \t", src, MAXLEN); 1641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (destLen != 4 || memcmp(dest, src, destLen * sizeof(UChar))) { 1642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nWrong result #10, should be '%s', got '%s'\n", 1643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru aescstrdup(src, srcLen), aescstrdup(dest, destLen)); 1644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RETURN_IF_BAD_ERRCODE("#20#"); 1646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("\\u05d0 123 \t\\u05d1 123 \\u05d2", src, MAXLEN); 1647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi, src, srcLen, UBIDI_LTR, NULL, &errorCode); 1648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode); 1649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("\\u05d0 \\u200e123\\u200e \t\\u05d2 123 \\u05d1", src, MAXLEN); 1650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (destLen != 16 || memcmp(dest, src, destLen * sizeof(UChar))) { 1651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nWrong result #11, should be '%s', got '%s'\n", 1652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru aescstrdup(src, srcLen), aescstrdup(dest, destLen)); 1653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RETURN_IF_BAD_ERRCODE("#21#"); 1655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("\\u05d0 123 \\u0660\\u0661 ab", src, MAXLEN); 1656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi, src, srcLen, UBIDI_LTR, NULL, &errorCode); 1657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode); 1658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("\\u05d0 \\u200e123 \\u200e\\u0660\\u0661 ab", src, MAXLEN); 1659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (destLen != 13 || memcmp(dest, src, destLen * sizeof(UChar))) { 1660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nWrong result #12, should be '%s', got '%s'\n", 1661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru aescstrdup(src, srcLen), aescstrdup(dest, destLen)); 1662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RETURN_IF_BAD_ERRCODE("#22#"); 1664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("ab \t", src, MAXLEN); 1665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode); 1666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode); 1667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("\\u200f\t ab", src, MAXLEN); 1668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (destLen != 5 || memcmp(dest, src, destLen * sizeof(UChar))) { 1669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nWrong result #13, should be '%s', got '%s'\n", 1670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru aescstrdup(src, srcLen), aescstrdup(dest, destLen)); 1671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RETURN_IF_BAD_ERRCODE("#23#"); 1673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* check exceeding para level */ 1675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(bidi); 1676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bidi = ubidi_open(); 1677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("A\\u202a\\u05d0\\u202aC\\u202c\\u05d1\\u202cE", src, MAXLEN); 1678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi, src, srcLen, UBIDI_MAX_EXPLICIT_LEVEL - 1, NULL, &errorCode); 1679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru level = ubidi_getLevelAt(bidi, 2); 168059d709d503bab6e2b61931737e662dd293b40578ccornelius if (level != UBIDI_MAX_EXPLICIT_LEVEL) { 168159d709d503bab6e2b61931737e662dd293b40578ccornelius log_err("\nWrong level at index 2\n, should be %d, got %d\n", UBIDI_MAX_EXPLICIT_LEVEL, level); 1682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RETURN_IF_BAD_ERRCODE("#24#"); 1684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* check 1-char runs with RUNS_ONLY */ 1686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setReorderingMode(bidi, UBIDI_REORDER_RUNS_ONLY); 1687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("a \\u05d0 b \\u05d1 c \\u05d2 d ", src, MAXLEN); 1688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi, src, srcLen, UBIDI_LTR, NULL, &errorCode); 1689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru runCount = ubidi_countRuns(bidi, &errorCode); 1690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (runCount != 14) { 1691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nWrong number of runs #3, should be 14, got %d\n", runCount); 1692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RETURN_IF_BAD_ERRCODE("#25#"); 1694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(bidi); 1696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(bidiLine); 1697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerutestFailureRecovery(void) { 1701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 1702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDi *bidi, *bidiLine; 1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar src[MAXLEN]; 1704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t srcLen; 1705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDiLevel level; 1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDiReorderingMode rm; 1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static UBiDiLevel myLevels[3] = {6,5,4}; 1708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\nEntering TestFailureRecovery\n\n"); 1710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode = U_FILE_ACCESS_ERROR; 1711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ubidi_writeReordered(NULL, NULL, 0, 0, &errorCode) != 0) { 1712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_writeReordered did not return 0 when passed a failing UErrorCode\n"); 1713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ubidi_writeReverse(NULL, 0, NULL, 0, 0, &errorCode) != 0) { 1715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_writeReverse did not return 0 when passed a failing UErrorCode\n"); 1716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode = U_ZERO_ERROR; 1718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ubidi_writeReordered(NULL, NULL, 0, 0, &errorCode) != 0 || errorCode != U_ILLEGAL_ARGUMENT_ERROR) { 1719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_writeReordered did not fail as expected\n"); 1720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bidi = ubidi_open(); 1723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("abc", src, MAXLEN); 1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode = U_ZERO_ERROR; 1725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_LTR - 1, NULL, &errorCode); 1726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(errorCode)) { 1727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nubidi_setPara did not fail when passed too big para level\n"); 1728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode = U_ZERO_ERROR; 1730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ubidi_writeReverse(NULL, 0, NULL, 0, 0, &errorCode) != 0 || errorCode != U_ILLEGAL_ARGUMENT_ERROR) { 1731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_writeReverse did not fail as expected\n"); 1732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bidiLine = ubidi_open(); 1734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode = U_ZERO_ERROR; 1735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode); 1736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(errorCode)) { 1737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nubidi_setLine did not fail when called before valid setPara()\n"); 1738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode = U_ZERO_ERROR; 1740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("abc", src, MAXLEN); 1741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi, src, srcLen, UBIDI_LTR + 4, NULL, &errorCode); 1742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru level = ubidi_getLevelAt(bidi, 3); 1743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (level != 0) { 1744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nubidi_getLevelAt did not fail when called with bad argument\n"); 1745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode = U_ZERO_ERROR; 1747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(bidi); 1748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bidi = ubidi_openSized(-1, 0, &errorCode); 1749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(errorCode)) { 1750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nubidi_openSized did not fail when called with bad argument\n"); 1751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(bidi); 1753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bidi = ubidi_openSized(2, 1, &errorCode); 1754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode = U_ZERO_ERROR; 1755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("abc", src, MAXLEN); 1756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi, src, srcLen, UBIDI_LTR, NULL, &errorCode); 1757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(errorCode)) { 1758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nsetPara did not fail when called with text too long\n"); 1759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode = U_ZERO_ERROR; 1761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("=2", src, MAXLEN); 1762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode); 1763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_countRuns(bidi, &errorCode); 1764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(errorCode)) { 1765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nsetPara did not fail when called for too many runs\n"); 1766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(bidi); 1768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bidi = ubidi_open(); 1769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rm = ubidi_getReorderingMode(bidi); 1770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setReorderingMode(bidi, UBIDI_REORDER_DEFAULT - 1); 1771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (rm != ubidi_getReorderingMode(bidi)) { 1772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nsetReorderingMode with bad argument #1 should have no effect\n"); 1773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setReorderingMode(bidi, 9999); 1775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (rm != ubidi_getReorderingMode(bidi)) { 1776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nsetReorderingMode with bad argument #2 should have no effect\n"); 1777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Try a surrogate char */ 1780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode = U_ZERO_ERROR; 1781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("\\uD800\\uDC00", src, MAXLEN); 1782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode); 1783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ubidi_getDirection(bidi) != UBIDI_MIXED) { 1784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\ngetDirection for 1st surrogate char should be MIXED\n"); 1785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode = U_ZERO_ERROR; 1787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("abc", src, MAXLEN); 1788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(bidi, src, srcLen, 5, myLevels, &errorCode); 1789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(errorCode)) { 1790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nsetPara did not fail when called with bad levels\n"); 1791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(bidi); 1793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(bidiLine); 1794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\nExiting TestFailureRecovery\n\n"); 1796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 1799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerutestMultipleParagraphs(void) { 1800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* const text = "__ABC\\u001c" /* Para #0 offset 0 */ 1801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "__\\u05d0DE\\u001c" /* 1 6 */ 1802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "__123\\u001c" /* 2 12 */ 1803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u000d\\u000a" /* 3 18 */ 1804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "FG\\u000d" /* 4 20 */ 1805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u000d" /* 5 23 */ 1806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "HI\\u000d\\u000a" /* 6 24 */ 1807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u000d\\u000a" /* 7 28 */ 1808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u000a" /* 8 30 */ 1809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u000a" /* 9 31 */ 1810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "JK\\u001c"; /* 10 32 */ 1811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const int32_t paraCount=11; 1812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const int32_t paraBounds[]={0, 6, 12, 18, 20, 23, 24, 28, 30, 31, 32, 35}; 1813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UBiDiLevel paraLevels[]={UBIDI_LTR, UBIDI_RTL, UBIDI_DEFAULT_LTR, UBIDI_DEFAULT_RTL, 22, 23}; 1814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UBiDiLevel multiLevels[6][11] = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 1815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, 1816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 1817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0}, 1818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22}, 1819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23}}; 1820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* const text2 = "\\u05d0 1-2\\u001c\\u0630 1-2\\u001c1-2"; 1821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UBiDiLevel levels2[] = {1,1,2,2,2,0, 1,1,2,1,2,0, 2,2,2}; 1822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static UBiDiLevel myLevels[10] = {0,0,0,0,0,0,0,0,0,0}; 1823c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru static const UChar multiparaTestString[] = { 1824c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 0x5de, 0x5e0, 0x5e1, 0x5d4, 0x20, 0x5e1, 0x5e4, 0x5da, 1825c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 0x20, 0xa, 0xa, 0x41, 0x72, 0x74, 0x69, 0x73, 1826c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 0x74, 0x3a, 0x20, 0x5de, 0x5e0, 0x5e1, 0x5d4, 0x20, 1827c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 0x5e1, 0x5e4, 0x5da, 0x20, 0xa, 0xa, 0x41, 0x6c, 1828c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 0x62, 0x75, 0x6d, 0x3a, 0x20, 0x5de, 0x5e0, 0x5e1, 1829c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 0x5d4, 0x20, 0x5e1, 0x5e4, 0x5da, 0x20, 0xa, 0xa, 1830c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 0x54, 0x69, 0x6d, 0x65, 0x3a, 0x20, 0x32, 0x3a, 1831c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 0x32, 0x37, 0xa, 0xa 1832c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru }; 1833c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru static const UBiDiLevel multiparaTestLevels[] = { 1834c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1, 1, 1, 1, 1, 1, 1, 1, 1835c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1, 1, 0, 0, 0, 0, 0, 0, 1836c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 0, 0, 0, 1, 1, 1, 1, 1, 1837c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1, 1, 1, 0, 0, 0, 0, 0, 1838c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 0, 0, 0, 0, 0, 1, 1, 1, 1839c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1, 1, 1, 1, 1, 0, 0, 0, 1840c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 0, 0, 0, 0, 0, 0, 0, 0, 1841c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 0, 0, 0, 0 1842c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru }; 1843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDiLevel gotLevel; 1844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UBiDiLevel* gotLevels; 1845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool orderParagraphsLTR; 1846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar src[MAXLEN], dest[MAXLEN]; 1847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode=U_ZERO_ERROR; 1848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDi* pBidi=ubidi_open(); 1849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDi* pLine; 1850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t srcSize, count, paraStart, paraLimit, paraIndex, length; 1851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t srcLen, destLen; 1852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i, j, k; 1853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\nEntering TestMultipleParagraphs\n\n"); 1855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_unescape(text, src, MAXLEN); 1856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcSize=u_strlen(src); 1857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(pBidi, src, srcSize, UBIDI_LTR, NULL, &errorCode); 1858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)){ 1859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_setPara failed, paraLevel=%d, errorCode %s\n", 1860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBIDI_LTR, u_errorName(errorCode)); 1861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(pBidi); 1862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* check paragraph count and boundaries */ 1865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (paraCount!=(count=ubidi_countParagraphs(pBidi))) { 1866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ubidi_countParagraphs returned %d, should be %d\n", 1867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru count, paraCount); 1868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=0; i<paraCount; i++) { 1870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_getParagraphByIndex(pBidi, i, ¶Start, ¶Limit, NULL, &errorCode); 1871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((paraStart!=paraBounds[i]) || (paraLimit!=paraBounds[i+1])) { 1872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Found boundaries of paragraph %d: %d-%d; expected: %d-%d\n", 1873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, paraStart, paraLimit, paraBounds[i], paraBounds[i+1]); 1874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* check with last paragraph not terminated by B */ 1878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru src[srcSize-1]='L'; 1879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(pBidi, src, srcSize, UBIDI_LTR, NULL, &errorCode); 1880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)){ 1881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("2nd ubidi_setPara failed, paraLevel=%d, errorCode %s\n", 1882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBIDI_LTR, u_errorName(errorCode)); 1883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(pBidi); 1884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (paraCount!=(count=ubidi_countParagraphs(pBidi))) { 1887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("2nd ubidi_countParagraphs returned %d, should be %d\n", 1888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru count, paraCount); 1889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i=paraCount-1; 1891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_getParagraphByIndex(pBidi, i, ¶Start, ¶Limit, NULL, &errorCode); 1892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((paraStart!=paraBounds[i]) || (paraLimit!=paraBounds[i+1])) { 1893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("2nd Found boundaries of paragraph %d: %d-%d; expected: %d-%d\n", 1894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, paraStart, paraLimit, paraBounds[i], paraBounds[i+1]); 1895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* check paraLevel for all paragraphs under various paraLevel specs */ 1898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (k=0; k<6; k++) { 1899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(pBidi, src, srcSize, paraLevels[k], NULL, &errorCode); 1900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=0; i<paraCount; i++) { 1901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru paraIndex=ubidi_getParagraph(pBidi, paraBounds[i], NULL, NULL, &gotLevel, &errorCode); 1902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (paraIndex!=i) { 1903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("For paraLevel=%d paragraph=%d, found paragraph index=%d expected=%d\n", 1904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru paraLevels[k], i, paraIndex, i); 1905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (gotLevel!=multiLevels[k][i]) { 1907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("For paraLevel=%d paragraph=%d, found level=%d expected %d\n", 1908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru paraLevels[k], i, gotLevel, multiLevels[k][i]); 1909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gotLevel=ubidi_getParaLevel(pBidi); 1912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (gotLevel!=multiLevels[k][0]) { 1913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("For paraLevel=%d getParaLevel=%d, expected %d\n", 1914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru paraLevels[k], gotLevel, multiLevels[k][0]); 1915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* check that the result of ubidi_getParaLevel changes if the first 1919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * paragraph has a different level 1920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru src[0]=0x05d2; /* Hebrew letter Gimel */ 1922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(pBidi, src, srcSize, UBIDI_DEFAULT_LTR, NULL, &errorCode); 1923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gotLevel=ubidi_getParaLevel(pBidi); 1924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (gotLevel!=UBIDI_RTL) { 1925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("For paraLevel=UBIDI_DEFAULT_LTR getParaLevel=%d, expected=%d\n", 1926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gotLevel, UBIDI_RTL); 1927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* check that line cannot overlap paragraph boundaries */ 1930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pLine=ubidi_open(); 1931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i=paraBounds[1]; 1932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru k=paraBounds[2]+1; 1933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setLine(pBidi, i, k, pLine, &errorCode); 1934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(errorCode)) { 1935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("For line limits %d-%d got success %s\n", 1936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, k, u_errorName(errorCode)); 1937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i=paraBounds[1]; 1940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru k=paraBounds[2]; 1941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setLine(pBidi, i, k, pLine, &errorCode); 1942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(errorCode)) { 1943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("For line limits %d-%d got error %s\n", 1944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, k, u_errorName(errorCode)); 1945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* check level of block separator at end of paragraph when orderParagraphsLTR==FALSE */ 1948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(pBidi, src, srcSize, UBIDI_RTL, NULL, &errorCode); 1949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* get levels through para Bidi block */ 1950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gotLevels=ubidi_getLevels(pBidi, &errorCode); 1951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(errorCode)) { 1952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error on Para getLevels %s\n", u_errorName(errorCode)); 1953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(pLine); 1954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(pBidi); 1955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=26; i<32; i++) { 1958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (gotLevels[i]!=UBIDI_RTL) { 1959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("For char %d(%04x), level=%d, expected=%d\n", 1960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, src[i], gotLevels[i], UBIDI_RTL); 1961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* get levels through para Line block */ 1964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i=paraBounds[1]; 1965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru k=paraBounds[2]; 1966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setLine(pBidi, i, k, pLine, &errorCode); 1967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(errorCode)) { 1968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("For line limits %d-%d got error %s\n", 1969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, k, u_errorName(errorCode)); 1970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(pLine); 1971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(pBidi); 1972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru paraIndex=ubidi_getParagraph(pLine, i, ¶Start, ¶Limit, &gotLevel, &errorCode); 1975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gotLevels=ubidi_getLevels(pLine, &errorCode); 1976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(errorCode)) { 1977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error on Line getLevels %s\n", u_errorName(errorCode)); 1978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(pLine); 1979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(pBidi); 1980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=ubidi_getLength(pLine); 1983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((gotLevel!=UBIDI_RTL) || (gotLevels[length-1]!=UBIDI_RTL)) { 1984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("For paragraph %d with limits %d-%d, paraLevel=%d expected=%d, " 1985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "level of separator=%d expected=%d\n", 1986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru paraIndex, paraStart, paraLimit, gotLevel, UBIDI_RTL, gotLevels[length-1], UBIDI_RTL); 1987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru orderParagraphsLTR=ubidi_isOrderParagraphsLTR(pBidi); 1989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (orderParagraphsLTR) { 1990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Found orderParagraphsLTR=%d expected=%d\n", orderParagraphsLTR, FALSE); 1991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_orderParagraphsLTR(pBidi, TRUE); 1993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru orderParagraphsLTR=ubidi_isOrderParagraphsLTR(pBidi); 1994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!orderParagraphsLTR) { 1995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Found orderParagraphsLTR=%d expected=%d\n", orderParagraphsLTR, TRUE); 1996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* check level of block separator at end of paragraph when orderParagraphsLTR==TRUE */ 1998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(pBidi, src, srcSize, UBIDI_RTL, NULL, &errorCode); 1999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* get levels through para Bidi block */ 2000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gotLevels=ubidi_getLevels(pBidi, &errorCode); 2001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=26; i<32; i++) { 2002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (gotLevels[i]!=0) { 2003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("For char %d(%04x), level=%d, expected=%d\n", 2004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, src[i], gotLevels[i], 0); 2005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* get levels through para Line block */ 2009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i=paraBounds[1]; 2010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru k=paraBounds[2]; 2011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setLine(pBidi, paraStart, paraLimit, pLine, &errorCode); 2012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru paraIndex=ubidi_getParagraph(pLine, i, ¶Start, ¶Limit, &gotLevel, &errorCode); 2013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gotLevels=ubidi_getLevels(pLine, &errorCode); 2014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=ubidi_getLength(pLine); 2015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((gotLevel!=UBIDI_RTL) || (gotLevels[length-1]!=0)) { 2016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("For paragraph %d with limits %d-%d, paraLevel=%d expected=%d, " 2017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "level of separator=%d expected=%d\n", 2018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru paraIndex, paraStart, paraLimit, gotLevel, UBIDI_RTL, gotLevels[length-1], 0); 2019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("levels="); 2020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (count=0; count<length; count++) { 2021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose(" %d", gotLevels[count]); 2022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\n"); 2024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test that the concatenation of separate invocations of the bidi code 2027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * on each individual paragraph in order matches the levels array that 2028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * results from invoking bidi once over the entire multiparagraph tests 2029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * (with orderParagraphsLTR false, of course) 2030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_unescape(text, src, MAXLEN); /* restore original content */ 2032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcSize=u_strlen(src); 2033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_orderParagraphsLTR(pBidi, FALSE); 2034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(pBidi, src, srcSize, UBIDI_DEFAULT_RTL, NULL, &errorCode); 2035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gotLevels=ubidi_getLevels(pBidi, &errorCode); 2036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=0; i<paraCount; i++) { 2037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* use pLine for individual paragraphs */ 2038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru paraStart = paraBounds[i]; 2039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length = paraBounds[i+1] - paraStart; 2040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(pLine, src+paraStart, length, UBIDI_DEFAULT_RTL, NULL, &errorCode); 2041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (j=0; j<length; j++) { 2042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((k=ubidi_getLevelAt(pLine, j)) != (gotLevel=gotLevels[paraStart+j])) { 2043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Checking paragraph concatenation: for paragraph=%d, " 2044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "char=%d(%04x), level=%d, expected=%d\n", 2045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, j, src[paraStart+j], k, gotLevel); 2046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* ensure that leading numerics in a paragraph are not treated as arabic 2051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numerals because of arabic text in a preceding paragraph 2052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_unescape(text2, src, MAXLEN); 2054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcSize=u_strlen(src); 2055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_orderParagraphsLTR(pBidi, TRUE); 2056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(pBidi, src, srcSize, UBIDI_RTL, NULL, &errorCode); 2057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gotLevels=ubidi_getLevels(pBidi, &errorCode); 2058c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (U_FAILURE(errorCode)) { 2059c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru log_err("Can't get levels. %s\n", u_errorName(errorCode)); 2060c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 2061c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 2062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=0; i<srcSize; i++) { 2063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (gotLevels[i]!=levels2[i]) { 2064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Checking leading numerics: for char %d(%04x), level=%d, expected=%d\n", 2065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, src[i], gotLevels[i], levels2[i]); 2066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* check handling of whitespace before end of paragraph separator when 2070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * orderParagraphsLTR==TRUE, when last paragraph has, and lacks, a terminating B 2071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_memset(src, 0x0020, MAXLEN); 2073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcSize = 5; 2074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_orderParagraphsLTR(pBidi, TRUE); 2075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=0x001c; i<=0x0020; i+=(0x0020-0x001c)) { 2076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru src[4]=(UChar)i; /* with and without terminating B */ 2077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (j=0x0041; j<=0x05d0; j+=(0x05d0-0x0041)) { 2078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru src[0]=(UChar)j; /* leading 'A' or Alef */ 2079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (gotLevel=4; gotLevel<=5; gotLevel++) { 2080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test even and odd paraLevel */ 2081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(pBidi, src, srcSize, gotLevel, NULL, &errorCode); 2082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gotLevels=ubidi_getLevels(pBidi, &errorCode); 2083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (k=1; k<=3; k++) { 2084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (gotLevels[k]!=gotLevel) { 2085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Checking trailing spaces: for leading_char=%04x, " 2086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "last_char=%04x, index=%d, level=%d, expected=%d\n", 2087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru src[0], src[4], k, gotLevels[k], gotLevel); 2088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* check default orientation when inverse bidi and paragraph starts 2095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * with LTR strong char and ends with RTL strong char, with and without 2096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * a terminating B 2097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setReorderingMode(pBidi, UBIDI_REORDER_INVERSE_LIKE_DIRECT); 2099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("abc \\u05d2\\u05d1\n", src, MAXLEN); 2100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(pBidi, src, srcLen, UBIDI_DEFAULT_LTR, NULL, &errorCode); 2101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLen = ubidi_writeReordered(pBidi, dest, MAXLEN, 0, &errorCode); 2102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("\\u05d1\\u05d2 abc\n", src, MAXLEN); 2103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (memcmp(src, dest, destLen * sizeof(UChar))) { 2104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nInvalid output #0, should be '%s', got '%s'\n", 2105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru aescstrdup(src, srcLen), aescstrdup(dest, destLen)); 2106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("abc \\u05d2\\u05d1", src, MAXLEN); 2108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(pBidi, src, srcLen, UBIDI_DEFAULT_LTR, NULL, &errorCode); 2109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLen = ubidi_writeReordered(pBidi, dest, MAXLEN, 0, &errorCode); 2110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("\\u05d1\\u05d2 abc", src, MAXLEN); 2111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (memcmp(src, dest, destLen * sizeof(UChar))) { 2112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nInvalid output #1, should be '%s', got '%s'\n", 2113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru aescstrdup(src, srcLen), aescstrdup(dest, destLen)); 2114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* check multiple paragraphs together with explicit levels 2117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setReorderingMode(pBidi, UBIDI_REORDER_DEFAULT); 2119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("ab\\u05d1\\u05d2\n\\u05d3\\u05d4123", src, MAXLEN); 2120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(pBidi, src, srcLen, UBIDI_LTR, myLevels, &errorCode); 2121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLen = ubidi_writeReordered(pBidi, dest, MAXLEN, 0, &errorCode); 2122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape("ab\\u05d2\\u05d1\\n123\\u05d4\\u05d3", src, MAXLEN); 2123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (memcmp(src, dest, destLen * sizeof(UChar))) { 2124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nInvalid output #2, should be '%s', got '%s'\n", 2125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru aescstrdup(src, srcLen), aescstrdup(dest, destLen)); 2126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru count = ubidi_countParagraphs(pBidi); 2128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (count != 2) { 2129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nInvalid number of paras, should be 2, got %d\n", count); 2130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(pLine); 2133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(pBidi); 2134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\nExiting TestMultipleParagraphs\n\n"); 2135c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 2136c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* check levels in multiple paragraphs with default para level 2137c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */ 2138c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pBidi = ubidi_open(); 2139c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru errorCode = U_ZERO_ERROR; 2140f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius ubidi_setPara(pBidi, multiparaTestString, UPRV_LENGTHOF(multiparaTestString), 2141c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UBIDI_DEFAULT_LTR, NULL, &errorCode); 2142c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (U_FAILURE(errorCode)) { 2143c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru log_err("ubidi_setPara failed for multiparaTestString\n"); 2144c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ubidi_close(pBidi); 2145c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 2146c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 2147c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru gotLevels = ubidi_getLevels(pBidi, &errorCode); 2148c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (U_FAILURE(errorCode)) { 2149c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru log_err("ubidi_getLevels failed for multiparaTestString\n"); 2150c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ubidi_close(pBidi); 2151c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 2152c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 2153f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius for (i = 0; i < UPRV_LENGTHOF(multiparaTestString); i++) { 2154c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (gotLevels[i] != multiparaTestLevels[i]) { 2155c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru log_err("Error on level for multiparaTestString at index %d, " 2156c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru "expected=%d, actual=%d\n", 2157c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru i, multiparaTestLevels[i], gotLevels[i]); 2158c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 2159c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 2160c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ubidi_close(pBidi); 2161c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 2162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* inverse BiDi ------------------------------------------------------------- */ 2166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int countRoundtrips=0, countNonRoundtrips=0; 2168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2169f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius#define STRING_TEST_CASE(s) { (s), UPRV_LENGTHOF(s) } 2170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 2172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerutestInverse(void) { 2173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar 2174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru string0[]={ 0x6c, 0x61, 0x28, 0x74, 0x69, 0x6e, 0x20, 0x5d0, 0x5d1, 0x29, 0x5d2, 0x5d3 }, 2175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru string1[]={ 0x6c, 0x61, 0x74, 0x20, 0x5d0, 0x5d1, 0x5d2, 0x20, 0x31, 0x32, 0x33 }, 2176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru string2[]={ 0x6c, 0x61, 0x74, 0x20, 0x5d0, 0x28, 0x5d1, 0x5d2, 0x20, 0x31, 0x29, 0x32, 0x33 }, 2177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru string3[]={ 0x31, 0x32, 0x33, 0x20, 0x5d0, 0x5d1, 0x5d2, 0x20, 0x34, 0x35, 0x36 }, 2178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru string4[]={ 0x61, 0x62, 0x20, 0x61, 0x62, 0x20, 0x661, 0x662 }; 2179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const struct { 2181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *s; 2182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length; 2183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } testCases[]={ 2184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru STRING_TEST_CASE(string0), 2185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru STRING_TEST_CASE(string1), 2186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru STRING_TEST_CASE(string2), 2187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru STRING_TEST_CASE(string3), 2188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru STRING_TEST_CASE(string4) 2189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDi *pBiDi; 2192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 2193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i; 2194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\nEntering TestInverse\n\n"); 2196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pBiDi=ubidi_open(); 2197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(pBiDi==NULL) { 2198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("unable to open a UBiDi object (out of memory)\n"); 2199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2202f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius log_verbose("inverse Bidi: testInverse(L) with %u test cases ---\n", UPRV_LENGTHOF(testCases)); 2203f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius for(i=0; i<UPRV_LENGTHOF(testCases); ++i) { 2204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing case %d\n", i); 2205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testInverseBidi(pBiDi, testCases[i].s, testCases[i].length, 0, &errorCode); 2207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2209f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius log_verbose("inverse Bidi: testInverse(R) with %u test cases ---\n", UPRV_LENGTHOF(testCases)); 2210f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius for(i=0; i<UPRV_LENGTHOF(testCases); ++i) { 2211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing case %d\n", i); 2212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testInverseBidi(pBiDi, testCases[i].s, testCases[i].length, 1, &errorCode); 2214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testManyInverseBidi(pBiDi, 0); 2217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testManyInverseBidi(pBiDi, 1); 2218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(pBiDi); 2220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("inverse Bidi: rountrips: %5u\nnon-roundtrips: %5u\n", countRoundtrips, countNonRoundtrips); 2222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testWriteReverse(); 2224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testManyAddedPoints(); 2226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testMisc(); 2228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\nExiting TestInverse\n\n"); 2230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define COUNT_REPEAT_SEGMENTS 6 2233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const UChar repeatSegments[COUNT_REPEAT_SEGMENTS][2]={ 2235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x61, 0x62 }, /* L */ 2236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x5d0, 0x5d1 }, /* R */ 2237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x627, 0x628 }, /* AL */ 2238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x31, 0x32 }, /* EN */ 2239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x661, 0x662 }, /* AN */ 2240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x20, 0x20 } /* WS (N) */ 2241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 2242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 2244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru_testManyInverseBidi(UBiDi *pBiDi, UBiDiLevel direction) { 2245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar text[8]={ 0, 0, 0x20, 0, 0, 0x20, 0, 0 }; 2246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i, j, k; 2247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 2248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("inverse Bidi: testManyInverseBidi(%c) - test permutations of text snippets ---\n", 2250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru direction==0 ? 'L' : 'R'); 2251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<COUNT_REPEAT_SEGMENTS; ++i) { 2252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru text[0]=repeatSegments[i][0]; 2253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru text[1]=repeatSegments[i][1]; 2254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(j=0; j<COUNT_REPEAT_SEGMENTS; ++j) { 2255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru text[3]=repeatSegments[j][0]; 2256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru text[4]=repeatSegments[j][1]; 2257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(k=0; k<COUNT_REPEAT_SEGMENTS; ++k) { 2258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru text[6]=repeatSegments[k][0]; 2259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru text[7]=repeatSegments[k][1]; 2260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("inverse Bidi: testManyInverseBidi()[%u %u %u]\n", i, j, k); 2263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testInverseBidi(pBiDi, text, 8, direction, &errorCode); 2264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 2270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru_testInverseBidi(UBiDi *pBiDi, const UChar *src, int32_t srcLength, 2271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDiLevel direction, UErrorCode *pErrorCode) { 2272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar visualLTR[MAXLEN], logicalDest[MAXLEN], visualDest[MAXLEN]; 2273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t ltrLength, logicalLength, visualLength; 2274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(direction==0) { 2276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("inverse Bidi: testInverse(L)\n"); 2277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* convert visual to logical */ 2279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setInverse(pBiDi, TRUE); 2280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!ubidi_isInverse(pBiDi)) { 2281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error while doing ubidi_setInverse(TRUE)\n"); 2282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(pBiDi, src, srcLength, 0, NULL, pErrorCode); 2284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (src != ubidi_getText(pBiDi)) { 2285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Wrong value returned by ubidi_getText\n"); 2286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2287f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius logicalLength=ubidi_writeReordered(pBiDi, logicalDest, UPRV_LENGTHOF(logicalDest), 2288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBIDI_DO_MIRRORING|UBIDI_INSERT_LRM_FOR_NUMERIC, pErrorCode); 2289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose(" v "); 2290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printUnicode(src, srcLength, ubidi_getLevels(pBiDi, pErrorCode)); 2291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\n"); 2292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* convert back to visual LTR */ 2294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setInverse(pBiDi, FALSE); 2295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ubidi_isInverse(pBiDi)) { 2296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error while doing ubidi_setInverse(FALSE)\n"); 2297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(pBiDi, logicalDest, logicalLength, 0, NULL, pErrorCode); 2299f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius visualLength=ubidi_writeReordered(pBiDi, visualDest, UPRV_LENGTHOF(visualDest), 2300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBIDI_DO_MIRRORING|UBIDI_REMOVE_BIDI_CONTROLS, pErrorCode); 2301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 2302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("inverse Bidi: testInverse(R)\n"); 2303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* reverse visual from RTL to LTR */ 2305f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius ltrLength=ubidi_writeReverse(src, srcLength, visualLTR, UPRV_LENGTHOF(visualLTR), 0, pErrorCode); 2306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose(" vr"); 2307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printUnicode(src, srcLength, NULL); 2308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\n"); 2309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* convert visual RTL to logical */ 2311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setInverse(pBiDi, TRUE); 2312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(pBiDi, visualLTR, ltrLength, 0, NULL, pErrorCode); 2313f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius logicalLength=ubidi_writeReordered(pBiDi, logicalDest, UPRV_LENGTHOF(logicalDest), 2314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBIDI_DO_MIRRORING|UBIDI_INSERT_LRM_FOR_NUMERIC, pErrorCode); 2315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose(" vl"); 2316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printUnicode(visualLTR, ltrLength, ubidi_getLevels(pBiDi, pErrorCode)); 2317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\n"); 2318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* convert back to visual RTL */ 2320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setInverse(pBiDi, FALSE); 2321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(pBiDi, logicalDest, logicalLength, 0, NULL, pErrorCode); 2322f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius visualLength=ubidi_writeReordered(pBiDi, visualDest, UPRV_LENGTHOF(visualDest), 2323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBIDI_DO_MIRRORING|UBIDI_REMOVE_BIDI_CONTROLS|UBIDI_OUTPUT_REVERSE, pErrorCode); 2324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose(" l "); 2326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printUnicode(logicalDest, logicalLength, ubidi_getLevels(pBiDi, pErrorCode)); 2327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\n"); 2328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose(" v "); 2329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printUnicode(visualDest, visualLength, NULL); 2330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\n"); 2331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* check and print results */ 2333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(*pErrorCode)) { 2334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("inverse BiDi: *** error %s\n" 2335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " turn on verbose mode to see details\n", u_errorName(*pErrorCode)); 2336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if(srcLength==visualLength && memcmp(src, visualDest, srcLength*U_SIZEOF_UCHAR)==0) { 2337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++countRoundtrips; 2338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose(" + roundtripped\n"); 2339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 2340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++countNonRoundtrips; 2341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose(" * did not roundtrip\n"); 2342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("inverse BiDi: transformation visual->logical->visual did not roundtrip the text;\n" 2343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " turn on verbose mode to see details\n"); 2344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 2348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru_testWriteReverse(void) { 2349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* U+064e and U+0650 are combining marks (Mn) */ 2350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar forward[]={ 2351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x200f, 0x627, 0x64e, 0x650, 0x20, 0x28, 0x31, 0x29 2352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, reverseKeepCombining[]={ 2353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x29, 0x31, 0x28, 0x20, 0x627, 0x64e, 0x650, 0x200f 2354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, reverseRemoveControlsKeepCombiningDoMirror[]={ 2355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x28, 0x31, 0x29, 0x20, 0x627, 0x64e, 0x650 2356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar reverse[10]; 2358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 2359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length; 2360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test ubidi_writeReverse() with "interesting" options */ 2362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2363f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=ubidi_writeReverse(forward, UPRV_LENGTHOF(forward), 2364f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius reverse, UPRV_LENGTHOF(reverse), 2365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBIDI_KEEP_BASE_COMBINING, 2366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2367f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(reverseKeepCombining) || memcmp(reverse, reverseKeepCombining, length*U_SIZEOF_UCHAR)!=0) { 2368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in ubidi_writeReverse(UBIDI_KEEP_BASE_COMBINING): length=%d (should be %d), error code %s\n", 2369f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length, UPRV_LENGTHOF(reverseKeepCombining), u_errorName(errorCode)); 2370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2372f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius memset(reverse, 0xa5, UPRV_LENGTHOF(reverse)*U_SIZEOF_UCHAR); 2373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2374f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=ubidi_writeReverse(forward, UPRV_LENGTHOF(forward), 2375f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius reverse, UPRV_LENGTHOF(reverse), 2376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBIDI_REMOVE_BIDI_CONTROLS|UBIDI_DO_MIRRORING|UBIDI_KEEP_BASE_COMBINING, 2377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2378f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(reverseRemoveControlsKeepCombiningDoMirror) || memcmp(reverse, reverseRemoveControlsKeepCombiningDoMirror, length*U_SIZEOF_UCHAR)!=0) { 2379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in ubidi_writeReverse(UBIDI_REMOVE_BIDI_CONTROLS|UBIDI_DO_MIRRORING|UBIDI_KEEP_BASE_COMBINING):\n" 2380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " length=%d (should be %d), error code %s\n", 2381f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length, UPRV_LENGTHOF(reverseRemoveControlsKeepCombiningDoMirror), u_errorName(errorCode)); 2382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void _testManyAddedPoints(void) { 2386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode = U_ZERO_ERROR; 2387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDi *bidi = ubidi_open(); 2388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar text[90], dest[MAXLEN], expected[120]; 2389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int destLen, i; 2390f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius for (i = 0; i < UPRV_LENGTHOF(text); i+=3) { 2391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru text[i] = 0x0061; /* 'a' */ 2392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru text[i+1] = 0x05d0; 2393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru text[i+2] = 0x0033; /* '3' */ 2394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setReorderingMode(bidi, UBIDI_REORDER_INVERSE_LIKE_DIRECT); 2396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setReorderingOptions(bidi, UBIDI_OPTION_INSERT_MARKS); 2397f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius ubidi_setPara(bidi, text, UPRV_LENGTHOF(text), UBIDI_LTR, NULL, &errorCode); 2398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode); 2399f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius for (i = 0; i < UPRV_LENGTHOF(expected); i+=4) { 2400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expected[i] = 0x0061; /* 'a' */ 2401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expected[i+1] = 0x05d0; 2402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expected[i+2] = 0x200e; 2403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expected[i+3] = 0x0033; /* '3' */ 2404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (memcmp(dest, expected, destLen * sizeof(UChar))) { 2406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nInvalid output with many added points, " 2407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "expected '%s', got '%s'\n", 2408f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius aescstrdup(expected, UPRV_LENGTHOF(expected)), 2409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru aescstrdup(dest, destLen)); 2410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(bidi); 2412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void _testMisc(void) { 2415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode = U_ZERO_ERROR; 2416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDi *bidi = ubidi_open(); 2417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar src[3], dest[MAXLEN], expected[5]; 2418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int destLen; 2419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setInverse(bidi, TRUE); 2420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru src[0] = src[1] = src[2] = 0x0020; 2421f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius ubidi_setPara(bidi, src, UPRV_LENGTHOF(src), UBIDI_RTL, NULL, &errorCode); 2422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 2423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBIDI_OUTPUT_REVERSE | UBIDI_INSERT_LRM_FOR_NUMERIC, 2424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_unescape("\\u200f \\u200f", expected, 5); 2426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (memcmp(dest, expected, destLen * sizeof(UChar))) { 2427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nInvalid output with RLM at both sides, " 2428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "expected '%s', got '%s'\n", 2429f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius aescstrdup(expected, UPRV_LENGTHOF(expected)), 2430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru aescstrdup(dest, destLen)); 2431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(bidi); 2433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* arabic shaping ----------------------------------------------------------- */ 2436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 2438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerudoArabicShapingTest(void) { 2439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar 2440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru source[]={ 2441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x31, /* en:1 */ 2442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x627, /* arabic:alef */ 2443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x32, /* en:2 */ 2444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x6f3, /* an:3 */ 2445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x61, /* latin:a */ 2446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x34, /* en:4 */ 2447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0 2448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, en2an[]={ 2449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x661, 0x627, 0x662, 0x6f3, 0x61, 0x664, 0 2450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, an2en[]={ 2451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x31, 0x627, 0x32, 0x33, 0x61, 0x34, 0 2452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, logical_alen2an_init_lr[]={ 2453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x31, 0x627, 0x662, 0x6f3, 0x61, 0x34, 0 2454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, logical_alen2an_init_al[]={ 2455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x6f1, 0x627, 0x6f2, 0x6f3, 0x61, 0x34, 0 2456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, reverse_alen2an_init_lr[]={ 2457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x661, 0x627, 0x32, 0x6f3, 0x61, 0x34, 0 2458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, reverse_alen2an_init_al[]={ 2459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x6f1, 0x627, 0x32, 0x6f3, 0x61, 0x6f4, 0 246050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho }, lamalef[]={ 246150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xfefb, 0 2462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar dest[8]; 2464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 2465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length; 2466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test number shaping */ 2468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* european->arabic */ 2470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2471f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(source, UPRV_LENGTHOF(source), 2472f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 2473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN, 2474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2475f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(source) || memcmp(dest, en2an, length*U_SIZEOF_UCHAR)!=0) { 2476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(en2an)\n"); 2477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* arabic->european */ 2480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=u_shapeArabic(source, -1, 2482f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 2483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_DIGITS_AN2EN|U_SHAPE_DIGIT_TYPE_AN_EXTENDED, 2484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode) || length!=u_strlen(source) || memcmp(dest, an2en, length*U_SIZEOF_UCHAR)!=0) { 2486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(an2en)\n"); 2487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* european->arabic with context, logical order, initial state not AL */ 2490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2491f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(source, UPRV_LENGTHOF(source), 2492f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 2493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_DIGITS_ALEN2AN_INIT_LR|U_SHAPE_DIGIT_TYPE_AN, 2494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2495f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(source) || memcmp(dest, logical_alen2an_init_lr, length*U_SIZEOF_UCHAR)!=0) { 2496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(logical_alen2an_init_lr)\n"); 2497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* european->arabic with context, logical order, initial state AL */ 2500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2501f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(source, UPRV_LENGTHOF(source), 2502f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 2503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_DIGITS_ALEN2AN_INIT_AL|U_SHAPE_DIGIT_TYPE_AN_EXTENDED, 2504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2505f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(source) || memcmp(dest, logical_alen2an_init_al, length*U_SIZEOF_UCHAR)!=0) { 2506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(logical_alen2an_init_al)\n"); 2507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* european->arabic with context, reverse order, initial state not AL */ 2510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2511f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(source, UPRV_LENGTHOF(source), 2512f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 2513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_DIGITS_ALEN2AN_INIT_LR|U_SHAPE_DIGIT_TYPE_AN|U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 2514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2515f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(source) || memcmp(dest, reverse_alen2an_init_lr, length*U_SIZEOF_UCHAR)!=0) { 2516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(reverse_alen2an_init_lr)\n"); 2517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* european->arabic with context, reverse order, initial state AL */ 2520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2521f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(source, UPRV_LENGTHOF(source), 2522f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 2523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_DIGITS_ALEN2AN_INIT_AL|U_SHAPE_DIGIT_TYPE_AN_EXTENDED|U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 2524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2525f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(source) || memcmp(dest, reverse_alen2an_init_al, length*U_SIZEOF_UCHAR)!=0) { 2526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(reverse_alen2an_init_al)\n"); 2527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test noop */ 2530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2531f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(source, UPRV_LENGTHOF(source), 2532f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 2533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0, 2534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2535f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(source) || memcmp(dest, source, length*U_SIZEOF_UCHAR)!=0) { 2536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(noop)\n"); 2537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=u_shapeArabic(source, 0, 2541f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 2542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN, 2543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode) || length!=0) { 2545f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius log_err("failure in u_shapeArabic(en2an, sourceLength=0), returned %d/%s\n", u_errorName(errorCode), UPRV_LENGTHOF(source)); 2546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* preflight digit shaping */ 2549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2550f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(source, UPRV_LENGTHOF(source), 2551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL, 0, 2552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN, 2553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2554f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=UPRV_LENGTHOF(source)) { 2555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(en2an preflighting), returned %d/%s instead of %d/U_BUFFER_OVERFLOW_ERROR\n", 2556f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length, u_errorName(errorCode), UPRV_LENGTHOF(source)); 2557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test illegal arguments */ 2560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2561f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(NULL, UPRV_LENGTHOF(source), 2562f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 2563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN, 2564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 2566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(source=NULL), returned %s instead of U_ILLEGAL_ARGUMENT_ERROR\n", u_errorName(errorCode)); 2567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=u_shapeArabic(source, -2, 2571f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 2572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN, 2573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 2575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(sourceLength=-2), returned %s instead of U_ILLEGAL_ARGUMENT_ERROR\n", u_errorName(errorCode)); 2576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2579f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(source, UPRV_LENGTHOF(source), 2580f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius NULL, UPRV_LENGTHOF(dest), 2581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN, 2582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 2584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(dest=NULL), returned %s instead of U_ILLEGAL_ARGUMENT_ERROR\n", u_errorName(errorCode)); 2585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2588f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(source, UPRV_LENGTHOF(source), 2589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest, -1, 2590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN, 2591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 2593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(destSize=-1), returned %s instead of U_ILLEGAL_ARGUMENT_ERROR\n", u_errorName(errorCode)); 2594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2597f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(source, UPRV_LENGTHOF(source), 2598f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 2599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_DIGITS_RESERVED|U_SHAPE_DIGIT_TYPE_AN, 2600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 2602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(U_SHAPE_DIGITS_RESERVED), returned %s instead of U_ILLEGAL_ARGUMENT_ERROR\n", u_errorName(errorCode)); 2603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2606f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(source, UPRV_LENGTHOF(source), 2607f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 2608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_RESERVED, 2609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 2611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(U_SHAPE_DIGIT_TYPE_RESERVED), returned %s instead of U_ILLEGAL_ARGUMENT_ERROR\n", u_errorName(errorCode)); 2612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2615f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(source, UPRV_LENGTHOF(source), 2616f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius (UChar *)(source+2), UPRV_LENGTHOF(dest), /* overlap source and destination */ 2617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN, 2618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 2620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(U_SHAPE_DIGIT_TYPE_RESERVED), returned %s instead of U_ILLEGAL_ARGUMENT_ERROR\n", u_errorName(errorCode)); 2621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 262250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 262350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 2624f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(lamalef, UPRV_LENGTHOF(lamalef), 2625f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 262650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho U_SHAPE_LETTERS_UNSHAPE | U_SHAPE_LENGTH_GROW_SHRINK | U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 262750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho &errorCode); 2628f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length == UPRV_LENGTHOF(lamalef)) { 262950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("failure in u_shapeArabic(U_SHAPE_LETTERS_UNSHAPE | U_SHAPE_LENGTH_GROW_SHRINK | U_SHAPE_TEXT_DIRECTION_VISUAL_LTR)\n"); 263050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("returned %s instead of U_ZERO_ERROR or returned length %d instead of 3\n", u_errorName(errorCode), length); 263150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 2632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 2635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerudoLamAlefSpecialVLTRArabicShapingTest(void) { 2636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar 2637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru source[]={ 2638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*a*/ 0x20 ,0x646,0x622,0x644,0x627,0x20, 2639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*b*/ 0x646,0x623,0x64E,0x644,0x627,0x20, 2640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*c*/ 0x646,0x627,0x670,0x644,0x627,0x20, 2641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*d*/ 0x646,0x622,0x653,0x644,0x627,0x20, 2642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*e*/ 0x646,0x625,0x655,0x644,0x627,0x20, 2643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*f*/ 0x646,0x622,0x654,0x644,0x627,0x20, 2644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*g*/ 0xFEFC,0x639 2645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, shape_near[]={ 2646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x20,0xfee5,0x20,0xfef5,0xfe8d,0x20,0xfee5,0x20,0xfe76,0xfef7,0xfe8d,0x20, 2647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfee5,0x20,0x670,0xfefb,0xfe8d,0x20,0xfee5,0x20,0x653,0xfef5,0xfe8d,0x20, 2648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfee5,0x20,0x655,0xfef9,0xfe8d,0x20,0xfee5,0x20,0x654,0xfef5,0xfe8d,0x20, 2649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfefc,0xfecb 2650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, shape_at_end[]={ 2651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x20,0xfee5,0xfef5,0xfe8d,0x20,0xfee5,0xfe76,0xfef7,0xfe8d,0x20,0xfee5,0x670, 2652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfefb,0xfe8d,0x20,0xfee5,0x653,0xfef5,0xfe8d,0x20,0xfee5,0x655,0xfef9,0xfe8d, 2653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x20,0xfee5,0x654,0xfef5,0xfe8d,0x20,0xfefc,0xfecb,0x20,0x20,0x20,0x20,0x20,0x20 2654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, shape_at_begin[]={ 2655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xfee5,0xfef5,0xfe8d,0x20,0xfee5,0xfe76, 2656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfef7,0xfe8d,0x20,0xfee5,0x670,0xfefb,0xfe8d,0x20,0xfee5,0x653,0xfef5,0xfe8d, 2657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x20,0xfee5,0x655,0xfef9,0xfe8d,0x20,0xfee5,0x654,0xfef5,0xfe8d,0x20,0xfefc,0xfecb 2658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, shape_grow_shrink[]={ 2659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x20,0xfee5,0xfef5,0xfe8d,0x20,0xfee5,0xfe76,0xfef7,0xfe8d,0x20,0xfee5, 2660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x670,0xfefb,0xfe8d,0x20,0xfee5,0x653,0xfef5,0xfe8d,0x20,0xfee5,0x655,0xfef9, 2661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfe8d,0x20,0xfee5,0x654,0xfef5,0xfe8d,0x20,0xfefc,0xfecb 2662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, shape_excepttashkeel_near[]={ 2663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x20,0xfee5,0x20,0xfef5,0xfe8d,0x20,0xfee5,0x20,0xfe76,0xfef7,0xfe8d,0x20, 2664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfee5,0x20,0x670,0xfefb,0xfe8d,0x20,0xfee5,0x20,0x653,0xfef5,0xfe8d,0x20, 2665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfee5,0x20,0x655,0xfef9,0xfe8d,0x20,0xfee5,0x20,0x654,0xfef5,0xfe8d,0x20, 2666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfefc,0xfecb 2667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, shape_excepttashkeel_at_end[]={ 2668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x20,0xfee5,0xfef5,0xfe8d,0x20,0xfee5,0xfe76,0xfef7,0xfe8d,0x20,0xfee5, 2669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x670,0xfefb,0xfe8d,0x20,0xfee5,0x653,0xfef5,0xfe8d,0x20,0xfee5,0x655,0xfef9, 2670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfe8d,0x20,0xfee5,0x654,0xfef5,0xfe8d,0x20,0xfefc,0xfecb,0x20,0x20,0x20, 2671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x20,0x20,0x20 2672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, shape_excepttashkeel_at_begin[]={ 2673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xfee5,0xfef5,0xfe8d,0x20,0xfee5,0xfe76, 2674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfef7,0xfe8d,0x20,0xfee5,0x670,0xfefb,0xfe8d,0x20,0xfee5,0x653,0xfef5,0xfe8d, 2675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x20,0xfee5,0x655,0xfef9,0xfe8d,0x20,0xfee5,0x654,0xfef5,0xfe8d,0x20,0xfefc,0xfecb 2676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, shape_excepttashkeel_grow_shrink[]={ 2677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x20,0xfee5,0xfef5,0xfe8d,0x20,0xfee5,0xfe76,0xfef7,0xfe8d,0x20,0xfee5,0x670, 2678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfefb,0xfe8d,0x20,0xfee5,0x653,0xfef5,0xfe8d,0x20,0xfee5,0x655,0xfef9,0xfe8d, 2679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x20,0xfee5,0x654,0xfef5,0xfe8d,0x20,0xfefc,0xfecb 2680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar dest[38]; 2683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 2684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length; 2685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2688f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(source, UPRV_LENGTHOF(source), 2689f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 2690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_LETTERS_SHAPE|U_SHAPE_LENGTH_FIXED_SPACES_NEAR| 2691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 2692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2694f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(shape_near) || memcmp(dest, shape_near, length*U_SIZEOF_UCHAR)!=0) { 2695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(LAMALEF shape_near)\n"); 2696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2700f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(source, UPRV_LENGTHOF(source), 2701f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 2702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_LETTERS_SHAPE|U_SHAPE_LENGTH_FIXED_SPACES_AT_END| 2703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 2704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2706f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(shape_at_end) || memcmp(dest, shape_at_end, length*U_SIZEOF_UCHAR)!=0) { 2707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(LAMALEF shape_at_end)\n"); 2708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2712f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(source, UPRV_LENGTHOF(source), 2713f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 2714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_LETTERS_SHAPE|U_SHAPE_LENGTH_FIXED_SPACES_AT_BEGINNING| 2715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 2716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2718f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(shape_at_begin) || memcmp(dest, shape_at_begin, length*U_SIZEOF_UCHAR)!=0) { 2719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(LAMALEF shape_at_begin)\n"); 2720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2724f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(source, UPRV_LENGTHOF(source), 2725f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 2726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_LETTERS_SHAPE|U_SHAPE_LENGTH_GROW_SHRINK| 2727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 2728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode) || memcmp(dest, shape_grow_shrink, length*U_SIZEOF_UCHAR)!=0) { 2731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(LAMALEF shape_grow_shrink)\n"); 2732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* ==================== U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED ==================== */ 2735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2738f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(source, UPRV_LENGTHOF(source), 2739f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 2740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED|U_SHAPE_LENGTH_FIXED_SPACES_NEAR| 2741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 2742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2744f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(shape_excepttashkeel_near) || memcmp(dest, shape_excepttashkeel_near, length*U_SIZEOF_UCHAR)!=0) { 2745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(LAMALEF shape_excepttashkeel_near)\n"); 2746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2750f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(source, UPRV_LENGTHOF(source), 2751f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 2752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED|U_SHAPE_LENGTH_FIXED_SPACES_AT_END| 2753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 2754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2756f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(shape_excepttashkeel_at_end) || memcmp(dest,shape_excepttashkeel_at_end , length*U_SIZEOF_UCHAR)!=0) { 2757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(LAMALEF shape_excepttashkeel_at_end)\n"); 2758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2762f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(source, UPRV_LENGTHOF(source), 2763f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 2764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED|U_SHAPE_LENGTH_FIXED_SPACES_AT_BEGINNING| 2765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 2766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2768f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(shape_excepttashkeel_at_begin) || memcmp(dest, shape_excepttashkeel_at_begin, length*U_SIZEOF_UCHAR)!=0) { 2769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(LAMALEF shape_excepttashkeel_at_begin)\n"); 2770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2774f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(source, UPRV_LENGTHOF(source), 2775f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 2776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED|U_SHAPE_LENGTH_GROW_SHRINK| 2777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 2778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode) || memcmp(dest, shape_excepttashkeel_grow_shrink, length*U_SIZEOF_UCHAR)!=0) { 2781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(LAMALEF shape_excepttashkeel_grow_shrink)\n"); 2782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 2786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerudoTashkeelSpecialVLTRArabicShapingTest(void) { 2787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar 2788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru source[]={ 2789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x64A,0x628,0x631,0x639,0x20, 2790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x64A,0x628,0x651,0x631,0x64E,0x639,0x20, 2791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x64C,0x64A,0x628,0x631,0x64F,0x639,0x20, 2792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x628,0x670,0x631,0x670,0x639,0x20, 2793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x628,0x653,0x631,0x653,0x639,0x20, 2794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x628,0x654,0x631,0x654,0x639,0x20, 2795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x628,0x655,0x631,0x655,0x639,0x20, 2796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, shape_near[]={ 2797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfef2,0xfe91,0xfeae,0xfecb,0x20,0xfef2,0xfe91,0xfe7c,0xfeae,0xfe77,0xfecb, 2798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x20,0xfe72,0xfef2,0xfe91,0xfeae,0xfe79,0xfecb,0x20,0xfe8f,0x670,0xfeae,0x670, 2799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfecb,0x20,0xfe8f,0x653,0xfeae,0x653,0xfecb,0x20,0xfe8f,0x654,0xfeae,0x654, 2800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfecb,0x20,0xfe8f,0x655,0xfeae,0x655,0xfecb,0x20 2801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, shape_excepttashkeel_near[]={ 2802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfef2,0xfe91,0xfeae,0xfecb,0x20,0xfef2,0xfe91,0xfe7c,0xfeae,0xfe76,0xfecb,0x20, 2803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfe72,0xfef2,0xfe91,0xfeae,0xfe78,0xfecb,0x20,0xfe8f,0x670,0xfeae,0x670,0xfecb, 2804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x20,0xfe8f,0x653,0xfeae,0x653,0xfecb,0x20,0xfe8f,0x654,0xfeae,0x654,0xfecb,0x20, 2805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfe8f,0x655,0xfeae,0x655,0xfecb,0x20 2806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar dest[43]; 2809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 2810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length; 2811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2814f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(source, UPRV_LENGTHOF(source), 2815f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 2816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_LETTERS_SHAPE|U_SHAPE_LENGTH_FIXED_SPACES_NEAR| 2817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 2818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2820f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(shape_near) || memcmp(dest, shape_near, length*U_SIZEOF_UCHAR)!=0) { 2821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(TASHKEEL shape_near)\n"); 2822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2826f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(source, UPRV_LENGTHOF(source), 2827f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 2828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED|U_SHAPE_LENGTH_FIXED_SPACES_NEAR| 2829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 2830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2832f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(shape_excepttashkeel_near) || memcmp(dest, shape_excepttashkeel_near, length*U_SIZEOF_UCHAR)!=0) { 2833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(TASHKEEL shape_excepttashkeel_near)\n"); 2834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 2838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerudoLOGICALArabicDeShapingTest(void) { 2839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar 2840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru source[]={ 2841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0020,0x0020,0x0020,0xFE8D,0xFEF5,0x0020,0xFEE5,0x0020,0xFE8D,0xFEF7,0x0020, 2842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xFED7,0xFEFC,0x0020,0xFEE1,0x0020,0xFE8D,0xFEDF,0xFECC,0xFEAE,0xFE91,0xFEF4, 2843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xFE94,0x0020,0xFE8D,0xFEDF,0xFEA4,0xFEAE,0xFE93,0x0020,0x0020,0x0020,0x0020 2844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, unshape_near[]={ 2845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x20,0x20,0x20,0x627,0x644,0x622,0x646,0x20,0x627,0x644,0x623,0x642,0x644,0x627, 2846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x645,0x20,0x627,0x644,0x639,0x631,0x628,0x64a,0x629,0x20,0x627,0x644,0x62d,0x631, 2847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x629,0x20,0x20,0x20,0x20 2848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, unshape_at_end[]={ 2849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x20,0x20,0x20,0x627,0x644,0x622,0x20,0x646,0x20,0x627,0x644,0x623,0x20,0x642, 2850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x644,0x627,0x20,0x645,0x20,0x627,0x644,0x639,0x631,0x628,0x64a,0x629,0x20,0x627, 2851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x644,0x62d,0x631,0x629,0x20 2852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, unshape_at_begin[]={ 2853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x627,0x644,0x622,0x20,0x646,0x20,0x627,0x644,0x623,0x20,0x642,0x644,0x627,0x20, 2854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x645,0x20,0x627,0x644,0x639,0x631,0x628,0x64a,0x629,0x20,0x627,0x644,0x62d,0x631, 2855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x629,0x20,0x20,0x20,0x20 2856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, unshape_grow_shrink[]={ 2857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x20,0x20,0x20,0x627,0x644,0x622,0x20,0x646,0x20,0x627,0x644,0x623,0x20,0x642, 2858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x644,0x627,0x20,0x645,0x20,0x627,0x644,0x639,0x631,0x628,0x64a,0x629,0x20,0x627, 2859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x644,0x62d,0x631,0x629,0x20,0x20,0x20,0x20 2860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar dest[36]; 2863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 2864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length; 2865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2868f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(source, UPRV_LENGTHOF(source), 2869f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 2870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_LETTERS_UNSHAPE|U_SHAPE_LENGTH_FIXED_SPACES_NEAR| 2871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_TEXT_DIRECTION_LOGICAL, 2872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2874f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(unshape_near) || memcmp(dest, unshape_near, length*U_SIZEOF_UCHAR)!=0) { 2875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(unshape_near)\n"); 2876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2880f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(source, UPRV_LENGTHOF(source), 2881f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 2882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_LETTERS_UNSHAPE|U_SHAPE_LENGTH_FIXED_SPACES_AT_END| 2883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_TEXT_DIRECTION_LOGICAL, 2884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2886f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(unshape_at_end) || memcmp(dest, unshape_at_end, length*U_SIZEOF_UCHAR)!=0) { 2887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(unshape_at_end)\n"); 2888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2892f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(source, UPRV_LENGTHOF(source), 2893f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 2894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_LETTERS_UNSHAPE|U_SHAPE_LENGTH_FIXED_SPACES_AT_BEGINNING| 2895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_TEXT_DIRECTION_LOGICAL, 2896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2898f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(unshape_at_begin) || memcmp(dest, unshape_at_begin, length*U_SIZEOF_UCHAR)!=0) { 2899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(unshape_at_begin)\n"); 2900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2904f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(source, UPRV_LENGTHOF(source), 2905f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 2906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_LETTERS_UNSHAPE|U_SHAPE_LENGTH_GROW_SHRINK| 2907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_TEXT_DIRECTION_LOGICAL, 2908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode) || memcmp(dest, unshape_grow_shrink, length*U_SIZEOF_UCHAR)!=0) { 2911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(unshape_grow_shrink)\n"); 2912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 2917b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehodoTailTest(void) { 2918b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const UChar src[] = { 0x0020, 0x0633, 0 }; 2919b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const UChar dst_old[] = { 0xFEB1, 0x200B,0 }; 2920b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const UChar dst_new[] = { 0xFEB1, 0xFE73,0 }; 2921b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UChar dst[3] = { 0x0000, 0x0000,0 }; 2922b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t length; 2923b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UErrorCode status; 292459d709d503bab6e2b61931737e662dd293b40578ccornelius 2925b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_verbose("SRC: U+%04X U+%04X\n", src[0],src[1]); 2926b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2927b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_verbose("Trying old tail\n"); 2928b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho status = U_ZERO_ERROR; 2929f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length = u_shapeArabic(src, -1, dst, UPRV_LENGTHOF(dst), 2930b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho U_SHAPE_LETTERS_SHAPE|U_SHAPE_SEEN_TWOCELL_NEAR, &status); 2931b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(U_FAILURE(status)) { 293259d709d503bab6e2b61931737e662dd293b40578ccornelius log_err("Fail: status %s\n", u_errorName(status)); 2933b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if(length!=2) { 2934b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err("Fail: len %d expected 3\n", length); 2935f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } else if(u_strncmp(dst,dst_old,UPRV_LENGTHOF(dst))) { 2936b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err("Fail: got U+%04X U+%04X expected U+%04X U+%04X\n", 2937b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho dst[0],dst[1],dst_old[0],dst_old[1]); 2938b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 2939b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_verbose("OK: U+%04X U+%04X len %d err %s\n", 2940b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho dst[0],dst[1],length,u_errorName(status)); 2941b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2942b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2943b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2944b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_verbose("Trying new tail\n"); 2945b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho status = U_ZERO_ERROR; 2946f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length = u_shapeArabic(src, -1, dst, UPRV_LENGTHOF(dst), 2947b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho U_SHAPE_LETTERS_SHAPE|U_SHAPE_SEEN_TWOCELL_NEAR|U_SHAPE_TAIL_NEW_UNICODE, &status); 2948b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(U_FAILURE(status)) { 294959d709d503bab6e2b61931737e662dd293b40578ccornelius log_err("Fail: status %s\n", u_errorName(status)); 2950b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if(length!=2) { 2951b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err("Fail: len %d expected 3\n", length); 2952f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } else if(u_strncmp(dst,dst_new,UPRV_LENGTHOF(dst))) { 2953b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err("Fail: got U+%04X U+%04X expected U+%04X U+%04X\n", 2954b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho dst[0],dst[1],dst_new[0],dst_new[1]); 2955b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 2956b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_verbose("OK: U+%04X U+%04X len %d err %s\n", 2957b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho dst[0],dst[1],length,u_errorName(status)); 2958b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2959b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 2960b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2961b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void 2962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerudoArabicShapingTestForBug5421(void) { 2963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar 2964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru persian_letters_source[]={ 2965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0020, 0x0698, 0x067E, 0x0686, 0x06AF, 0x0020 2966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, persian_letters[]={ 2967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0020, 0xFB8B, 0xFB59, 0xFB7D, 0xFB94, 0x0020 2968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, tashkeel_aggregation_source[]={ 2969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0020, 0x0628, 0x0651, 0x064E, 0x062A, 0x0631, 0x0645, 0x0020, 2970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0628, 0x064E, 0x0651, 0x062A, 0x0631, 0x0645, 0x0020 2971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, tashkeel_aggregation[]={ 2972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0020, 0xFE90, 0xFC60, 0xFE97, 0xFEAE, 0xFEE3, 2973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0020, 0xFE90, 0xFC60, 0xFE97, 0xFEAE, 0xFEE3, 0x0020 2974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, untouched_presentation_source[]={ 2975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0020 ,0x0627, 0xfe90,0x0020 2976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, untouched_presentation[]={ 2977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0020,0xfe8D, 0xfe90,0x0020 2978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, untouched_presentation_r_source[]={ 2979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0020 ,0xfe90, 0x0627, 0x0020 2980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, untouched_presentation_r[]={ 2981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0020, 0xfe90,0xfe8D,0x0020 2982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar dest[38]; 2985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 2986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length; 2987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 2989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2990f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(persian_letters_source, UPRV_LENGTHOF(persian_letters_source), 2991f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 2992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_LETTERS_SHAPE|U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 2993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 2994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2995f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(persian_letters) || memcmp(dest, persian_letters, length*U_SIZEOF_UCHAR)!=0) { 2996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(persian_letters)\n"); 2997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 3000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3001f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(tashkeel_aggregation_source, UPRV_LENGTHOF(tashkeel_aggregation_source), 3002f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 3003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_AGGREGATE_TASHKEEL|U_SHAPE_PRESERVE_PRESENTATION| 3004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED|U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 3005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 3006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3007f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(tashkeel_aggregation) || memcmp(dest, tashkeel_aggregation, length*U_SIZEOF_UCHAR)!=0) { 3008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(tashkeel_aggregation)\n"); 3009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 3012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3013f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(untouched_presentation_source, UPRV_LENGTHOF(untouched_presentation_source), 3014f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 3015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_PRESERVE_PRESENTATION| 3016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_LETTERS_SHAPE|U_SHAPE_TEXT_DIRECTION_VISUAL_LTR, 3017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 3018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3019f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(untouched_presentation) || memcmp(dest, untouched_presentation, length*U_SIZEOF_UCHAR)!=0) { 3020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(untouched_presentation)\n"); 3021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 3024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3025f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(untouched_presentation_r_source, UPRV_LENGTHOF(untouched_presentation_r_source), 3026f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 3027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_PRESERVE_PRESENTATION| 3028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SHAPE_LETTERS_SHAPE|U_SHAPE_TEXT_DIRECTION_LOGICAL, 3029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &errorCode); 3030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3031f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(untouched_presentation_r) || memcmp(dest, untouched_presentation_r, length*U_SIZEOF_UCHAR)!=0) { 3032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("failure in u_shapeArabic(untouched_presentation_r)\n"); 3033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 303654dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic void 303754dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusdoArabicShapingTestForBug8703(void) { 303854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius static const UChar 303954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius letters_source1[]={ 304054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0x0634,0x0651,0x0645,0x0652,0x0633 304154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }, letters_source2[]={ 304259d709d503bab6e2b61931737e662dd293b40578ccornelius 0x0634,0x0651,0x0645,0x0652,0x0633 304354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }, letters_source3[]={ 304454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0x0634,0x0651,0x0645,0x0652,0x0633 304554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }, letters_source4[]={ 304659d709d503bab6e2b61931737e662dd293b40578ccornelius 0x0634,0x0651,0x0645,0x0652,0x0633 304754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }, letters_source5[]={ 304854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0x0633,0x0652,0x0645,0x0651,0x0634 304954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }, letters_source6[]={ 305059d709d503bab6e2b61931737e662dd293b40578ccornelius 0x0633,0x0652,0x0645,0x0651,0x0634 305154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }, letters_source7[]={ 305254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0x0633,0x0652,0x0645,0x0651,0x0634 305354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }, letters_source8[]={ 305454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0x0633,0x0652,0x0645,0x0651,0x0634 305554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }, letters_dest1[]={ 305659d709d503bab6e2b61931737e662dd293b40578ccornelius 0x0020,0xFEB7,0xFE7D,0xFEE4,0xFEB2 305754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }, letters_dest2[]={ 305854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xFEB7,0xFE7D,0xFEE4,0xFEB2,0x0020 305954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }, letters_dest3[]={ 306054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xFEB7,0xFE7D,0xFEE4,0xFEB2 306154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }, letters_dest4[]={ 306254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xFEB7,0xFE7D,0xFEE4,0x0640,0xFEB2 306354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }, letters_dest5[]={ 306459d709d503bab6e2b61931737e662dd293b40578ccornelius 0x0020,0xFEB2,0xFEE4,0xFE7D,0xFEB7 306554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }, letters_dest6[]={ 306654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xFEB2,0xFEE4,0xFE7D,0xFEB7,0x0020 306754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }, letters_dest7[]={ 306854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xFEB2,0xFEE4,0xFE7D,0xFEB7 306954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }, letters_dest8[]={ 307054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xFEB2,0x0640,0xFEE4,0xFE7D,0xFEB7 307154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }; 307254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 307354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UChar dest[20]; 307454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UErrorCode errorCode; 307554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int32_t length; 307654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 307754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius errorCode=U_ZERO_ERROR; 307854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 3079f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(letters_source1, UPRV_LENGTHOF(letters_source1), 3080f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 308154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_BEGIN | U_SHAPE_LETTERS_SHAPE, 308254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius &errorCode); 308354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 3084f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(letters_dest1) || memcmp(dest, letters_dest1, length*U_SIZEOF_UCHAR)!=0) { 308554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius log_err("failure in u_shapeArabic(letters_source1)\n"); 308654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 308754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 308854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius errorCode=U_ZERO_ERROR; 308954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 3090f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(letters_source2, UPRV_LENGTHOF(letters_source2), 3091f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 309254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_END | U_SHAPE_LETTERS_SHAPE, 309354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius &errorCode); 309454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 3095f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(letters_dest2) || memcmp(dest, letters_dest2, length*U_SIZEOF_UCHAR)!=0) { 309654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius log_err("failure in u_shapeArabic(letters_source2)\n"); 309754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 309854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 309954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius errorCode=U_ZERO_ERROR; 310054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 3101f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(letters_source3, UPRV_LENGTHOF(letters_source3), 3102f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 310354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_RESIZE | U_SHAPE_LETTERS_SHAPE, 310454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius &errorCode); 310554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 3106f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(letters_dest3) || memcmp(dest, letters_dest3, length*U_SIZEOF_UCHAR)!=0) { 310754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius log_err("failure in u_shapeArabic(letters_source3)\n"); 310854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 310954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 311054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius errorCode=U_ZERO_ERROR; 311154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 3112f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(letters_source4, UPRV_LENGTHOF(letters_source4), 3113f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 311454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_REPLACE_BY_TATWEEL | U_SHAPE_LETTERS_SHAPE, 311554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius &errorCode); 311654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 3117f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(letters_dest4) || memcmp(dest, letters_dest4, length*U_SIZEOF_UCHAR)!=0) { 311854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius log_err("failure in u_shapeArabic(letters_source4)\n"); 311954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 312054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 312154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius errorCode=U_ZERO_ERROR; 312254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 3123f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(letters_source5, UPRV_LENGTHOF(letters_source5), 3124f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 312554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius U_SHAPE_TEXT_DIRECTION_VISUAL_LTR | U_SHAPE_TASHKEEL_BEGIN | U_SHAPE_LETTERS_SHAPE, 312654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius &errorCode); 312754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 3128f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(letters_dest5) || memcmp(dest, letters_dest5, length*U_SIZEOF_UCHAR)!=0) { 312954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius log_err("failure in u_shapeArabic(letters_source5)\n"); 313054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 313154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 313254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius errorCode=U_ZERO_ERROR; 313354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 3134f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(letters_source6, UPRV_LENGTHOF(letters_source6), 3135f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 313654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius U_SHAPE_TEXT_DIRECTION_VISUAL_LTR | U_SHAPE_TASHKEEL_END | U_SHAPE_LETTERS_SHAPE, 313754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius &errorCode); 313854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 3139f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(letters_dest6) || memcmp(dest, letters_dest6, length*U_SIZEOF_UCHAR)!=0) { 314054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius log_err("failure in u_shapeArabic(letters_source6)\n"); 314154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 314254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 314354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius errorCode=U_ZERO_ERROR; 314454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 3145f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(letters_source7, UPRV_LENGTHOF(letters_source7), 3146f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 314754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius U_SHAPE_TEXT_DIRECTION_VISUAL_LTR | U_SHAPE_TASHKEEL_RESIZE | U_SHAPE_LETTERS_SHAPE, 314854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius &errorCode); 314954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 3150f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(letters_dest7) || memcmp(dest, letters_dest7, length*U_SIZEOF_UCHAR)!=0) { 315154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius log_err("failure in u_shapeArabic(letters_source7)\n"); 315254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 315354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 315454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius errorCode=U_ZERO_ERROR; 315554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 3156f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(letters_source8, UPRV_LENGTHOF(letters_source8), 3157f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 315854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius U_SHAPE_TEXT_DIRECTION_VISUAL_LTR | U_SHAPE_TASHKEEL_REPLACE_BY_TATWEEL | U_SHAPE_LETTERS_SHAPE, 315954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius &errorCode); 316054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 3161f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(letters_dest8) || memcmp(dest, letters_dest8, length*U_SIZEOF_UCHAR)!=0) { 316254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius log_err("failure in u_shapeArabic(letters_source8)\n"); 316354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 316454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} 316554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 316654dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic void 316754dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusdoArabicShapingTestForBug9024(void) { 316854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius static const UChar 316954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius letters_source1[]={ /* Arabic mathematical Symbols 0x1EE00 - 0x1EE1B */ 317059d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE00, 0xD83B, 0xDE01, 0xD83B, 0xDE02, 0xD83B, 0xDE03, 0x20, 317154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE24, 0xD83B, 0xDE05, 0xD83B, 0xDE06, 0x20, 317254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE07, 0xD83B, 0xDE08, 0xD83B, 0xDE09, 0x20, 317354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE0A, 0xD83B, 0xDE0B, 0xD83B, 0xDE0C, 0xD83B, 0xDE0D, 0x20, 317454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE0E, 0xD83B, 0xDE0F, 0xD83B, 0xDE10, 0xD83B, 0xDE11, 0x20, 317554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE12, 0xD83B, 0xDE13, 0xD83B, 0xDE14, 0xD83B, 0xDE15, 0x20, 317654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE16, 0xD83B, 0xDE17, 0xD83B, 0xDE18, 0x20, 317754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE19, 0xD83B, 0xDE1A, 0xD83B, 0xDE1B 317854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }, letters_source2[]={/* Arabic mathematical Symbols - Looped Symbols, 0x1EE80 - 0x1EE9B */ 317959d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE80, 0xD83B, 0xDE81, 0xD83B, 0xDE82, 0xD83B, 0xDE83, 0x20, 318054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE84, 0xD83B, 0xDE85, 0xD83B, 0xDE86, 0x20, 318154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE87, 0xD83B, 0xDE88, 0xD83B, 0xDE89, 0x20, 318254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE8B, 0xD83B, 0xDE8C, 0xD83B, 0xDE8D, 0x20, 318354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE8E, 0xD83B, 0xDE8F, 0xD83B, 0xDE90, 0xD83B, 0xDE91, 0x20, 318454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE92, 0xD83B, 0xDE93, 0xD83B, 0xDE94, 0xD83B, 0xDE95, 0x20, 318554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE96, 0xD83B, 0xDE97, 0xD83B, 0xDE98, 0x20, 318654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE99, 0xD83B, 0xDE9A, 0xD83B, 0xDE9B 318754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }, letters_source3[]={/* Arabic mathematical Symbols - Double-struck Symbols, 0x1EEA1 - 0x1EEBB */ 318859d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDEA1, 0xD83B, 0xDEA2, 0xD83B, 0xDEA3, 0x20, 318954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDEA5, 0xD83B, 0xDEA6, 0x20, 319054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDEA7, 0xD83B, 0xDEA8, 0xD83B, 0xDEA9, 0x20, 319154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDEAB, 0xD83B, 0xDEAC, 0xD83B, 0xDEAD, 0x20, 319254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDEAE, 0xD83B, 0xDEAF, 0xD83B, 0xDEB0, 0xD83B, 0xDEB1, 0x20, 319354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDEB2, 0xD83B, 0xDEB3, 0xD83B, 0xDEB4, 0xD83B, 0xDEB5, 0x20, 319454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDEB6, 0xD83B, 0xDEB7, 0xD83B, 0xDEB8, 0x20, 319554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDEB9, 0xD83B, 0xDEBA, 0xD83B, 0xDEBB 319654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }, letters_source4[]={/* Arabic mathematical Symbols - Initial Symbols, 0x1EE21 - 0x1EE3B */ 319759d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE21, 0xD83B, 0xDE22, 0x20, 319854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE27, 0xD83B, 0xDE29, 0x20, 319954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE2A, 0xD83B, 0xDE2B, 0xD83B, 0xDE2C, 0xD83B, 0xDE2D, 0x20, 320054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE2E, 0xD83B, 0xDE2F, 0xD83B, 0xDE30, 0xD83B, 0xDE31, 0x20, 320154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE32, 0xD83B, 0xDE34, 0xD83B, 0xDE35, 0x20, 320254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE36, 0xD83B, 0xDE37, 0x20, 320354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE39, 0xD83B, 0xDE3B 320454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }, letters_source5[]={/* Arabic mathematical Symbols - Tailed Symbols */ 320559d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE42, 0xD83B, 0xDE47, 0xD83B, 0xDE49, 0xD83B, 0xDE4B, 0x20, 320654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE4D, 0xD83B, 0xDE4E, 0xD83B, 0xDE4F, 0x20, 320754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE51, 0xD83B, 0xDE52, 0xD83B, 0xDE54, 0xD83B, 0xDE57, 0x20, 320854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE59, 0xD83B, 0xDE5B, 0xD83B, 0xDE5D, 0xD83B, 0xDE5F 320954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }, letters_source6[]={/* Arabic mathematical Symbols - Stretched Symbols with 06 range */ 321054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE21, 0x0633, 0xD83B, 0xDE62, 0x0647 321154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }, letters_dest1[]={ 321259d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE00, 0xD83B, 0xDE01, 0xD83B, 0xDE02, 0xD83B, 0xDE03, 0x20, 321354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE24, 0xD83B, 0xDE05, 0xD83B, 0xDE06, 0x20, 321454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE07, 0xD83B, 0xDE08, 0xD83B, 0xDE09, 0x20, 321554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE0A, 0xD83B, 0xDE0B, 0xD83B, 0xDE0C, 0xD83B, 0xDE0D, 0x20, 321654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE0E, 0xD83B, 0xDE0F, 0xD83B, 0xDE10, 0xD83B, 0xDE11, 0x20, 321754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE12, 0xD83B, 0xDE13, 0xD83B, 0xDE14, 0xD83B, 0xDE15, 0x20, 321854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE16, 0xD83B, 0xDE17, 0xD83B, 0xDE18, 0x20, 321954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE19, 0xD83B, 0xDE1A, 0xD83B, 0xDE1B 322054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }, letters_dest2[]={ 322159d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE80, 0xD83B, 0xDE81, 0xD83B, 0xDE82, 0xD83B, 0xDE83, 0x20, 322254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE84, 0xD83B, 0xDE85, 0xD83B, 0xDE86, 0x20, 322354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE87, 0xD83B, 0xDE88, 0xD83B, 0xDE89, 0x20, 322454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE8B, 0xD83B, 0xDE8C, 0xD83B, 0xDE8D, 0x20, 322554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE8E, 0xD83B, 0xDE8F, 0xD83B, 0xDE90, 0xD83B, 0xDE91, 0x20, 322654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE92, 0xD83B, 0xDE93, 0xD83B, 0xDE94, 0xD83B, 0xDE95, 0x20, 322754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE96, 0xD83B, 0xDE97, 0xD83B, 0xDE98, 0x20, 322854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE99, 0xD83B, 0xDE9A, 0xD83B, 0xDE9B 322954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }, letters_dest3[]={ 323059d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDEA1, 0xD83B, 0xDEA2, 0xD83B, 0xDEA3, 0x20, 323154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDEA5, 0xD83B, 0xDEA6, 0x20, 323254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDEA7, 0xD83B, 0xDEA8, 0xD83B, 0xDEA9, 0x20, 323354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDEAB, 0xD83B, 0xDEAC, 0xD83B, 0xDEAD, 0x20, 323454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDEAE, 0xD83B, 0xDEAF, 0xD83B, 0xDEB0, 0xD83B, 0xDEB1, 0x20, 323554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDEB2, 0xD83B, 0xDEB3, 0xD83B, 0xDEB4, 0xD83B, 0xDEB5, 0x20, 323654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDEB6, 0xD83B, 0xDEB7, 0xD83B, 0xDEB8, 0x20, 323754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDEB9, 0xD83B, 0xDEBA, 0xD83B, 0xDEBB 323854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }, letters_dest4[]={ 323959d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE21, 0xD83B, 0xDE22, 0x20, 324054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE27, 0xD83B, 0xDE29, 0x20, 324154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE2A, 0xD83B, 0xDE2B, 0xD83B, 0xDE2C, 0xD83B, 0xDE2D, 0x20, 324254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE2E, 0xD83B, 0xDE2F, 0xD83B, 0xDE30, 0xD83B, 0xDE31, 0x20, 324354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE32, 0xD83B, 0xDE34, 0xD83B, 0xDE35, 0x20, 324454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE36, 0xD83B, 0xDE37, 0x20, 324554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE39, 0xD83B, 0xDE3B 324654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }, letters_dest5[]={ 324759d709d503bab6e2b61931737e662dd293b40578ccornelius 0xD83B, 0xDE42, 0xD83B, 0xDE47, 0xD83B, 0xDE49, 0xD83B, 0xDE4B, 0x20, 324854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE4D, 0xD83B, 0xDE4E, 0xD83B, 0xDE4F, 0x20, 324954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE51, 0xD83B, 0xDE52, 0xD83B, 0xDE54, 0xD83B, 0xDE57, 0x20, 325054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE59, 0xD83B, 0xDE5B, 0xD83B, 0xDE5D, 0xD83B, 0xDE5F 325154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }, letters_dest6[]={ 325254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0xD83B, 0xDE21, 0xFEB1, 0xD83B, 0xDE62, 0xFEE9 325354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }; 325454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 325554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UChar dest[MAXLEN]; 325654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UErrorCode errorCode; 325754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int32_t length; 325854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 325954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius errorCode=U_ZERO_ERROR; 326054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 3261f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(letters_source1, UPRV_LENGTHOF(letters_source1), 3262f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 326354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_BEGIN | U_SHAPE_LETTERS_SHAPE, 326454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius &errorCode); 326554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 3266f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(letters_dest1) || memcmp(dest, letters_dest1, length*U_SIZEOF_UCHAR)!=0) { 326754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius log_err("failure in u_shapeArabic(letters_source1)\n"); 326854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 326954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 327054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius errorCode=U_ZERO_ERROR; 327154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 3272f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(letters_source2, UPRV_LENGTHOF(letters_source2), 3273f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 327454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_END | U_SHAPE_LETTERS_SHAPE, 327554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius &errorCode); 327654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 3277f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(letters_dest2) || memcmp(dest, letters_dest2, length*U_SIZEOF_UCHAR)!=0) { 327854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius log_err("failure in u_shapeArabic(letters_source2)\n"); 327954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 328054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 328154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius errorCode=U_ZERO_ERROR; 328254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 3283f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(letters_source3, UPRV_LENGTHOF(letters_source3), 3284f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 328554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_RESIZE | U_SHAPE_LETTERS_SHAPE, 328654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius &errorCode); 328754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 3288f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(letters_dest3) || memcmp(dest, letters_dest3, length*U_SIZEOF_UCHAR)!=0) { 328954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius log_err("failure in u_shapeArabic(letters_source3)\n"); 329054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 329154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 329254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius errorCode=U_ZERO_ERROR; 329354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 3294f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(letters_source4, UPRV_LENGTHOF(letters_source4), 3295f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 329654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_REPLACE_BY_TATWEEL | U_SHAPE_LETTERS_SHAPE, 329754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius &errorCode); 329854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 3299f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(letters_dest4) || memcmp(dest, letters_dest4, length*U_SIZEOF_UCHAR)!=0) { 330054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius log_err("failure in u_shapeArabic(letters_source4)\n"); 330154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 330254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 330354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius errorCode=U_ZERO_ERROR; 330454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 3305f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(letters_source5, UPRV_LENGTHOF(letters_source5), 3306f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 330754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius U_SHAPE_TEXT_DIRECTION_VISUAL_LTR | U_SHAPE_TASHKEEL_BEGIN | U_SHAPE_LETTERS_SHAPE, 330854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius &errorCode); 330954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 3310f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(letters_dest5) || memcmp(dest, letters_dest5, length*U_SIZEOF_UCHAR)!=0) { 331154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius log_err("failure in u_shapeArabic(letters_source5)\n"); 331254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 331354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 331454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius errorCode=U_ZERO_ERROR; 331554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 3316f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius length=u_shapeArabic(letters_source6, UPRV_LENGTHOF(letters_source6), 3317f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dest, UPRV_LENGTHOF(dest), 331854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius U_SHAPE_TEXT_DIRECTION_VISUAL_LTR | U_SHAPE_TASHKEEL_END | U_SHAPE_LETTERS_SHAPE, 331954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius &errorCode); 332054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 3321f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode) || length!=UPRV_LENGTHOF(letters_dest6) || memcmp(dest, letters_dest6, length*U_SIZEOF_UCHAR)!=0) { 332254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius log_err("failure in u_shapeArabic(letters_source6)\n"); 332354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 332454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 332554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} 332654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 332759d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic void _testPresentationForms(const UChar* in) { 332859d709d503bab6e2b61931737e662dd293b40578ccornelius enum Forms { GENERIC, ISOLATED, FINAL, INITIAL, MEDIAL }; 332959d709d503bab6e2b61931737e662dd293b40578ccornelius /* This character is used to check whether the in-character is rewritten correctly 333059d709d503bab6e2b61931737e662dd293b40578ccornelius and whether the surrounding characters are shaped correctly as well. */ 333159d709d503bab6e2b61931737e662dd293b40578ccornelius UChar otherChar[] = {0x0628, 0xfe8f, 0xfe90, 0xfe91, 0xfe92}; 333259d709d503bab6e2b61931737e662dd293b40578ccornelius UChar src[3]; 333359d709d503bab6e2b61931737e662dd293b40578ccornelius UChar dst[3]; 333459d709d503bab6e2b61931737e662dd293b40578ccornelius UErrorCode errorCode; 333559d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t length; 333659d709d503bab6e2b61931737e662dd293b40578ccornelius 333759d709d503bab6e2b61931737e662dd293b40578ccornelius /* Testing isolated shaping */ 333859d709d503bab6e2b61931737e662dd293b40578ccornelius src[0] = in[GENERIC]; 333959d709d503bab6e2b61931737e662dd293b40578ccornelius errorCode=U_ZERO_ERROR; 334059d709d503bab6e2b61931737e662dd293b40578ccornelius length=u_shapeArabic(src, 1, 334159d709d503bab6e2b61931737e662dd293b40578ccornelius dst, 1, 334259d709d503bab6e2b61931737e662dd293b40578ccornelius U_SHAPE_LETTERS_SHAPE, 334359d709d503bab6e2b61931737e662dd293b40578ccornelius &errorCode); 334459d709d503bab6e2b61931737e662dd293b40578ccornelius if(U_FAILURE(errorCode) || length!=1 || dst[0] != in[ISOLATED]) { 334559d709d503bab6e2b61931737e662dd293b40578ccornelius log_err("failure in u_shapeArabic(_testAllForms: shaping isolated): %x\n", in[GENERIC]); 334659d709d503bab6e2b61931737e662dd293b40578ccornelius } 334759d709d503bab6e2b61931737e662dd293b40578ccornelius errorCode=U_ZERO_ERROR; 334859d709d503bab6e2b61931737e662dd293b40578ccornelius length=u_shapeArabic(dst, 1, 334959d709d503bab6e2b61931737e662dd293b40578ccornelius src, 1, 335059d709d503bab6e2b61931737e662dd293b40578ccornelius U_SHAPE_LETTERS_UNSHAPE, 335159d709d503bab6e2b61931737e662dd293b40578ccornelius &errorCode); 335259d709d503bab6e2b61931737e662dd293b40578ccornelius if(U_FAILURE(errorCode) || length!=1 || src[0] != in[GENERIC]) { 335359d709d503bab6e2b61931737e662dd293b40578ccornelius log_err("failure in u_shapeArabic(_testAllForms: unshaping isolated): %x\n", in[GENERIC]); 335459d709d503bab6e2b61931737e662dd293b40578ccornelius } 335559d709d503bab6e2b61931737e662dd293b40578ccornelius 335659d709d503bab6e2b61931737e662dd293b40578ccornelius /* Testing final shaping */ 335759d709d503bab6e2b61931737e662dd293b40578ccornelius src[0] = otherChar[GENERIC]; 335859d709d503bab6e2b61931737e662dd293b40578ccornelius src[1] = in[GENERIC]; 335959d709d503bab6e2b61931737e662dd293b40578ccornelius if (in[FINAL] != 0) { 336059d709d503bab6e2b61931737e662dd293b40578ccornelius errorCode=U_ZERO_ERROR; 336159d709d503bab6e2b61931737e662dd293b40578ccornelius length=u_shapeArabic(src, 2, 336259d709d503bab6e2b61931737e662dd293b40578ccornelius dst, 2, 336359d709d503bab6e2b61931737e662dd293b40578ccornelius U_SHAPE_LETTERS_SHAPE, 336459d709d503bab6e2b61931737e662dd293b40578ccornelius &errorCode); 336559d709d503bab6e2b61931737e662dd293b40578ccornelius if(U_FAILURE(errorCode) || length!=2 || dst[0] != otherChar[INITIAL] || dst[1] != in[FINAL]) { 336659d709d503bab6e2b61931737e662dd293b40578ccornelius log_err("failure in u_shapeArabic(_testAllForms: shaping final): %x\n", in[GENERIC]); 336759d709d503bab6e2b61931737e662dd293b40578ccornelius } 336859d709d503bab6e2b61931737e662dd293b40578ccornelius errorCode=U_ZERO_ERROR; 336959d709d503bab6e2b61931737e662dd293b40578ccornelius length=u_shapeArabic(dst, 2, 337059d709d503bab6e2b61931737e662dd293b40578ccornelius src, 2, 337159d709d503bab6e2b61931737e662dd293b40578ccornelius U_SHAPE_LETTERS_UNSHAPE, 337259d709d503bab6e2b61931737e662dd293b40578ccornelius &errorCode); 337359d709d503bab6e2b61931737e662dd293b40578ccornelius if(U_FAILURE(errorCode) || length!=2 || src[0] != otherChar[GENERIC] || src[1] != in[GENERIC]) { 337459d709d503bab6e2b61931737e662dd293b40578ccornelius log_err("failure in u_shapeArabic(_testAllForms: unshaping final): %x\n", in[GENERIC]); 337559d709d503bab6e2b61931737e662dd293b40578ccornelius } 337659d709d503bab6e2b61931737e662dd293b40578ccornelius } else { 337759d709d503bab6e2b61931737e662dd293b40578ccornelius errorCode=U_ZERO_ERROR; 337859d709d503bab6e2b61931737e662dd293b40578ccornelius length=u_shapeArabic(src, 2, 337959d709d503bab6e2b61931737e662dd293b40578ccornelius dst, 2, 338059d709d503bab6e2b61931737e662dd293b40578ccornelius U_SHAPE_LETTERS_SHAPE, 338159d709d503bab6e2b61931737e662dd293b40578ccornelius &errorCode); 338259d709d503bab6e2b61931737e662dd293b40578ccornelius if(U_FAILURE(errorCode) || length!=2 || dst[0] != otherChar[ISOLATED] || dst[1] != in[ISOLATED]) { 338359d709d503bab6e2b61931737e662dd293b40578ccornelius log_err("failure in u_shapeArabic(_testAllForms: shaping final): %x\n", in[GENERIC]); 338459d709d503bab6e2b61931737e662dd293b40578ccornelius } 338559d709d503bab6e2b61931737e662dd293b40578ccornelius errorCode=U_ZERO_ERROR; 338659d709d503bab6e2b61931737e662dd293b40578ccornelius length=u_shapeArabic(dst, 2, 338759d709d503bab6e2b61931737e662dd293b40578ccornelius src, 2, 338859d709d503bab6e2b61931737e662dd293b40578ccornelius U_SHAPE_LETTERS_UNSHAPE, 338959d709d503bab6e2b61931737e662dd293b40578ccornelius &errorCode); 339059d709d503bab6e2b61931737e662dd293b40578ccornelius if(U_FAILURE(errorCode) || length!=2 || src[0] != otherChar[GENERIC] || src[1] != in[GENERIC]) { 339159d709d503bab6e2b61931737e662dd293b40578ccornelius log_err("failure in u_shapeArabic(_testAllForms: unshaping final): %x\n", in[GENERIC]); 339259d709d503bab6e2b61931737e662dd293b40578ccornelius } 339359d709d503bab6e2b61931737e662dd293b40578ccornelius } 339459d709d503bab6e2b61931737e662dd293b40578ccornelius 339559d709d503bab6e2b61931737e662dd293b40578ccornelius /* Testing initial shaping */ 339659d709d503bab6e2b61931737e662dd293b40578ccornelius src[0] = in[GENERIC]; 339759d709d503bab6e2b61931737e662dd293b40578ccornelius src[1] = otherChar[GENERIC]; 339859d709d503bab6e2b61931737e662dd293b40578ccornelius if (in[INITIAL] != 0) { 339959d709d503bab6e2b61931737e662dd293b40578ccornelius /* Testing characters that have an initial form */ 340059d709d503bab6e2b61931737e662dd293b40578ccornelius errorCode=U_ZERO_ERROR; 340159d709d503bab6e2b61931737e662dd293b40578ccornelius length=u_shapeArabic(src, 2, 340259d709d503bab6e2b61931737e662dd293b40578ccornelius dst, 2, 340359d709d503bab6e2b61931737e662dd293b40578ccornelius U_SHAPE_LETTERS_SHAPE, 340459d709d503bab6e2b61931737e662dd293b40578ccornelius &errorCode); 340559d709d503bab6e2b61931737e662dd293b40578ccornelius if(U_FAILURE(errorCode) || length!=2 || dst[0] != in[INITIAL] || dst[1] != otherChar[FINAL]) { 340659d709d503bab6e2b61931737e662dd293b40578ccornelius log_err("failure in u_shapeArabic(_testAllForms: shaping initial): %x\n", in[GENERIC]); 340759d709d503bab6e2b61931737e662dd293b40578ccornelius } 340859d709d503bab6e2b61931737e662dd293b40578ccornelius errorCode=U_ZERO_ERROR; 340959d709d503bab6e2b61931737e662dd293b40578ccornelius length=u_shapeArabic(dst, 2, 341059d709d503bab6e2b61931737e662dd293b40578ccornelius src, 2, 341159d709d503bab6e2b61931737e662dd293b40578ccornelius U_SHAPE_LETTERS_UNSHAPE, 341259d709d503bab6e2b61931737e662dd293b40578ccornelius &errorCode); 341359d709d503bab6e2b61931737e662dd293b40578ccornelius if(U_FAILURE(errorCode) || length!=2 || src[0] != in[GENERIC] || src[1] != otherChar[GENERIC]) { 341459d709d503bab6e2b61931737e662dd293b40578ccornelius log_err("failure in u_shapeArabic(_testAllForms: unshaping initial): %x\n", in[GENERIC]); 341559d709d503bab6e2b61931737e662dd293b40578ccornelius } 341659d709d503bab6e2b61931737e662dd293b40578ccornelius } else { 341759d709d503bab6e2b61931737e662dd293b40578ccornelius /* Testing characters that do not have an initial form */ 341859d709d503bab6e2b61931737e662dd293b40578ccornelius errorCode=U_ZERO_ERROR; 341959d709d503bab6e2b61931737e662dd293b40578ccornelius length=u_shapeArabic(src, 2, 342059d709d503bab6e2b61931737e662dd293b40578ccornelius dst, 2, 342159d709d503bab6e2b61931737e662dd293b40578ccornelius U_SHAPE_LETTERS_SHAPE, 342259d709d503bab6e2b61931737e662dd293b40578ccornelius &errorCode); 342359d709d503bab6e2b61931737e662dd293b40578ccornelius if(U_FAILURE(errorCode) || length!=2 || dst[0] != in[ISOLATED] || dst[1] != otherChar[ISOLATED]) { 342459d709d503bab6e2b61931737e662dd293b40578ccornelius log_err("failure in u_shapeArabic(_testTwoForms: shaping initial): %x\n", in[GENERIC]); 342559d709d503bab6e2b61931737e662dd293b40578ccornelius } 342659d709d503bab6e2b61931737e662dd293b40578ccornelius errorCode=U_ZERO_ERROR; 342759d709d503bab6e2b61931737e662dd293b40578ccornelius length=u_shapeArabic(dst, 2, 342859d709d503bab6e2b61931737e662dd293b40578ccornelius src, 2, 342959d709d503bab6e2b61931737e662dd293b40578ccornelius U_SHAPE_LETTERS_UNSHAPE, 343059d709d503bab6e2b61931737e662dd293b40578ccornelius &errorCode); 343159d709d503bab6e2b61931737e662dd293b40578ccornelius if(U_FAILURE(errorCode) || length!=2 || src[0] != in[GENERIC] || src[1] != otherChar[GENERIC]) { 343259d709d503bab6e2b61931737e662dd293b40578ccornelius log_err("failure in u_shapeArabic(_testTwoForms: unshaping initial): %x\n", in[GENERIC]); 343359d709d503bab6e2b61931737e662dd293b40578ccornelius } 343459d709d503bab6e2b61931737e662dd293b40578ccornelius } 343559d709d503bab6e2b61931737e662dd293b40578ccornelius 343659d709d503bab6e2b61931737e662dd293b40578ccornelius /* Testing medial shaping */ 343759d709d503bab6e2b61931737e662dd293b40578ccornelius src[0] = otherChar[0]; 343859d709d503bab6e2b61931737e662dd293b40578ccornelius src[1] = in[GENERIC]; 343959d709d503bab6e2b61931737e662dd293b40578ccornelius src[2] = otherChar[0]; 344059d709d503bab6e2b61931737e662dd293b40578ccornelius errorCode=U_ZERO_ERROR; 344159d709d503bab6e2b61931737e662dd293b40578ccornelius if (in[MEDIAL] != 0) { 344259d709d503bab6e2b61931737e662dd293b40578ccornelius /* Testing characters that have an medial form */ 344359d709d503bab6e2b61931737e662dd293b40578ccornelius length=u_shapeArabic(src, 3, 344459d709d503bab6e2b61931737e662dd293b40578ccornelius dst, 3, 344559d709d503bab6e2b61931737e662dd293b40578ccornelius U_SHAPE_LETTERS_SHAPE, 344659d709d503bab6e2b61931737e662dd293b40578ccornelius &errorCode); 344759d709d503bab6e2b61931737e662dd293b40578ccornelius if(U_FAILURE(errorCode) || length!=3 || dst[0] != otherChar[INITIAL] || dst[1] != in[MEDIAL] || dst[2] != otherChar[FINAL]) { 344859d709d503bab6e2b61931737e662dd293b40578ccornelius log_err("failure in u_shapeArabic(_testAllForms: shaping medial): %x\n", in[GENERIC]); 344959d709d503bab6e2b61931737e662dd293b40578ccornelius } 345059d709d503bab6e2b61931737e662dd293b40578ccornelius errorCode=U_ZERO_ERROR; 345159d709d503bab6e2b61931737e662dd293b40578ccornelius length=u_shapeArabic(dst, 3, 345259d709d503bab6e2b61931737e662dd293b40578ccornelius src, 3, 345359d709d503bab6e2b61931737e662dd293b40578ccornelius U_SHAPE_LETTERS_UNSHAPE, 345459d709d503bab6e2b61931737e662dd293b40578ccornelius &errorCode); 345559d709d503bab6e2b61931737e662dd293b40578ccornelius if(U_FAILURE(errorCode) || length!=3 || src[0] != otherChar[GENERIC] || src[1] != in[GENERIC] || src[2] != otherChar[GENERIC]) { 345659d709d503bab6e2b61931737e662dd293b40578ccornelius log_err("failure in u_shapeArabic(_testAllForms: unshaping medial): %x\n", in[GENERIC]); 345759d709d503bab6e2b61931737e662dd293b40578ccornelius } 345859d709d503bab6e2b61931737e662dd293b40578ccornelius } else { 345959d709d503bab6e2b61931737e662dd293b40578ccornelius /* Testing characters that do not have an medial form */ 346059d709d503bab6e2b61931737e662dd293b40578ccornelius errorCode=U_ZERO_ERROR; 346159d709d503bab6e2b61931737e662dd293b40578ccornelius length=u_shapeArabic(src, 3, 346259d709d503bab6e2b61931737e662dd293b40578ccornelius dst, 3, 346359d709d503bab6e2b61931737e662dd293b40578ccornelius U_SHAPE_LETTERS_SHAPE, 346459d709d503bab6e2b61931737e662dd293b40578ccornelius &errorCode); 346559d709d503bab6e2b61931737e662dd293b40578ccornelius if(U_FAILURE(errorCode) || length!=3 || dst[0] != otherChar[INITIAL] || dst[1] != in[FINAL] || dst[2] != otherChar[ISOLATED]) { 346659d709d503bab6e2b61931737e662dd293b40578ccornelius log_err("failure in u_shapeArabic(_testTwoForms: shaping medial): %x\n", in[GENERIC]); 346759d709d503bab6e2b61931737e662dd293b40578ccornelius } 346859d709d503bab6e2b61931737e662dd293b40578ccornelius errorCode=U_ZERO_ERROR; 346959d709d503bab6e2b61931737e662dd293b40578ccornelius length=u_shapeArabic(dst, 3, 347059d709d503bab6e2b61931737e662dd293b40578ccornelius src, 3, 347159d709d503bab6e2b61931737e662dd293b40578ccornelius U_SHAPE_LETTERS_UNSHAPE, 347259d709d503bab6e2b61931737e662dd293b40578ccornelius &errorCode); 347359d709d503bab6e2b61931737e662dd293b40578ccornelius if(U_FAILURE(errorCode) || length!=3 || src[0] != otherChar[GENERIC] || src[1] != in[GENERIC] || src[2] != otherChar[GENERIC]) { 347459d709d503bab6e2b61931737e662dd293b40578ccornelius log_err("failure in u_shapeArabic(_testTwoForms: unshaping medial): %x\n", in[GENERIC]); 347559d709d503bab6e2b61931737e662dd293b40578ccornelius } 347659d709d503bab6e2b61931737e662dd293b40578ccornelius } 347759d709d503bab6e2b61931737e662dd293b40578ccornelius} 347859d709d503bab6e2b61931737e662dd293b40578ccornelius 347959d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic void 348059d709d503bab6e2b61931737e662dd293b40578ccorneliusdoArabicShapingTestForNewCharacters(void) { 348159d709d503bab6e2b61931737e662dd293b40578ccornelius static const UChar letterForms[][5]={ 348259d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0679, 0xFB66, 0xFB67, 0xFB68, 0xFB69 }, /* TTEH */ 348359d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x067A, 0xFB5E, 0xFB5F, 0xFB60, 0xFB61 }, /* TTEHEH */ 348459d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x067B, 0xFB52, 0xFB53, 0xFB54, 0xFB55 }, /* BEEH */ 348559d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0688, 0xFB88, 0xFB89, 0, 0 }, /* DDAL */ 348659d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x068C, 0xFB84, 0xFB85, 0, 0 }, /* DAHAL */ 348759d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x068D, 0xFB82, 0xFB83, 0, 0 }, /* DDAHAL */ 348859d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x068E, 0xFB86, 0xFB87, 0, 0 }, /* DUL */ 348959d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0691, 0xFB8C, 0xFB8D, 0, 0 }, /* RREH */ 349059d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x06BA, 0xFB9E, 0xFB9F, 0, 0 }, /* NOON GHUNNA */ 349159d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x06BB, 0xFBA0, 0xFBA1, 0xFBA2, 0xFBA3 }, /* RNOON */ 349259d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x06BE, 0xFBAA, 0xFBAB, 0xFBAC, 0xFBAD }, /* HEH DOACHASHMEE */ 349359d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x06C0, 0xFBA4, 0xFBA5, 0, 0 }, /* HEH WITH YEH ABOVE */ 349459d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x06C1, 0xFBA6, 0xFBA7, 0xFBA8, 0xFBA9 }, /* HEH GOAL */ 349559d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x06C5, 0xFBE0, 0xFBE1, 0, 0 }, /* KIRGIHIZ OE */ 349659d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x06C6, 0xFBD9, 0xFBDA, 0, 0 }, /* OE */ 349759d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x06C7, 0xFBD7, 0xFBD8, 0, 0 }, /* U */ 349859d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x06C8, 0xFBDB, 0xFBDC, 0, 0 }, /* YU */ 349959d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x06C9, 0xFBE2, 0xFBE3, 0, 0 }, /* KIRGIZ YU */ 350059d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x06CB, 0xFBDE, 0xFBDF, 0, 0}, /* VE */ 350159d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x06D0, 0xFBE4, 0xFBE5, 0xFBE6, 0xFBE7 }, /* E */ 350259d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x06D2, 0xFBAE, 0xFBAF, 0, 0 }, /* YEH BARREE */ 350359d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x06D3, 0xFBB0, 0xFBB1, 0, 0 }, /* YEH BARREE WITH HAMZA ABOVE */ 350459d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0622, 0xFE81, 0xFE82, 0, 0, }, /* ALEF WITH MADDA ABOVE */ 350559d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0623, 0xFE83, 0xFE84, 0, 0, }, /* ALEF WITH HAMZA ABOVE */ 350659d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0624, 0xFE85, 0xFE86, 0, 0, }, /* WAW WITH HAMZA ABOVE */ 350759d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0625, 0xFE87, 0xFE88, 0, 0, }, /* ALEF WITH HAMZA BELOW */ 350859d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0626, 0xFE89, 0xFE8A, 0xFE8B, 0xFE8C, }, /* YEH WITH HAMZA ABOVE */ 350959d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0627, 0xFE8D, 0xFE8E, 0, 0, }, /* ALEF */ 351059d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0628, 0xFE8F, 0xFE90, 0xFE91, 0xFE92, }, /* BEH */ 351159d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0629, 0xFE93, 0xFE94, 0, 0, }, /* TEH MARBUTA */ 351259d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x062A, 0xFE95, 0xFE96, 0xFE97, 0xFE98, }, /* TEH */ 351359d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x062B, 0xFE99, 0xFE9A, 0xFE9B, 0xFE9C, }, /* THEH */ 351459d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x062C, 0xFE9D, 0xFE9E, 0xFE9F, 0xFEA0, }, /* JEEM */ 351559d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x062D, 0xFEA1, 0xFEA2, 0xFEA3, 0xFEA4, }, /* HAH */ 351659d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x062E, 0xFEA5, 0xFEA6, 0xFEA7, 0xFEA8, }, /* KHAH */ 351759d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x062F, 0xFEA9, 0xFEAA, 0, 0, }, /* DAL */ 351859d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0630, 0xFEAB, 0xFEAC, 0, 0, }, /* THAL */ 351959d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0631, 0xFEAD, 0xFEAE, 0, 0, }, /* REH */ 352059d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0632, 0xFEAF, 0xFEB0, 0, 0, }, /* ZAIN */ 352159d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0633, 0xFEB1, 0xFEB2, 0xFEB3, 0xFEB4, }, /* SEEN */ 352259d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0634, 0xFEB5, 0xFEB6, 0xFEB7, 0xFEB8, }, /* SHEEN */ 352359d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0635, 0xFEB9, 0xFEBA, 0xFEBB, 0xFEBC, }, /* SAD */ 352459d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0636, 0xFEBD, 0xFEBE, 0xFEBF, 0xFEC0, }, /* DAD */ 352559d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0637, 0xFEC1, 0xFEC2, 0xFEC3, 0xFEC4, }, /* TAH */ 352659d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0638, 0xFEC5, 0xFEC6, 0xFEC7, 0xFEC8, }, /* ZAH */ 352759d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0639, 0xFEC9, 0xFECA, 0xFECB, 0xFECC, }, /* AIN */ 352859d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x063A, 0xFECD, 0xFECE, 0xFECF, 0xFED0, }, /* GHAIN */ 352959d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0641, 0xFED1, 0xFED2, 0xFED3, 0xFED4, }, /* FEH */ 353059d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0642, 0xFED5, 0xFED6, 0xFED7, 0xFED8, }, /* QAF */ 353159d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0643, 0xFED9, 0xFEDA, 0xFEDB, 0xFEDC, }, /* KAF */ 353259d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0644, 0xFEDD, 0xFEDE, 0xFEDF, 0xFEE0, }, /* LAM */ 353359d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0645, 0xFEE1, 0xFEE2, 0xFEE3, 0xFEE4, }, /* MEEM */ 353459d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0646, 0xFEE5, 0xFEE6, 0xFEE7, 0xFEE8, }, /* NOON */ 353559d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0647, 0xFEE9, 0xFEEA, 0xFEEB, 0xFEEC, }, /* HEH */ 353659d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0648, 0xFEED, 0xFEEE, 0, 0, }, /* WAW */ 353759d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0649, 0xFEEF, 0xFEF0, 0, 0, }, /* ALEF MAKSURA */ 353859d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x064A, 0xFEF1, 0xFEF2, 0xFEF3, 0xFEF4, }, /* YEH */ 353959d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x064E, 0xFE76, 0, 0, 0xFE77, }, /* FATHA */ 354059d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x064F, 0xFE78, 0, 0, 0xFE79, }, /* DAMMA */ 354159d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0650, 0xFE7A, 0, 0, 0xFE7B, }, /* KASRA */ 354259d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0651, 0xFE7C, 0, 0, 0xFE7D, }, /* SHADDA */ 354359d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0652, 0xFE7E, 0, 0, 0xFE7F, }, /* SUKUN */ 354459d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0679, 0xFB66, 0xFB67, 0xFB68, 0xFB69, }, /* TTEH */ 354559d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x067E, 0xFB56, 0xFB57, 0xFB58, 0xFB59, }, /* PEH */ 354659d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0686, 0xFB7A, 0xFB7B, 0xFB7C, 0xFB7D, }, /* TCHEH */ 354759d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0688, 0xFB88, 0xFB89, 0, 0, }, /* DDAL */ 354859d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0691, 0xFB8C, 0xFB8D, 0, 0, }, /* RREH */ 354959d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x0698, 0xFB8A, 0xFB8B, 0, 0, }, /* JEH */ 355059d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x06A9, 0xFB8E, 0xFB8F, 0xFB90, 0xFB91, }, /* KEHEH */ 355159d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x06AF, 0xFB92, 0xFB93, 0xFB94, 0xFB95, }, /* GAF */ 355259d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x06BA, 0xFB9E, 0xFB9F, 0, 0, }, /* NOON GHUNNA */ 355359d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x06BE, 0xFBAA, 0xFBAB, 0xFBAC, 0xFBAD, }, /* HEH DOACHASHMEE */ 355459d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x06C0, 0xFBA4, 0xFBA5, 0, 0, }, /* HEH WITH YEH ABOVE */ 355559d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x06C1, 0xFBA6, 0xFBA7, 0xFBA8, 0xFBA9, }, /* HEH GOAL */ 355659d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x06CC, 0xFBFC, 0xFBFD, 0xFBFE, 0xFBFF, }, /* FARSI YEH */ 355759d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x06D2, 0xFBAE, 0xFBAF, 0, 0, }, /* YEH BARREE */ 355859d709d503bab6e2b61931737e662dd293b40578ccornelius { 0x06D3, 0xFBB0, 0xFBB1, 0, 0, }}; /* YEH BARREE WITH HAMZA ABOVE */ 3559fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius int32_t i; 3560f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius for (i = 0; i < UPRV_LENGTHOF(letterForms); ++i) { 356159d709d503bab6e2b61931737e662dd293b40578ccornelius _testPresentationForms(letterForms[i]); 356259d709d503bab6e2b61931737e662dd293b40578ccornelius } 356359d709d503bab6e2b61931737e662dd293b40578ccornelius} 356459d709d503bab6e2b61931737e662dd293b40578ccornelius 3565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* helpers ------------------------------------------------------------------ */ 3566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void initCharFromDirProps(void) { 3568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UVersionInfo ucd401={ 4, 0, 1, 0 }; 3569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static UVersionInfo ucdVersion={ 0, 0, 0, 0 }; 3570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* lazy initialization */ 3572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(ucdVersion[0]>0) { 3573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 3574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_getUnicodeVersion(ucdVersion); 3577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(memcmp(ucdVersion, ucd401, sizeof(UVersionInfo))>=0) { 3578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Unicode 4.0.1 changes bidi classes for +-/ */ 3579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru charFromDirProp[U_EUROPEAN_NUMBER_SEPARATOR]=0x2b; /* change ES character from / to + */ 3580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* return a string with characters according to the desired directional properties */ 3584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UChar * 3585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerugetStringFromDirProps(const uint8_t *dirProps, int32_t length, UChar *buffer) { 3586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i; 3587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru initCharFromDirProps(); 3589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* this part would have to be modified for UTF-x */ 3591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<length; ++i) { 3592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[i]=charFromDirProp[dirProps[i]]; 3593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[length]=0; 3595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return buffer; 3596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void printUnicode(const UChar *s, int32_t length, const UBiDiLevel *levels) { 3599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i; 3600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("{ "); 3602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<length; ++i) { 3603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(levels!=NULL) { 3604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("%4x.%u ", s[i], levels[i]); 3605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 3606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("%4x ", s[i]); 3607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose(" }"); 3610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* new BIDI API */ 3613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Reordering Mode BiDi --------------------------------------------------------- */ 3615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const UBiDiLevel paraLevels[] = { UBIDI_LTR, UBIDI_RTL }; 3617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool 3619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruassertSuccessful(const char* message, UErrorCode* rc) { 3620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (rc != NULL && U_FAILURE(*rc)) { 3621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s() failed with error %s.\n", message, myErrorName(*rc)); 3622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 3623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 3625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool 3628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruassertStringsEqual(const char* expected, const char* actual, const char* src, 3629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* mode, const char* option, UBiDi* pBiDi) { 3630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (uprv_strcmp(expected, actual)) { 3631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char formatChars[MAXLEN]; 3632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nActual and expected output mismatch.\n" 3633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "%20s %s\n%20s %s\n%20s %s\n%20s %s\n%20s %d %s\n%20s %u\n%20s %d %s\n", 3634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Input:", src, 3635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Actual output:", actual, 3636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Expected output:", expected, 3637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Levels:", formatLevels(pBiDi, formatChars), 3638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Reordering mode:", ubidi_getReorderingMode(pBiDi), mode, 3639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Paragraph level:", ubidi_getParaLevel(pBiDi), 3640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Reordering option:", ubidi_getReorderingOptions(pBiDi), option); 3641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 3642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 3644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBiDi* 3647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerugetBiDiObject(void) { 3648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDi* pBiDi = ubidi_open(); 3649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pBiDi == NULL) { 3650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Unable to allocate a UBiDi object. Tests are skipped.\n"); 3651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return pBiDi; 3653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define MAKE_ITEMS(val) val, #val 3656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const struct { 3658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDiReorderingMode value; 3659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* description; 3660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querumodes[] = { 3662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { MAKE_ITEMS(UBIDI_REORDER_GROUP_NUMBERS_WITH_R) }, 3663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { MAKE_ITEMS(UBIDI_REORDER_INVERSE_LIKE_DIRECT) }, 3664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { MAKE_ITEMS(UBIDI_REORDER_NUMBERS_SPECIAL) }, 3665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { MAKE_ITEMS(UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL) }, 3666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { MAKE_ITEMS(UBIDI_REORDER_INVERSE_NUMBERS_AS_L) } 3667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 3668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const struct { 3669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t value; 3670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* description; 3671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruoptions[] = { 3673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { MAKE_ITEMS(UBIDI_OPTION_INSERT_MARKS) }, 3674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { MAKE_ITEMS(0) } 3675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 3676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3677f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius#define TC_COUNT UPRV_LENGTHOF(textIn) 3678f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius#define MODES_COUNT UPRV_LENGTHOF(modes) 3679f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius#define OPTIONS_COUNT UPRV_LENGTHOF(options) 3680f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius#define LEVELS_COUNT UPRV_LENGTHOF(paraLevels) 3681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* const textIn[] = { 3683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* (0) 123 */ 3684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "123", 3685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* (1) .123->4.5 */ 3686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ".123->4.5", 3687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* (2) 678 */ 3688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "678", 3689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* (3) .678->8.9 */ 3690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ".678->8.9", 3691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* (4) JIH1.2,3MLK */ 3692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "JIH1.2,3MLK", 3693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* (5) FE.>12-> */ 3694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "FE.>12->", 3695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* (6) JIH.>12->a */ 3696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "JIH.>12->a", 3697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* (7) CBA.>67->89=a */ 3698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "CBA.>67->89=a", 3699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* (8) CBA.123->xyz */ 3700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "CBA.123->xyz", 3701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* (9) .>12->xyz */ 3702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ".>12->xyz", 3703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* (10) a.>67->xyz */ 3704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a.>67->xyz", 3705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* (11) 123JIH */ 3706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "123JIH", 3707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* (12) 123 JIH */ 3708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "123 JIH" 3709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 3710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* const textOut[] = { 3712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 0: 123 */ 3713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "123", /* (0) */ 3714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 1: .123->4.5 */ 3715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ".123->4.5", /* (1) */ 3716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "4.5<-123.", /* (2) */ 3717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 2: 678 */ 3718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "678", /* (3) */ 3719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 3: .678->8.9 */ 3720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ".8.9<-678", /* (4) */ 3721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "8.9<-678.", /* (5) */ 3722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ".678->8.9", /* (6) */ 3723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 4: MLK1.2,3JIH */ 3724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "KLM1.2,3HIJ", /* (7) */ 3725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 5: FE.>12-> */ 3726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "12<.EF->", /* (8) */ 3727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<-12<.EF", /* (9) */ 3728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "EF.>@12->", /* (10) */ 3729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 6: JIH.>12->a */ 3730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "12<.HIJ->a", /* (11) */ 3731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a<-12<.HIJ", /* (12) */ 3732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "HIJ.>@12->a", /* (13) */ 3733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a&<-12<.HIJ", /* (14) */ 3734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 7: CBA.>67->89=a */ 3735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ABC.>@67->89=a", /* (15) */ 3736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a=89<-67<.ABC", /* (16) */ 3737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a&=89<-67<.ABC", /* (17) */ 3738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "89<-67<.ABC=a", /* (18) */ 3739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 8: CBA.123->xyz */ 3740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "123.ABC->xyz", /* (19) */ 3741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "xyz<-123.ABC", /* (20) */ 3742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ABC.@123->xyz", /* (21) */ 3743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "xyz&<-123.ABC", /* (22) */ 3744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 9: .>12->xyz */ 3745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ".>12->xyz", /* (23) */ 3746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "xyz<-12<.", /* (24) */ 3747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "xyz&<-12<.", /* (25) */ 3748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 10: a.>67->xyz */ 3749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a.>67->xyz", /* (26) */ 3750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a.>@67@->xyz", /* (27) */ 3751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "xyz<-67<.a", /* (28) */ 3752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 11: 123JIH */ 3753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "123HIJ", /* (29) */ 3754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "HIJ123", /* (30) */ 3755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 12: 123 JIH */ 3756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "123 HIJ", /* (31) */ 3757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "HIJ 123", /* (32) */ 3758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 3759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define NO UBIDI_MAP_NOWHERE 3761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define MAX_MAP_LENGTH 20 3762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const int32_t forwardMap[][MAX_MAP_LENGTH] = { 3764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 0: 123 */ 3765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0, 1, 2 }, /* (0) */ 3766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 1: .123->4.5 */ 3767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, /* (1) */ 3768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 8, 5, 6, 7, 4, 3, 0, 1, 2 }, /* (2) */ 3769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 2: 678 */ 3770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0, 1, 2 }, /* (3) */ 3771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 3: .678->8.9 */ 3772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0, 6, 7, 8, 5, 4, 1, 2, 3 }, /* (4) */ 3773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 8, 5, 6, 7, 4, 3, 0, 1, 2 }, /* (5) */ 3774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, /* (6) */ 3775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 4: MLK1.2,3JIH */ 3776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 10, 9, 8, 3, 4, 5, 6, 7, 2, 1, 0 }, /* (7) */ 3777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 5: FE.>12-> */ 3778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 5, 4, 3, 2, 0, 1, 6, 7 }, /* (8) */ 3779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 7, 6, 5, 4, 2, 3, 1, 0 }, /* (9) */ 3780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1, 0, 2, 3, 5, 6, 7, 8 }, /* (10) */ 3781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 6: JIH.>12->a */ 3782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 6, 5, 4, 3, 2, 0, 1, 7, 8, 9 }, /* (11) */ 3783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 9, 8, 7, 6, 5, 3, 4, 2, 1, 0 }, /* (12) */ 3784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2, 1, 0, 3, 4, 6, 7, 8, 9, 10 }, /* (13) */ 3785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 10, 9, 8, 7, 6, 4, 5, 3, 2, 0 }, /* (14) */ 3786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 7: CBA.>67->89=a */ 3787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2, 1, 0, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13 }, /* (15) */ 3788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 12, 11, 10, 9, 8, 6, 7, 5, 4, 2, 3, 1, 0 }, /* (16) */ 3789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 13, 12, 11, 10, 9, 7, 8, 6, 5, 3, 4, 2, 0 }, /* (17) */ 3790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 10, 9, 8, 7, 6, 4, 5, 3, 2, 0, 1, 11, 12 }, /* (18) */ 3791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 8: CBA.123->xyz */ 3792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 6, 5, 4, 3, 0, 1, 2, 7, 8, 9, 10, 11 }, /* (19) */ 3793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 11, 10, 9, 8, 5, 6, 7, 4, 3, 0, 1, 2 }, /* (20) */ 3794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2, 1, 0, 3, 5, 6, 7, 8, 9, 10, 11, 12 }, /* (21) */ 3795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 12, 11, 10, 9, 6, 7, 8, 5, 4, 0, 1, 2 }, /* (22) */ 3796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 9: .>12->xyz */ 3797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, /* (23) */ 3798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 8, 7, 5, 6, 4, 3, 0, 1, 2 }, /* (24) */ 3799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 9, 8, 6, 7, 5, 4, 0, 1, 2 }, /* (25) */ 3800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 10: a.>67->xyz */ 3801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, /* (26) */ 3802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0, 1, 2, 4, 5, 7, 8, 9, 10, 11 }, /* (27) */ 3803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 9, 8, 7, 5, 6, 4, 3, 0, 1, 2 }, /* (28) */ 3804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 11: 123JIH */ 3805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0, 1, 2, 5, 4, 3 }, /* (29) */ 3806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 3, 4, 5, 2, 1, 0 }, /* (30) */ 3807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 12: 123 JIH */ 3808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0, 1, 2, 3, 6, 5, 4 }, /* (31) */ 3809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 4, 5, 6, 3, 2, 1, 0 }, /* (32) */ 3810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 3811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const int32_t inverseMap[][MAX_MAP_LENGTH] = { 3813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 0: 123 */ 3814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0, 1, 2 }, /* (0) */ 3815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 1: .123->4.5 */ 3816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, /* (1) */ 3817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 6, 7, 8, 5, 4, 1, 2, 3, 0 }, /* (2) */ 3818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 2: 678 */ 3819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0, 1, 2 }, /* (3) */ 3820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 3: .678->8.9 */ 3821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0, 6, 7, 8, 5, 4, 1, 2, 3 }, /* (4) */ 3822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 6, 7, 8, 5, 4, 1, 2, 3, 0 }, /* (5) */ 3823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, /* (6) */ 3824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 4: MLK1.2,3JIH */ 3825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 10, 9, 8, 3, 4, 5, 6, 7, 2, 1, 0 }, /* (7) */ 3826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 5: FE.>12-> */ 3827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 4, 5, 3, 2, 1, 0, 6, 7 }, /* (8) */ 3828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 7, 6, 4, 5, 3, 2, 1, 0 }, /* (9) */ 3829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1, 0, 2, 3, NO, 4, 5, 6, 7 }, /* (10) */ 3830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 6: JIH.>12->a */ 3831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 5, 6, 4, 3, 2, 1, 0, 7, 8, 9 }, /* (11) */ 3832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 9, 8, 7, 5, 6, 4, 3, 2, 1, 0 }, /* (12) */ 3833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2, 1, 0, 3, 4, NO, 5, 6, 7, 8, 9 }, /* (13) */ 3834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 9, NO, 8, 7, 5, 6, 4, 3, 2, 1, 0 }, /* (14) */ 3835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 7: CBA.>67->89=a */ 3836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2, 1, 0, 3, 4, NO, 5, 6, 7, 8, 9, 10, 11, 12 }, /* (15) */ 3837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 12, 11, 9, 10, 8, 7, 5, 6, 4, 3, 2, 1, 0 }, /* (16) */ 3838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 12, NO, 11, 9, 10, 8, 7, 5, 6, 4, 3, 2, 1, 0 }, /* (17) */ 3839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 9, 10, 8, 7, 5, 6, 4, 3, 2, 1, 0, 11, 12 }, /* (18) */ 3840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 8: CBA.123->xyz */ 3841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 4, 5, 6, 3, 2, 1, 0, 7, 8, 9, 10, 11 }, /* (19) */ 3842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 9, 10, 11, 8, 7, 4, 5, 6, 3, 2, 1, 0 }, /* (20) */ 3843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2, 1, 0, 3, NO, 4, 5, 6, 7, 8, 9, 10, 11 }, /* (21) */ 3844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 9, 10, 11, NO, 8, 7, 4, 5, 6, 3, 2, 1, 0 }, /* (22) */ 3845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 9: .>12->xyz */ 3846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, /* (23) */ 3847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 6, 7, 8, 5, 4, 2, 3, 1, 0 }, /* (24) */ 3848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 6, 7, 8, NO, 5, 4, 2, 3, 1, 0 }, /* (25) */ 3849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 10: a.>67->xyz */ 3850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, /* (26) */ 3851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0, 1, 2, NO, 3, 4, NO, 5, 6, 7, 8, 9 }, /* (27) */ 3852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 7, 8, 9, 6, 5, 3, 4, 2, 1, 0 }, /* (28) */ 3853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 11: 123JIH */ 3854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0, 1, 2, 5, 4, 3 }, /* (29) */ 3855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 5, 4, 3, 0, 1, 2 }, /* (30) */ 3856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 12: 123 JIH */ 3857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0, 1, 2, 3, 6, 5, 4 }, /* (31) */ 3858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 6, 5, 4, 3, 0, 1, 2 }, /* (32) */ 3859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 3860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char outIndices[TC_COUNT][MODES_COUNT - 1][OPTIONS_COUNT] 3862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru [LEVELS_COUNT] = { 3863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { /* TC 0: 123 */ 3864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 0, 0}, { 0, 0}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 3865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 0, 0}, { 0, 0}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 3866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 0, 0}, { 0, 0}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 3867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 0, 0}, { 0, 0}} /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 3868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 3869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { /* TC 1: .123->4.5 */ 3870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 2}, { 1, 2}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 3871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 2}, { 1, 2}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 3872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 2}, { 1, 2}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 3873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 2}, { 1, 2}} /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 3874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 3875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { /* TC 2: 678 */ 3876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 3, 3}, { 3, 3}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 3877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 3, 3}, { 3, 3}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 3878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 3, 3}, { 3, 3}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 3879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 3, 3}, { 3, 3}} /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 3880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 3881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { /* TC 3: .678->8.9 */ 3882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 6, 5}, { 6, 5}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 3883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 4, 5}, { 4, 5}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 3884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 6, 5}, { 6, 5}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 3885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 6, 5}, { 6, 5}} /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 3886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 3887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { /* TC 4: MLK1.2,3JIH */ 3888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 7, 7}, { 7, 7}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 3889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 7, 7}, { 7, 7}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 3890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 7, 7}, { 7, 7}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 3891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 7, 7}, { 7, 7}} /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 3892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 3893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { /* TC 5: FE.>12-> */ 3894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 8, 9}, { 8, 9}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 3895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{10, 9}, { 8, 9}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 3896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 8, 9}, { 8, 9}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 3897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{10, 9}, { 8, 9}} /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 3898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 3899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { /* TC 6: JIH.>12->a */ 3900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{11, 12}, {11, 12}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 3901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{13, 14}, {11, 12}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 3902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{11, 12}, {11, 12}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 3903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{13, 14}, {11, 12}} /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 3904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 3905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { /* TC 7: CBA.>67->89=a */ 3906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{18, 16}, {18, 16}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 3907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{18, 17}, {18, 16}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 3908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{18, 16}, {18, 16}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 3909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{15, 17}, {18, 16}} /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 3910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 3911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { /* TC 8: CBA.>124->xyz */ 3912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{19, 20}, {19, 20}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 3913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{21, 22}, {19, 20}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 3914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{19, 20}, {19, 20}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 3915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{21, 22}, {19, 20}} /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 3916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 3917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { /* TC 9: .>12->xyz */ 3918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{23, 24}, {23, 24}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 3919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{23, 25}, {23, 24}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 3920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{23, 24}, {23, 24}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 3921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{23, 25}, {23, 24}} /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 3922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 3923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { /* TC 10: a.>67->xyz */ 3924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{26, 26}, {26, 26}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 3925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{26, 27}, {26, 28}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 3926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{26, 28}, {26, 28}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 3927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{26, 27}, {26, 28}} /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 3928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 3929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { /* TC 11: 124JIH */ 3930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{30, 30}, {30, 30}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 3931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{29, 30}, {29, 30}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 3932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{30, 30}, {30, 30}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 3933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{30, 30}, {30, 30}} /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 3934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 3935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { /* TC 12: 124 JIH */ 3936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{32, 32}, {32, 32}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 3937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{31, 32}, {31, 32}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 3938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{31, 32}, {31, 32}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 3939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{31, 32}, {31, 32}} /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 3940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 3942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool 3944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruassertRoundTrip(UBiDi *pBiDi, int32_t tc, int32_t outIndex, const char *srcChars, 3945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *destChars, const UChar *dest, int32_t destLen, 3946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int mode, int option, UBiDiLevel level) { 3947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char roundtrip[TC_COUNT][MODES_COUNT][OPTIONS_COUNT] 3949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru [LEVELS_COUNT] = { 3950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { /* TC 0: 123 */ 3951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 3952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 3953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 3954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 3955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}} /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */ 3956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 3957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { /* TC 1: .123->4.5 */ 3958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 3959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 3960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 3961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 3962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}} /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */ 3963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 3964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { /* TC 2: 678 */ 3965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 3966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 3967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 3968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 3969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}} /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */ 3970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 3971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { /* TC 3: .678->8.9 */ 3972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 3973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 3974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 3975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 3976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 0, 0}, { 1, 1}} /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */ 3977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 3978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { /* TC 4: MLK1.2,3JIH */ 3979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 3980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 3981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 3982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 3983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}} /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */ 3984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 3985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { /* TC 5: FE.>12-> */ 3986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 3987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 3988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 0, 1}, { 1, 1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 3989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 3990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}} /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */ 3991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 3992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { /* TC 6: JIH.>12->a */ 3993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 3994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 3995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 0, 0}, { 1, 1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 3996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 3997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}} /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */ 3998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 3999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { /* TC 7: CBA.>67->89=a */ 4000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 4001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 4002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 0, 1}, { 1, 1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 4003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 4004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 0, 0}, { 1, 1}} /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */ 4005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 4006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { /* TC 8: CBA.>123->xyz */ 4007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 4008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 4009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 0, 0}, { 1, 1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 4010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 4011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}} /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */ 4012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 4013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { /* TC 9: .>12->xyz */ 4014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 4015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 4016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 0}, { 1, 1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 4017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 4018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}} /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */ 4019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 4020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { /* TC 10: a.>67->xyz */ 4021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 4022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 4023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 4024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 4025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 0}, { 1, 1}} /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */ 4026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 4027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { /* TC 11: 123JIH */ 4028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 4029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 4030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 4031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 4032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}} /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */ 4033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 4034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { /* TC 12: 123 JIH */ 4035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */ 4036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */ 4037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */ 4038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */ 4039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {{ 1, 1}, { 1, 1}} /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */ 4040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 4042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru #define SET_ROUND_TRIP_MODE(mode) \ 4044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setReorderingMode(pBiDi, mode); \ 4045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru desc = #mode; \ 4046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 4047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode rc = U_ZERO_ERROR; 4049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar dest2[MAXLEN]; 4050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t destLen2; 4051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* desc; 4052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char destChars2[MAXLEN]; 4053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char destChars3[MAXLEN]; 4054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (modes[mode].value) { 4056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case UBIDI_REORDER_NUMBERS_SPECIAL: 4057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SET_ROUND_TRIP_MODE(UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL) 4058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case UBIDI_REORDER_GROUP_NUMBERS_WITH_R: 4059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SET_ROUND_TRIP_MODE(UBIDI_REORDER_GROUP_NUMBERS_WITH_R) 4060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case UBIDI_REORDER_RUNS_ONLY: 4061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SET_ROUND_TRIP_MODE(UBIDI_REORDER_RUNS_ONLY) 4062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case UBIDI_REORDER_INVERSE_NUMBERS_AS_L: 4063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SET_ROUND_TRIP_MODE(UBIDI_REORDER_DEFAULT) 4064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case UBIDI_REORDER_INVERSE_LIKE_DIRECT: 4065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SET_ROUND_TRIP_MODE(UBIDI_REORDER_DEFAULT) 4066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL: 4067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SET_ROUND_TRIP_MODE(UBIDI_REORDER_NUMBERS_SPECIAL) 4068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: 4069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SET_ROUND_TRIP_MODE(UBIDI_REORDER_INVERSE_LIKE_DIRECT) 4070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setReorderingOptions(pBiDi, UBIDI_OPTION_REMOVE_CONTROLS); 4072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(pBiDi, dest, destLen, level, NULL, &rc); 4074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertSuccessful("ubidi_setPara", &rc); 4075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *dest2 = 0; 4076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLen2 = ubidi_writeReordered(pBiDi, dest2, MAXLEN, UBIDI_DO_MIRRORING, 4077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &rc); 4078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertSuccessful("ubidi_writeReordered", &rc); 4079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u16ToPseudo(destLen, dest, destChars3); 4081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u16ToPseudo(destLen2, dest2, destChars2); 4082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru checkWhatYouCan(pBiDi, destChars3, destChars2); 4083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (strcmp(srcChars, destChars2)) { 4084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (roundtrip[tc][mode][option][level]) { 4085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nRound trip failed for case=%d mode=%d option=%d.\n" 4086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "%20s %s\n%20s %s\n%20s %s\n%20s %s\n%20s %s" 4087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\n%20s %u\n", tc, mode, option, 4088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Original text:", srcChars, 4089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Round-tripped text:", destChars2, 4090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Intermediate text:", destChars3, 4091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Reordering mode:", modes[mode].description, 4092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Reordering option:", options[option].description, 4093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Paragraph level:", level); 4094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 4096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\nExpected round trip failure for case=%d mode=%d option=%d.\n" 4097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "%20s %s\n%20s %s\n%20s %s\n%20s %s\n%20s %s" 4098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\n%20s %u\n", tc, mode, option, 4099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Original text:", srcChars, 4100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Round-tripped text:", destChars2, 4101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Intermediate text:", destChars3, 4102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Reordering mode:", modes[mode].description, 4103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Reordering option:", options[option].description, 4104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Paragraph level:", level); 4105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 4107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!checkResultLength(pBiDi, destChars, destChars2, destLen2, 4109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru desc, "UBIDI_OPTION_REMOVE_CONTROLS", level)) { 4110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 4111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (outIndex > -1 && !checkMaps(pBiDi, outIndex, srcChars, destChars, 4113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru desc, "UBIDI_OPTION_REMOVE_CONTROLS", 4114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru level, FALSE)) { 4115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 4116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 4118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool 4121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerucheckResultLength(UBiDi *pBiDi, const char *srcChars, const char *destChars, 4122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t destLen, const char* mode, 4123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* option, UBiDiLevel level) { 4124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t actualLen; 4125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (strcmp(mode, "UBIDI_REORDER_INVERSE_NUMBERS_AS_L") == 0) 4126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru actualLen = strlen(destChars); 4127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else 4128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru actualLen = ubidi_getResultLength(pBiDi); 4129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (actualLen != destLen) { 4130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nubidi_getResultLength failed.\n%20s %7d\n%20s %7d\n" 4131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "%20s %s\n%20s %s\n%20s %s\n%20s %s\n%20s %u\n", 4132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Expected:", destLen, "Actual:", actualLen, 4133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Input:", srcChars, "Output:", destChars, 4134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Reordering mode:", mode, "Reordering option:", option, 4135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Paragraph level:", level); 4136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 4137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 4139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 4142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerutestReorderRunsOnly(void) { 4143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const struct { 4144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* textIn; 4145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* textOut[2][2]; 4146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char noroundtrip[2]; 4147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } testCases[] = { 4148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"ab 234 896 de", {{"de 896 ab 234", "de 896 ab 234"}, /*0*/ 4149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"ab 234 @896@ de", "de 896 ab 234"}}, {0, 0}}, 4150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"abcGHI", {{"GHIabc", "GHIabc"}, {"GHIabc", "GHIabc"}}, {0, 0}}, /*1*/ 4151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"a.>67->", {{"<-67<.a", "<-67<.a"}, {"<-67<.a", "<-67<.a"}}, {0, 0}}, /*2*/ 4152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"-=%$123/ *", {{"* /%$123=-", "* /%$123=-"}, /*3*/ 4153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"* /%$123=-", "* /%$123=-"}}, {0, 0}}, 4154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"abc->12..>JKL", {{"JKL<..12<-abc", "JKL<..abc->12"}, /*4*/ 4155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"JKL<..12<-abc", "JKL<..abc->12"}}, {0, 0}}, 4156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"JKL->12..>abc", {{"abc<..JKL->12", "abc<..12<-JKL"}, /*5*/ 4157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"abc<..JKL->12", "abc<..12<-JKL"}}, {0, 0}}, 4158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"123->abc", {{"abc<-123", "abc<-123"}, /*6*/ 4159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"abc&<-123", "abc<-123"}}, {1, 0}}, 4160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"123->JKL", {{"JKL<-123", "123->JKL"}, /*7*/ 4161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"JKL<-123", "JKL<-@123"}}, {0, 1}}, 4162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"*>12.>34->JKL", {{"JKL<-34<.12<*", "12.>34->JKL<*"}, /*8*/ 4163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"JKL<-34<.12<*", "JKL<-@34<.12<*"}}, {0, 1}}, 4164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"*>67.>89->JKL", {{"67.>89->JKL<*", "67.>89->JKL<*"}, /*9*/ 4165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"67.>89->JKL<*", "67.>89->JKL<*"}}, {0, 0}}, 4166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"* /abc-=$%123", {{"$%123=-abc/ *", "abc-=$%123/ *"}, /*10*/ 4167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"$%123=-abc/ *", "abc-=$%123/ *"}}, {0, 0}}, 4168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"* /$%def-=123", {{"123=-def%$/ *", "def-=123%$/ *"}, /*11*/ 4169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"123=-def%$/ *", "def-=123%$/ *"}}, {0, 0}}, 4170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"-=GHI* /123%$", {{"GHI* /123%$=-", "123%$/ *GHI=-"}, /*12*/ 4171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"GHI* /123%$=-", "123%$/ *GHI=-"}}, {0, 0}}, 4172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"-=%$JKL* /123", {{"JKL* /%$123=-", "123/ *JKL$%=-"}, /*13*/ 4173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"JKL* /%$123=-", "123/ *JKL$%=-"}}, {0, 0}}, 4174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"ab =#CD *?450", {{"CD *?450#= ab", "450?* CD#= ab"}, /*14*/ 4175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"CD *?450#= ab", "450?* CD#= ab"}}, {0, 0}}, 4176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"ab 234 896 de", {{"de 896 ab 234", "de 896 ab 234"}, /*15*/ 4177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"ab 234 @896@ de", "de 896 ab 234"}}, {0, 0}}, 4178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"abc-=%$LMN* /123", {{"LMN* /%$123=-abc", "123/ *LMN$%=-abc"}, /*16*/ 4179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"LMN* /%$123=-abc", "123/ *LMN$%=-abc"}}, {0, 0}}, 4180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"123->JKL&MN&P", {{"JKLMNP<-123", "123->JKLMNP"}, /*17*/ 4181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"JKLMNP<-123", "JKLMNP<-@123"}}, {0, 1}}, 4182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"123", {{"123", "123"}, /* just one run */ /*18*/ 4183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"123", "123"}}, {0, 0}} 4184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 4185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDi *pBiDi = getBiDiObject(); 4186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDi *pL2VBiDi = getBiDiObject(); 4187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar src[MAXLEN], dest[MAXLEN], visual1[MAXLEN], visual2[MAXLEN]; 4188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char destChars[MAXLEN], vis1Chars[MAXLEN], vis2Chars[MAXLEN]; 4189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t srcLen, destLen, vis1Len, vis2Len, option, i, j, nCases, paras; 4190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode rc = U_ZERO_ERROR; 4191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDiLevel level; 4192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\nEntering TestReorderRunsOnly\n\n"); 4194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!pL2VBiDi) { 4196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(pBiDi); /* in case this one was allocated */ 4197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 4198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setReorderingMode(pBiDi, UBIDI_REORDER_RUNS_ONLY); 4200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setReorderingOptions(pL2VBiDi, UBIDI_OPTION_REMOVE_CONTROLS); 4201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (option = 0; option < 2; option++) { 4203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setReorderingOptions(pBiDi, option==0 ? UBIDI_OPTION_REMOVE_CONTROLS 4204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru : UBIDI_OPTION_INSERT_MARKS); 4205f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius for (i = 0, nCases = UPRV_LENGTHOF(testCases); i < nCases; i++) { 4206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = strlen(testCases[i].textIn); 4207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToU16(srcLen, testCases[i].textIn, src); 4208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(j = 0; j < 2; j++) { 4209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Now doing test for option %d, case %d, level %d\n", 4210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, option, j); 4211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru level = paraLevels[j]; 4212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(pBiDi, src, srcLen, level, NULL, &rc); 4213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertSuccessful("ubidi_setPara", &rc); 4214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *dest = 0; 4215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLen = ubidi_writeReordered(pBiDi, dest, MAXLEN, UBIDI_DO_MIRRORING, &rc); 4216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertSuccessful("ubidi_writeReordered", &rc); 4217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u16ToPseudo(destLen, dest, destChars); 4218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru checkWhatYouCan(pBiDi, testCases[i].textIn, destChars); 4219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertStringsEqual(testCases[i].textOut[option][level], destChars, 4220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testCases[i].textIn, "UBIDI_REORDER_RUNS_ONLY", 4221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru option==0 ? "0" : "UBIDI_OPTION_INSERT_MARKS", 4222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pBiDi); 4223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if((option==0) && testCases[i].noroundtrip[level]) { 4225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 4226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(pL2VBiDi, src, srcLen, level, NULL, &rc); 4228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertSuccessful("ubidi_setPara1", &rc); 4229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *visual1 = 0; 4230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru vis1Len = ubidi_writeReordered(pL2VBiDi, visual1, MAXLEN, UBIDI_DO_MIRRORING, &rc); 4231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertSuccessful("ubidi_writeReordered1", &rc); 4232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u16ToPseudo(vis1Len, visual1, vis1Chars); 4233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru checkWhatYouCan(pL2VBiDi, testCases[i].textIn, vis1Chars); 4234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(pL2VBiDi, dest, destLen, level^1, NULL, &rc); 4235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertSuccessful("ubidi_setPara2", &rc); 4236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *visual2 = 0; 4237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru vis2Len = ubidi_writeReordered(pL2VBiDi, visual2, MAXLEN, UBIDI_DO_MIRRORING, &rc); 4238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertSuccessful("ubidi_writeReordered2", &rc); 4239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u16ToPseudo(vis2Len, visual2, vis2Chars); 4240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru checkWhatYouCan(pL2VBiDi, destChars, vis2Chars); 4241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertStringsEqual(vis1Chars, vis2Chars, 4242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testCases[i].textIn, "UBIDI_REORDER_RUNS_ONLY (2)", 4243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru option==0 ? "0" : "UBIDI_OPTION_INSERT_MARKS", 4244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pBiDi); 4245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test with null or empty text */ 4250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(pBiDi, src, 0, UBIDI_LTR, NULL, &rc); 4251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertSuccessful("ubidi_setPara3", &rc); 4252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru paras = ubidi_countParagraphs(pBiDi); 4253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (paras != 0) { 4254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nInvalid number of paras (should be 0): %d\n", paras); 4255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(pBiDi); 4258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(pL2VBiDi); 4259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\nExiting TestReorderRunsOnly\n\n"); 4261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 4264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerutestReorderingMode(void) { 4265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar src[MAXLEN], dest[MAXLEN]; 4267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char destChars[MAXLEN]; 4268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDi *pBiDi = NULL, *pBiDi2 = NULL, *pBiDi3 = NULL; 4269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode rc; 4270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int tc, mode, option, level; 4271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t optionValue, optionBack; 4272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDiReorderingMode modeValue, modeBack; 427354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int32_t srcLen, destLen, idx; 4274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *expectedChars; 4275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool testOK = TRUE; 4276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\nEntering TestReorderingMode\n\n"); 4278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pBiDi = getBiDiObject(); 4280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pBiDi2 = getBiDiObject(); 4281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pBiDi3 = getBiDiObject(); 4282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!pBiDi3) { 4283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(pBiDi); /* in case this one was allocated */ 4284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(pBiDi2); /* in case this one was allocated */ 4285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 4286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setInverse(pBiDi2, TRUE); 4289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (tc = 0; tc < TC_COUNT; tc++) { 4291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *srcChars = textIn[tc]; 4292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = strlen(srcChars); 4293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToU16(srcLen, srcChars, src); 4294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (mode = 0; mode < MODES_COUNT; mode++) { 4296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru modeValue = modes[mode].value; 4297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setReorderingMode(pBiDi, modeValue); 4298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru modeBack = ubidi_getReorderingMode(pBiDi); 4299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (modeValue != modeBack) { 4300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error while setting reordering mode to %d, returned %d\n", 4301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru modeValue, modeBack); 4302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (option = 0; option < OPTIONS_COUNT; option++) { 4305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru optionValue = options[option].value; 4306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setReorderingOptions(pBiDi, optionValue); 4307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru optionBack = ubidi_getReorderingOptions(pBiDi); 4308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (optionValue != optionBack) { 4309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error while setting reordering option to %d, returned %d\n", 4310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru optionValue, optionBack); 4311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (level = 0; level < LEVELS_COUNT; level++) { 4314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("starting test %d mode=%d option=%d level=%d\n", 4315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tc, modes[mode].value, options[option].value, level); 4316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rc = U_ZERO_ERROR; 4317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(pBiDi, src, srcLen, paraLevels[level], NULL, &rc); 4318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertSuccessful("ubidi_setPara", &rc); 4319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *dest = 0; 4321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLen = ubidi_writeReordered(pBiDi, dest, MAXLEN, 4322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBIDI_DO_MIRRORING, &rc); 4323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertSuccessful("ubidi_writeReordered", &rc); 4324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u16ToPseudo(destLen, dest, destChars); 4325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!((modes[mode].value == UBIDI_REORDER_INVERSE_NUMBERS_AS_L) && 4326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (options[option].value == UBIDI_OPTION_INSERT_MARKS))) { 4327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru checkWhatYouCan(pBiDi, srcChars, destChars); 4328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (modes[mode].value == UBIDI_REORDER_INVERSE_NUMBERS_AS_L) { 433154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius idx = -1; 4332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectedChars = inverseBasic(pBiDi2, srcChars, srcLen, 4333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru options[option].value, paraLevels[level], destChars); 4334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 433654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius idx = outIndices[tc][mode][option][level]; 433754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius expectedChars = textOut[idx]; 4338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!assertStringsEqual(expectedChars, destChars, srcChars, 4340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru modes[mode].description, 4341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru options[option].description, 4342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pBiDi)) { 4343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testOK = FALSE; 4344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (options[option].value == UBIDI_OPTION_INSERT_MARKS && 434654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius !assertRoundTrip(pBiDi3, tc, idx, srcChars, 4347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destChars, dest, destLen, 4348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru mode, option, paraLevels[level])) { 4349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testOK = FALSE; 4350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else if (!checkResultLength(pBiDi, srcChars, destChars, 4352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLen, modes[mode].description, 4353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru options[option].description, 4354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru paraLevels[level])) { 4355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testOK = FALSE; 4356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 435754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius else if (idx > -1 && !checkMaps(pBiDi, idx, srcChars, 4358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destChars, modes[mode].description, 4359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru options[option].description, paraLevels[level], 4360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TRUE)) { 4361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testOK = FALSE; 4362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (testOK == TRUE) { 4368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\nReordering mode test OK\n"); 4369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(pBiDi3); 4371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(pBiDi2); 4372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(pBiDi); 4373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\nExiting TestReorderingMode\n\n"); 4375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* inverseBasic(UBiDi *pBiDi, const char *srcChars, int32_t srcLen, 4378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t option, UBiDiLevel level, char *result) { 4379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode rc = U_ZERO_ERROR; 4380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t destLen; 4381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar src[MAXLEN], dest2[MAXLEN]; 4382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 43831b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert if (pBiDi == NULL || srcChars == NULL) { 4384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 4385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setReorderingOptions(pBiDi, option); 4387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pseudoToU16(srcLen, srcChars, src); 4388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(pBiDi, src, srcLen, level, NULL, &rc); 4389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertSuccessful("ubidi_setPara", &rc); 4390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *dest2 = 0; 4392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLen = ubidi_writeReordered(pBiDi, dest2, MAXLEN, 4393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBIDI_DO_MIRRORING, &rc); 4394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertSuccessful("ubidi_writeReordered", &rc); 4395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u16ToPseudo(destLen, dest2, result); 4396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!(option == UBIDI_OPTION_INSERT_MARKS)) { 4397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru checkWhatYouCan(pBiDi, srcChars, result); 4398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 4400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define NULL_CHAR '\0' 4403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 4405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerutestStreaming(void) { 4406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define MAXPORTIONS 10 4407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const struct { 4409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* textIn; 4410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru short int chunk; 4411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru short int nPortions[2]; 4412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char portionLens[2][MAXPORTIONS]; 4413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* message[2]; 4414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } testData[] = { 4415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "123\\u000A" 4416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "abc45\\u000D" 4417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "67890\\u000A" 4418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u000D" 4419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "02468\\u000D" 4420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ghi", 442159d709d503bab6e2b61931737e662dd293b40578ccornelius 6, { 6, 6 }, {{ 4, 6, 6, 1, 6, 3}, { 4, 6, 6, 1, 6, 3 }}, 442259d709d503bab6e2b61931737e662dd293b40578ccornelius {"4, 6, 6, 1, 6, 3", "4, 6, 6, 1, 6, 3"} 4423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 4424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "abcd\\u000Afgh\\u000D12345\\u000A456", 442559d709d503bab6e2b61931737e662dd293b40578ccornelius 6, { 4, 4 }, {{ 5, 4, 6, 3 }, { 5, 4, 6, 3 }}, 442659d709d503bab6e2b61931737e662dd293b40578ccornelius {"5, 4, 6, 3", "5, 4, 6, 3"} 4427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 4428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "abcd\\u000Afgh\\u000D12345\\u000A45\\u000D", 442959d709d503bab6e2b61931737e662dd293b40578ccornelius 6, { 4, 4 }, {{ 5, 4, 6, 3 }, { 5, 4, 6, 3 }}, 443059d709d503bab6e2b61931737e662dd293b40578ccornelius {"5, 4, 6, 3", "5, 4, 6, 3"} 4431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 4432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "abcde\\u000Afghi", 443359d709d503bab6e2b61931737e662dd293b40578ccornelius 10, { 2, 2 }, {{ 6, 4 }, { 6, 4 }}, 443459d709d503bab6e2b61931737e662dd293b40578ccornelius {"6, 4", "6, 4"} 4435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 4437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar src[MAXLEN]; 4438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDi *pBiDi = NULL; 4439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *pSrc; 4440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode rc = U_ZERO_ERROR; 4441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t srcLen, processedLen, chunk, len, nPortions; 4442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i, j, levelIndex; 4443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDiLevel level; 4444f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius int nTests = UPRV_LENGTHOF(testData), nLevels = UPRV_LENGTHOF(paraLevels); 4445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool mismatch, testOK = TRUE; 444659d709d503bab6e2b61931737e662dd293b40578ccornelius char processedLenStr[MAXPORTIONS * 5]; 4447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\nEntering TestStreaming\n\n"); 4449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pBiDi = getBiDiObject(); 4451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_orderParagraphsLTR(pBiDi, TRUE); 4453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (levelIndex = 0; levelIndex < nLevels; levelIndex++) { 4455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < nTests; i++) { 4456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape(testData[i].textIn, src, MAXLEN); 4457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru chunk = testData[i].chunk; 4458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nPortions = testData[i].nPortions[levelIndex]; 4459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru level = paraLevels[levelIndex]; 446059d709d503bab6e2b61931737e662dd293b40578ccornelius processedLenStr[0] = NULL_CHAR; 4461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing level %d, case %d\n", level, i); 4462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru mismatch = FALSE; 4464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setReorderingOptions(pBiDi, UBIDI_OPTION_STREAMING); 4466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (j = 0, pSrc = src; j < MAXPORTIONS && srcLen > 0; j++) { 4467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru len = chunk < srcLen ? chunk : srcLen; 4469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(pBiDi, pSrc, len, level, NULL, &rc); 4470c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (!assertSuccessful("ubidi_setPara", &rc)) { 4471c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru break; 4472c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 4473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru processedLen = ubidi_getProcessedLength(pBiDi); 4475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (processedLen == 0) { 4476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setReorderingOptions(pBiDi, UBIDI_OPTION_DEFAULT); 4477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru j--; 4478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 4479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setReorderingOptions(pBiDi, UBIDI_OPTION_STREAMING); 4481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 448259d709d503bab6e2b61931737e662dd293b40578ccornelius mismatch |= (UBool)(j >= nPortions || 4483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru processedLen != testData[i].portionLens[levelIndex][j]); 4484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sprintf(processedLenStr + j * 4, "%4d", processedLen); 4486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen -= processedLen, pSrc += processedLen; 4487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (mismatch || j != nPortions) { 4490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testOK = FALSE; 4491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nProcessed lengths mismatch.\n" 4492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\tParagraph level: %u\n" 4493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\tInput string: %s\n" 4494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\tActually processed portion lengths: { %s }\n" 4495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\tExpected portion lengths : { %s }\n", 4496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru paraLevels[levelIndex], testData[i].textIn, 4497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru processedLenStr, testData[i].message[levelIndex]); 4498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(pBiDi); 4502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (testOK == TRUE) { 4503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\nBiDi streaming test OK\n"); 4504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\nExiting TestStreaming\n\n"); 4506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_BEGIN 4509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UCharDirection U_CALLCONV 4511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruoverrideBidiClass(const void *context, UChar32 c) { 4512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define DEF U_BIDI_CLASS_DEFAULT 4514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UCharDirection customClasses[] = { 4516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 0/8 1/9 2/A 3/B 4/C 5/D 6/E 7/F */ 4517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DEF, DEF, DEF, DEF, DEF, DEF, DEF, DEF, /* 00-07 */ 4518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DEF, DEF, DEF, DEF, DEF, DEF, DEF, DEF, /* 08-0F */ 4519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DEF, DEF, DEF, DEF, DEF, DEF, DEF, DEF, /* 10-17 */ 4520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DEF, DEF, DEF, DEF, DEF, DEF, DEF, DEF, /* 18-1F */ 4521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DEF, DEF, DEF, DEF, DEF, DEF, R, DEF, /* 20-27 */ 4522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DEF, DEF, DEF, DEF, DEF, DEF, DEF, DEF, /* 28-2F */ 4523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru EN, EN, EN, EN, EN, EN, AN, AN, /* 30-37 */ 4524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru AN, AN, DEF, DEF, DEF, DEF, DEF, DEF, /* 38-3F */ 4525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru L, AL, AL, AL, AL, AL, AL, R, /* 40-47 */ 4526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru R, R, R, R, R, R, R, R, /* 48-4F */ 4527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru R, R, R, R, R, R, R, R, /* 50-57 */ 4528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru R, R, R, LRE, DEF, RLE, PDF, S, /* 58-5F */ 4529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NSM, DEF, DEF, DEF, DEF, DEF, DEF, DEF, /* 60-67 */ 4530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DEF, DEF, DEF, DEF, DEF, DEF, DEF, DEF, /* 68-6F */ 4531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DEF, DEF, DEF, DEF, DEF, DEF, DEF, DEF, /* 70-77 */ 4532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DEF, DEF, DEF, LRO, B, RLO, BN, DEF /* 78-7F */ 4533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 4534f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius static const int nEntries = UPRV_LENGTHOF(customClasses); 4535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *dummy = context; /* just to avoid a compiler warning */ 4536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dummy++; 4537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return c >= nEntries ? U_BIDI_CLASS_DEFAULT : customClasses[c]; 4539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_END 4542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void verifyCallbackParams(UBiDiClassCallback* fn, const void* context, 4544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDiClassCallback* expectedFn, 4545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const void* expectedContext, 4546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t sizeOfContext) { 4547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fn != expectedFn) { 4548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Class callback pointer is not set properly.\n"); 4549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (context != expectedContext) { 4551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Class callback context is not set properly.\n"); 4552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else if (context != NULL && 4554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru memcmp(context, expectedContext, sizeOfContext)) { 4555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Callback context content doesn't match the expected one.\n"); 4556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 4560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerutestClassOverride(void) { 4561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* const textSrc = "JIH.>12->a \\u05D0\\u05D1 6 ABC78"; 4562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* const textResult = "12<.HIJ->a 78CBA 6 \\u05D1\\u05D0"; 4563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar src[MAXLEN], dest[MAXLEN]; 4565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode rc = U_ZERO_ERROR; 4566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDi *pBiDi = NULL; 4567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDiClassCallback* oldFn = NULL; 4568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBiDiClassCallback* newFn = overrideBidiClass; 4569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const void* oldContext = NULL; 4570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t srcLen, destLen, textSrcSize = (int32_t)uprv_strlen(textSrc); 4571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char* destChars = NULL; 4572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\nEntering TestClassOverride\n\n"); 4574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pBiDi = getBiDiObject(); 4576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!pBiDi) { 4577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 4578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_getClassCallback(pBiDi, &oldFn, &oldContext); 4581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru verifyCallbackParams(oldFn, oldContext, NULL, NULL, 0); 4582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setClassCallback(pBiDi, newFn, textSrc, &oldFn, &oldContext, &rc); 4584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!assertSuccessful("ubidi_setClassCallback", &rc)) { 4585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(pBiDi); 4586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 4587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru verifyCallbackParams(oldFn, oldContext, NULL, NULL, 0); 4589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_getClassCallback(pBiDi, &oldFn, &oldContext); 4591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru verifyCallbackParams(oldFn, oldContext, newFn, textSrc, textSrcSize); 4592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setClassCallback(pBiDi, newFn, textSrc, &oldFn, &oldContext, &rc); 4594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!assertSuccessful("ubidi_setClassCallback", &rc)) { 4595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(pBiDi); 4596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 4597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru verifyCallbackParams(oldFn, oldContext, newFn, textSrc, textSrcSize); 4599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = u_unescape(textSrc, src, MAXLEN); 4601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_setPara(pBiDi, src, srcLen, UBIDI_LTR, NULL, &rc); 4602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertSuccessful("ubidi_setPara", &rc); 4603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLen = ubidi_writeReordered(pBiDi, dest, MAXLEN, 4605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBIDI_DO_MIRRORING, &rc); 4606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertSuccessful("ubidi_writeReordered", &rc); 4607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destChars = aescstrdup(dest, destLen); 4609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (uprv_strcmp(textResult, destChars)) { 4610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nActual and expected output mismatch.\n" 4611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "%20s %s\n%20s %s\n%20s %s\n", 4612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Input:", textSrc, "Actual output:", destChars, 4613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Expected output:", textResult); 4614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 4616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\nClass override test OK\n"); 4617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_close(pBiDi); 4619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\nExiting TestClassOverride\n\n"); 4620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic char * formatMap(const int32_t * map, int len, char * buffer) 4623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i, k; 4625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char c; 4626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < len; i++) { 4627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru k = map[i]; 4628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (k < 0) 4629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = '-'; 4630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else if (k >= sizeof(columns)) 4631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = '+'; 4632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else 4633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = columns[k]; 4634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[i] = c; 4635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[len] = '\0'; 4637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return buffer; 4638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool 4641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerucheckMaps(UBiDi *pBiDi, int32_t stringIndex, const char *src, const char *dest, 4642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *mode, const char* option, UBiDiLevel level, UBool forward) 4643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t actualLogicalMap[MAX_MAP_LENGTH]; 4645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t actualVisualMap[MAX_MAP_LENGTH]; 4646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t getIndexMap[MAX_MAP_LENGTH]; 464754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int32_t i, srcLen, resLen, idx; 4648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const int32_t *expectedLogicalMap, *expectedVisualMap; 4649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode rc = U_ZERO_ERROR; 4650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool testOK = TRUE; 4651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (forward) { 4653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectedLogicalMap = forwardMap[stringIndex]; 4654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectedVisualMap = inverseMap[stringIndex]; 4655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 4657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectedLogicalMap = inverseMap[stringIndex]; 4658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectedVisualMap = forwardMap[stringIndex]; 4659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_getLogicalMap(pBiDi, actualLogicalMap, &rc); 4661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!assertSuccessful("ubidi_getLogicalMap", &rc)) { 4662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testOK = FALSE; 4663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLen = ubidi_getProcessedLength(pBiDi); 4665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (memcmp(expectedLogicalMap, actualLogicalMap, srcLen * sizeof(int32_t))) { 4666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char expChars[MAX_MAP_LENGTH]; 4667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char actChars[MAX_MAP_LENGTH]; 4668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nubidi_getLogicalMap() returns unexpected map for output string " 4669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "index %d\n" 4670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "source: %s\n" 4671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "dest : %s\n" 4672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Scale : %s\n" 4673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ExpMap: %s\n" 4674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Actual: %s\n" 4675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Paragraph level : %d == %d\n" 4676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Reordering mode : %s == %d\n" 4677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Reordering option: %s == %d\n" 4678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Forward flag : %d\n", 4679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru stringIndex, src, dest, columns, 4680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatMap(expectedLogicalMap, srcLen, expChars), 4681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatMap(actualLogicalMap, srcLen, actChars), 4682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru level, ubidi_getParaLevel(pBiDi), 4683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru mode, ubidi_getReorderingMode(pBiDi), 4684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru option, ubidi_getReorderingOptions(pBiDi), 4685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru forward 4686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ); 4687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testOK = FALSE; 4688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru resLen = ubidi_getResultLength(pBiDi); 4690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ubidi_getVisualMap(pBiDi, actualVisualMap, &rc); 4691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertSuccessful("ubidi_getVisualMap", &rc); 4692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (memcmp(expectedVisualMap, actualVisualMap, resLen * sizeof(int32_t))) { 4693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char expChars[MAX_MAP_LENGTH]; 4694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char actChars[MAX_MAP_LENGTH]; 4695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nubidi_getVisualMap() returns unexpected map for output string " 4696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "index %d\n" 4697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "source: %s\n" 4698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "dest : %s\n" 4699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Scale : %s\n" 4700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ExpMap: %s\n" 4701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Actual: %s\n" 4702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Paragraph level : %d == %d\n" 4703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Reordering mode : %s == %d\n" 4704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Reordering option: %s == %d\n" 4705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Forward flag : %d\n", 4706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru stringIndex, src, dest, columns, 4707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatMap(expectedVisualMap, resLen, expChars), 4708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatMap(actualVisualMap, resLen, actChars), 4709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru level, ubidi_getParaLevel(pBiDi), 4710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru mode, ubidi_getReorderingMode(pBiDi), 4711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru option, ubidi_getReorderingOptions(pBiDi), 4712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru forward 4713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ); 4714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testOK = FALSE; 4715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < srcLen; i++) { 471754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius idx = ubidi_getVisualIndex(pBiDi, i, &rc); 4718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertSuccessful("ubidi_getVisualIndex", &rc); 471954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius getIndexMap[i] = idx; 4720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (memcmp(actualLogicalMap, getIndexMap, srcLen * sizeof(int32_t))) { 4722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char actChars[MAX_MAP_LENGTH]; 4723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char gotChars[MAX_MAP_LENGTH]; 4724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nMismatch between ubidi_getLogicalMap and ubidi_getVisualIndex for output string " 4725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "index %d\n" 4726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "source: %s\n" 4727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "dest : %s\n" 4728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Scale : %s\n" 4729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ActMap: %s\n" 4730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "IdxMap: %s\n" 4731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Paragraph level : %d == %d\n" 4732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Reordering mode : %s == %d\n" 4733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Reordering option: %s == %d\n" 4734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Forward flag : %d\n", 4735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru stringIndex, src, dest, columns, 4736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatMap(actualLogicalMap, srcLen, actChars), 4737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatMap(getIndexMap, srcLen, gotChars), 4738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru level, ubidi_getParaLevel(pBiDi), 4739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru mode, ubidi_getReorderingMode(pBiDi), 4740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru option, ubidi_getReorderingOptions(pBiDi), 4741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru forward 4742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ); 4743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testOK = FALSE; 4744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < resLen; i++) { 474654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius idx = ubidi_getLogicalIndex(pBiDi, i, &rc); 4747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertSuccessful("ubidi_getLogicalIndex", &rc); 474854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius getIndexMap[i] = idx; 4749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (memcmp(actualVisualMap, getIndexMap, resLen * sizeof(int32_t))) { 4751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char actChars[MAX_MAP_LENGTH]; 4752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char gotChars[MAX_MAP_LENGTH]; 4753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\nMismatch between ubidi_getVisualMap and ubidi_getLogicalIndex for output string " 4754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "index %d\n" 4755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "source: %s\n" 4756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "dest : %s\n" 4757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Scale : %s\n" 4758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ActMap: %s\n" 4759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "IdxMap: %s\n" 4760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Paragraph level : %d == %d\n" 4761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Reordering mode : %s == %d\n" 4762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Reordering option: %s == %d\n" 4763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Forward flag : %d\n", 4764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru stringIndex, src, dest, columns, 4765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatMap(actualVisualMap, resLen, actChars), 4766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatMap(getIndexMap, resLen, gotChars), 4767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru level, ubidi_getParaLevel(pBiDi), 4768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru mode, ubidi_getReorderingMode(pBiDi), 4769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru option, ubidi_getReorderingOptions(pBiDi), 4770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru forward 4771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ); 4772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testOK = FALSE; 4773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return testOK; 4775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4777b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic UBool 4778b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoassertIllegalArgument(const char* message, UErrorCode* rc) { 4779b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (*rc != U_ILLEGAL_ARGUMENT_ERROR) { 4780b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err("%s() failed with error %s.\n", message, myErrorName(*rc)); 4781b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return FALSE; 4782b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 4783b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return TRUE; 4784b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 4785b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 4786b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehotypedef struct { 4787b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const char* prologue; 4788b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const char* source; 4789b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const char* epilogue; 4790b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const char* expected; 4791b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UBiDiLevel paraLevel; 4792b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} contextCase; 4793b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 4794b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const contextCase contextData[] = { 4795b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*00*/ {"", "", "", "", UBIDI_LTR}, 4796b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*01*/ {"", ".-=JKL-+*", "", ".-=LKJ-+*", UBIDI_LTR}, 4797b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*02*/ {" ", ".-=JKL-+*", " ", ".-=LKJ-+*", UBIDI_LTR}, 4798b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*03*/ {"a", ".-=JKL-+*", "b", ".-=LKJ-+*", UBIDI_LTR}, 4799b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*04*/ {"D", ".-=JKL-+*", "", "LKJ=-.-+*", UBIDI_LTR}, 4800b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*05*/ {"", ".-=JKL-+*", " D", ".-=*+-LKJ", UBIDI_LTR}, 4801b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*06*/ {"", ".-=JKL-+*", " 2", ".-=*+-LKJ", UBIDI_LTR}, 4802b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*07*/ {"", ".-=JKL-+*", " 7", ".-=*+-LKJ", UBIDI_LTR}, 4803b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*08*/ {" G 1", ".-=JKL-+*", " H", "*+-LKJ=-.", UBIDI_LTR}, 4804b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*09*/ {"7", ".-=JKL-+*", " H", ".-=*+-LKJ", UBIDI_LTR}, 4805b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*10*/ {"", ".-=abc-+*", "", "*+-abc=-.", UBIDI_RTL}, 4806b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*11*/ {" ", ".-=abc-+*", " ", "*+-abc=-.", UBIDI_RTL}, 4807b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*12*/ {"D", ".-=abc-+*", "G", "*+-abc=-.", UBIDI_RTL}, 4808b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*13*/ {"x", ".-=abc-+*", "", "*+-.-=abc", UBIDI_RTL}, 4809b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*14*/ {"", ".-=abc-+*", " y", "abc-+*=-.", UBIDI_RTL}, 4810b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*15*/ {"", ".-=abc-+*", " 2", "abc-+*=-.", UBIDI_RTL}, 4811b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*16*/ {" x 1", ".-=abc-+*", " 2", ".-=abc-+*", UBIDI_RTL}, 4812b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*17*/ {" x 7", ".-=abc-+*", " 8", "*+-.-=abc", UBIDI_RTL}, 4813b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*18*/ {"x|", ".-=abc-+*", " 8", "*+-abc=-.", UBIDI_RTL}, 4814b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*19*/ {"G|y", ".-=abc-+*", " 8", "*+-.-=abc", UBIDI_RTL}, 4815b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*20*/ {"", ".-=", "", ".-=", UBIDI_DEFAULT_LTR}, 4816b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*21*/ {"D", ".-=", "", "=-.", UBIDI_DEFAULT_LTR}, 4817b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*22*/ {"G", ".-=", "", "=-.", UBIDI_DEFAULT_LTR}, 4818b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*23*/ {"xG", ".-=", "", ".-=", UBIDI_DEFAULT_LTR}, 4819b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*24*/ {"x|G", ".-=", "", "=-.", UBIDI_DEFAULT_LTR}, 4820b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*25*/ {"x|G", ".-=|-+*", "", "=-.|-+*", UBIDI_DEFAULT_LTR}, 4821b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}; 4822f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius#define CONTEXT_COUNT UPRV_LENGTHOF(contextData) 4823b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 4824b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void 4825b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehotestContext(void) { 4826b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 4827b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UChar prologue[MAXLEN], epilogue[MAXLEN], src[MAXLEN], dest[MAXLEN]; 4828b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho char destChars[MAXLEN]; 4829b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UBiDi *pBiDi = NULL; 4830b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UErrorCode rc; 4831b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t proLength, epiLength, srcLen, destLen, tc; 4832b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho contextCase cc; 4833b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UBool testOK = TRUE; 4834b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 4835b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_verbose("\nEntering TestContext \n\n"); 4836b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 4837b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* test null BiDi object */ 4838b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho rc = U_ZERO_ERROR; 4839b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ubidi_setContext(pBiDi, NULL, 0, NULL, 0, &rc); 4840b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho testOK &= assertIllegalArgument("Error when BiDi object is null", &rc); 4841b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 4842b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho pBiDi = getBiDiObject(); 4843b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ubidi_orderParagraphsLTR(pBiDi, TRUE); 4844b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 4845b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* test proLength < -1 */ 4846b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho rc = U_ZERO_ERROR; 4847b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ubidi_setContext(pBiDi, NULL, -2, NULL, 0, &rc); 4848b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho testOK &= assertIllegalArgument("Error when proLength < -1", &rc); 4849b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* test epiLength < -1 */ 4850b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho rc = U_ZERO_ERROR; 4851b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ubidi_setContext(pBiDi, NULL, 0, NULL, -2, &rc); 4852b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho testOK &= assertIllegalArgument("Error when epiLength < -1", &rc); 4853b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* test prologue == NULL */ 4854b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho rc = U_ZERO_ERROR; 4855b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ubidi_setContext(pBiDi, NULL, 3, NULL, 0, &rc); 4856b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho testOK &= assertIllegalArgument("Prologue is NULL", &rc); 4857b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* test epilogue == NULL */ 4858b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho rc = U_ZERO_ERROR; 4859b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ubidi_setContext(pBiDi, NULL, 0, NULL, 4, &rc); 4860b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho testOK &= assertIllegalArgument("Epilogue is NULL", &rc); 4861b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 4862b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (tc = 0; tc < CONTEXT_COUNT; tc++) { 4863b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho cc = contextData[tc]; 4864b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho proLength = strlen(cc.prologue); 4865b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho pseudoToU16(proLength, cc.prologue, prologue); 4866b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho epiLength = strlen(cc.epilogue); 4867b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho pseudoToU16(epiLength, cc.epilogue, epilogue); 4868b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* in the call below, prologue and epilogue are swapped to show 4869b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho that the next call will override this call */ 4870b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho rc = U_ZERO_ERROR; 4871b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ubidi_setContext(pBiDi, epilogue, epiLength, prologue, proLength, &rc); 4872b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho testOK &= assertSuccessful("swapped ubidi_setContext", &rc); 4873b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ubidi_setContext(pBiDi, prologue, -1, epilogue, -1, &rc); 4874b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho testOK &= assertSuccessful("regular ubidi_setContext", &rc); 4875b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho srcLen = strlen(cc.source); 4876b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho pseudoToU16(srcLen, cc.source, src); 4877b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ubidi_setPara(pBiDi, src, srcLen, cc.paraLevel, NULL, &rc); 4878b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho testOK &= assertSuccessful("ubidi_setPara", &rc); 4879b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho destLen = ubidi_writeReordered(pBiDi, dest, MAXLEN, UBIDI_DO_MIRRORING, &rc); 4880b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho assertSuccessful("ubidi_writeReordered", &rc); 4881b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho u16ToPseudo(destLen, dest, destChars); 4882b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (uprv_strcmp(cc.expected, destChars)) { 4883b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho char formatChars[MAXLEN]; 4884b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err("\nActual and expected output mismatch on case %d.\n" 4885b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "%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", 4886b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho tc, 4887b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "Prologue:", cc.prologue, 4888b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "Input:", cc.source, 4889b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "Epilogue:", cc.epilogue, 4890b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "Expected output:", cc.expected, 4891b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "Actual output:", destChars, 4892b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "Levels:", formatLevels(pBiDi, formatChars), 4893b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "Reordering mode:", ubidi_getReorderingMode(pBiDi), 4894b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "Paragraph level:", ubidi_getParaLevel(pBiDi), 4895b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "Reordering option:", ubidi_getReorderingOptions(pBiDi)); 4896b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho testOK = FALSE; 4897b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 4898b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 4899b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (testOK == TRUE) { 4900b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_verbose("\nContext test OK\n"); 4901b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 4902b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ubidi_close(pBiDi); 4903b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 4904b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_verbose("\nExiting TestContext \n\n"); 4905b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 4906f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 4907f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius/* Ticket#11054 ubidi_setPara crash with heavily nested brackets */ 4908f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusstatic void 4909f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliustestBracketOverflow(void) { 4910f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius static const char* TEXT = "(((((((((((((((((((((((((((((((((((((((((a)(A)))))))))))))))))))))))))))))))))))))))))"; 4911f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius UErrorCode status = U_ZERO_ERROR; 4912f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius UBiDi* bidi; 4913f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius UChar src[100]; 4914f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius int32_t len; 4915f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 4916f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius bidi = ubidi_open(); 4917f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius len = uprv_strlen(TEXT); 4918f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius pseudoToU16(len, TEXT, src); 4919f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius ubidi_setPara(bidi, src, len, UBIDI_DEFAULT_LTR , NULL, &status); 4920f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if (U_FAILURE(status)) { 4921f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius log_err("setPara failed with heavily nested brackets - %s", u_errorName(status)); 4922f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 4923f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 4924f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius ubidi_close(bidi); 4925f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius} 4926f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 49270596faeddefbf198de137d5e893708495ab1584cFredrik Roubertstatic void TestExplicitLevel0() { 49280596faeddefbf198de137d5e893708495ab1584cFredrik Roubert // The following used to fail with an error, see ICU ticket #12922. 49290596faeddefbf198de137d5e893708495ab1584cFredrik Roubert static const UChar text[2] = { 0x202d, 0x05d0 }; 49300596faeddefbf198de137d5e893708495ab1584cFredrik Roubert static UBiDiLevel embeddings[2] = { 0, 0 }; 49310596faeddefbf198de137d5e893708495ab1584cFredrik Roubert UErrorCode errorCode = U_ZERO_ERROR; 49320596faeddefbf198de137d5e893708495ab1584cFredrik Roubert UBiDi *bidi = ubidi_open(); 49330596faeddefbf198de137d5e893708495ab1584cFredrik Roubert ubidi_setPara(bidi, text, 2, UBIDI_DEFAULT_LTR , embeddings, &errorCode); 49340596faeddefbf198de137d5e893708495ab1584cFredrik Roubert if (U_FAILURE(errorCode)) { 49350596faeddefbf198de137d5e893708495ab1584cFredrik Roubert log_err("ubidi_setPara() - %s", u_errorName(errorCode)); 49360596faeddefbf198de137d5e893708495ab1584cFredrik Roubert } else { 49370596faeddefbf198de137d5e893708495ab1584cFredrik Roubert UBiDiLevel level0 = ubidi_getLevelAt(bidi, 0); 49380596faeddefbf198de137d5e893708495ab1584cFredrik Roubert UBiDiLevel level1 = ubidi_getLevelAt(bidi, 1); 49390596faeddefbf198de137d5e893708495ab1584cFredrik Roubert if (level0 != 1 || level1 != 1) { 49400596faeddefbf198de137d5e893708495ab1584cFredrik Roubert log_err("resolved levels != 1: { %d, %d }\n", level0, level1); 49410596faeddefbf198de137d5e893708495ab1584cFredrik Roubert } 49420596faeddefbf198de137d5e893708495ab1584cFredrik Roubert if (embeddings[0] != 1 || embeddings[1] != 1) { 49430596faeddefbf198de137d5e893708495ab1584cFredrik Roubert log_err("modified embeddings[] levels != 1: { %d, %d }\n", embeddings[0], embeddings[1]); 49440596faeddefbf198de137d5e893708495ab1584cFredrik Roubert } 49450596faeddefbf198de137d5e893708495ab1584cFredrik Roubert } 49460596faeddefbf198de137d5e893708495ab1584cFredrik Roubert ubidi_close(bidi); 49470596faeddefbf198de137d5e893708495ab1584cFredrik Roubert} 4948