1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455
|
// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/*
**********************************************************************
* Copyright (C) 2000-2016, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
*/
#ifndef URESIMP_H
#define URESIMP_H
#include <_foundation_unicode/ures.h>
#include <_foundation_unicode/utypes.h>
#include "uresdata.h"
#define kRootLocaleName "root"
#define kPoolBundleName "pool"
/*
The default minor version and the version separator must be exactly one
character long.
*/
#define kDefaultMinorVersion "0"
#define kVersionSeparator "."
#define kVersionTag "Version"
#define MAGIC1 19700503
#define MAGIC2 19641227
#define URES_MAX_ALIAS_LEVEL 256
#define EMPTY_SET 0x2205
struct UResourceDataEntry;
typedef struct UResourceDataEntry UResourceDataEntry;
/*
* Note: If we wanted to make this structure smaller, then we could try
* to use one UResourceDataEntry pointer for fAlias and fPool, with a separate
* flag to distinguish whether this struct is for a real bundle with a pool,
* or for an alias entry for which we won't use the pool after loading.
*/
struct UResourceDataEntry {
char *fName; /* name of the locale for bundle - still to decide whether it is original or fallback */
char *fPath; /* path to bundle - used for distinguishing between resources with the same name */
UResourceDataEntry *fParent; /*next resource in fallback chain*/
UResourceDataEntry *fAlias;
UResourceDataEntry *fPool;
ResourceData fData; /* data for low level access */
char fNameBuffer[3]; /* A small buffer of free space for fName. The free space is due to struct padding. */
uint32_t fCountExisting; /* how much is this resource used */
UErrorCode fBogus;
/* int32_t fHashKey;*/ /* for faster access in the hashtable */
};
#define RES_BUFSIZE 64
#define RES_PATH_SEPARATOR '/'
#define RES_PATH_SEPARATOR_S "/"
U_CAPI void U_EXPORT2 ures_initStackObject(UResourceBundle* resB);
#ifdef __cplusplus
struct UResourceBundle {
const char *fKey; /*tag*/
/**
* The dataEntry for the actual locale in which this item lives.
* Used for accessing the item's data.
* Non-const pointer for reference counting via entryIncrease().
*/
UResourceDataEntry *fData; /*for low-level access*/
char *fVersion;
/**
* The dataEntry for the valid locale.
* Used for /LOCALE/path alias resolution that starts back from the valid locale,
* rather than from the actual locale of this item which might live in
* an ancestor bundle.
*/
UResourceDataEntry *fValidLocaleDataEntry;
char *fResPath; /* full path to the resource: "zh_TW/CollationElements/Sequence" */
char fResBuf[RES_BUFSIZE];
int32_t fResPathLen;
Resource fRes;
UBool fHasFallback;
UBool fIsTopLevel;
uint32_t fMagic1; /* For determining if it's a stack object */
uint32_t fMagic2; /* For determining if it's a stack object */
int32_t fIndex;
int32_t fSize;
inline const ResourceData &getResData() const { return fData->fData; }
};
U_NAMESPACE_BEGIN
/**
* \class StackUResourceBundle
* "Smart pointer" like class, closes a UResourceBundle via ures_close().
*
* This code:
*
* StackUResourceBundle bundle;
* foo(bundle.getAlias());
*
* Is equivalent to this code:
*
* UResourceBundle bundle;
* ures_initStackObject(&bundle);
* foo(&bundle);
* ures_close(&bundle);
*
* @see LocalUResourceBundlePointer
* @internal
*/
class U_COMMON_API StackUResourceBundle {
public:
// No heap allocation. Use only on the stack.
static void* U_EXPORT2 operator new(size_t) noexcept = delete;
static void* U_EXPORT2 operator new[](size_t) noexcept = delete;
#if U_HAVE_PLACEMENT_NEW
static void* U_EXPORT2 operator new(size_t, void*) noexcept = delete;
#endif
StackUResourceBundle();
~StackUResourceBundle();
UResourceBundle* getAlias() { return &bundle; }
UResourceBundle& ref() { return bundle; }
const UResourceBundle& ref() const { return bundle; }
StackUResourceBundle(const StackUResourceBundle&) = delete;
StackUResourceBundle& operator=(const StackUResourceBundle&) = delete;
StackUResourceBundle(StackUResourceBundle&&) = delete;
StackUResourceBundle& operator=(StackUResourceBundle&&) = delete;
private:
UResourceBundle bundle;
};
U_NAMESPACE_END
#endif /* __cplusplus */
/**
* Opens a resource bundle for the locale;
* if there is not even a base language bundle, then loads the root bundle;
* never falls back to the default locale.
*
* This is used for algorithms that have good pan-Unicode default behavior,
* such as case mappings, collation, and segmentation (BreakIterator).
*/
U_CAPI UResourceBundle* U_EXPORT2
ures_openNoDefault(const char* path, const char* localeID, UErrorCode* status);
/* Some getters used by the copy constructor */
U_CFUNC const char* ures_getName(const UResourceBundle* resB);
#ifdef URES_DEBUG
U_CFUNC const char* ures_getPath(const UResourceBundle* resB);
/**
* If anything was in the RB cache, dump it to the screen.
* @return true if there was anything into the cache
*/
U_CAPI UBool U_EXPORT2 ures_dumpCacheContents(void);
#endif
/* Candidates for export */
U_CFUNC UResourceBundle *ures_copyResb(UResourceBundle *r, const UResourceBundle *original, UErrorCode *status);
/**
* Returns a resource that can be located using the pathToResource argument. One needs optional package, locale
* and path inside the locale, for example: "/myData/en/zoneStrings/3". Keys and indexes are supported. Keys
* need to reference data in named structures, while indexes can reference both named and anonymous resources.
* Features a fill-in parameter.
*
* Note, this function does NOT have a syntax for specifying items within a tree. May want to consider a
* syntax that delineates between package/tree and resource.
*
* @param pathToResource a path that will lead to the requested resource
* @param fillIn if NULL a new UResourceBundle struct is allocated and must be deleted by the caller.
* Alternatively, you can supply a struct to be filled by this function.
* @param status fills in the outgoing error code.
* @return a pointer to a UResourceBundle struct. If fill in param was NULL, caller must delete it
*/
U_CAPI UResourceBundle* U_EXPORT2
ures_findResource(const char* pathToResource,
UResourceBundle *fillIn, UErrorCode *status);
/**
* Returns a sub resource that can be located using the pathToResource argument. One needs a path inside
* the supplied resource, for example, if you have "en_US" resource bundle opened, you might ask for
* "zoneStrings/3". Keys and indexes are supported. Keys
* need to reference data in named structures, while indexes can reference both
* named and anonymous resources.
* Features a fill-in parameter.
*
* @param resourceBundle a resource
* @param pathToResource a path that will lead to the requested resource
* @param fillIn if NULL a new UResourceBundle struct is allocated and must be deleted by the caller.
* Alternatively, you can supply a struct to be filled by this function.
* @param status fills in the outgoing error code.
* @return a pointer to a UResourceBundle struct. If fill in param was NULL, caller must delete it
*/
U_CAPI UResourceBundle* U_EXPORT2
ures_findSubResource(const UResourceBundle *resB,
char* pathToResource,
UResourceBundle *fillIn, UErrorCode *status);
/**
* Returns a functionally equivalent locale (considering keywords) for the specified keyword.
* @param result fillin for the equivalent locale
* @param resultCapacity capacity of the fillin buffer
* @param path path to the tree, or NULL for ICU data
* @param resName top level resource. Example: "collations"
* @param keyword locale keyword. Example: "collation"
* @param locid The requested locale
* @param isAvailable If non-null, pointer to fillin parameter that indicates whether the
* requested locale was available. The locale is defined as 'available' if it physically
* exists within the specified tree.
* @param omitDefault if true, omit keyword and value if default. 'de_DE\@collation=standard' -> 'de_DE'
* @param status error code
* @return the actual buffer size needed for the full locale. If it's greater
* than resultCapacity, the returned full name will be truncated and an error code will be returned.
*/
U_CAPI int32_t U_EXPORT2
ures_getFunctionalEquivalent(char *result, int32_t resultCapacity,
const char *path, const char *resName, const char *keyword, const char *locid,
UBool *isAvailable, UBool omitDefault, UErrorCode *status);
/**
* Given a tree path and keyword, return a string enumeration of all possible values for that keyword.
* @param path path to the tree, or NULL for ICU data
* @param keyword a particular keyword to consider, must match a top level resource name
* within the tree.
* @param status error code
*/
U_CAPI UEnumeration* U_EXPORT2
ures_getKeywordValues(const char *path, const char *keyword, UErrorCode *status);
/**
* Get a resource with multi-level fallback. Normally only the top level resources will
* fallback to its parent. This performs fallback on subresources. For example, when a table
* is defined in a resource bundle and a parent resource bundle, normally no fallback occurs
* on the sub-resources because the table is defined in the current resource bundle, but this
* function can perform fallback on the sub-resources of the table.
* @param resB a resource
* @param inKey a key associated with the requested resource
* @param fillIn if NULL a new UResourceBundle struct is allocated and must be deleted by the caller.
* Alternatively, you can supply a struct to be filled by this function.
* @param status: fills in the outgoing error code
* could be <TT>U_MISSING_RESOURCE_ERROR</TT> if the key is not found
* could be a non-failing error
* e.g.: <TT>U_USING_FALLBACK_WARNING</TT>,<TT>U_USING_DEFAULT_WARNING </TT>
* @return a pointer to a UResourceBundle struct. If fill in param was NULL, caller must delete it
*/
U_CAPI UResourceBundle* U_EXPORT2
ures_getByKeyWithFallback(const UResourceBundle *resB,
const char* inKey,
UResourceBundle *fillIn,
UErrorCode *status);
/**
* Get a String with multi-level fallback. Normally only the top level resources will
* fallback to its parent. This performs fallback on subresources. For example, when a table
* is defined in a resource bundle and a parent resource bundle, normally no fallback occurs
* on the sub-resources because the table is defined in the current resource bundle, but this
* function can perform fallback on the sub-resources of the table.
* @param resB a resource
* @param inKey a key associated with the requested resource
* @param len if not NULL, used to return the length of the string
* @param status: fills in the outgoing error code
* could be <TT>U_MISSING_RESOURCE_ERROR</TT> if the key is not found
* could be a non-failing error
* e.g.: <TT>U_USING_FALLBACK_WARNING</TT>,<TT>U_USING_DEFAULT_WARNING </TT>
* @return returns a pointer to a zero-terminated UChar array which lives in a
* memory mapped/DLL file.
*/
U_CAPI const UChar* U_EXPORT2
ures_getStringByKeyWithFallback(const UResourceBundle *resB,
const char* inKey,
int32_t* len,
UErrorCode *status);
#ifdef __cplusplus
U_CAPI void U_EXPORT2
ures_getValueWithFallback(const UResourceBundle *bundle, const char *path,
UResourceBundle *tempFillIn,
icu::ResourceDataValue &value, UErrorCode &errorCode);
/**
* Locates the resource specified by `path` in the resource bundle specified by `bundle` (performing any
* necessary fallback and following any aliases) and calls the specified `sink`'s `put()` method with that
* resource. Then walks the bundle's parent chain, calling `put()` on the sink for each item in the
* parent chain.
* @param bundle The bundle to search
* @param path The path of the desired resource
* @param sink A `ResourceSink` that gets called for each resource in the parent chain
* @param errorCode The error code
*/
U_CAPI void U_EXPORT2
ures_getAllItemsWithFallback(const UResourceBundle *bundle, const char *path,
icu::ResourceSink &sink, UErrorCode &errorCode);
/**
* Locates the resource specified by `path` in the resource bundle specified by `bundle` (performing any
* necessary fallback and following any aliases) and, if the resource is a table resource, iterates over its
* immediate child resources (again, following any aliases to get the individual resource values), and calls the specified
* `sink`'s `put()` method for each child resource (passing it that resource's key and either its actual value or,
* if that value is an alias, the value you get by following the alias). Then walks back over the bundle's
* parent chain, similarly iterating over each parent table resource's child resources.
* Does not descend beyond one level of table children.
* @param bundle The bundle to search
* @param path The path of the desired resource
* @param sink A `ResourceSink` that gets called for each child resource of the specified resource (and each child
* of the resources in its parent chain).
* @param errorCode The error code. This will be U_RESOURCE_TYPE_MISMATCH if the resource the caller
* is asking for isn't a table resource.
*/
U_CAPI void U_EXPORT2
ures_getAllChildrenWithFallback(const UResourceBundle *bundle, const char *path,
icu::ResourceSink &sink, UErrorCode &errorCode);
#endif /* __cplusplus */
/**
* Get a version number by key
* @param resB bundle containing version number
* @param key the key for the version number
* @param ver fillin for the version number
* @param status error code
*/
U_CAPI void U_EXPORT2
ures_getVersionByKey(const UResourceBundle *resB,
const char *key,
UVersionInfo ver,
UErrorCode *status);
/**
* Internal function.
* Return the version number associated with this ResourceBundle as a string.
*
* @param resourceBundle The resource bundle for which the version is checked.
* @return A version number string as specified in the resource bundle or its parent.
* The caller does not own this string.
* @see ures_getVersion
*/
U_CAPI const char* U_EXPORT2
ures_getVersionNumberInternal(const UResourceBundle *resourceBundle);
/**
* Return the name of the Locale associated with this ResourceBundle. This API allows
* you to query for the real locale of the resource. For example, if you requested
* "en_US_CALIFORNIA" and only "en_US" bundle exists, "en_US" will be returned.
* For subresources, the locale where this resource comes from will be returned.
* If fallback has occurred, getLocale will reflect this.
*
* This internal version avoids deprecated-warnings in ICU code.
*
* @param resourceBundle resource bundle in question
* @param status just for catching illegal arguments
* @return A Locale name
*/
U_CAPI const char* U_EXPORT2
ures_getLocaleInternal(const UResourceBundle* resourceBundle,
UErrorCode* status);
/**
* Same as ures_openDirect() but uses the fill-in parameter instead of allocating a new bundle.
*
* @param r The existing UResourceBundle to fill in. If NULL then status will be
* set to U_ILLEGAL_ARGUMENT_ERROR.
* @param packageName The packageName and locale together point to an ICU udata object,
* as defined by <code> udata_open( packageName, "res", locale, err) </code>
* or equivalent. Typically, packageName will refer to a (.dat) file, or to
* a package registered with udata_setAppData(). Using a full file or directory
* pathname for packageName is deprecated. If NULL, ICU data will be used.
* @param locale specifies the locale for which we want to open the resource
* if NULL, the default locale will be used. If strlen(locale) == 0
* root locale will be used.
* @param status The error code.
* @see ures_openDirect
* @internal
*/
U_CAPI void U_EXPORT2
ures_openDirectFillIn(UResourceBundle *r,
const char *packageName,
const char *locale,
UErrorCode *status);
#if APPLE_ICU_CHANGES
// rdar://54886964 Numeral format should follow the region, not the language
// rdar://26911014 English + region combinations without specific locales: fall back to en_001 & region’s time cycle
/**
* Same as ures_open(), except that if no resource bundle for the specified package name and locale exists,
* and the incoming locale specifies a country, this will fall back to the resource bundle for the specified country
* and the specified country's default language. For example, if caller asks for fr_JP and no bundle for fr_JP exists,
* ures_open() will fall back to fr and this function will fall back to ja_JP.
* @param packageName The packageName and locale together point to an ICU udata object,
* as defined by <code> udata_open( packageName, "res", locale, err) </code>
* or equivalent. Typically, packageName will refer to a (.dat) file, or to
* a package registered with udata_setAppData(). Using a full file or directory
* pathname for packageName is deprecated. If NULL, ICU data will be used.
* @param locale specifies the locale for which we want to open the resource
* if NULL, the default locale will be used. If strlen(locale) == 0
* root locale will be used.
* @param didFallBackByCountry If not NULL, filled in with a Boolean value that indicates whether we actually
* did fall back by country. If this value is false, the result of calling this function
* is the same as the caller would have gotten from ures_open().
* @param status fills in the outgoing error code.
* @return a newly allocated resource bundle.
* @see ures_open
* @internal
*/
U_CAPI UResourceBundle* U_EXPORT2
ures_openWithCountryFallback(const char* packageName,
const char* locale,
UBool* didFallBackByCountry,
UErrorCode* status);
#endif // APPLE_ICU_CHANGES
#if APPLE_ICU_CHANGES
// rdar://63880069 ualoc_localizationsToUse should now use parentLocaleTable from uresbund.cpp, not duplicate the mapping
/**
* If localeID has a parent in parentLocale data, return that.
* Otherwise return empty string.
*
* A more general version of this might then itself call
* uloc_getParent, but that is not what we want for ualoc usage.
*
* Some version of this (perhaps more general) should eventually move
* (with new name) to ulocimp.h, or perhaps uloc.h.
*
* @param localeID Input locale ID string.
* @param parent Output string buffer for the parent locale ID.
* @param parentCapacity Size of the output buffer.
* @param err A UErrorCode value.
* @return The length of the parent locale ID.
* @see uloc_getParent
* @internal Apple rdar://63880069
*/
U_CAPI int32_t U_EXPORT2
ures_getLocParent(const char* localeID,
char* parent,
int32_t parentCapacity,
UErrorCode* err);
#endif // APPLE_ICU_CHANGES
#endif /*URESIMP_H*/
|