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 |