/*
*******************************************************************************
-* Copyright (C) 2015, International Business Machines
+* Copyright (C) 2015-2016, International Business Machines
* Corporation and others. All Rights Reserved.
*******************************************************************************
* resource.cpp
ResourceArraySink::~ResourceArraySink() {}
+void ResourceArraySink::enter(int32_t /*size*/, UErrorCode & /*errorCode*/) {}
+
void ResourceArraySink::put(
int32_t /*index*/, const ResourceValue & /*value*/, UErrorCode & /*errorCode*/) {}
ResourceArraySink *ResourceArraySink::getOrCreateArraySink(
- int32_t /*index*/, int32_t /*size*/, UErrorCode & /*errorCode*/) {
+ int32_t /*index*/, UErrorCode & /*errorCode*/) {
return NULL;
}
ResourceTableSink *ResourceArraySink::getOrCreateTableSink(
- int32_t /*index*/, int32_t /*initialSize*/, UErrorCode & /*errorCode*/) {
+ int32_t /*index*/, UErrorCode & /*errorCode*/) {
return NULL;
}
ResourceTableSink::~ResourceTableSink() {}
+void ResourceTableSink::enter(int32_t /*size*/, UErrorCode & /*errorCode*/) {}
+
void ResourceTableSink::put(
const char * /*key*/, const ResourceValue & /*value*/, UErrorCode & /*errorCode*/) {}
void ResourceTableSink::putNoFallback(const char * /*key*/, UErrorCode & /*errorCode*/) {}
ResourceArraySink *ResourceTableSink::getOrCreateArraySink(
- const char * /*key*/, int32_t /*size*/, UErrorCode & /*errorCode*/) {
+ const char * /*key*/, UErrorCode & /*errorCode*/) {
return NULL;
}
ResourceTableSink *ResourceTableSink::getOrCreateTableSink(
- const char * /*key*/, int32_t /*initialSize*/, UErrorCode & /*errorCode*/) {
+ const char * /*key*/, UErrorCode & /*errorCode*/) {
return NULL;
}
/*
*******************************************************************************
-* Copyright (C) 2015, International Business Machines
+* Copyright (C) 2015-2016, International Business Machines
* Corporation and others. All Rights Reserved.
*******************************************************************************
* resource.h
ResourceArraySink() {}
virtual ~ResourceArraySink();
+ /**
+ * "Enters" the array.
+ * Called just before enumerating the array's resource items.
+ * The size can be used to allocate storage for the items.
+ * It may differ between child and parent bundles.
+ *
+ * @param size number of array items
+ */
+ virtual void enter(int32_t size, UErrorCode &errorCode);
+
/**
* Adds a value from a resource array.
*
* This sink (not the caller) owns the nested sink.
*
* @param index of the resource array item
- * @param size number of array items
* @return nested-array sink, or NULL
*/
- virtual ResourceArraySink *getOrCreateArraySink(
- int32_t index, int32_t size, UErrorCode &errorCode);
+ virtual ResourceArraySink *getOrCreateArraySink(int32_t index, UErrorCode &errorCode);
/**
* Returns a nested resource table at the array index as another sink.
* This sink (not the caller) owns the nested sink.
*
* @param index of the resource array item
- * @param initialSize size hint for creating the sink if necessary
* @return nested-table sink, or NULL
*/
- virtual ResourceTableSink *getOrCreateTableSink(
- int32_t index, int32_t initialSize, UErrorCode &errorCode);
+ virtual ResourceTableSink *getOrCreateTableSink(int32_t index, UErrorCode &errorCode);
/**
* "Leaves" the array.
ResourceTableSink() {}
virtual ~ResourceTableSink();
+ /**
+ * "Enters" the table.
+ * Called just before enumerating the table's resource items.
+ * The size can be used to allocate storage for the items.
+ * It usually differs between child and parent bundles.
+ *
+ * @param size number of table items
+ */
+ virtual void enter(int32_t size, UErrorCode &errorCode);
+
/**
* Adds a key-value pair from a resource table.
*
* This sink (not the caller) owns the nested sink.
*
* @param key resource key string
- * @param size number of array items
* @return nested-array sink, or NULL
*/
- virtual ResourceArraySink *getOrCreateArraySink(
- const char *key, int32_t size, UErrorCode &errorCode);
+ virtual ResourceArraySink *getOrCreateArraySink(const char *key, UErrorCode &errorCode);
/**
* Returns a nested resource table for the key as another sink.
* This sink (not the caller) owns the nested sink.
*
* @param key resource key string
- * @param initialSize size hint for creating the sink if necessary
* @return nested-table sink, or NULL
*/
- virtual ResourceTableSink *getOrCreateTableSink(
- const char *key, int32_t initialSize, UErrorCode &errorCode);
+ virtual ResourceTableSink *getOrCreateTableSink(const char *key, UErrorCode &errorCode);
/**
* "Leaves" the table.
}
}
-namespace {
-
-int32_t getArrayLength(const ResourceData *pResData, Resource res) {
- uint32_t offset=RES_GET_OFFSET(res);
- if(offset == 0) {
- return 0;
- }
- int32_t type = RES_GET_TYPE(res);
- if(type == URES_ARRAY) {
- return *(pResData->pRoot+offset);
- } else if(type == URES_ARRAY16) {
- return pResData->p16BitUnits[offset];
- } else {
- return 0;
- }
-}
-
-int32_t getTableLength(const ResourceData *pResData, Resource res) {
- uint32_t offset=RES_GET_OFFSET(res);
- if(offset == 0) {
- return 0;
- }
- int32_t type = RES_GET_TYPE(res);
- if(type == URES_TABLE) {
- return *((const uint16_t *)(pResData->pRoot+offset));
- } else if(type == URES_TABLE16) {
- return pResData->p16BitUnits[offset];
- } else if(type == URES_TABLE32) {
- return *(pResData->pRoot+offset);
- } else {
- return 0;
- }
-}
-
-} // namespace
-
U_NAMESPACE_BEGIN
ResourceDataValue::~ResourceDataValue() {}
errorCode = U_RESOURCE_TYPE_MISMATCH;
return;
}
+ sink.enter(length, errorCode);
+ if(U_FAILURE(errorCode)) { return; }
for (int32_t i = 0; i < length; ++i) {
const char *key;
}
int32_t type = RES_GET_TYPE(res);
if (URES_IS_ARRAY(type)) {
- int32_t numItems = getArrayLength(pResData, res);
- icu::ResourceArraySink *subSink = sink.getOrCreateArraySink(key, numItems, errorCode);
+ icu::ResourceArraySink *subSink = sink.getOrCreateArraySink(key, errorCode);
if (subSink != NULL) {
ures_getAllArrayItems(pResData, res, value, *subSink, errorCode);
}
} else if (URES_IS_TABLE(type)) {
- int32_t numItems = getTableLength(pResData, res);
- icu::ResourceTableSink *subSink = sink.getOrCreateTableSink(key, numItems, errorCode);
+ icu::ResourceTableSink *subSink = sink.getOrCreateTableSink(key, errorCode);
if (subSink != NULL) {
ures_getAllTableItems(pResData, res, value, *subSink, errorCode);
}
errorCode = U_RESOURCE_TYPE_MISMATCH;
return;
}
+ sink.enter(length, errorCode);
+ if(U_FAILURE(errorCode)) { return; }
for (int32_t i = 0; i < length; ++i) {
Resource res;
}
int32_t type = RES_GET_TYPE(res);
if (URES_IS_ARRAY(type)) {
- int32_t numItems = getArrayLength(pResData, res);
- icu::ResourceArraySink *subSink = sink.getOrCreateArraySink(i, numItems, errorCode);
+ icu::ResourceArraySink *subSink = sink.getOrCreateArraySink(i, errorCode);
if (subSink != NULL) {
ures_getAllArrayItems(pResData, res, value, *subSink, errorCode);
}
} else if (URES_IS_TABLE(type)) {
- int32_t numItems = getTableLength(pResData, res);
- icu::ResourceTableSink *subSink = sink.getOrCreateTableSink(i, numItems, errorCode);
+ icu::ResourceTableSink *subSink = sink.getOrCreateTableSink(i, errorCode);
if (subSink != NULL) {
ures_getAllTableItems(pResData, res, value, *subSink, errorCode);
}
virtual ~DayPeriodRulesDataSink();
// Entry point.
- virtual ResourceTableSink *getOrCreateTableSink(const char *key, int32_t, UErrorCode &errorCode) {
+ virtual ResourceTableSink *getOrCreateTableSink(const char *key, UErrorCode &errorCode) {
if (U_FAILURE(errorCode)) { return NULL; }
if (uprv_strcmp(key, "locales") == 0) {
RulesSink(DayPeriodRulesDataSink &outer) : outer(outer) {}
virtual ~RulesSink();
- virtual ResourceTableSink *getOrCreateTableSink(const char *key, int32_t, UErrorCode &errorCode) {
+ virtual ResourceTableSink *getOrCreateTableSink(const char *key, UErrorCode &errorCode) {
if (U_FAILURE(errorCode)) { return NULL; }
outer.ruleSetNum = parseSetNum(key, errorCode);
RuleSetSink(DayPeriodRulesDataSink &outer) : outer(outer) {}
virtual ~RuleSetSink();
- virtual ResourceTableSink *getOrCreateTableSink(const char *key, int32_t, UErrorCode &errorCode) {
+ virtual ResourceTableSink *getOrCreateTableSink(const char *key, UErrorCode &errorCode) {
if (U_FAILURE(errorCode)) { return NULL; }
outer.period = DayPeriodRules::getDayPeriodFromString(key);
outer.addCutoff(type, value.getUnicodeString(errorCode), errorCode);
}
- virtual ResourceArraySink *getOrCreateArraySink(const char *key, int32_t, UErrorCode &errorCode) {
+ virtual ResourceArraySink *getOrCreateArraySink(const char *key, UErrorCode &errorCode) {
if (U_FAILURE(errorCode)) { return NULL; }
outer.cutoffType = getCutoffTypeFromString(key);
return &outer.cutoffSink;
struct DayPeriodRulesCountSink : public ResourceTableSink {
virtual ~DayPeriodRulesCountSink();
- virtual ResourceTableSink *getOrCreateTableSink(const char *key, int32_t, UErrorCode &errorCode) {
+ virtual ResourceTableSink *getOrCreateTableSink(const char *key, UErrorCode &errorCode) {
if (U_FAILURE(errorCode)) { return NULL; }
int32_t setNum = DayPeriodRulesDataSink::parseSetNum(key, errorCode);
SkeletonSink(DateIntervalSink &sink) : outer(sink) {}
virtual ~SkeletonSink();
- virtual ResourceTableSink *getOrCreateTableSink(
- const char *key, int32_t, UErrorCode &errorCode) {
+ virtual ResourceTableSink *getOrCreateTableSink(const char *key, UErrorCode &errorCode) {
if (U_SUCCESS(errorCode)) {
outer.currentSkeleton = key;
return &outer.patternSink;
}
}
- virtual ResourceTableSink *getOrCreateTableSink(
- const char *key, int32_t, UErrorCode &errorCode) {
+ virtual ResourceTableSink *getOrCreateTableSink(const char *key, UErrorCode &errorCode) {
// Check if it's the intervalFormat table
if (U_SUCCESS(errorCode) && uprv_strcmp(key, gIntervalDateTimePatternTag) == 0) {
return &skeletonSink;
virtual ~AllowedHourFormatsSink();
// Entry point.
- virtual ResourceTableSink *getOrCreateTableSink(const char *key, int32_t, UErrorCode &status) {
+ virtual ResourceTableSink *getOrCreateTableSink(const char *key, UErrorCode &status) {
if (U_FAILURE(status)) { return NULL; }
locale = key;
}
}
- virtual ResourceArraySink *getOrCreateArraySink(const char *key, int32_t size, UErrorCode &status) {
- if (U_FAILURE(status)) { return NULL; }
-
- if (uprv_strcmp(key, "allowed") == 0) {
- outer.allowedFormats = static_cast<int32_t *>(uprv_malloc((size + 1) * sizeof(int32_t)));
- outer.allowedFormatsLength = size;
- if (outer.allowedFormats == NULL) {
- status = U_MEMORY_ALLOCATION_ERROR;
- return NULL;
- } else {
- return &outer.allowedListSink;
- }
+ virtual ResourceArraySink *getOrCreateArraySink(const char *key, UErrorCode &status) {
+ if (U_SUCCESS(status) && uprv_strcmp(key, "allowed") == 0) {
+ return &outer.allowedListSink;
}
return NULL;
}
AllowedListSink(AllowedHourFormatsSink &outer) : outer(outer) {}
virtual ~AllowedListSink();
+ virtual void enter(int32_t size, UErrorCode &status) {
+ if (U_FAILURE(status)) { return; }
+ outer.allowedFormats = static_cast<int32_t *>(uprv_malloc((size + 1) * sizeof(int32_t)));
+ outer.allowedFormatsLength = size;
+ if (outer.allowedFormats == NULL) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ }
+ }
virtual void put(int32_t index, const ResourceValue &value, UErrorCode &status) {
if (U_FAILURE(status)) { return; }
struct UnitSubtypeSink : public ResourceTableSink {
UnitSubtypeSink(UnitDataSink &sink) : outer(sink) {}
~UnitSubtypeSink();
- virtual ResourceTableSink *getOrCreateTableSink(
- const char *key, int32_t /* initialSize */, UErrorCode &errorCode) {
+ virtual ResourceTableSink *getOrCreateTableSink(const char *key, UErrorCode &errorCode) {
if (U_FAILURE(errorCode)) { return NULL; }
outer.unitIndex = MeasureUnit::internalGetIndexForTypeAndSubtype(outer.type, key);
if (outer.unitIndex >= 0) {
struct UnitTypeSink : public ResourceTableSink {
UnitTypeSink(UnitDataSink &sink) : outer(sink) {}
~UnitTypeSink();
- virtual ResourceTableSink *getOrCreateTableSink(
- const char *key, int32_t /* initialSize */, UErrorCode &errorCode) {
+ virtual ResourceTableSink *getOrCreateTableSink(const char *key, UErrorCode &errorCode) {
if (U_FAILURE(errorCode)) { return NULL; }
if (uprv_strcmp(key, "currency") == 0) {
// Skip.
}
cacheData.widthFallback[sourceWidth] = targetWidth;
}
- virtual ResourceTableSink *getOrCreateTableSink(
- const char *key, int32_t /* initialSize */, UErrorCode &errorCode) {
+ virtual ResourceTableSink *getOrCreateTableSink(const char *key, UErrorCode &errorCode) {
if (U_SUCCESS(errorCode) && (width = widthFromKey(key)) != UMEASFMT_WIDTH_COUNT) {
return &typeSink;
}
RelativeTimeSink(RelDateTimeFmtDataSink &sink) : outer(sink) {}
~RelativeTimeSink();
- virtual ResourceTableSink *getOrCreateTableSink(
- const char *key, int32_t /* initialSize */, UErrorCode& errorCode) {
+ virtual ResourceTableSink *getOrCreateTableSink(const char *key, UErrorCode& errorCode) {
if (U_FAILURE(errorCode)) { return NULL; }
outer.relUnitIndex = relUnitFromGeneric(outer.genericUnit);
if (outer.relUnitIndex < 0) {
}
}
- virtual ResourceTableSink *getOrCreateTableSink(
- const char *key, int32_t /* initialSize */, UErrorCode &errorCode) {
+ virtual ResourceTableSink *getOrCreateTableSink(const char *key, UErrorCode &errorCode) {
if (U_FAILURE(errorCode)) { return NULL; }
if (uprv_strcmp(key, "relative") == 0) {
return &outer.relativeSink;
}
// Top level sink
- virtual ResourceTableSink *getOrCreateTableSink(
- const char *key, int32_t /* initialSize */, UErrorCode& /* errorCode */) {
+ virtual ResourceTableSink *getOrCreateTableSink(const char *key, UErrorCode& /* errorCode */) {
style= styleFromString(key);
int32_t unitSize = uprv_strlen(key) - styleSuffixLength(style);
genericUnit = unitOrNegativeFromString(key, unitSize);