| OLD | NEW |
| (Empty) |
| 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 | |
| OLD | NEW |