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