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