void processRules(const ResourceTable &rules, const char *key, ResourceValue &value, UErrorCode &errorCode) { if (U_FAILURE(errorCode)) { return; } for (int32_t i = 0; rules.getKeyAndValue(i, key, value); ++i) { ruleSetNum = parseSetNum(key, errorCode); ResourceTable ruleSet = value.getTable(errorCode); if (U_FAILURE(errorCode)) { return; } for (int32_t j = 0; ruleSet.getKeyAndValue(j, key, value); ++j) { period = DayPeriodRules::getDayPeriodFromString(key); if (period == DayPeriodRules::DAYPERIOD_UNKNOWN) { errorCode = U_INVALID_FORMAT_ERROR; return; } ResourceTable periodDefinition = value.getTable(errorCode); if (U_FAILURE(errorCode)) { return; } for (int32_t k = 0; periodDefinition.getKeyAndValue(k, key, value); ++k) { if (value.getType() == URES_STRING) { // Key-value pairs (e.g. before{6:00}). CutoffType type = getCutoffTypeFromString(key); addCutoff(type, value.getUnicodeString(errorCode), errorCode); if (U_FAILURE(errorCode)) { return; } } else { // Arrays (e.g. before{6:00, 24:00}). cutoffType = getCutoffTypeFromString(key); ResourceArray cutoffArray = value.getArray(errorCode); if (U_FAILURE(errorCode)) { return; } int32_t length = cutoffArray.getSize(); for (int32_t l = 0; l < length; ++l) { cutoffArray.getValue(l, value); addCutoff(cutoffType, value.getUnicodeString(errorCode), errorCode); if (U_FAILURE(errorCode)) { return; } } } } setDayPeriodForHoursFromCutoffs(errorCode); for (int32_t k = 0; k < UPRV_LENGTHOF(cutoffs); ++k) { cutoffs[k] = 0; } } if (!data->rules[ruleSetNum].allHoursAreSet()) { errorCode = U_INVALID_FORMAT_ERROR; return; } } }
virtual ResourceArraySink *getOrCreateArraySink(const char *key, UErrorCode &errorCode) { if (U_FAILURE(errorCode)) { return NULL; } outer.cutoffType = getCutoffTypeFromString(key); return &outer.cutoffSink; }
virtual void put(const char *key, const ResourceValue &value, UErrorCode &errorCode) { if (U_FAILURE(errorCode)) { return; } CutoffType type = getCutoffTypeFromString(key); outer.addCutoff(type, value.getUnicodeString(errorCode), errorCode); }