| Index: source/tools/genrb/reslist.h
|
| diff --git a/source/tools/genrb/reslist.h b/source/tools/genrb/reslist.h
|
| index 809b7ba1bc09c9572b4eb904fbdcd3f12df10ef5..032c0c248cf0c59954cac1adafdfee6c94339bc3 100644
|
| --- a/source/tools/genrb/reslist.h
|
| +++ b/source/tools/genrb/reslist.h
|
| @@ -1,7 +1,7 @@
|
| /*
|
| *******************************************************************************
|
| *
|
| -* Copyright (C) 2000-2014, International Business Machines
|
| +* Copyright (C) 2000-2015, International Business Machines
|
| * Corporation and others. All Rights Reserved.
|
| *
|
| *******************************************************************************
|
| @@ -22,27 +22,80 @@
|
| #define RESLIST_MAX_INT_VECTOR 2048
|
|
|
| #include "unicode/utypes.h"
|
| +#include "unicode/unistr.h"
|
| #include "unicode/ures.h"
|
| #include "unicode/ustring.h"
|
| -#include "uresdata.h"
|
| #include "cmemory.h"
|
| #include "cstring.h"
|
| +#include "uhash.h"
|
| #include "unewdata.h"
|
| +#include "uresdata.h"
|
| #include "ustr.h"
|
|
|
| U_CDECL_BEGIN
|
|
|
| +class PseudoListResource;
|
| +
|
| +struct ResFile {
|
| + ResFile()
|
| + : fBytes(NULL), fIndexes(NULL),
|
| + fKeys(NULL), fKeysLength(0), fKeysCount(0),
|
| + fStrings(NULL), fStringIndexLimit(0),
|
| + fChecksum(0) {}
|
| + ~ResFile() { close(); }
|
| +
|
| + void close();
|
| +
|
| + uint8_t *fBytes;
|
| + const int32_t *fIndexes;
|
| + const char *fKeys;
|
| + int32_t fKeysLength;
|
| + int32_t fKeysCount;
|
| +
|
| + PseudoListResource *fStrings;
|
| + int32_t fStringIndexLimit;
|
| +
|
| + int32_t fChecksum;
|
| +};
|
| +
|
| +struct SResource;
|
| +
|
| typedef struct KeyMapEntry {
|
| int32_t oldpos, newpos;
|
| } KeyMapEntry;
|
|
|
| /* Resource bundle root table */
|
| struct SRBRoot {
|
| - struct SResource *fRoot;
|
| + SRBRoot(const UString *comment, UBool isPoolBundle, UErrorCode &errorCode);
|
| + ~SRBRoot();
|
| +
|
| + void write(const char *outputDir, const char *outputPkg,
|
| + char *writtenFilename, int writtenFilenameLen, UErrorCode &errorCode);
|
| +
|
| + void setLocale(UChar *locale, UErrorCode &errorCode);
|
| + int32_t addTag(const char *tag, UErrorCode &errorCode);
|
| +
|
| + const char *getKeyString(int32_t key) const;
|
| + const char *getKeyBytes(int32_t *pLength) const;
|
| +
|
| + int32_t addKeyBytes(const char *keyBytes, int32_t length, UErrorCode &errorCode);
|
| +
|
| + void compactKeys(UErrorCode &errorCode);
|
| +
|
| + int32_t makeRes16(uint32_t resWord) const;
|
| + int32_t mapKey(int32_t oldpos) const;
|
| +
|
| +private:
|
| + void compactStringsV2(UHashtable *stringSet, UErrorCode &errorCode);
|
| +
|
| +public:
|
| + // TODO: private
|
| +
|
| + SResource *fRoot; // Normally a TableResource.
|
| char *fLocale;
|
| int32_t fIndexLength;
|
| int32_t fMaxTableLength;
|
| - UBool noFallback; /* see URES_ATT_NO_FALLBACK */
|
| + UBool fNoFallback; /* see URES_ATT_NO_FALLBACK */
|
| int8_t fStringsForm; /* default STRINGS_UTF16_V1 */
|
| UBool fIsPoolBundle;
|
|
|
| @@ -53,45 +106,26 @@ struct SRBRoot {
|
| int32_t fKeysCount;
|
| int32_t fLocalKeyLimit; /* key offset < limit fits into URES_TABLE */
|
|
|
| - uint16_t *f16BitUnits;
|
| - int32_t f16BitUnitsCapacity;
|
| - int32_t f16BitUnitsLength;
|
| + icu::UnicodeString f16BitUnits;
|
| + int32_t f16BitStringsLength;
|
|
|
| - const char *fPoolBundleKeys;
|
| - int32_t fPoolBundleKeysLength;
|
| - int32_t fPoolBundleKeysCount;
|
| - int32_t fPoolChecksum;
|
| + const ResFile *fUsePoolBundle;
|
| + int32_t fPoolStringIndexLimit;
|
| + int32_t fPoolStringIndex16Limit;
|
| + int32_t fLocalStringIndexLimit;
|
| + SRBRoot *fWritePoolBundle;
|
| };
|
|
|
| -struct SRBRoot *bundle_open(const struct UString* comment, UBool isPoolBundle, UErrorCode *status);
|
| -void bundle_write(struct SRBRoot *bundle, const char *outputDir, const char *outputPkg, char *writtenFilename, int writtenFilenameLen, UErrorCode *status);
|
| -
|
| /* write a java resource file */
|
| +// TODO: C++ify
|
| void bundle_write_java(struct SRBRoot *bundle, const char *outputDir, const char* outputEnc, char *writtenFilename,
|
| int writtenFilenameLen, const char* packageName, const char* bundleName, UErrorCode *status);
|
|
|
| /* write a xml resource file */
|
| -/* commented by Jing*/
|
| -/* void bundle_write_xml(struct SRBRoot *bundle, const char *outputDir,const char* outputEnc,
|
| - char *writtenFilename, int writtenFilenameLen,UErrorCode *status); */
|
| -
|
| -/* added by Jing*/
|
| +// TODO: C++ify
|
| void bundle_write_xml(struct SRBRoot *bundle, const char *outputDir,const char* outputEnc, const char* rbname,
|
| char *writtenFilename, int writtenFilenameLen, const char* language, const char* package, UErrorCode *status);
|
|
|
| -void bundle_close(struct SRBRoot *bundle, UErrorCode *status);
|
| -void bundle_setlocale(struct SRBRoot *bundle, UChar *locale, UErrorCode *status);
|
| -int32_t bundle_addtag(struct SRBRoot *bundle, const char *tag, UErrorCode *status);
|
| -
|
| -const char *
|
| -bundle_getKeyBytes(struct SRBRoot *bundle, int32_t *pLength);
|
| -
|
| -int32_t
|
| -bundle_addKeyBytes(struct SRBRoot *bundle, const char *keyBytes, int32_t length, UErrorCode *status);
|
| -
|
| -void
|
| -bundle_compactKeys(struct SRBRoot *bundle, UErrorCode *status);
|
| -
|
| /* Various resource types */
|
|
|
| /*
|
| @@ -101,82 +135,274 @@ bundle_compactKeys(struct SRBRoot *bundle, UErrorCode *status);
|
| */
|
| struct SResource* res_none(void);
|
|
|
| -struct SResTable {
|
| +class ArrayResource;
|
| +class TableResource;
|
| +class IntVectorResource;
|
| +
|
| +TableResource *table_open(struct SRBRoot *bundle, const char *tag, const struct UString* comment, UErrorCode *status);
|
| +
|
| +ArrayResource *array_open(struct SRBRoot *bundle, const char *tag, const struct UString* comment, UErrorCode *status);
|
| +
|
| +struct SResource *string_open(struct SRBRoot *bundle, const char *tag, const UChar *value, int32_t len, const struct UString* comment, UErrorCode *status);
|
| +
|
| +struct SResource *alias_open(struct SRBRoot *bundle, const char *tag, UChar *value, int32_t len, const struct UString* comment, UErrorCode *status);
|
| +
|
| +IntVectorResource *intvector_open(struct SRBRoot *bundle, const char *tag, const struct UString* comment, UErrorCode *status);
|
| +
|
| +struct SResource *int_open(struct SRBRoot *bundle, const char *tag, int32_t value, const struct UString* comment, UErrorCode *status);
|
| +
|
| +struct SResource *bin_open(struct SRBRoot *bundle, const char *tag, uint32_t length, uint8_t *data, const char* fileName, const struct UString* comment, UErrorCode *status);
|
| +
|
| +/* Resource place holder */
|
| +
|
| +struct SResource {
|
| + SResource();
|
| + SResource(SRBRoot *bundle, const char *tag, int8_t type, const UString* comment,
|
| + UErrorCode &errorCode);
|
| + virtual ~SResource();
|
| +
|
| + UBool isTable() const { return fType == URES_TABLE; }
|
| + UBool isString() const { return fType == URES_STRING; }
|
| +
|
| + const char *getKeyString(const SRBRoot *bundle) const;
|
| +
|
| + /**
|
| + * Preflights strings.
|
| + * Finds duplicates and counts the total number of string code units
|
| + * so that they can be written first to the 16-bit array,
|
| + * for minimal string and container storage.
|
| + *
|
| + * We walk the final parse tree, rather than collecting this information while building it,
|
| + * so that we need not deal with changes to the parse tree (especially removing resources).
|
| + */
|
| + void preflightStrings(SRBRoot *bundle, UHashtable *stringSet, UErrorCode &errorCode);
|
| + virtual void handlePreflightStrings(SRBRoot *bundle, UHashtable *stringSet, UErrorCode &errorCode);
|
| +
|
| + /**
|
| + * Writes resource values into f16BitUnits
|
| + * and determines the resource item word, if possible.
|
| + */
|
| + void write16(SRBRoot *bundle);
|
| + virtual void handleWrite16(SRBRoot *bundle);
|
| +
|
| + /**
|
| + * Calculates ("preflights") and advances the *byteOffset
|
| + * by the size of the resource's data in the binary file and
|
| + * determines the resource item word.
|
| + *
|
| + * Most handlePreWrite() functions may add any number of bytes, but preWrite()
|
| + * will always pad it to a multiple of 4.
|
| + * The resource item type may be a related subtype of the fType.
|
| + *
|
| + * The preWrite() and write() functions start and end at the same
|
| + * byteOffset values.
|
| + * Prewriting allows bundle.write() to determine the root resource item word,
|
| + * 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);
|
| + 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);
|
| + 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;
|
| +};
|
| +
|
| +class ContainerResource : public SResource {
|
| +public:
|
| + ContainerResource(SRBRoot *bundle, const char *tag, int8_t type,
|
| + const UString* comment, UErrorCode &errorCode)
|
| + : SResource(bundle, tag, type, comment, errorCode),
|
| + fCount(0), fFirst(NULL) {}
|
| + 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;
|
| - int8_t fType; /* determined by table_write16() for table_preWrite() & table_write() */
|
| - struct SResource *fFirst;
|
| - struct SRBRoot *fRoot;
|
| + SResource *fFirst;
|
| };
|
|
|
| -struct SResource* table_open(struct SRBRoot *bundle, const char *tag, const struct UString* comment, UErrorCode *status);
|
| -void table_add(struct SResource *table, struct SResource *res, int linenumber, UErrorCode *status);
|
| +class TableResource : public ContainerResource {
|
| +public:
|
| + TableResource(SRBRoot *bundle, const char *tag,
|
| + const UString* comment, UErrorCode &errorCode)
|
| + : ContainerResource(bundle, tag, URES_TABLE, comment, errorCode),
|
| + fTableType(URES_TABLE), fRoot(bundle) {}
|
| + virtual ~TableResource();
|
|
|
| -struct SResArray {
|
| - uint32_t fCount;
|
| - struct SResource *fFirst;
|
| - struct SResource *fLast;
|
| + void add(SResource *res, int linenumber, 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;
|
| };
|
|
|
| -struct SResource* array_open(struct SRBRoot *bundle, const char *tag, const struct UString* comment, UErrorCode *status);
|
| -void array_add(struct SResource *array, struct SResource *res, UErrorCode *status);
|
| +class ArrayResource : public ContainerResource {
|
| +public:
|
| + ArrayResource(SRBRoot *bundle, const char *tag,
|
| + const UString* comment, UErrorCode &errorCode)
|
| + : ContainerResource(bundle, tag, URES_ARRAY, comment, errorCode),
|
| + fLast(NULL) {}
|
| + virtual ~ArrayResource();
|
|
|
| -struct SResString {
|
| - struct SResource *fSame; /* used for duplicates */
|
| - UChar *fChars;
|
| - int32_t fLength;
|
| - int32_t fSuffixOffset; /* this string is a suffix of fSame at this offset */
|
| - int8_t fNumCharsForLength;
|
| + void add(SResource *res);
|
| +
|
| + virtual void handleWrite16(SRBRoot *bundle);
|
| + virtual void handlePreWrite(uint32_t *byteOffset);
|
| + virtual void handleWrite(UNewDataMemory *mem, uint32_t *byteOffset);
|
| +
|
| + SResource *fLast;
|
| };
|
|
|
| -struct SResource *string_open(struct SRBRoot *bundle, const char *tag, const UChar *value, int32_t len, const struct UString* comment, UErrorCode *status);
|
| +/**
|
| + * 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();
|
|
|
| -struct SResource *alias_open(struct SRBRoot *bundle, const char *tag, UChar *value, int32_t len, const struct UString* comment, UErrorCode *status);
|
| + void add(SResource *res);
|
|
|
| -struct SResIntVector {
|
| - uint32_t fCount;
|
| - uint32_t *fArray;
|
| + virtual void handleWrite16(SRBRoot *bundle);
|
| };
|
|
|
| -struct SResource* intvector_open(struct SRBRoot *bundle, const char *tag, const struct UString* comment, UErrorCode *status);
|
| -void intvector_add(struct SResource *intvector, int32_t value, UErrorCode *status);
|
| +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(); }
|
|
|
| -struct SResInt {
|
| - uint32_t fValue;
|
| + virtual void handlePreWrite(uint32_t *byteOffset);
|
| + virtual void handleWrite(UNewDataMemory *mem, uint32_t *byteOffset);
|
| +
|
| + // TODO: private with getter?
|
| + icu::UnicodeString fString;
|
| };
|
|
|
| -struct SResource *int_open(struct SRBRoot *bundle, const char *tag, int32_t value, const struct UString* comment, UErrorCode *status);
|
| +class StringResource : public StringBaseResource {
|
| +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),
|
| + 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);
|
| +
|
| + 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;
|
| +};
|
|
|
| -struct SResBinary {
|
| - uint32_t fLength;
|
| - uint8_t *fData;
|
| - char* fFileName; /* file name for binary or import binary tags if any */
|
| +class AliasResource : public StringBaseResource {
|
| +public:
|
| + AliasResource(SRBRoot *bundle, const char *tag, const UChar *value, int32_t len,
|
| + const UString* comment, UErrorCode &errorCode)
|
| + : StringBaseResource(bundle, tag, URES_ALIAS, value, len, comment, errorCode) {}
|
| + virtual ~AliasResource();
|
| };
|
|
|
| -struct SResource *bin_open(struct SRBRoot *bundle, const char *tag, uint32_t length, uint8_t *data, const char* fileName, const struct UString* comment, UErrorCode *status);
|
| +class IntResource : public SResource {
|
| +public:
|
| + IntResource(SRBRoot *bundle, const char *tag, int32_t value,
|
| + const UString* comment, UErrorCode &errorCode);
|
| + virtual ~IntResource();
|
|
|
| -/* Resource place holder */
|
| + // TODO: private with getter?
|
| + int32_t fValue;
|
| +};
|
|
|
| -struct SResource {
|
| - int8_t fType; /* nominal type: fRes (when != 0xffffffff) may use subtype */
|
| - UBool fWritten; /* res_write() can exit early */
|
| - uint32_t fRes; /* resource item word; 0xffffffff if not known yet */
|
| - int32_t fKey; /* Index into bundle->fKeys; -1 if no key. */
|
| - int line; /* used internally to report duplicate keys in tables */
|
| - struct SResource *fNext; /*This is for internal chaining while building*/
|
| - struct UString fComment;
|
| - union {
|
| - struct SResTable fTable;
|
| - struct SResArray fArray;
|
| - struct SResString fString;
|
| - struct SResIntVector fIntVector;
|
| - struct SResInt fIntValue;
|
| - struct SResBinary fBinaryValue;
|
| - } u;
|
| +class IntVectorResource : public SResource {
|
| +public:
|
| + IntVectorResource(SRBRoot *bundle, const char *tag,
|
| + const UString* comment, UErrorCode &errorCode);
|
| + virtual ~IntVectorResource();
|
| +
|
| + void add(int32_t value, UErrorCode &errorCode);
|
| +
|
| + virtual void handlePreWrite(uint32_t *byteOffset);
|
| + virtual void handleWrite(UNewDataMemory *mem, uint32_t *byteOffset);
|
| +
|
| + // TODO: UVector32
|
| + uint32_t fCount;
|
| + uint32_t *fArray;
|
| };
|
|
|
| -const char *
|
| -res_getKeyString(const struct SRBRoot *bundle, const struct SResource *res, char temp[8]);
|
| +class BinaryResource : public SResource {
|
| +public:
|
| + BinaryResource(SRBRoot *bundle, const char *tag,
|
| + uint32_t length, uint8_t *data, const char* fileName,
|
| + const UString* comment, UErrorCode &errorCode);
|
| + virtual ~BinaryResource();
|
| +
|
| + virtual void handlePreWrite(uint32_t *byteOffset);
|
| + virtual void handleWrite(UNewDataMemory *mem, uint32_t *byteOffset);
|
|
|
| + // TODO: CharString?
|
| + uint32_t fLength;
|
| + uint8_t *fData;
|
| + // TODO: CharString
|
| + char* fFileName; // file name for binary or import binary tags if any
|
| +};
|
| +
|
| +// TODO: use LocalPointer or delete
|
| void res_close(struct SResource *res);
|
|
|
| void setIncludeCopyright(UBool val);
|
| @@ -184,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 */
|
|
|