]>
Commit | Line | Data |
---|---|---|
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 |