Index: source/common/uresdata.h |
diff --git a/source/common/uresdata.h b/source/common/uresdata.h |
index 55d04e665f93b4b7d03ce65eabf79b1a696fe403..ff69dd48374150465ba7874d4e6cd070f45082b0 100644 |
--- a/source/common/uresdata.h |
+++ b/source/common/uresdata.h |
@@ -1,9 +1,7 @@ |
/* |
****************************************************************************** |
-* * |
-* Copyright (C) 1999-2012, International Business Machines * |
-* Corporation and others. All Rights Reserved. * |
-* * |
+* Copyright (C) 1999-2015, International Business Machines |
+* Corporation and others. All Rights Reserved. |
****************************************************************************** |
* file name: uresdata.h |
* encoding: US-ASCII |
@@ -51,6 +49,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; |
/* |
@@ -61,6 +61,7 @@ typedef enum { |
typedef uint32_t Resource; |
#define RES_BOGUS 0xffffffff |
+#define RES_MAX_OFFSET 0x0fffffff |
#define RES_GET_TYPE(res) ((int32_t)((res)>>28UL)) |
#define RES_GET_OFFSET(res) ((res)&0x0fffffff) |
@@ -84,22 +85,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 |
}; |
@@ -126,9 +153,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 |
@@ -270,8 +329,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<poolStringIndex16Limit |
+ * then use the pool bundle's 16-bit-units array, |
+ * otherwise subtract that limit and use the local 16-bit-units array. |
* |
* Type Name Memory layout of values |
* (in parentheses: scalar, non-offset values) |
@@ -293,6 +356,12 @@ enum { |
* - if first<0xdfff then length=((first-0xdfef)<<16) | second UChar |
* - if first==0xdfff then length=((second UChar)<<16) | third UChar |
* (stored in the 16-bit-units array; new in formatVersion 2/ICU 4.4) |
+ * |
+ * Starting with formatVersion 3/ICU 56, if offset<poolStringIndexLimit |
+ * then use the pool bundle's 16-bit-units array, |
+ * otherwise subtract that limit and use the local 16-bit-units array. |
+ * (Note different limits for Resource16 vs. Resource.) |
+ * |
* 7 Integer: (28-bit offset is integer value) |
* 8 Array: int32_t count, Resource[count] |
* 9 Array16: uint16_t count, Resource16[count] |
@@ -317,6 +386,9 @@ typedef struct { |
const char *poolBundleKeys; |
Resource rootRes; |
int32_t localKeyLimit; |
+ const uint16_t *poolBundleStrings; |
+ int32_t poolStringIndexLimit; |
+ int32_t poolStringIndex16Limit; |
UBool noFallback; /* see URES_ATT_NO_FALLBACK */ |
UBool isPoolBundle; |
UBool usesPoolBundle; |