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