X-Git-Url: https://git.saurik.com/apple/icu.git/blobdiff_plain/729e4ab9bc6618bc3d8a898e575df7f4019e29ca..a01113dcd0f39d5da295ef82785beff9ed86fe38:/icuSources/common/uresdata.h?ds=sidebyside diff --git a/icuSources/common/uresdata.h b/icuSources/common/uresdata.h index 6fdc7123..4e28ddcc 100644 --- a/icuSources/common/uresdata.h +++ b/icuSources/common/uresdata.h @@ -1,12 +1,12 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** -* * -* Copyright (C) 1999-2009, International Business Machines * -* Corporation and others. All Rights Reserved. * -* * +* Copyright (C) 1999-2016, International Business Machines +* Corporation and others. All Rights Reserved. ****************************************************************************** * file name: uresdata.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -21,6 +21,7 @@ #include "unicode/utypes.h" #include "unicode/udata.h" #include "unicode/ures.h" +#include "putilimp.h" #include "udataswp.h" /** @@ -50,6 +51,8 @@ typedef enum { * All values are URES_STRING_V2 strings. */ URES_ARRAY16=9 + + /* Resource type 15 is not defined but effectively used by RES_BOGUS=0xffffffff. */ } UResInternalType; /* @@ -60,17 +63,23 @@ typedef enum { typedef uint32_t Resource; #define RES_BOGUS 0xffffffff +#define RES_MAX_OFFSET 0x0fffffff -#define RES_GET_TYPE(res) ((UResType)((res)>>28UL)) +#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL)) #define RES_GET_OFFSET(res) ((res)&0x0fffffff) #define RES_GET_POINTER(pRoot, res) ((pRoot)+RES_GET_OFFSET(res)) /* get signed and unsigned integer values directly from the Resource handle */ -#define RES_GET_INT(res) (((int32_t)((res)<<4L))>>4L) +#if U_SIGNED_RIGHT_SHIFT_IS_ARITHMETIC +# define RES_GET_INT(res) (((int32_t)((res)<<4L))>>4L) +#else +# define RES_GET_INT(res) (int32_t)(((res)&0x08000000) ? (res)|0xf0000000 : (res)&0x07ffffff) +#endif + #define RES_GET_UINT(res) ((res)&0x0fffffff) -#define URES_IS_ARRAY(type) ((type)==URES_ARRAY || (type)==URES_ARRAY16) -#define URES_IS_TABLE(type) ((type)==URES_TABLE || (type)==URES_TABLE16 || (type)==URES_TABLE32) +#define URES_IS_ARRAY(type) ((int32_t)(type)==URES_ARRAY || (int32_t)(type)==URES_ARRAY16) +#define URES_IS_TABLE(type) ((int32_t)(type)==URES_TABLE || (int32_t)(type)==URES_TABLE16 || (int32_t)(type)==URES_TABLE32) #define URES_IS_CONTAINER(type) (URES_IS_TABLE(type) || URES_IS_ARRAY(type)) #define URES_MAKE_RESOURCE(type, offset) (((Resource)(type)<<28)|(Resource)(offset)) @@ -78,22 +87,48 @@ typedef uint32_t Resource; /* indexes[] value names; indexes are generally 32-bit (Resource) indexes */ enum { - URES_INDEX_LENGTH, /* [0] contains URES_INDEX_TOP==the length of indexes[]; - * formatVersion==1: all bits contain the length of indexes[] - * but the length is much less than 0xff; - * formatVersion>1: - * only bits 7..0 contain the length of indexes[], - * bits 31..8 are reserved and set to 0 */ - URES_INDEX_KEYS_TOP, /* [1] contains the top of the key strings, */ - /* same as the bottom of resources or UTF-16 strings, rounded up */ - URES_INDEX_RESOURCES_TOP, /* [2] contains the top of all resources */ - URES_INDEX_BUNDLE_TOP, /* [3] contains the top of the bundle, */ - /* in case it were ever different from [2] */ - URES_INDEX_MAX_TABLE_LENGTH,/* [4] max. length of any table */ - URES_INDEX_ATTRIBUTES, /* [5] attributes bit set, see URES_ATT_* (new in formatVersion 1.2) */ - URES_INDEX_16BIT_TOP, /* [6] top of the 16-bit units (UTF-16 string v2 UChars, URES_TABLE16, URES_ARRAY16), - * rounded up (new in formatVersion 2.0, ICU 4.4) */ - URES_INDEX_POOL_CHECKSUM, /* [7] checksum of the pool bundle (new in formatVersion 2.0, ICU 4.4) */ + /** + * [0] contains the length of indexes[] + * which is at most URES_INDEX_TOP of the latest format version + * + * formatVersion==1: all bits contain the length of indexes[] + * but the length is much less than 0xff; + * formatVersion>1: + * only bits 7..0 contain the length of indexes[], + * bits 31..8 are reserved and set to 0 + * formatVersion>=3: + * bits 31..8 poolStringIndexLimit bits 23..0 + */ + URES_INDEX_LENGTH, + /** + * [1] contains the top of the key strings, + * same as the bottom of resources or UTF-16 strings, rounded up + */ + URES_INDEX_KEYS_TOP, + /** [2] contains the top of all resources */ + URES_INDEX_RESOURCES_TOP, + /** + * [3] contains the top of the bundle, + * in case it were ever different from [2] + */ + URES_INDEX_BUNDLE_TOP, + /** [4] max. length of any table */ + URES_INDEX_MAX_TABLE_LENGTH, + /** + * [5] attributes bit set, see URES_ATT_* (new in formatVersion 1.2) + * + * formatVersion>=3: + * bits 31..16 poolStringIndex16Limit + * bits 15..12 poolStringIndexLimit bits 27..24 + */ + URES_INDEX_ATTRIBUTES, + /** + * [6] top of the 16-bit units (UTF-16 string v2 UChars, URES_TABLE16, URES_ARRAY16), + * rounded up (new in formatVersion 2.0, ICU 4.4) + */ + URES_INDEX_16BIT_TOP, + /** [7] checksum of the pool bundle (new in formatVersion 2.0, ICU 4.4) */ + URES_INDEX_POOL_CHECKSUM, URES_INDEX_TOP }; @@ -120,9 +155,41 @@ enum { #define URES_ATT_USES_POOL_BUNDLE 4 /* - * File format for .res resource bundle files (formatVersion=2, ICU 4.4) - * - * New in formatVersion 2 compared with 1.3: ------------- + * File format for .res resource bundle files + * + * ICU 56: New in formatVersion 3 compared with 2: ------------- + * + * Resource bundles can optionally use shared string-v2 values + * stored in the pool bundle. + * If so, then the indexes[] contain two new values + * in previously-unused bits of existing indexes[] slots: + * - poolStringIndexLimit: + * String-v2 offsets (in 32-bit Resource words) below this limit + * point to pool bundle string-v2 values. + * - poolStringIndex16Limit: + * Resource16 string-v2 offsets below this limit + * point to pool bundle string-v2 values. + * Guarantee: poolStringIndex16Limit <= poolStringIndexLimit + * + * The local bundle's poolStringIndexLimit is greater than + * any pool bundle string index used in the local bundle. + * The poolStringIndexLimit should not be greater than + * the maximum possible pool bundle string index. + * + * The maximum possible pool bundle string index is the index to the last non-NUL + * pool string character, due to suffix sharing. + * + * In the pool bundle, there is no structure that lists the strings. + * (The root resource is an empty Table.) + * If the strings need to be enumerated (as genrb --usePoolBundle does), + * then iterate through the pool bundle's 16-bit-units array from the beginning. + * Stop at the end of the array, or when an explicit or implicit string length + * would lead beyond the end of the array, + * or when an apparent string is not NUL-terminated. + * (Future genrb version might terminate the strings with + * what looks like a large explicit string length.) + * + * ICU 4.4: New in formatVersion 2 compared with 1.3: ------------- * * Three new resource types -- String-v2, Table16 and Array16 -- have their * values stored in a new array of 16-bit units between the table key strings @@ -264,8 +331,12 @@ enum { * at 2-byte offsets from the start of a contiguous 16-bit-unit array between * the table key strings and the other resources. (new in formatVersion 2/ICU 4.4) * At offset 0 of that array is a 16-bit zero value for empty 16-bit resources. + * * Resource16 values in Table16 and Array16 are 16-bit offsets to String-v2 * resources, with the offsets relative to the start of the 16-bit-units array. + * Starting with formatVersion 3/ICU 56, if offset(URES_NONE)) {} + virtual ~ResourceDataValue(); + + void setData(const ResourceData *data) { pResData = data; } + void setResource(Resource r) { res = r; } + + virtual UResType getType() const; + virtual const UChar *getString(int32_t &length, UErrorCode &errorCode) const; + virtual const UChar *getAliasString(int32_t &length, UErrorCode &errorCode) const; + virtual int32_t getInt(UErrorCode &errorCode) const; + virtual uint32_t getUInt(UErrorCode &errorCode) const; + virtual const int32_t *getIntVector(int32_t &length, UErrorCode &errorCode) const; + virtual const uint8_t *getBinary(int32_t &length, UErrorCode &errorCode) const; + virtual ResourceArray getArray(UErrorCode &errorCode) const; + virtual ResourceTable getTable(UErrorCode &errorCode) const; + virtual UBool isNoInheritanceMarker() const; + virtual int32_t getStringArray(UnicodeString *dest, int32_t capacity, + UErrorCode &errorCode) const; + virtual int32_t getStringArrayOrStringAsArray(UnicodeString *dest, int32_t capacity, + UErrorCode &errorCode) const; + virtual UnicodeString getStringOrFirstOfArray(UErrorCode &errorCode) const; + + const ResourceData *pResData; + +private: + Resource res; +}; + +U_NAMESPACE_END + +#endif /* __cplusplus */ /** * Swap an ICU resource bundle. See udataswp.h.