16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org************************************************************************ 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Copyright (c) 2007-2011, International Business Machines 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Corporation and others. All Rights Reserved. 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org************************************************************************ 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "fldset.h" 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "intltest.h" 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/regex.h" 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgFieldsSet::FieldsSet() { 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // NOTREACHED 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgFieldsSet::FieldsSet(int32_t fieldCount) { 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org construct((UDebugEnumType)-1, fieldCount); 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgFieldsSet::FieldsSet(UDebugEnumType field) { 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org construct(field, udbg_enumCount(field)); 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgFieldsSet::~FieldsSet() { 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t FieldsSet::fieldCount() const { 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return fFieldCount; 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid FieldsSet::construct(UDebugEnumType field, int32_t fieldCount) { 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fEnum = field; 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(fieldCount > U_FIELDS_SET_MAX) { 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fieldCount = U_FIELDS_SET_MAX; 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fFieldCount = fieldCount; 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org clear(); 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString FieldsSet::diffFrom(const FieldsSet& other, UErrorCode& status) const { 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString str; 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!isSameType(other)) { 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ILLEGAL_ARGUMENT_ERROR; 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return UnicodeString("U_ILLEGAL_ARGUMENT_ERROR: FieldsSet of a different type!"); 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int i=0; i<fieldCount(); i++) { 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (isSet((UCalendarDateFields)i)) { 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t myVal = get(i); 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t theirVal = other.get(i); 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(fEnum != -1) { 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& fieldName = udbg_enumString( 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fEnum, i); 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org str = str + fieldName + UnicodeString("=")+myVal+UnicodeString(" not ")+theirVal+UnicodeString(", "); 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org str = str + UnicodeString("some field") + "=" + myVal+" not " + theirVal+", "; 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return str; 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UnicodeString *split(const UnicodeString &src, UChar ch, int32_t &splits) 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t offset = -1; 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org splits = 1; 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while((offset = src.indexOf(ch, offset + 1)) >= 0) { 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org splits += 1; 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString *result = new UnicodeString[splits]; 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t start = 0; 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t split = 0; 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t end; 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while((end = src.indexOf(ch, start)) >= 0) { 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src.extractBetween(start, end, result[split++]); 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org start = end + 1; 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org src.extractBetween(start, src.length(), result[split]); 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return result; 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t FieldsSet::parseFrom(const UnicodeString& str, const 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FieldsSet* inheritFrom, UErrorCode& status) { 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int goodFields = 0; 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)) { 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return -1; 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t destCount = 0; 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString *dest = split(str, 0x002C /* ',' */, destCount); 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(int i = 0; i < destCount; i += 1) { 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t dc = 0; 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString *kv = split(dest[i], 0x003D /* '=' */, dc); 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(dc != 2) { 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org it_errln(UnicodeString("dc == ") + dc + UnicodeString("?")); 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t field = handleParseName(inheritFrom, kv[0], kv[1], status); 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)) { 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char ch[256]; 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *u = kv[0].getBuffer(); 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t len = kv[0].length(); 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_UCharsToChars(u, ch, len); 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ch[len] = 0; /* include terminating \0 */ 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org it_errln(UnicodeString("Parse Failed: Field ") + UnicodeString(ch) + UnicodeString(", err ") + UnicodeString(u_errorName(status))); 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete[] kv; 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete[] dest; 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return -1; 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(field != -1) { 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org handleParseValue(inheritFrom, field, kv[1], status); 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)) { 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char ch[256]; 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *u = kv[1].getBuffer(); 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t len = kv[1].length(); 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_UCharsToChars(u, ch, len); 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ch[len] = 0; /* include terminating \0 */ 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org it_errln(UnicodeString("Parse Failed: Value ") + UnicodeString(ch) + UnicodeString(", err ") + UnicodeString(u_errorName(status))); 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete[] kv; 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete[] dest; 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return -1; 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org goodFields += 1; 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete[] kv; 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete[] dest; 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return goodFields; 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool FieldsSet::isSameType(const FieldsSet& other) const { 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return((&other==this)|| 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ((other.fFieldCount==fFieldCount) && (other.fEnum==fEnum))); 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid FieldsSet::clear() { 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int i=0; i<fieldCount(); i++) { 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fValue[i]=-1; 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fIsSet[i]=FALSE; 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid FieldsSet::clear(int32_t field) { 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (field<0|| field>=fieldCount()) { 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fValue[field] = -1; 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fIsSet[field] = FALSE; 1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid FieldsSet::set(int32_t field, int32_t amount) { 1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (field<0|| field>=fieldCount()) { 1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fValue[field] = amount; 1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fIsSet[field] = TRUE; 1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool FieldsSet::isSet(int32_t field) const { 1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (field<0|| field>=fieldCount()) { 1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return fIsSet[field]; 1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t FieldsSet::get(int32_t field) const { 1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (field<0|| field>=fieldCount()) { 1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return -1; 1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return fValue[field]; 1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t FieldsSet::handleParseName(const FieldsSet* /* inheritFrom */, const UnicodeString& name, const UnicodeString& /* substr*/ , UErrorCode& status) { 1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(fEnum > -1) { 1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t which = udbg_enumByString(fEnum, name); 1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(which == UDBG_INVALID_ENUM) { 1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_UNSUPPORTED_ERROR; 1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return which; 2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_UNSUPPORTED_ERROR; 2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return -1; 2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid FieldsSet::parseValueDefault(const FieldsSet* inheritFrom, int32_t field, const UnicodeString& substr, UErrorCode& status) { 2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t value = -1; 2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(substr.length()==0) { // inherit requested 2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // inherit 2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if((inheritFrom == NULL) || !inheritFrom->isSet((UCalendarDateFields)field)) { 2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // couldn't inherit from field 2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org it_errln(UnicodeString("Parse Failed: Couldn't inherit field ") + field + UnicodeString(" [") + UnicodeString(udbg_enumName(fEnum, field)) + UnicodeString("]")); 2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ILLEGAL_ARGUMENT_ERROR; 2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org value = inheritFrom->get((UCalendarDateFields)field); 2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org value = udbg_stoi(substr); 2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org set(field, value); 2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid FieldsSet::parseValueEnum(UDebugEnumType type, const FieldsSet* inheritFrom, int32_t field, const UnicodeString& substr, UErrorCode& status) { 2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t value = udbg_enumByString(type, substr); 2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(value>=0) { 2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org set(field, value); 2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // fallback 2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parseValueDefault(inheritFrom,field,substr,status); 2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid FieldsSet::handleParseValue(const FieldsSet* inheritFrom, int32_t field, const UnicodeString& substr, UErrorCode& status) { 2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parseValueDefault(inheritFrom, field, substr, status); 2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/// CAL FIELDS 2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCalendarFieldsSet::CalendarFieldsSet() : 2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgFieldsSet(UDBG_UCalendarDateFields) { 2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // base class will call clear. 2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCalendarFieldsSet::~CalendarFieldsSet() { 2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarFieldsSet::handleParseValue(const FieldsSet* inheritFrom, int32_t field, const UnicodeString& substr, UErrorCode& status) { 2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(field==UCAL_MONTH) { 2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parseValueEnum(UDBG_UCalendarMonths, inheritFrom, field, substr, status); 2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // will fallback to default. 2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parseValueDefault(inheritFrom, field, substr, status); 2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * set the specified fields on this calendar. Doesn't clear first. Returns any errors the caller 2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarFieldsSet::setOnCalendar(Calendar *cal, UErrorCode& /*status*/) const { 2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int i=0; i<UDAT_FIELD_COUNT; i++) { 2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (isSet((UCalendarDateFields)i)) { 2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t value = get((UCalendarDateFields)i); 2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org cal->set((UCalendarDateFields)i, value); 2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * return true if the calendar matches in these fields 2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool CalendarFieldsSet::matches(Calendar *cal, CalendarFieldsSet &diffSet, 2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode& status) const { 2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool match = TRUE; 2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int i=0; i<UDAT_FIELD_COUNT; i++) { 2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (isSet((UCalendarDateFields)i)) { 2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t calVal = cal->get((UCalendarDateFields)i, status); 2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) 2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (calVal != get((UCalendarDateFields)i)) { 2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org match = FALSE; 2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org diffSet.set((UCalendarDateFields)i, calVal); 2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //fprintf(stderr, "match failed: %s#%d=%d != %d\n",udbg_enumName(UDBG_UCalendarDateFields,i),i,cal->get((UCalendarDateFields)i,status), get((UCalendarDateFields)i));; 2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return match; 2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * DateTimeStyleSet has two 'fields' -- date, and time. 2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgenum DateTimeStyleSetFields { 2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DTS_DATE = 0, /** Field one: the date (long, medium, short, etc). */ 3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DTS_TIME, /** Field two: the time (long, medium, short, etc). */ 3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DTS_COUNT /** The number of fields */ 3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * DateTimeSet 3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * */ 3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgDateTimeStyleSet::DateTimeStyleSet() : 3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FieldsSet(DTS_COUNT) { 3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgDateTimeStyleSet::~DateTimeStyleSet() { 3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUDateFormatStyle DateTimeStyleSet::getDateStyle() const { 3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!isSet(DTS_DATE)) { 3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return UDAT_NONE; 3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return (UDateFormatStyle)get(DTS_DATE); 3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUDateFormatStyle DateTimeStyleSet::getTimeStyle() const { 3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!isSet(DTS_TIME)) { 3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return UDAT_NONE; 3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return (UDateFormatStyle)get(DTS_TIME); 3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid DateTimeStyleSet::handleParseValue(const FieldsSet* inheritFrom, int32_t field, const UnicodeString& substr, UErrorCode& status) { 3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString kRELATIVE_("RELATIVE_"); 3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(substr.startsWith(kRELATIVE_)) { 3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString relativeas(substr,kRELATIVE_.length()); 3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parseValueEnum(UDBG_UDateFormatStyle, inheritFrom, field, relativeas, status); 3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // fix relative value 3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(isSet(field) && U_SUCCESS(status)) { 3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org set(field, get(field) | UDAT_RELATIVE); 3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parseValueEnum(UDBG_UDateFormatStyle, inheritFrom, field, substr, status); 3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t DateTimeStyleSet::handleParseName(const FieldsSet* /* inheritFrom */, const UnicodeString& name, const UnicodeString& /* substr */, UErrorCode& status) { 3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString kDATE("DATE"); // TODO: static 3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString kTIME("TIME"); // TODO: static 3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(name == kDATE ) { 3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return DTS_DATE; 3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if(name == kTIME) { 3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return DTS_TIME; 3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ILLEGAL_ARGUMENT_ERROR; 3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return -1; 3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /*!UCONFIG_NO_FORMAT*/ 360