]>
Commit | Line | Data |
---|---|---|
73c04bcf A |
1 | /* |
2 | ******************************************************************************* | |
3 | * | |
b331163b | 4 | * Copyright (C) 1999-2014, International Business Machines |
73c04bcf A |
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 | ||
b331163b | 23 | #ifndef USING_ICULEHB |
73c04bcf | 24 | #include "OpenTypeLayoutEngine.h" |
b331163b | 25 | #endif |
73c04bcf A |
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 | ||
46f4442e A |
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 | ||
73c04bcf A |
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 | { | |
46f4442e | 83 | UBiDiLevel level = 0; |
73c04bcf A |
84 | UErrorCode status = U_ZERO_ERROR; |
85 | le_int32 charCount = text.length(); | |
46f4442e | 86 | le_int32 limit = -1; |
73c04bcf A |
87 | UBiDi *ubidi = ubidi_openSized(charCount, 0, &status); |
88 | ||
89 | ubidi_setPara(ubidi, text.getBuffer(), charCount, UBIDI_DEFAULT_LTR, NULL, &status); | |
46f4442e A |
90 | |
91 | // TODO: Should check that there's only a single logical run... | |
92 | ubidi_getLogicalRun(ubidi, 0, &limit, &level); | |
93 | ||
73c04bcf A |
94 | ubidi_close(ubidi); |
95 | ||
46f4442e | 96 | return level & 1; |
73c04bcf A |
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 | ||
b331163b | 107 | #ifndef USING_ICULEHB |
73c04bcf A |
108 | for (le_int32 i = 0; i < languageCodeCount; i += 1) { |
109 | if (langTag == OpenTypeLayoutEngine::languageTags[i]) { | |
110 | return i; | |
111 | } | |
112 | } | |
b331163b | 113 | #endif |
73c04bcf A |
114 | |
115 | return -1; | |
116 | } | |
117 |