1 /* 2 ******************************************************************************* 3 * 4 * Copyright (C) 1999-2014, International Business Machines 5 * Corporation and others. All Rights Reserved. 6 * 7 ******************************************************************************* 8 * file name: letsutil.cpp 9 * 10 * created on: 04/25/2006 11 * created by: Eric R. Mader 12 */ 13 14 #include "unicode/utypes.h" 15 #include "unicode/unistr.h" 16 #include "unicode/ubidi.h" 17 18 #include "layout/LETypes.h" 19 #include "layout/LEScripts.h" 20 #include "layout/LayoutEngine.h" 21 #include "layout/LELanguages.h" 22 23 #ifndef USING_ICULEHB 24 #include "OpenTypeLayoutEngine.h" 25 #endif 26 27 #include "letest.h" 28 #include "letsutil.h" 29 30 U_NAMESPACE_USE 31 32 char *getCString(const UnicodeString *uString) 33 { 34 if (uString == NULL) { 35 return NULL; 36 } 37 38 le_int32 uLength = uString->length(); 39 le_int32 cLength = uString->extract(0, uLength, NULL, 0, US_INV); 40 char *cString = NEW_ARRAY(char, cLength + 1); 41 42 uString->extract(0, uLength, cString, cLength, US_INV); 43 cString[cLength] = '\0'; 44 45 return cString; 46 } 47 48 char *getCString(const LEUnicode16 *uChars) 49 { 50 if (uChars == NULL) { 51 return NULL; 52 } 53 54 const UnicodeString ustring(uChars); 55 56 return getCString(&ustring); 57 } 58 59 char *getUTF8String(const UnicodeString *uString) 60 { 61 if (uString == NULL) { 62 return NULL; 63 } 64 65 le_int32 uLength = uString->length(); 66 le_int32 cLength = uString->extract(0, uLength, NULL, 0, "UTF-8"); 67 char *cString = NEW_ARRAY(char, cLength + 1); 68 69 uString->extract(0, uLength, cString, cLength, "UTF-8"); 70 71 cString[cLength] = '\0'; 72 73 return cString; 74 } 75 76 void freeCString(char *cString) 77 { 78 DELETE_ARRAY(cString); 79 } 80 81 le_bool getRTL(const UnicodeString &text) 82 { 83 UBiDiLevel level = 0; 84 UErrorCode status = U_ZERO_ERROR; 85 le_int32 charCount = text.length(); 86 le_int32 limit = -1; 87 UBiDi *ubidi = ubidi_openSized(charCount, 0, &status); 88 89 ubidi_setPara(ubidi, text.getBuffer(), charCount, UBIDI_DEFAULT_LTR, NULL, &status); 90 91 // TODO: Should check that there's only a single logical run... 92 ubidi_getLogicalRun(ubidi, 0, &limit, &level); 93 94 ubidi_close(ubidi); 95 96 return level & 1; 97 } 98 99 le_int32 getLanguageCode(const char *lang) 100 { 101 if (strlen(lang) != 3) { 102 return -1; 103 } 104 105 LETag langTag = (LETag) ((lang[0] << 24) + (lang[1] << 16) + (lang[2] << 8) + 0x20); 106 107 #ifndef USING_ICULEHB 108 for (le_int32 i = 0; i < languageCodeCount; i += 1) { 109 if (langTag == OpenTypeLayoutEngine::languageTags[i]) { 110 return i; 111 } 112 } 113 #endif 114 115 return -1; 116 } 117 118