From 36e5d9e75ff3056222b4336aff6be13ef573cd13 Mon Sep 17 00:00:00 2001 From: Markus Scherer Date: Fri, 7 Aug 2015 18:44:38 +0000 Subject: [PATCH] ICU-11537 move shared resource bundle string values to pool.res, .res formatVersion 3; merge --integrate from dev branch, plus make toolutil/pkgitems.cpp set poolBundleStrings so that icupkg can check dependencies X-SVN-Rev: 37731 --- icu4c/source/common/uresbund.cpp | 3 +- icu4c/source/common/uresdata.c | 42 +- icu4c/source/common/uresdata.h | 118 ++++- icu4c/source/data/curr/pool.res | Bin 2088 -> 162624 bytes icu4c/source/data/lang/pool.res | Bin 4520 -> 93584 bytes icu4c/source/data/locales/pool.res | Bin 2996 -> 76192 bytes icu4c/source/data/region/pool.res | Bin 1056 -> 69976 bytes icu4c/source/data/unit/pool.res | Bin 1368 -> 54076 bytes icu4c/source/data/zone/pool.res | Bin 9940 -> 91496 bytes icu4c/source/tools/genrb/genrb.cpp | 178 +++++-- icu4c/source/tools/genrb/genrb.h | 2 +- icu4c/source/tools/genrb/reslist.cpp | 565 +++++++++++++++-------- icu4c/source/tools/genrb/reslist.h | 115 +++-- icu4c/source/tools/genrb/wrtxml.cpp | 2 +- icu4c/source/tools/toolutil/pkgitems.cpp | 6 +- 15 files changed, 736 insertions(+), 295 deletions(-) diff --git a/icu4c/source/common/uresbund.cpp b/icu4c/source/common/uresbund.cpp index b80c2c252c0..e74afb8a483 100644 --- a/icu4c/source/common/uresbund.cpp +++ b/icu4c/source/common/uresbund.cpp @@ -4,7 +4,7 @@ * others. All Rights Reserved. ****************************************************************************** * -* File URESBUND.C +* File uresbund.cpp * * Modification History: * @@ -377,6 +377,7 @@ static UResourceDataEntry *init_entry(const char *localeID, const char *path, UE const int32_t *poolIndexes = r->fPool->fData.pRoot + 1; if(r->fData.pRoot[1 + URES_INDEX_POOL_CHECKSUM] == poolIndexes[URES_INDEX_POOL_CHECKSUM]) { r->fData.poolBundleKeys = (const char *)(poolIndexes + (poolIndexes[URES_INDEX_LENGTH] & 0xff)); + r->fData.poolBundleStrings = r->fPool->fData.p16BitUnits; } else { r->fBogus = *status = U_INVALID_FORMAT_ERROR; } diff --git a/icu4c/source/common/uresdata.c b/icu4c/source/common/uresdata.c index a007377762e..bdbd83aca3f 100644 --- a/icu4c/source/common/uresdata.c +++ b/icu4c/source/common/uresdata.c @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 1999-2014, International Business Machines Corporation +* Copyright (C) 1999-2015, International Business Machines Corporation * and others. All Rights Reserved. ******************************************************************************* * file name: uresdata.c @@ -145,7 +145,7 @@ isAcceptable(void *context, pInfo->dataFormat[1]==0x65 && pInfo->dataFormat[2]==0x73 && pInfo->dataFormat[3]==0x42 && - (pInfo->formatVersion[0]==1 || pInfo->formatVersion[0]==2)); + (1<=pInfo->formatVersion[0] || pInfo->formatVersion[0]<=3)); } /* semi-public functions ---------------------------------------------------- */ @@ -198,11 +198,20 @@ res_init(ResourceData *pResData, if(indexes[URES_INDEX_KEYS_TOP]>(1+indexLength)) { pResData->localKeyLimit=indexes[URES_INDEX_KEYS_TOP]<<2; } + if(formatVersion[0]>=3) { + // In formatVersion 1, the indexLength took up this whole int. + // In version 2, bits 31..8 were reserved and always 0. + // In version 3, they contain bits 23..0 of the poolStringIndexLimit. + // Bits 27..24 are in indexes[URES_INDEX_ATTRIBUTES] bits 15..12. + pResData->poolStringIndexLimit=(int32_t)((uint32_t)indexes[URES_INDEX_LENGTH]>>8); + } if(indexLength>URES_INDEX_ATTRIBUTES) { int32_t att=indexes[URES_INDEX_ATTRIBUTES]; pResData->noFallback=(UBool)(att&URES_ATT_NO_FALLBACK); pResData->isPoolBundle=(UBool)((att&URES_ATT_IS_POOL_BUNDLE)!=0); pResData->usesPoolBundle=(UBool)((att&URES_ATT_USES_POOL_BUNDLE)!=0); + pResData->poolStringIndexLimit|=(att&0xf000)<<12; // bits 15..12 -> 27..24 + pResData->poolStringIndex16Limit=(int32_t)((uint32_t)att>>16); } if((pResData->isPoolBundle || pResData->usesPoolBundle) && indexLength<=URES_INDEX_POOL_CHECKSUM) { *errorCode=U_INVALID_FORMAT_ERROR; @@ -301,7 +310,11 @@ res_getString(const ResourceData *pResData, Resource res, int32_t *pLength) { int32_t length; if(RES_GET_TYPE(res)==URES_STRING_V2) { int32_t first; - p=(const UChar *)(pResData->p16BitUnits+offset); + if(offsetpoolStringIndexLimit) { + p=(const UChar *)pResData->poolBundleStrings+offset; + } else { + p=(const UChar *)pResData->p16BitUnits+(offset-pResData->poolStringIndexLimit); + } first=*p; if(!U16_IS_TRAIL(first)) { length=u_strlen(p); @@ -410,6 +423,18 @@ res_countArrayItems(const ResourceData *pResData, Resource res) { } } +static Resource +makeResourceFrom16(const ResourceData *pResData, int32_t res16) { + if(res16poolStringIndex16Limit) { + // Pool string, nothing to do. + } else { + // Local string, adjust the 16-bit offset to a regular one, + // with a larger pool string index limit. + res16=res16-pResData->poolStringIndex16Limit+pResData->poolStringIndexLimit; + } + return URES_MAKE_RESOURCE(URES_STRING_V2, res16); +} + U_CAPI Resource U_EXPORT2 res_getTableItemByKey(const ResourceData *pResData, Resource table, int32_t *indexR, const char **key) { @@ -437,7 +462,7 @@ res_getTableItemByKey(const ResourceData *pResData, Resource table, length=*p++; *indexR=idx=_res_findTableItem(pResData, p, length, *key, key); if(idx>=0) { - return URES_MAKE_RESOURCE(URES_STRING_V2, p[length+idx]); + return makeResourceFrom16(pResData, p[length+idx]); } break; } @@ -486,7 +511,7 @@ res_getTableItemByIndex(const ResourceData *pResData, Resource table, if(key!=NULL) { *key=RES_GET_KEY16(pResData, p[indexR]); } - return URES_MAKE_RESOURCE(URES_STRING_V2, p[length+indexR]); + return makeResourceFrom16(pResData, p[length+indexR]); } break; } @@ -533,7 +558,7 @@ res_getArrayItem(const ResourceData *pResData, Resource array, int32_t indexR) { case URES_ARRAY16: { const uint16_t *p=pResData->p16BitUnits+offset; if(indexR<*p) { - return URES_MAKE_RESOURCE(URES_STRING_V2, p[1+indexR]); + return makeResourceFrom16(pResData, p[1+indexR]); } break; } @@ -990,8 +1015,9 @@ ures_swap(const UDataSwapper *ds, pInfo->dataFormat[1]==0x65 && pInfo->dataFormat[2]==0x73 && pInfo->dataFormat[3]==0x42 && - ((pInfo->formatVersion[0]==1 && pInfo->formatVersion[1]>=1) || /* formatVersion 1.1+ or 2.x */ - pInfo->formatVersion[0]==2) + /* formatVersion 1.1+ or 2.x or 3.x */ + ((pInfo->formatVersion[0]==1 && pInfo->formatVersion[1]>=1) || + pInfo->formatVersion[0]==2 || pInfo->formatVersion[0]==3) )) { udata_printError(ds, "ures_swap(): data format %02x.%02x.%02x.%02x (format version %02x.%02x) is not a resource bundle\n", pInfo->dataFormat[0], pInfo->dataFormat[1], diff --git a/icu4c/source/common/uresdata.h b/icu4c/source/common/uresdata.h index 55d04e665f9..ff69dd48374 100644 --- a/icu4c/source/common/uresdata.h +++ b/icu4c/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 offsetYRk`a)wgD4G;V{wVTK(Z?Su3^;V58o?Mr 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�$EshOpPkVj0fW*GTBb(rY9@QkvfJzF zD=BXb?---*eD+2YYzw%U9j7x_RC}U%*-_$iddAY2vMKsIy<<4$@$}wt&*$DURX(Q{ z9{Jq2!>DZ$QVYuu%4pc(b{MBZdpKD&E3M6RE0La7d$sMroyTp5ec?M97#Z~piX*r2 z(^_9U=GW8W;jMwQbUuSUi4Wb5Pu?}Vj@kY+`X|Z@e`d9l%20p}*XrWNbwBhD?KOR< zJaWEWd#h)#-rgba0DG|A-egSgZg318z)6y|c#!u+^>}0}-ik=CZWy|}oFKomw2Y->ZSUV%Z{;*F~h2BiA1~Zz3R!W z+BR>owhh~Ml3>(J^{qf?fAl6eWIZOv3>kery#&W=OZE=b5}#(i-&#wbh+R�XLGq z`lzyKhN)GP0F@D??nveQDHY(V*{CgnFVEW&D0FNI{eRw;7}Gw4zE5k9D81gz&b(Cj znm4o0TO$rs>!4Y?+7h)q*%F_gUP0@#mew%8@cMj2)DUBJTHKG$tmpiyhU$OQ$#d%` zN1wU=V2VK3lXP}#Eu*XcdWt}<3N zX{|soUNSxvddirP^>Nn!*IIT&2^GN*dMNaFv-jpv+2jk;`CP9{or{|}9E8-wO>*|%UvL$~rrWzyBC(*a+QXC~r z89>+TbTO7v?UTWEYrM6{ktiXwb-YmLXbX1hk;G!3M}Gke($>s;l(Bs`deA-sfsD5o zW6$}e+V-5O>sXwvYCVRu)ag^4$AfTdthlp;j-5$wou{=ggst0m^CvO?c2DSj1|mP4 zWFX6eJ-ihE-NoMd^|VGG)U`E^xB75tbzCD` zSu_UO7kth0t*{U6>RLhP3yy!WHtsdFw|ymcyZ;ZM%%Ld& delta 76 zcmX@`jdO*7paR1!brA*-U}6YLEp}p>C@3w##02C5F$gdNF^C;?^N;mLmuSYxiy32? VgF>A)Gc%PkGr9U~E@R!q1OPU-5Apy2 diff --git a/icu4c/source/data/lang/pool.res b/icu4c/source/data/lang/pool.res index a56a95c65b2291fd0c5b71a4a5ed69e34aa8ab3e..5c98f0a45b5569c9f7508873c90ae34953c1d13b 100644 GIT binary patch literal 93584 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 XkKK{W&?|f_9&CQj?T*;)FMs)e!&rD# delta 128 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%0D?z*_J!k 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 delta 114 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 E0NfgPkpKVy delta 55 zcmcbyh-CqXpaR1!brA*-U}6YLEp}p>C@3w#zzF1nFc2_<2q2r^a(nVdmpjY=3g`&# diff --git a/icu4c/source/data/unit/pool.res b/icu4c/source/data/unit/pool.res index 7f775bc172abfd2c5349829cb6ee14de11443c11..69d472330badb9b6fcc49ebe32c6e5d33cc7bb52 100644 GIT binary patch literal 54076 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 delta 117 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 delta 104 zcmaEHiuH=GpaR1!brA*-U}6YLEp}p>C@3zomXm=2hCx!yKn&uS-1KnR=u)Pl?pU0e mXyu%dpO;>knU~H0=6WO+C1vJ8*xrf78R>~dn|G>wW&{8+iybKd diff --git a/icu4c/source/tools/genrb/genrb.cpp b/icu4c/source/tools/genrb/genrb.cpp index f3696283909..7604950a3fa 100644 --- a/icu4c/source/tools/genrb/genrb.cpp +++ b/icu4c/source/tools/genrb/genrb.cpp @@ -16,9 +16,11 @@ ******************************************************************************* */ +#include #include "genrb.h" #include "unicode/localpointer.h" #include "unicode/uclean.h" +#include "unicode/utf16.h" #include "reslist.h" #include "ucmndata.h" /* TODO: for reading the pool bundle */ @@ -41,8 +43,10 @@ const char *gCurrentFileName = theCurrentFileName; #endif void ResFile::close() { - uprv_free(fBytes); + delete[] fBytes; fBytes = NULL; + delete fStrings; + fStrings = NULL; } enum @@ -136,7 +140,7 @@ main(int argc, } if(options[FORMAT_VERSION].doesOccur) { const char *s = options[FORMAT_VERSION].value; - if(uprv_strlen(s) != 1 || (s[0] != '1' && s[0] != '2')) { + if(uprv_strlen(s) != 1 || (s[0] < '1' && '3' < s[0])) { fprintf(stderr, "%s: unsupported --formatVersion %s\n", argv[0], s); argc = -1; } else if(s[0] == '1' && @@ -336,62 +340,141 @@ main(int argc, fprintf(stderr, "the pool bundle file %s is too small\n", theCurrentFileName); return 1; } - poolBundle.fBytes = (uint8_t *)uprv_malloc((poolFileSize + 15) & ~15); + poolBundle.fBytes = new uint8_t[(poolFileSize + 15) & ~15]; if (poolFileSize > 0 && poolBundle.fBytes == NULL) { fprintf(stderr, "unable to allocate memory for the pool bundle file %s\n", theCurrentFileName); return U_MEMORY_ALLOCATION_ERROR; - } else { - UDataSwapper *ds; - const DataHeader *header; - int32_t bytesRead = T_FileStream_read(poolFile, poolBundle.fBytes, poolFileSize); - int32_t keysBottom; - if (bytesRead != poolFileSize) { - fprintf(stderr, "unable to read the pool bundle file %s\n", theCurrentFileName); - return 1; - } - /* - * Swap the pool bundle so that a single checked-in file can be used. - * The swapper functions also test that the data looks like - * a well-formed .res file. - */ - ds = udata_openSwapperForInputData(poolBundle.fBytes, bytesRead, - U_IS_BIG_ENDIAN, U_CHARSET_FAMILY, &status); - if (U_FAILURE(status)) { - fprintf(stderr, "udata_openSwapperForInputData(pool bundle %s) failed: %s\n", - theCurrentFileName, u_errorName(status)); - return status; - } - ures_swap(ds, poolBundle.fBytes, bytesRead, poolBundle.fBytes, &status); - udata_closeSwapper(ds); - if (U_FAILURE(status)) { - fprintf(stderr, "ures_swap(pool bundle %s) failed: %s\n", - theCurrentFileName, u_errorName(status)); - return status; - } - header = (const DataHeader *)poolBundle.fBytes; - if (header->info.formatVersion[0]!=2) { - fprintf(stderr, "invalid format of pool bundle file %s\n", theCurrentFileName); - return U_INVALID_FORMAT_ERROR; - } - poolBundle.fKeys = (const char *)header + header->dataHeader.headerSize; - poolBundle.fIndexes = (const int32_t *)poolBundle.fKeys + 1; - indexLength = poolBundle.fIndexes[URES_INDEX_LENGTH] & 0xff; - if (indexLength <= URES_INDEX_POOL_CHECKSUM) { - fprintf(stderr, "insufficient indexes[] in pool bundle file %s\n", theCurrentFileName); - return U_INVALID_FORMAT_ERROR; - } - keysBottom = (1 + indexLength) * 4; - poolBundle.fKeys += keysBottom; - poolBundle.fKeysLength = (poolBundle.fIndexes[URES_INDEX_KEYS_TOP] * 4) - keysBottom; - poolBundle.fChecksum = poolBundle.fIndexes[URES_INDEX_POOL_CHECKSUM]; } + + UDataSwapper *ds; + const DataHeader *header; + int32_t bytesRead = T_FileStream_read(poolFile, poolBundle.fBytes, poolFileSize); + if (bytesRead != poolFileSize) { + fprintf(stderr, "unable to read the pool bundle file %s\n", theCurrentFileName); + return 1; + } + /* + * Swap the pool bundle so that a single checked-in file can be used. + * The swapper functions also test that the data looks like + * a well-formed .res file. + */ + ds = udata_openSwapperForInputData(poolBundle.fBytes, bytesRead, + U_IS_BIG_ENDIAN, U_CHARSET_FAMILY, &status); + if (U_FAILURE(status)) { + fprintf(stderr, "udata_openSwapperForInputData(pool bundle %s) failed: %s\n", + theCurrentFileName, u_errorName(status)); + return status; + } + ures_swap(ds, poolBundle.fBytes, bytesRead, poolBundle.fBytes, &status); + udata_closeSwapper(ds); + if (U_FAILURE(status)) { + fprintf(stderr, "ures_swap(pool bundle %s) failed: %s\n", + theCurrentFileName, u_errorName(status)); + return status; + } + header = (const DataHeader *)poolBundle.fBytes; + if (header->info.formatVersion[0] < 2) { + fprintf(stderr, "invalid format of pool bundle file %s\n", theCurrentFileName); + return U_INVALID_FORMAT_ERROR; + } + const int32_t *pRoot = (const int32_t *)( + (const char *)header + header->dataHeader.headerSize); + poolBundle.fIndexes = pRoot + 1; + indexLength = poolBundle.fIndexes[URES_INDEX_LENGTH] & 0xff; + if (indexLength <= URES_INDEX_POOL_CHECKSUM) { + fprintf(stderr, "insufficient indexes[] in pool bundle file %s\n", theCurrentFileName); + return U_INVALID_FORMAT_ERROR; + } + int32_t keysBottom = 1 + indexLength; + int32_t keysTop = poolBundle.fIndexes[URES_INDEX_KEYS_TOP]; + poolBundle.fKeys = (const char *)(pRoot + keysBottom); + poolBundle.fKeysLength = (keysTop - keysBottom) * 4; + poolBundle.fChecksum = poolBundle.fIndexes[URES_INDEX_POOL_CHECKSUM]; + for (i = 0; i < poolBundle.fKeysLength; ++i) { if (poolBundle.fKeys[i] == 0) { ++poolBundle.fKeysCount; } } + + // 16BitUnits[] begins with strings-v2. + // The strings-v2 may optionally be terminated by what looks like + // an explicit string length that exceeds the number of remaining 16-bit units. + int32_t stringUnitsLength = (poolBundle.fIndexes[URES_INDEX_16BIT_TOP] - keysTop) * 2; + if (stringUnitsLength >= 2 && getFormatVersion() >= 3) { + poolBundle.fStrings = new PseudoListResource(NULL, status); + if (poolBundle.fStrings == NULL) { + fprintf(stderr, "unable to allocate memory for the pool bundle strings %s\n", theCurrentFileName); + return U_MEMORY_ALLOCATION_ERROR; + } + // The PseudoListResource constructor call did not allocate further memory. + assert(U_SUCCESS(status)); + const UChar *p = (const UChar *)(pRoot + keysTop); + int32_t remaining = stringUnitsLength; + do { + int32_t first = *p; + int8_t numCharsForLength; + int32_t length; + if (!U16_IS_TRAIL(first)) { + // NUL-terminated + numCharsForLength = 0; + for (length = 0; + length < remaining && p[length] != 0; + ++length) {} + } else if (first < 0xdfef) { + numCharsForLength = 1; + length = first & 0x3ff; + } else if (first < 0xdfff && remaining >= 2) { + numCharsForLength = 2; + length = ((first - 0xdfef) << 16) | p[1]; + } else if (first == 0xdfff && remaining >= 3) { + numCharsForLength = 3; + length = ((int32_t)p[1] << 16) | p[2]; + } else { + break; // overrun + } + // Check for overrun before changing remaining, + // so that it is always accurate after the loop body. + if ((numCharsForLength + length) >= remaining || + p[numCharsForLength + length] != 0) { + break; // overrun or explicitly terminated + } + int32_t poolStringIndex = stringUnitsLength - remaining; + // Maximum pool string index when suffix-sharing the last character. + int32_t maxStringIndex = poolStringIndex + numCharsForLength + length - 1; + if (maxStringIndex >= RES_MAX_OFFSET) { + // pool string index overrun + break; + } + p += numCharsForLength; + remaining -= numCharsForLength; + if (length != 0) { + StringResource *sr = + new StringResource(poolStringIndex, numCharsForLength, + p, length, status); + if (sr == NULL) { + fprintf(stderr, "unable to allocate memory for a pool bundle string %s\n", + theCurrentFileName); + return U_MEMORY_ALLOCATION_ERROR; + } + poolBundle.fStrings->add(sr); + poolBundle.fStringIndexLimit = maxStringIndex + 1; + // The StringResource constructor did not allocate further memory. + assert(U_SUCCESS(status)); + } + p += length + 1; + remaining -= length + 1; + } while (remaining > 0); + } + T_FileStream_close(poolFile); setUsePoolBundle(TRUE); + if (isVerbose() && poolBundle.fStrings != NULL) { + printf("number of shared strings: %d\n", (int)poolBundle.fStrings->fCount); + int32_t length = poolBundle.fStringIndexLimit + 1; // incl. last NUL + printf("16-bit units for strings: %6d = %6d bytes\n", + (int)length, (int)length * 2); + } } if(options[INCLUDE_UNIHAN_COLL].doesOccur) { @@ -565,6 +648,7 @@ processFile(const char *filename, const char *cp, goto finish; } if(options[WRITE_POOL_BUNDLE].doesOccur) { + data->fWritePoolBundle = newPoolBundle; data->compactKeys(*status); int32_t newKeysLength; const char *newKeys = data->getKeyBytes(&newKeysLength); diff --git a/icu4c/source/tools/genrb/genrb.h b/icu4c/source/tools/genrb/genrb.h index 85fbab9738f..9a190f28d37 100644 --- a/icu4c/source/tools/genrb/genrb.h +++ b/icu4c/source/tools/genrb/genrb.h @@ -32,7 +32,7 @@ #include "unicode/uloc.h" /* The version of genrb */ -#define GENRB_VERSION "3.3" +#define GENRB_VERSION "56" U_CDECL_BEGIN diff --git a/icu4c/source/tools/genrb/reslist.cpp b/icu4c/source/tools/genrb/reslist.cpp index 3b313c2b4bc..87aa00fcc91 100644 --- a/icu4c/source/tools/genrb/reslist.cpp +++ b/icu4c/source/tools/genrb/reslist.cpp @@ -46,21 +46,33 @@ */ #define BIN_ALIGNMENT 16 +// This numeric constant must be at least 1. +// If StringResource.fNumUnitsSaved == 0 then the string occurs only once, +// and it makes no sense to move it to the pool bundle. +// The larger the threshold for fNumUnitsSaved +// the smaller the savings, and the smaller the pool bundle. +// We trade some total size reduction to reduce the pool bundle a bit, +// so that one can reasonably save data size by +// removing bundle files without rebuilding the pool bundle. +// This can also help to keep the pool and total (pool+local) string indexes +// within 16 bits, that is, within range of Table16 and Array16 containers. +#ifndef GENRB_MIN_16BIT_UNITS_SAVED_FOR_POOL_STRING +# define GENRB_MIN_16BIT_UNITS_SAVED_FOR_POOL_STRING 10 +#endif + U_NAMESPACE_USE static UBool gIncludeCopyright = FALSE; static UBool gUsePoolBundle = FALSE; -static int32_t gFormatVersion = 2; +static int32_t gFormatVersion = 3; /* How do we store string values? */ enum { STRINGS_UTF16_V1, /* formatVersion 1: int length + UChars + NUL + padding to 4 bytes */ - STRINGS_UTF16_V2 /* formatVersion 2: optional length in 1..3 UChars + UChars + NUL */ + STRINGS_UTF16_V2 /* formatVersion 2 & up: optional length in 1..3 UChars + UChars + NUL */ }; -enum { - MAX_IMPLICIT_STRING_LENGTH = 40 /* do not store the length explicitly for such strings */ -}; +static const int32_t MAX_IMPLICIT_STRING_LENGTH = 40; /* do not store the length explicitly for such strings */ static const ResFile kNoPoolBundle; @@ -85,11 +97,14 @@ static UDataInfo dataInfo= { {1, 4, 0, 0} /* dataVersion take a look at version inside parsed resb*/ }; -static const UVersionInfo gFormatVersions[3] = { /* indexed by a major-formatVersion integer */ +static const UVersionInfo gFormatVersions[4] = { /* indexed by a major-formatVersion integer */ { 0, 0, 0, 0 }, { 1, 3, 0, 0 }, - { 2, 0, 0, 0 } + { 2, 0, 0, 0 }, + { 3, 0, 0, 0 } }; +// Remember to update genrb.h GENRB_VERSION when changing the data format. +// (Or maybe we should remove GENRB_VERSION and report the ICU version number?) static uint8_t calcPadding(uint32_t size) { /* returns space we need to pad */ @@ -109,6 +124,10 @@ void setFormatVersion(int32_t formatVersion) { gFormatVersion = formatVersion; } +int32_t getFormatVersion() { + return gFormatVersion; +} + void setUsePoolBundle(UBool use) { gUsePoolBundle = use; } @@ -119,15 +138,15 @@ struct SResource* res_none() { } SResource::SResource() - : fType(URES_NONE), fWritten(FALSE), fRes(RES_BOGUS), fKey(-1), line(0), - fNext(NULL) { + : fType(URES_NONE), fWritten(FALSE), fRes(RES_BOGUS), fRes16(-1), fKey(-1), fKey16(-1), + line(0), fNext(NULL) { ustr_init(&fComment); } SResource::SResource(SRBRoot *bundle, const char *tag, int8_t type, const UString* comment, UErrorCode &errorCode) - : fType(type), fWritten(FALSE), fRes(RES_BOGUS), - fKey(bundle->addTag(tag, errorCode)), + : fType(type), fWritten(FALSE), fRes(RES_BOGUS), fRes16(-1), + fKey(bundle != NULL ? bundle->addTag(tag, errorCode) : -1), fKey16(-1), line(0), fNext(NULL) { ustr_init(&fComment); if(comment != NULL) { @@ -228,6 +247,16 @@ void ArrayResource::add(SResource *res) { } } +PseudoListResource::~PseudoListResource() {} + +void PseudoListResource::add(SResource *res) { + if (res != NULL && res != &kNoResource) { + res->fNext = fFirst; + fFirst = res; + ++fCount; + } +} + StringBaseResource::StringBaseResource(SRBRoot *bundle, const char *tag, int8_t type, const UChar *value, int32_t len, const UString* comment, UErrorCode &errorCode) @@ -245,6 +274,29 @@ StringBaseResource::StringBaseResource(SRBRoot *bundle, const char *tag, int8_t } } +StringBaseResource::StringBaseResource(SRBRoot *bundle, int8_t type, + const icu::UnicodeString &value, UErrorCode &errorCode) + : SResource(bundle, NULL, type, NULL, errorCode), fString(value) { + if (value.isEmpty() && gFormatVersion > 1) { + fRes = URES_MAKE_EMPTY_RESOURCE(type); + fWritten = TRUE; + return; + } + + fString.getTerminatedBuffer(); // Some code relies on NUL-termination. + if (U_SUCCESS(errorCode) && fString.isBogus()) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + } +} + +// Pool bundle string, alias the buffer. Guaranteed NUL-terminated and not empty. +StringBaseResource::StringBaseResource(int8_t type, const UChar *value, int32_t len, + UErrorCode &errorCode) + : SResource(NULL, NULL, type, NULL, errorCode), fString(TRUE, value, len) { + assert(len > 0); + assert(!fString.isBogus()); +} + StringBaseResource::~StringBaseResource() {} static int32_t U_CALLCONV @@ -268,7 +320,7 @@ IntResource::IntResource(SRBRoot *bundle, const char *tag, int32_t value, const UString* comment, UErrorCode &errorCode) : SResource(bundle, tag, URES_INT, comment, errorCode) { fValue = value; - fRes = URES_MAKE_RESOURCE(URES_INT, value & 0x0FFFFFFF); + fRes = URES_MAKE_RESOURCE(URES_INT, value & RES_MAX_OFFSET); fWritten = TRUE; } @@ -335,17 +387,27 @@ BinaryResource::~BinaryResource() { void StringResource::handlePreflightStrings(SRBRoot *bundle, UHashtable *stringSet, UErrorCode &errorCode) { + assert(fSame == NULL); fSame = static_cast(uhash_get(stringSet, this)); if (fSame != NULL) { - return; /* This is a duplicate of an earlier-visited string. */ + // This is a duplicate of a pool bundle string or of an earlier-visited string. + if (++fSame->fNumCopies == 1) { + assert(fSame->fWritten); + int32_t poolStringIndex = (int32_t)RES_GET_OFFSET(fSame->fRes); + if (poolStringIndex >= bundle->fPoolStringIndexLimit) { + bundle->fPoolStringIndexLimit = poolStringIndex + 1; + } + } + return; } /* Put this string into the set for finding duplicates. */ + fNumCopies = 1; uhash_put(stringSet, this, this, &errorCode); if (bundle->fStringsForm != STRINGS_UTF16_V1) { - const UChar *s = getBuffer(); int32_t len = length(); - if (len <= MAX_IMPLICIT_STRING_LENGTH && !U16_IS_TRAIL(s[0]) && len == u_strlen(s)) { + if (len <= MAX_IMPLICIT_STRING_LENGTH && + !U16_IS_TRAIL(fString[0]) && fString.indexOf((UChar)0) < 0) { /* * This string will be stored without an explicit length. * Runtime will detect !U16_IS_TRAIL(s[0]) and call u_strlen(). @@ -392,16 +454,25 @@ SResource::handlePreflightStrings(SRBRoot * /*bundle*/, UHashtable * /*stringSet /* Neither a string nor a container. */ } -static int32_t -makeRes16(uint32_t resWord) { - uint32_t type, offset; +int32_t +SRBRoot::makeRes16(uint32_t resWord) const { if (resWord == 0) { return 0; /* empty string */ } - type = RES_GET_TYPE(resWord); - offset = RES_GET_OFFSET(resWord); - if (type == URES_STRING_V2 && offset <= 0xffff) { - return (int32_t)offset; + uint32_t type = RES_GET_TYPE(resWord); + int32_t offset = (int32_t)RES_GET_OFFSET(resWord); + if (type == URES_STRING_V2) { + assert(offset > 0); + if (offset < fPoolStringIndexLimit) { + if (offset < fPoolStringIndex16Limit) { + return offset; + } + } else { + offset = offset - fPoolStringIndexLimit + fPoolStringIndex16Limit; + if (offset <= 0xffff) { + return offset; + } + } } return -1; } @@ -429,22 +500,13 @@ SRBRoot::mapKey(int32_t oldpos) const { return map[start].newpos; } -uint16_t -SRBRoot::makeKey16(int32_t key) const { - if (key >= 0) { - return (uint16_t)key; - } else { - return (uint16_t)(key + fLocalKeyLimit); /* offset in the pool bundle */ - } -} - /* * Only called for UTF-16 v1 strings and duplicate UTF-16 v2 strings. * For unique UTF-16 v2 strings, write16() sees fRes != RES_BOGUS * and exits early. */ void -StringResource::handleWrite16(SRBRoot * /*bundle*/, UErrorCode & /*errorCode*/) { +StringResource::handleWrite16(SRBRoot * /*bundle*/) { SResource *same; if ((same = fSame) != NULL) { /* This is a duplicate. */ @@ -455,7 +517,15 @@ StringResource::handleWrite16(SRBRoot * /*bundle*/, UErrorCode & /*errorCode*/) } void -ArrayResource::handleWrite16(SRBRoot *bundle, UErrorCode &errorCode) { +ContainerResource::writeAllRes16(SRBRoot *bundle) { + for (SResource *current = fFirst; current != NULL; current = current->fNext) { + bundle->f16BitUnits.append((UChar)current->fRes16); + } + fWritten = TRUE; +} + +void +ArrayResource::handleWrite16(SRBRoot *bundle) { if (fCount == 0 && gFormatVersion > 1) { fRes = URES_MAKE_EMPTY_RESOURCE(URES_ARRAY); fWritten = TRUE; @@ -464,76 +534,43 @@ ArrayResource::handleWrite16(SRBRoot *bundle, UErrorCode &errorCode) { int32_t res16 = 0; for (SResource *current = fFirst; current != NULL; current = current->fNext) { - current->write16(bundle, errorCode); - res16 |= makeRes16(current->fRes); + current->write16(bundle); + res16 |= current->fRes16; } - if (U_SUCCESS(errorCode) && fCount <= 0xffff && res16 >= 0 && gFormatVersion > 1) { + if (fCount <= 0xffff && res16 >= 0 && gFormatVersion > 1) { fRes = URES_MAKE_RESOURCE(URES_ARRAY16, bundle->f16BitUnits.length()); bundle->f16BitUnits.append((UChar)fCount); - for (SResource *current = fFirst; current != NULL; current = current->fNext) { - bundle->f16BitUnits.append((UChar)makeRes16(current->fRes)); - } - fWritten = TRUE; - if (bundle->f16BitUnits.isBogus()) { - errorCode = U_MEMORY_ALLOCATION_ERROR; - } + writeAllRes16(bundle); } } void -TableResource::handleWrite16(SRBRoot *bundle, UErrorCode &errorCode) { - int32_t maxKey = 0, maxPoolKey = 0x80000000; - int32_t res16 = 0; - UBool hasLocalKeys = FALSE, hasPoolKeys = FALSE; - +TableResource::handleWrite16(SRBRoot *bundle) { if (fCount == 0 && gFormatVersion > 1) { fRes = URES_MAKE_EMPTY_RESOURCE(URES_TABLE); fWritten = TRUE; return; } /* Find the smallest table type that fits the data. */ + int32_t key16 = 0; + int32_t res16 = 0; for (SResource *current = fFirst; current != NULL; current = current->fNext) { - int32_t key; - current->write16(bundle, errorCode); - key = current->fKey = bundle->mapKey(current->fKey); - if (key >= 0) { - hasLocalKeys = TRUE; - if (key > maxKey) { - maxKey = key; - } - } else { - hasPoolKeys = TRUE; - if (key > maxPoolKey) { - maxPoolKey = key; - } - } - res16 |= makeRes16(current->fRes); - } - if (U_FAILURE(errorCode)) { - return; + current->write16(bundle); + key16 |= current->fKey16; + res16 |= current->fRes16; } if(fCount > (uint32_t)bundle->fMaxTableLength) { bundle->fMaxTableLength = fCount; } - maxPoolKey &= 0x7fffffff; - if (fCount <= 0xffff && - (!hasLocalKeys || maxKey < bundle->fLocalKeyLimit) && - (!hasPoolKeys || maxPoolKey < (0x10000 - bundle->fLocalKeyLimit)) - ) { + if (fCount <= 0xffff && key16 >= 0) { if (res16 >= 0 && gFormatVersion > 1) { /* 16-bit count, key offsets and values */ fRes = URES_MAKE_RESOURCE(URES_TABLE16, bundle->f16BitUnits.length()); bundle->f16BitUnits.append((UChar)fCount); for (SResource *current = fFirst; current != NULL; current = current->fNext) { - bundle->f16BitUnits.append((UChar)bundle->makeKey16(current->fKey)); - } - for (SResource *current = fFirst; current != NULL; current = current->fNext) { - bundle->f16BitUnits.append((UChar)makeRes16(current->fRes)); - } - fWritten = TRUE; - if (bundle->f16BitUnits.isBogus()) { - errorCode = U_MEMORY_ALLOCATION_ERROR; + bundle->f16BitUnits.append((UChar)current->fKey16); } + writeAllRes16(bundle); } else { /* 16-bit count, 16-bit key offsets, 32-bit values */ fTableType = URES_TABLE; @@ -545,24 +582,51 @@ TableResource::handleWrite16(SRBRoot *bundle, UErrorCode &errorCode) { } void -SResource::write16(SRBRoot *bundle, UErrorCode &errorCode) { - if (U_FAILURE(errorCode)) { - return; +PseudoListResource::handleWrite16(SRBRoot * /*bundle*/) { + fRes = URES_MAKE_EMPTY_RESOURCE(URES_TABLE); + fWritten = TRUE; +} + +void +SResource::write16(SRBRoot *bundle) { + if (fKey >= 0) { + // A tagged resource has a non-negative key index into the parsed key strings. + // compactKeys() built a map from parsed key index to the final key index. + // After the mapping, negative key indexes are used for shared pool bundle keys. + fKey = bundle->mapKey(fKey); + // If the key index fits into a Key16 for a Table or Table16, + // then set the fKey16 field accordingly. + // Otherwise keep it at -1. + if (fKey >= 0) { + if (fKey < bundle->fLocalKeyLimit) { + fKey16 = fKey; + } + } else { + int32_t poolKeyIndex = fKey & 0x7fffffff; + if (poolKeyIndex <= 0xffff) { + poolKeyIndex += bundle->fLocalKeyLimit; + if (poolKeyIndex <= 0xffff) { + fKey16 = poolKeyIndex; + } + } + } } - if (fRes != RES_BOGUS) { - /* - * The resource item word was already precomputed, which means - * no further data needs to be written. - * This might be an integer, or an empty or UTF-16 v2 string, - * an empty binary, etc. - */ - return; + /* + * fRes != RES_BOGUS: + * The resource item word was already precomputed, which means + * no further data needs to be written. + * This might be an integer, or an empty or UTF-16 v2 string, + * an empty binary, etc. + */ + if (fRes == RES_BOGUS) { + handleWrite16(bundle); } - handleWrite16(bundle, errorCode); + // Compute fRes16 for precomputed as well as just-computed fRes. + fRes16 = bundle->makeRes16(fRes); } void -SResource::handleWrite16(SRBRoot * /*bundle*/, UErrorCode & /*errorCode*/) { +SResource::handleWrite16(SRBRoot * /*bundle*/) { /* Only a few resource types write 16-bit units. */ } @@ -572,16 +636,14 @@ SResource::handleWrite16(SRBRoot * /*bundle*/, UErrorCode & /*errorCode*/) { * and exits early. */ void -StringBaseResource::handlePreWrite(uint32_t *byteOffset, SRBRoot * /*bundle*/, - UErrorCode & /*errorCode*/) { +StringBaseResource::handlePreWrite(uint32_t *byteOffset) { /* Write the UTF-16 v1 string. */ fRes = URES_MAKE_RESOURCE(fType, *byteOffset >> 2); *byteOffset += 4 + (length() + 1) * U_SIZEOF_UCHAR; } void -IntVectorResource::handlePreWrite(uint32_t *byteOffset, SRBRoot * /*bundle*/, - UErrorCode & /*errorCode*/) { +IntVectorResource::handlePreWrite(uint32_t *byteOffset) { if (fCount == 0 && gFormatVersion > 1) { fRes = URES_MAKE_EMPTY_RESOURCE(URES_INT_VECTOR); fWritten = TRUE; @@ -592,8 +654,7 @@ IntVectorResource::handlePreWrite(uint32_t *byteOffset, SRBRoot * /*bundle*/, } void -BinaryResource::handlePreWrite(uint32_t *byteOffset, SRBRoot * /*bundle*/, - UErrorCode & /*errorCode*/) { +BinaryResource::handlePreWrite(uint32_t *byteOffset) { uint32_t pad = 0; uint32_t dataStart = *byteOffset + sizeof(fLength); @@ -606,19 +667,22 @@ BinaryResource::handlePreWrite(uint32_t *byteOffset, SRBRoot * /*bundle*/, } void -ArrayResource::handlePreWrite(uint32_t *byteOffset, SRBRoot *bundle, UErrorCode &errorCode) { +ContainerResource::preWriteAllRes(uint32_t *byteOffset) { for (SResource *current = fFirst; current != NULL; current = current->fNext) { - current->preWrite(byteOffset, bundle, errorCode); + current->preWrite(byteOffset); } +} + +void +ArrayResource::handlePreWrite(uint32_t *byteOffset) { + preWriteAllRes(byteOffset); fRes = URES_MAKE_RESOURCE(URES_ARRAY, *byteOffset >> 2); *byteOffset += (1 + fCount) * 4; } void -TableResource::handlePreWrite(uint32_t *byteOffset, SRBRoot *bundle, UErrorCode &errorCode) { - for (SResource *current = fFirst; current != NULL; current = current->fNext) { - current->preWrite(byteOffset, bundle, errorCode); - } +TableResource::handlePreWrite(uint32_t *byteOffset) { + preWriteAllRes(byteOffset); if (fTableType == URES_TABLE) { /* 16-bit count, 16-bit key offsets, 32-bit values */ fRes = URES_MAKE_RESOURCE(URES_TABLE, *byteOffset >> 2); @@ -631,10 +695,7 @@ TableResource::handlePreWrite(uint32_t *byteOffset, SRBRoot *bundle, UErrorCode } void -SResource::preWrite(uint32_t *byteOffset, SRBRoot *bundle, UErrorCode &errorCode) { - if (U_FAILURE(errorCode)) { - return; - } +SResource::preWrite(uint32_t *byteOffset) { if (fRes != RES_BOGUS) { /* * The resource item word was already precomputed, which means @@ -644,14 +705,13 @@ SResource::preWrite(uint32_t *byteOffset, SRBRoot *bundle, UErrorCode &errorCode */ return; } - handlePreWrite(byteOffset, bundle, errorCode); + handlePreWrite(byteOffset); *byteOffset += calcPadding(*byteOffset); } void -SResource::handlePreWrite(uint32_t * /*byteOffset*/, SRBRoot * /*bundle*/, - UErrorCode &errorCode) { - errorCode = U_INTERNAL_PROGRAM_ERROR; +SResource::handlePreWrite(uint32_t * /*byteOffset*/) { + assert(FALSE); } /* @@ -659,8 +719,7 @@ SResource::handlePreWrite(uint32_t * /*byteOffset*/, SRBRoot * /*bundle*/, * write() sees fWritten and exits early. */ void -StringBaseResource::handleWrite(UNewDataMemory *mem, uint32_t *byteOffset, - SRBRoot * /*bundle*/, UErrorCode & /*errorCode*/) { +StringBaseResource::handleWrite(UNewDataMemory *mem, uint32_t *byteOffset) { /* Write the UTF-16 v1 string. */ int32_t len = length(); udata_write32(mem, len); @@ -670,24 +729,32 @@ StringBaseResource::handleWrite(UNewDataMemory *mem, uint32_t *byteOffset, } void -ArrayResource::handleWrite(UNewDataMemory *mem, uint32_t *byteOffset, - SRBRoot *bundle, UErrorCode &errorCode) { +ContainerResource::writeAllRes(UNewDataMemory *mem, uint32_t *byteOffset) { uint32_t i = 0; for (SResource *current = fFirst; current != NULL; ++i, current = current->fNext) { - current->write(mem, byteOffset, bundle, errorCode); + current->write(mem, byteOffset); } assert(i == fCount); +} - udata_write32(mem, fCount); +void +ContainerResource::writeAllRes32(UNewDataMemory *mem, uint32_t *byteOffset) { for (SResource *current = fFirst; current != NULL; current = current->fNext) { udata_write32(mem, current->fRes); } - *byteOffset += (1 + fCount) * 4; + *byteOffset += fCount * 4; } void -IntVectorResource::handleWrite(UNewDataMemory *mem, uint32_t *byteOffset, - SRBRoot * /*bundle*/, UErrorCode & /*errorCode*/) { +ArrayResource::handleWrite(UNewDataMemory *mem, uint32_t *byteOffset) { + writeAllRes(mem, byteOffset); + udata_write32(mem, fCount); + *byteOffset += 4; + writeAllRes32(mem, byteOffset); +} + +void +IntVectorResource::handleWrite(UNewDataMemory *mem, uint32_t *byteOffset) { udata_write32(mem, fCount); for(uint32_t i = 0; i < fCount; ++i) { udata_write32(mem, fArray[i]); @@ -696,8 +763,7 @@ IntVectorResource::handleWrite(UNewDataMemory *mem, uint32_t *byteOffset, } void -BinaryResource::handleWrite(UNewDataMemory *mem, uint32_t *byteOffset, - SRBRoot * /*bundle*/, UErrorCode & /*errorCode*/) { +BinaryResource::handleWrite(UNewDataMemory *mem, uint32_t *byteOffset) { uint32_t pad = 0; uint32_t dataStart = *byteOffset + sizeof(fLength); @@ -715,19 +781,12 @@ BinaryResource::handleWrite(UNewDataMemory *mem, uint32_t *byteOffset, } void -TableResource::handleWrite(UNewDataMemory *mem, uint32_t *byteOffset, - SRBRoot *bundle, UErrorCode &errorCode) { - uint32_t i = 0; - for (SResource *current = fFirst; current != NULL; ++i, current = current->fNext) { - assert(i < fCount); - current->write(mem, byteOffset, bundle, errorCode); - } - assert(i == fCount); - +TableResource::handleWrite(UNewDataMemory *mem, uint32_t *byteOffset) { + writeAllRes(mem, byteOffset); if(fTableType == URES_TABLE) { udata_write16(mem, (uint16_t)fCount); for (SResource *current = fFirst; current != NULL; current = current->fNext) { - udata_write16(mem, bundle->makeKey16(current->fKey)); + udata_write16(mem, current->fKey16); } *byteOffset += (1 + fCount)* 2; if ((fCount & 1) == 0) { @@ -742,23 +801,16 @@ TableResource::handleWrite(UNewDataMemory *mem, uint32_t *byteOffset, } *byteOffset += (1 + fCount)* 4; } - for (SResource *current = fFirst; current != NULL; current = current->fNext) { - udata_write32(mem, current->fRes); - } - *byteOffset += fCount * 4; + writeAllRes32(mem, byteOffset); } void -SResource::write(UNewDataMemory *mem, uint32_t *byteOffset, - SRBRoot *bundle, UErrorCode &errorCode) { - if (U_FAILURE(errorCode)) { - return; - } +SResource::write(UNewDataMemory *mem, uint32_t *byteOffset) { if (fWritten) { assert(fRes != RES_BOGUS); return; } - handleWrite(mem, byteOffset, bundle, errorCode); + handleWrite(mem, byteOffset); uint8_t paddingSize = calcPadding(*byteOffset); if (paddingSize > 0) { udata_writePadding(mem, paddingSize); @@ -768,9 +820,8 @@ SResource::write(UNewDataMemory *mem, uint32_t *byteOffset, } void -SResource::handleWrite(UNewDataMemory * /*mem*/, uint32_t * /*byteOffset*/, - SRBRoot * /*bundle*/, UErrorCode &errorCode) { - errorCode = U_INTERNAL_PROGRAM_ERROR; +SResource::handleWrite(UNewDataMemory * /*mem*/, uint32_t * /*byteOffset*/) { + assert(FALSE); } void SRBRoot::write(const char *outputDir, const char *outputPkg, @@ -811,6 +862,17 @@ void SRBRoot::write(const char *outputDir, const char *outputPkg, UHashtable *stringSet; if (gFormatVersion > 1) { stringSet = uhash_open(string_hash, string_comp, string_comp, &errorCode); + if (U_SUCCESS(errorCode) && + fUsePoolBundle != NULL && fUsePoolBundle->fStrings != NULL) { + for (SResource *current = fUsePoolBundle->fStrings->fFirst; + current != NULL; + current = current->fNext) { + StringResource *sr = static_cast(current); + sr->fNumCopies = 0; + sr->fNumUnitsSaved = 0; + uhash_put(stringSet, sr, sr, &errorCode); + } + } fRoot->preflightStrings(this, stringSet, errorCode); } else { stringSet = NULL; @@ -823,7 +885,28 @@ void SRBRoot::write(const char *outputDir, const char *outputPkg, return; } - fRoot->write16(this, errorCode); + if (fPoolStringIndexLimit != 0) { + int32_t sum = fPoolStringIndexLimit + fLocalStringIndexLimit; + if ((sum - 1) > RES_MAX_OFFSET) { + errorCode = U_BUFFER_OVERFLOW_ERROR; + return; + } + if (fPoolStringIndexLimit < 0x10000 && sum <= 0x10000) { + // 16-bit indexes work for all pool + local strings. + fPoolStringIndex16Limit = fPoolStringIndexLimit; + } else { + // Set the pool index threshold so that 16-bit indexes work + // for some pool strings and some local strings. + fPoolStringIndex16Limit = (int32_t)( + ((int64_t)fPoolStringIndexLimit * 0xffff) / sum); + } + } + + fRoot->write16(this); + if (f16BitUnits.isBogus()) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return; + } if (f16BitUnits.length() & 1) { f16BitUnits.append((UChar)0xaaaa); /* pad to multiple of 4 bytes */ } @@ -832,15 +915,11 @@ void SRBRoot::write(const char *outputDir, const char *outputPkg, fKeyMap = NULL; byteOffset = fKeysTop + f16BitUnits.length() * 2; - fRoot->preWrite(&byteOffset, this, errorCode); + fRoot->preWrite(&byteOffset); /* total size including the root item */ top = byteOffset; - if (U_FAILURE(errorCode)) { - return; - } - if (writtenFilename && writtenFilenameLen) { *writtenFilename = 0; } @@ -908,7 +987,7 @@ void SRBRoot::write(const char *outputDir, const char *outputPkg, /* * formatVersion 1.1 (ICU 2.8): - * write int32_t indexes[] after root and before the strings + * write int32_t indexes[] after root and before the key strings * to make it easier to parse resource bundles in icuswap or from Java etc. */ uprv_memset(indexes, 0, sizeof(indexes)); @@ -936,15 +1015,38 @@ void SRBRoot::write(const char *outputDir, const char *outputPkg, if (URES_INDEX_POOL_CHECKSUM < fIndexLength) { if (fIsPoolBundle) { indexes[URES_INDEX_ATTRIBUTES] |= URES_ATT_IS_POOL_BUNDLE | URES_ATT_NO_FALLBACK; - indexes[URES_INDEX_POOL_CHECKSUM] = - (int32_t)computeCRC((char *)(fKeys + fKeysBottom), - (uint32_t)(fKeysTop - fKeysBottom), - 0); + uint32_t checksum = computeCRC((const char *)(fKeys + fKeysBottom), + (uint32_t)(fKeysTop - fKeysBottom), 0); + if (f16BitUnits.length() <= 1) { + // no pool strings to checksum + } else if (U_IS_BIG_ENDIAN) { + checksum = computeCRC((const char *)f16BitUnits.getBuffer(), + (uint32_t)f16BitUnits.length() * 2, checksum); + } else { + // Swap to big-endian so we get the same checksum on all platforms + // (except for charset family, due to the key strings). + UnicodeString s(f16BitUnits); + s.append((UChar)1); // Ensure that we own this buffer. + assert(!s.isBogus()); + uint16_t *p = (uint16_t *)s.getBuffer(); + for (int32_t count = f16BitUnits.length(); count > 0; --count) { + uint16_t x = *p; + *p++ = (uint16_t)((x << 8) | (x >> 8)); + } + checksum = computeCRC((const char *)p, + (uint32_t)f16BitUnits.length() * 2, checksum); + } + indexes[URES_INDEX_POOL_CHECKSUM] = (int32_t)checksum; } else if (gUsePoolBundle) { indexes[URES_INDEX_ATTRIBUTES] |= URES_ATT_USES_POOL_BUNDLE; indexes[URES_INDEX_POOL_CHECKSUM] = fUsePoolBundle->fChecksum; } } + // formatVersion 3 (ICU 56): + // share string values via pool bundle strings + indexes[URES_INDEX_LENGTH] |= fPoolStringIndexLimit << 8; // bits 23..0 -> 31..8 + indexes[URES_INDEX_ATTRIBUTES] |= (fPoolStringIndexLimit >> 12) & 0xf000; // bits 27..24 -> 15..12 + indexes[URES_INDEX_ATTRIBUTES] |= fPoolStringIndex16Limit << 16; /* write the indexes[] */ udata_writeBlock(mem, indexes, fIndexLength*4); @@ -958,7 +1060,7 @@ void SRBRoot::write(const char *outputDir, const char *outputPkg, /* write all of the bundle contents: the root item and its children */ byteOffset = fKeysTop + f16BitUnits.length() * 2; - fRoot->write(mem, &byteOffset, this, errorCode); + fRoot->write(mem, &byteOffset); assert(byteOffset == top); size = udata_finish(mem, &errorCode); @@ -1016,7 +1118,9 @@ SRBRoot::SRBRoot(const UString *comment, UBool isPoolBundle, UErrorCode &errorCo fKeys(NULL), fKeyMap(NULL), fKeysBottom(0), fKeysTop(0), fKeysCapacity(0), fKeysCount(0), fLocalKeyLimit(0), f16BitUnits(), f16BitStringsLength(0), - fUsePoolBundle(&kNoPoolBundle) { + fUsePoolBundle(&kNoPoolBundle), + fPoolStringIndexLimit(0), fPoolStringIndex16Limit(0), fLocalStringIndexLimit(0), + fWritePoolBundle(NULL) { if (U_FAILURE(errorCode)) { return; } @@ -1028,7 +1132,11 @@ SRBRoot::SRBRoot(const UString *comment, UBool isPoolBundle, UErrorCode &errorCo } fKeys = (char *) uprv_malloc(sizeof(char) * KEY_SPACE_SIZE); - fRoot = new TableResource(this, NULL, comment, errorCode); + if (isPoolBundle) { + fRoot = new PseudoListResource(this, errorCode); + } else { + fRoot = new TableResource(this, NULL, comment, errorCode); + } if (fKeys == NULL || fRoot == NULL || U_FAILURE(errorCode)) { if (U_SUCCESS(errorCode)) { errorCode = U_MEMORY_ALLOCATION_ERROR; @@ -1037,7 +1145,7 @@ SRBRoot::SRBRoot(const UString *comment, UBool isPoolBundle, UErrorCode &errorCo } fKeysCapacity = KEY_SPACE_SIZE; - /* formatVersion 1.1: start fKeysTop after the root item and indexes[] */ + /* formatVersion 1.1 and up: start fKeysTop after the root item and indexes[] */ if (gUsePoolBundle || isPoolBundle) { fIndexLength = URES_INDEX_POOL_CHECKSUM + 1; } else if (gFormatVersion >= 2) { @@ -1365,13 +1473,23 @@ compareStringLengths(const void * /*context*/, const void *l, const void *r) { return diff; } /* sort by ascending string length */ - return left->length() - right->length(); + diff = left->length() - right->length(); + if (diff != 0) { + return diff; + } + // sort by descending size reduction + diff = right->fNumUnitsSaved - left->fNumUnitsSaved; + if (diff != 0) { + return diff; + } + // sort lexically + return left->fString.compare(right->fString); } void -StringResource::writeUTF16v2(UnicodeString &dest) { +StringResource::writeUTF16v2(int32_t base, UnicodeString &dest) { int32_t len = length(); - fRes = URES_MAKE_RESOURCE(URES_STRING_V2, dest.length()); + fRes = URES_MAKE_RESOURCE(URES_STRING_V2, base + dest.length()); fWritten = TRUE; switch(fNumCharsForLength) { case 0: @@ -1429,16 +1547,33 @@ SRBRoot::compactStringsV2(UHashtable *stringSet, UErrorCode &errorCode) { * suffixes of this one. */ StringResource *res = array[i]; + res->fNumUnitsSaved = (res->fNumCopies - 1) * res->get16BitStringsLength(); + // Whole duplicates of pool strings are already account for in fPoolStringIndexLimit, + // see StringResource::handlePreflightStrings(). int32_t j; for (j = i + 1; j < count; ++j) { StringResource *suffixRes = array[j]; /* Is it a suffix of the earlier, longer string? */ if (res->fString.endsWith(suffixRes->fString)) { assert(res->length() != suffixRes->length()); // Set strings are unique. - if (suffixRes->fNumCharsForLength == 0) { + if (suffixRes->fWritten) { + // Pool string, skip. + } else if (suffixRes->fNumCharsForLength == 0) { /* yes, point to the earlier string */ suffixRes->fSame = res; suffixRes->fSuffixOffset = res->length() - suffixRes->length(); + if (res->fWritten) { + // Suffix-share res which is a pool string. + // Compute the resource word and collect the maximum. + suffixRes->fRes = + res->fRes + res->fNumCharsForLength + suffixRes->fSuffixOffset; + int32_t poolStringIndex = (int32_t)RES_GET_OFFSET(suffixRes->fRes); + if (poolStringIndex >= fPoolStringIndexLimit) { + fPoolStringIndexLimit = poolStringIndex + 1; + } + suffixRes->fWritten = TRUE; + } + res->fNumUnitsSaved += suffixRes->fNumCopies * suffixRes->get16BitStringsLength(); } else { /* write the suffix by itself if we need explicit length */ } @@ -1458,23 +1593,89 @@ SRBRoot::compactStringsV2(UHashtable *stringSet, UErrorCode &errorCode) { if (U_FAILURE(errorCode)) { return; } - /* Write the non-suffix strings. */ - int32_t i; - for (i = 0; i < count && array[i]->fSame == NULL; ++i) { - array[i]->writeUTF16v2(f16BitUnits); - } - if (f16BitUnits.isBogus()) { - errorCode = U_MEMORY_ALLOCATION_ERROR; - return; - } - /* Write the suffix strings. Make each point to the real string. */ - for (; i < count; ++i) { - StringResource *res = array[i]; - StringResource *same = res->fSame; - assert(res->length() != same->length()); // Set strings are unique. - res->fRes = same->fRes + same->fNumCharsForLength + res->fSuffixOffset; - res->fSame = NULL; - res->fWritten = TRUE; + if (fIsPoolBundle) { + // Write strings that are sufficiently shared. + // Avoid writing other strings. + int32_t numStringsWritten = 0; + int32_t numUnitsSaved = 0; + int32_t numUnitsNotSaved = 0; + for (int32_t i = 0; i < count; ++i) { + StringResource *res = array[i]; + // Maximum pool string index when suffix-sharing the last character. + int32_t maxStringIndex = + f16BitUnits.length() + res->fNumCharsForLength + res->length() - 1; + if (res->fNumUnitsSaved >= GENRB_MIN_16BIT_UNITS_SAVED_FOR_POOL_STRING && + maxStringIndex < RES_MAX_OFFSET) { + res->writeUTF16v2(0, f16BitUnits); + ++numStringsWritten; + numUnitsSaved += res->fNumUnitsSaved; + } else { + numUnitsNotSaved += res->fNumUnitsSaved; + res->fRes = URES_MAKE_EMPTY_RESOURCE(URES_STRING); + res->fWritten = TRUE; + } + } + if (f16BitUnits.isBogus()) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + } + if (getShowWarning()) { // not quiet + printf("number of shared strings: %d\n", (int)numStringsWritten); + printf("16-bit units for strings: %6d = %6d bytes\n", + (int)f16BitUnits.length(), (int)f16BitUnits.length() * 2); + printf("16-bit units saved: %6d = %6d bytes\n", + (int)numUnitsSaved, (int)numUnitsSaved * 2); + printf("16-bit units not saved: %6d = %6d bytes\n", + (int)numUnitsNotSaved, (int)numUnitsNotSaved * 2); + } + } else { + assert(fPoolStringIndexLimit <= fUsePoolBundle->fStringIndexLimit); + /* Write the non-suffix strings. */ + int32_t i; + for (i = 0; i < count && array[i]->fSame == NULL; ++i) { + StringResource *res = array[i]; + if (!res->fWritten) { + int32_t localStringIndex = f16BitUnits.length(); + if (localStringIndex >= fLocalStringIndexLimit) { + fLocalStringIndexLimit = localStringIndex + 1; + } + res->writeUTF16v2(fPoolStringIndexLimit, f16BitUnits); + } + } + if (f16BitUnits.isBogus()) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return; + } + if (fWritePoolBundle != NULL && gFormatVersion >= 3) { + PseudoListResource *poolStrings = + static_cast(fWritePoolBundle->fRoot); + for (i = 0; i < count && array[i]->fSame == NULL; ++i) { + assert(!array[i]->fString.isEmpty()); + StringResource *poolString = + new StringResource(fWritePoolBundle, array[i]->fString, errorCode); + if (poolString == NULL) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + break; + } + poolStrings->add(poolString); + } + } + /* Write the suffix strings. Make each point to the real string. */ + for (; i < count; ++i) { + StringResource *res = array[i]; + if (res->fWritten) { + continue; + } + StringResource *same = res->fSame; + assert(res->length() != same->length()); // Set strings are unique. + res->fRes = same->fRes + same->fNumCharsForLength + res->fSuffixOffset; + int32_t localStringIndex = (int32_t)RES_GET_OFFSET(res->fRes) - fPoolStringIndexLimit; + // Suffixes of pool strings have been set already. + assert(localStringIndex >= 0); + if (localStringIndex >= fLocalStringIndexLimit) { + fLocalStringIndexLimit = localStringIndex + 1; + } + res->fWritten = TRUE; + } } // +1 to account for the initial zero in f16BitUnits assert(f16BitUnits.length() <= (f16BitStringsLength + 1)); diff --git a/icu4c/source/tools/genrb/reslist.h b/icu4c/source/tools/genrb/reslist.h index 7243023d64a..032c0c248cf 100644 --- a/icu4c/source/tools/genrb/reslist.h +++ b/icu4c/source/tools/genrb/reslist.h @@ -34,10 +34,14 @@ U_CDECL_BEGIN +class PseudoListResource; + struct ResFile { ResFile() : fBytes(NULL), fIndexes(NULL), - fKeys(NULL), fKeysLength(0), fKeysCount(0), fChecksum(0) {} + fKeys(NULL), fKeysLength(0), fKeysCount(0), + fStrings(NULL), fStringIndexLimit(0), + fChecksum(0) {} ~ResFile() { close(); } void close(); @@ -47,6 +51,10 @@ struct ResFile { const char *fKeys; int32_t fKeysLength; int32_t fKeysCount; + + PseudoListResource *fStrings; + int32_t fStringIndexLimit; + int32_t fChecksum; }; @@ -74,8 +82,8 @@ struct SRBRoot { void compactKeys(UErrorCode &errorCode); + int32_t makeRes16(uint32_t resWord) const; int32_t mapKey(int32_t oldpos) const; - uint16_t makeKey16(int32_t key) const; private: void compactStringsV2(UHashtable *stringSet, UErrorCode &errorCode); @@ -102,6 +110,10 @@ public: int32_t f16BitStringsLength; const ResFile *fUsePoolBundle; + int32_t fPoolStringIndexLimit; + int32_t fPoolStringIndex16Limit; + int32_t fLocalStringIndexLimit; + SRBRoot *fWritePoolBundle; }; /* write a java resource file */ @@ -170,8 +182,8 @@ struct SResource { * Writes resource values into f16BitUnits * and determines the resource item word, if possible. */ - void write16(SRBRoot *bundle, UErrorCode &errorCode); - virtual void handleWrite16(SRBRoot *bundle, UErrorCode &errorCode); + void write16(SRBRoot *bundle); + virtual void handleWrite16(SRBRoot *bundle); /** * Calculates ("preflights") and advances the *byteOffset @@ -188,21 +200,22 @@ struct SResource { * before actually writing the bundle contents to the file, * which is necessary because the root item is stored at the beginning. */ - void preWrite(uint32_t *byteOffset, SRBRoot *bundle, UErrorCode &errorCode); - virtual void handlePreWrite(uint32_t *byteOffset, SRBRoot *bundle, UErrorCode &errorCode); + void preWrite(uint32_t *byteOffset); + virtual void handlePreWrite(uint32_t *byteOffset); /** * Writes the resource's data to mem and updates the byteOffset * in parallel. */ - void write(UNewDataMemory *mem, uint32_t *byteOffset, SRBRoot *bundle, UErrorCode &errorCode); - virtual void handleWrite(UNewDataMemory *mem, uint32_t *byteOffset, SRBRoot *bundle, - UErrorCode &errorCode); + void write(UNewDataMemory *mem, uint32_t *byteOffset); + virtual void handleWrite(UNewDataMemory *mem, uint32_t *byteOffset); int8_t fType; /* nominal type: fRes (when != 0xffffffff) may use subtype */ UBool fWritten; /* res_write() can exit early */ uint32_t fRes; /* resource item word; RES_BOGUS=0xffffffff if not known yet */ + int32_t fRes16; /* Res16 version of fRes for Table, Table16, Array16; -1 if it does not fit. */ int32_t fKey; /* Index into bundle->fKeys; -1 if no key. */ + int32_t fKey16; /* Key16 version of fKey for Table & Table16; -1 if no key or it does not fit. */ int line; /* used internally to report duplicate keys in tables */ SResource *fNext; /* This is for internal chaining while building */ struct UString fComment; @@ -217,7 +230,13 @@ public: virtual ~ContainerResource(); virtual void handlePreflightStrings(SRBRoot *bundle, UHashtable *stringSet, UErrorCode &errorCode); +protected: + void writeAllRes16(SRBRoot *bundle); + void preWriteAllRes(uint32_t *byteOffset); + void writeAllRes(UNewDataMemory *mem, uint32_t *byteOffset); + void writeAllRes32(UNewDataMemory *mem, uint32_t *byteOffset); +public: // TODO: private with getter? uint32_t fCount; SResource *fFirst; @@ -233,10 +252,9 @@ public: void add(SResource *res, int linenumber, UErrorCode &errorCode); - virtual void handleWrite16(SRBRoot *bundle, UErrorCode &errorCode); - virtual void handlePreWrite(uint32_t *byteOffset, SRBRoot *bundle, UErrorCode &errorCode); - virtual void handleWrite(UNewDataMemory *mem, uint32_t *byteOffset, SRBRoot *bundle, - UErrorCode &errorCode); + virtual void handleWrite16(SRBRoot *bundle); + virtual void handlePreWrite(uint32_t *byteOffset); + virtual void handleWrite(UNewDataMemory *mem, uint32_t *byteOffset); int8_t fTableType; // determined by table_write16() for table_preWrite() & table_write() SRBRoot *fRoot; @@ -252,27 +270,43 @@ public: void add(SResource *res); - virtual void handleWrite16(SRBRoot *bundle, UErrorCode &errorCode); - virtual void handlePreWrite(uint32_t *byteOffset, SRBRoot *bundle, UErrorCode &errorCode); - virtual void handleWrite(UNewDataMemory *mem, uint32_t *byteOffset, SRBRoot *bundle, - UErrorCode &errorCode); + virtual void handleWrite16(SRBRoot *bundle); + virtual void handlePreWrite(uint32_t *byteOffset); + virtual void handleWrite(UNewDataMemory *mem, uint32_t *byteOffset); SResource *fLast; }; +/** + * List of resources for a pool bundle. + * Writes an empty table resource, rather than a container structure. + */ +class PseudoListResource : public ContainerResource { +public: + PseudoListResource(SRBRoot *bundle, UErrorCode &errorCode) + : ContainerResource(bundle, NULL, URES_TABLE, NULL, errorCode) {} + virtual ~PseudoListResource(); + + void add(SResource *res); + + virtual void handleWrite16(SRBRoot *bundle); +}; + class StringBaseResource : public SResource { public: StringBaseResource(SRBRoot *bundle, const char *tag, int8_t type, const UChar *value, int32_t len, const UString* comment, UErrorCode &errorCode); + StringBaseResource(SRBRoot *bundle, int8_t type, + const icu::UnicodeString &value, UErrorCode &errorCode); + StringBaseResource(int8_t type, const UChar *value, int32_t len, UErrorCode &errorCode); virtual ~StringBaseResource(); const UChar *getBuffer() const { return fString.getBuffer(); } int32_t length() const { return fString.length(); } - virtual void handlePreWrite(uint32_t *byteOffset, SRBRoot *bundle, UErrorCode &errorCode); - virtual void handleWrite(UNewDataMemory *mem, uint32_t *byteOffset, SRBRoot *bundle, - UErrorCode &errorCode); + virtual void handlePreWrite(uint32_t *byteOffset); + virtual void handleWrite(UNewDataMemory *mem, uint32_t *byteOffset); // TODO: private with getter? icu::UnicodeString fString; @@ -283,16 +317,37 @@ public: StringResource(SRBRoot *bundle, const char *tag, const UChar *value, int32_t len, const UString* comment, UErrorCode &errorCode) : StringBaseResource(bundle, tag, URES_STRING, value, len, comment, errorCode), - fSame(NULL), fSuffixOffset(0), fNumCharsForLength(0) {} + fSame(NULL), fSuffixOffset(0), + fNumCopies(0), fNumUnitsSaved(0), fNumCharsForLength(0) {} + StringResource(SRBRoot *bundle, const icu::UnicodeString &value, UErrorCode &errorCode) + : StringBaseResource(bundle, URES_STRING, value, errorCode), + fSame(NULL), fSuffixOffset(0), + fNumCopies(0), fNumUnitsSaved(0), fNumCharsForLength(0) {} + StringResource(int32_t poolStringIndex, int8_t numCharsForLength, + const UChar *value, int32_t length, + UErrorCode &errorCode) + : StringBaseResource(URES_STRING, value, length, errorCode), + fSame(NULL), fSuffixOffset(0), + fNumCopies(0), fNumUnitsSaved(0), fNumCharsForLength(numCharsForLength) { + // v3 pool string encoded as string-v2 with low offset + fRes = URES_MAKE_RESOURCE(URES_STRING_V2, poolStringIndex); + fWritten = TRUE; + } virtual ~StringResource(); + int32_t get16BitStringsLength() const { + return fNumCharsForLength + length() + 1; // +1 for the NUL + } + virtual void handlePreflightStrings(SRBRoot *bundle, UHashtable *stringSet, UErrorCode &errorCode); - virtual void handleWrite16(SRBRoot *bundle, UErrorCode &errorCode); + virtual void handleWrite16(SRBRoot *bundle); - void writeUTF16v2(icu::UnicodeString &dest); + void writeUTF16v2(int32_t base, icu::UnicodeString &dest); StringResource *fSame; // used for duplicates int32_t fSuffixOffset; // this string is a suffix of fSame at this offset + int32_t fNumCopies; // number of equal strings represented by one stringSet element + int32_t fNumUnitsSaved; // from not writing duplicates and suffixes int8_t fNumCharsForLength; }; @@ -322,9 +377,8 @@ public: void add(int32_t value, UErrorCode &errorCode); - virtual void handlePreWrite(uint32_t *byteOffset, SRBRoot *bundle, UErrorCode &errorCode); - virtual void handleWrite(UNewDataMemory *mem, uint32_t *byteOffset, SRBRoot *bundle, - UErrorCode &errorCode); + virtual void handlePreWrite(uint32_t *byteOffset); + virtual void handleWrite(UNewDataMemory *mem, uint32_t *byteOffset); // TODO: UVector32 uint32_t fCount; @@ -338,9 +392,8 @@ public: const UString* comment, UErrorCode &errorCode); virtual ~BinaryResource(); - virtual void handlePreWrite(uint32_t *byteOffset, SRBRoot *bundle, UErrorCode &errorCode); - virtual void handleWrite(UNewDataMemory *mem, uint32_t *byteOffset, SRBRoot *bundle, - UErrorCode &errorCode); + virtual void handlePreWrite(uint32_t *byteOffset); + virtual void handleWrite(UNewDataMemory *mem, uint32_t *byteOffset); // TODO: CharString? uint32_t fLength; @@ -357,10 +410,12 @@ UBool getIncludeCopyright(void); void setFormatVersion(int32_t formatVersion); +int32_t getFormatVersion(); + void setUsePoolBundle(UBool use); /* in wrtxml.cpp */ -uint32_t computeCRC(char *ptr, uint32_t len, uint32_t lastcrc); +uint32_t computeCRC(const char *ptr, uint32_t len, uint32_t lastcrc); U_CDECL_END #endif /* #ifndef RESLIST_H */ diff --git a/icu4c/source/tools/genrb/wrtxml.cpp b/icu4c/source/tools/genrb/wrtxml.cpp index bee40633cc9..c250fc29b41 100644 --- a/icu4c/source/tools/genrb/wrtxml.cpp +++ b/icu4c/source/tools/genrb/wrtxml.cpp @@ -136,7 +136,7 @@ static char* getID(const char* id, const char* curKey, char* result) { * conversion is not portable across platforms with different endianess. */ -uint32_t computeCRC(char *ptr, uint32_t len, uint32_t lastcrc){ +uint32_t computeCRC(const char *ptr, uint32_t len, uint32_t lastcrc){ int32_t crc; uint32_t temp1; uint32_t temp2; diff --git a/icu4c/source/tools/toolutil/pkgitems.cpp b/icu4c/source/tools/toolutil/pkgitems.cpp index e48b6036bb8..8a20981f5da 100644 --- a/icu4c/source/tools/toolutil/pkgitems.cpp +++ b/icu4c/source/tools/toolutil/pkgitems.cpp @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2003-2014, International Business Machines +* Copyright (C) 2003-2015, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -410,7 +410,8 @@ ures_enumDependencies(const char *itemName, const UDataInfo *pInfo, fprintf(stderr, "icupkg: %s is not a pool bundle\n", poolName); return; } - const int32_t *poolIndexes=(const int32_t *)nativePool.getBytes()+1; + const int32_t *poolRoot=(const int32_t *)nativePool.getBytes(); + const int32_t *poolIndexes=poolRoot+1; int32_t poolIndexLength=poolIndexes[URES_INDEX_LENGTH]&0xff; if(!(poolIndexLength>URES_INDEX_POOL_CHECKSUM && (poolIndexes[URES_INDEX_ATTRIBUTES]&URES_ATT_IS_POOL_BUNDLE)) @@ -420,6 +421,7 @@ ures_enumDependencies(const char *itemName, const UDataInfo *pInfo, } if(resData.pRoot[1+URES_INDEX_POOL_CHECKSUM]==poolIndexes[URES_INDEX_POOL_CHECKSUM]) { resData.poolBundleKeys=(const char *)(poolIndexes+poolIndexLength); + resData.poolBundleStrings=(const uint16_t *)(poolRoot+poolIndexes[URES_INDEX_KEYS_TOP]); } else { fprintf(stderr, "icupkg: %s has mismatched checksum for %s\n", poolName, itemName); return; -- 2.40.0