1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
3 /*
4 **********************************************************************
5 *   Copyright (C) 2004-2016, International Business Machines
6 *   Corporation and others.  All Rights Reserved.
7 **********************************************************************
8 */
9 
10 #ifndef ULOCIMP_H
11 #define ULOCIMP_H
12 
13 #include "unicode/bytestream.h"
14 #include "unicode/uloc.h"
15 
16 /**
17  * Create an iterator over the specified keywords list
18  * @param keywordList double-null terminated list. Will be copied.
19  * @param keywordListSize size in bytes of keywordList
20  * @param status err code
21  * @return enumeration (owned by caller) of the keyword list.
22  * @internal ICU 3.0
23  */
24 U_CAPI UEnumeration* U_EXPORT2
25 uloc_openKeywordList(const char *keywordList, int32_t keywordListSize, UErrorCode* status);
26 
27 /**
28  * Look up a resource bundle table item with fallback on the table level.
29  * This is accessible so it can be called by C++ code.
30  */
31 U_CAPI const UChar * U_EXPORT2
32 uloc_getTableStringWithFallback(
33     const char *path,
34     const char *locale,
35     const char *tableKey,
36     const char *subTableKey,
37     const char *itemKey,
38     int32_t *pLength,
39     UErrorCode *pErrorCode);
40 
41 /*returns TRUE if a is an ID separator FALSE otherwise*/
42 #define _isIDSeparator(a) (a == '_' || a == '-')
43 
44 U_CFUNC const char*
45 uloc_getCurrentCountryID(const char* oldID);
46 
47 U_CFUNC const char*
48 uloc_getCurrentLanguageID(const char* oldID);
49 
50 U_CFUNC int32_t
51 ulocimp_getLanguage(const char *localeID,
52                     char *language, int32_t languageCapacity,
53                     const char **pEnd);
54 
55 U_CFUNC int32_t
56 ulocimp_getScript(const char *localeID,
57                    char *script, int32_t scriptCapacity,
58                    const char **pEnd);
59 
60 U_CFUNC int32_t
61 ulocimp_getCountry(const char *localeID,
62                    char *country, int32_t countryCapacity,
63                    const char **pEnd);
64 
65 /**
66  * Writes a well-formed language tag for this locale ID.
67  *
68  * **Note**: When `strict` is FALSE, any locale fields which do not satisfy the
69  * BCP47 syntax requirement will be omitted from the result.  When `strict` is
70  * TRUE, this function sets U_ILLEGAL_ARGUMENT_ERROR to the `err` if any locale
71  * fields do not satisfy the BCP47 syntax requirement.
72  *
73  * @param localeID  the input locale ID
74  * @param sink      the output sink receiving the BCP47 language
75  *                  tag for this Locale.
76  * @param strict    boolean value indicating if the function returns
77  *                  an error for an ill-formed input locale ID.
78  * @param err       error information if receiving the language
79  *                  tag failed.
80  * @return          The length of the BCP47 language tag.
81  *
82  * @internal ICU 64
83  */
84 U_STABLE void U_EXPORT2
85 ulocimp_toLanguageTag(const char* localeID,
86                       icu::ByteSink& sink,
87                       UBool strict,
88                       UErrorCode* err);
89 
90 /**
91  * Returns a locale ID for the specified BCP47 language tag string.
92  * If the specified language tag contains any ill-formed subtags,
93  * the first such subtag and all following subtags are ignored.
94  * <p>
95  * This implements the 'Language-Tag' production of BCP47, and so
96  * supports grandfathered (regular and irregular) as well as private
97  * use language tags.  Private use tags are represented as 'x-whatever',
98  * and grandfathered tags are converted to their canonical replacements
99  * where they exist.  Note that a few grandfathered tags have no modern
100  * replacement, these will be converted using the fallback described in
101  * the first paragraph, so some information might be lost.
102  * @param langtag   the input BCP47 language tag.
103  * @param tagLen    the length of langtag, or -1 to call uprv_strlen().
104  * @param sink      the output sink receiving a locale ID for the
105  *                  specified BCP47 language tag.
106  * @param parsedLength  if not NULL, successfully parsed length
107  *                      for the input language tag is set.
108  * @param err       error information if receiving the locald ID
109  *                  failed.
110  * @internal ICU 63
111  */
112 U_CAPI void U_EXPORT2
113 ulocimp_forLanguageTag(const char* langtag,
114                        int32_t tagLen,
115                        icu::ByteSink& sink,
116                        int32_t* parsedLength,
117                        UErrorCode* err);
118 
119 /**
120  * Get the region to use for supplemental data lookup. Uses
121  * (1) any region specified by locale tag "rg"; if none then
122  * (2) any unicode_region_tag in the locale ID; if none then
123  * (3) if inferRegion is TRUE, the region suggested by
124  * getLikelySubtags on the localeID.
125  * If no region is found, returns length 0.
126  *
127  * @param localeID
128  *     The complete locale ID (with keywords) from which
129  *     to get the region to use for supplemental data.
130  * @param inferRegion
131  *     If TRUE, will try to infer region from localeID if
132  *     no other region is found.
133  * @param region
134  *     Buffer in which to put the region ID found; should
135  *     have a capacity at least ULOC_COUNTRY_CAPACITY.
136  * @param regionCapacity
137  *     The actual capacity of the region buffer.
138  * @param status
139  *     Pointer to in/out UErrorCode value for latest status.
140  * @return
141  *     The length of any region code found, or 0 if none.
142  * @internal ICU 57
143  */
144 U_CAPI int32_t U_EXPORT2
145 ulocimp_getRegionForSupplementalData(const char *localeID, UBool inferRegion,
146                                      char *region, int32_t regionCapacity, UErrorCode* status);
147 
148 /**
149  * Add the likely subtags for a provided locale ID, per the algorithm described
150  * in the following CLDR technical report:
151  *
152  *   http://www.unicode.org/reports/tr35/#Likely_Subtags
153  *
154  * If localeID is already in the maximal form, or there is no data available
155  * for maximization, it will be copied to the output buffer.  For example,
156  * "und-Zzzz" cannot be maximized, since there is no reasonable maximization.
157  *
158  * Examples:
159  *
160  * "en" maximizes to "en_Latn_US"
161  *
162  * "de" maximizes to "de_Latn_US"
163  *
164  * "sr" maximizes to "sr_Cyrl_RS"
165  *
166  * "sh" maximizes to "sr_Latn_RS" (Note this will not reverse.)
167  *
168  * "zh_Hani" maximizes to "zh_Hans_CN" (Note this will not reverse.)
169  *
170  * @param localeID The locale to maximize
171  * @param sink The output sink receiving the maximized locale
172  * @param err Error information if maximizing the locale failed.  If the length
173  * of the localeID and the null-terminator is greater than the maximum allowed size,
174  * or the localeId is not well-formed, the error code is U_ILLEGAL_ARGUMENT_ERROR.
175  * @internal ICU 64
176  */
177 U_STABLE void U_EXPORT2
178 ulocimp_addLikelySubtags(const char* localeID,
179                          icu::ByteSink& sink,
180                          UErrorCode* err);
181 
182 /**
183  * Minimize the subtags for a provided locale ID, per the algorithm described
184  * in the following CLDR technical report:
185  *
186  *   http://www.unicode.org/reports/tr35/#Likely_Subtags
187  *
188  * If localeID is already in the minimal form, or there is no data available
189  * for minimization, it will be copied to the output buffer.  Since the
190  * minimization algorithm relies on proper maximization, see the comments
191  * for ulocimp_addLikelySubtags for reasons why there might not be any data.
192  *
193  * Examples:
194  *
195  * "en_Latn_US" minimizes to "en"
196  *
197  * "de_Latn_US" minimizes to "de"
198  *
199  * "sr_Cyrl_RS" minimizes to "sr"
200  *
201  * "zh_Hant_TW" minimizes to "zh_TW" (The region is preferred to the
202  * script, and minimizing to "zh" would imply "zh_Hans_CN".)
203  *
204  * @param localeID The locale to minimize
205  * @param sink The output sink receiving the maximized locale
206  * @param err Error information if minimizing the locale failed.  If the length
207  * of the localeID and the null-terminator is greater than the maximum allowed size,
208  * or the localeId is not well-formed, the error code is U_ILLEGAL_ARGUMENT_ERROR.
209  * @internal ICU 64
210  */
211 U_STABLE void U_EXPORT2
212 ulocimp_minimizeSubtags(const char* localeID,
213                         icu::ByteSink& sink,
214                         UErrorCode* err);
215 
216 U_CAPI const char * U_EXPORT2
217 locale_getKeywordsStart(const char *localeID);
218 
219 U_CFUNC UBool
220 ultag_isExtensionSubtags(const char* s, int32_t len);
221 
222 U_CFUNC UBool
223 ultag_isLanguageSubtag(const char* s, int32_t len);
224 
225 U_CFUNC UBool
226 ultag_isPrivateuseValueSubtags(const char* s, int32_t len);
227 
228 U_CFUNC UBool
229 ultag_isRegionSubtag(const char* s, int32_t len);
230 
231 U_CFUNC UBool
232 ultag_isScriptSubtag(const char* s, int32_t len);
233 
234 U_CFUNC UBool
235 ultag_isTransformedExtensionSubtags(const char* s, int32_t len);
236 
237 U_CFUNC UBool
238 ultag_isUnicodeExtensionSubtags(const char* s, int32_t len);
239 
240 U_CFUNC UBool
241 ultag_isUnicodeLocaleAttribute(const char* s, int32_t len);
242 
243 U_CFUNC UBool
244 ultag_isUnicodeLocaleAttributes(const char* s, int32_t len);
245 
246 U_CFUNC UBool
247 ultag_isUnicodeLocaleKey(const char* s, int32_t len);
248 
249 U_CFUNC UBool
250 ultag_isUnicodeLocaleType(const char* s, int32_t len);
251 
252 U_CFUNC UBool
253 ultag_isVariantSubtags(const char* s, int32_t len);
254 
255 U_CFUNC const char*
256 ulocimp_toBcpKey(const char* key);
257 
258 U_CFUNC const char*
259 ulocimp_toLegacyKey(const char* key);
260 
261 U_CFUNC const char*
262 ulocimp_toBcpType(const char* key, const char* type, UBool* isKnownKey, UBool* isSpecialType);
263 
264 U_CFUNC const char*
265 ulocimp_toLegacyType(const char* key, const char* type, UBool* isKnownKey, UBool* isSpecialType);
266 
267 #endif
268