]>
git.saurik.com Git - apple/icu.git/blob - icuSources/test/intltest/fldset.cpp
2 ************************************************************************
3 * Copyright (c) 2007-2011, International Business Machines
4 * Corporation and others. All Rights Reserved.
5 ************************************************************************
11 #if !UCONFIG_NO_FORMATTING
12 #include "unicode/regex.h"
15 FieldsSet::FieldsSet() {
19 FieldsSet::FieldsSet(int32_t fieldCount
) {
20 construct((UDebugEnumType
)-1, fieldCount
);
23 FieldsSet::FieldsSet(UDebugEnumType field
) {
24 construct(field
, udbg_enumCount(field
));
27 FieldsSet::~FieldsSet() {
31 int32_t FieldsSet::fieldCount() const {
35 void FieldsSet::construct(UDebugEnumType field
, int32_t fieldCount
) {
37 if(fieldCount
> U_FIELDS_SET_MAX
) {
38 fieldCount
= U_FIELDS_SET_MAX
;
40 fFieldCount
= fieldCount
;
44 UnicodeString
FieldsSet::diffFrom(const FieldsSet
& other
, UErrorCode
& status
) const {
46 if(!isSameType(other
)) {
47 status
= U_ILLEGAL_ARGUMENT_ERROR
;
48 return UnicodeString("U_ILLEGAL_ARGUMENT_ERROR: FieldsSet of a different type!");
50 for (int i
=0; i
<fieldCount(); i
++) {
51 if (isSet((UCalendarDateFields
)i
)) {
52 int32_t myVal
= get(i
);
53 int32_t theirVal
= other
.get(i
);
56 const UnicodeString
& fieldName
= udbg_enumString(
59 str
= str
+ fieldName
+ UnicodeString("=")+myVal
+UnicodeString(" not ")+theirVal
+UnicodeString(", ");
61 str
= str
+ UnicodeString("some field") + "=" + myVal
+" not " + theirVal
+", ";
68 static UnicodeString
*split(const UnicodeString
&src
, UChar ch
, int32_t &splits
)
73 while((offset
= src
.indexOf(ch
, offset
+ 1)) >= 0) {
77 UnicodeString
*result
= new UnicodeString
[splits
];
83 while((end
= src
.indexOf(ch
, start
)) >= 0) {
84 src
.extractBetween(start
, end
, result
[split
++]);
88 src
.extractBetween(start
, src
.length(), result
[split
]);
93 int32_t FieldsSet::parseFrom(const UnicodeString
& str
, const
94 FieldsSet
* inheritFrom
, UErrorCode
& status
) {
98 if(U_FAILURE(status
)) {
102 int32_t destCount
= 0;
103 UnicodeString
*dest
= split(str
, 0x002C /* ',' */, destCount
);
105 for(int i
= 0; i
< destCount
; i
+= 1) {
107 UnicodeString
*kv
= split(dest
[i
], 0x003D /* '=' */, dc
);
110 it_errln(UnicodeString("dc == ") + dc
+ UnicodeString("?"));
113 int32_t field
= handleParseName(inheritFrom
, kv
[0], kv
[1], status
);
115 if(U_FAILURE(status
)) {
117 const UChar
*u
= kv
[0].getBuffer();
118 int32_t len
= kv
[0].length();
119 u_UCharsToChars(u
, ch
, len
);
120 ch
[len
] = 0; /* include terminating \0 */
121 it_errln(UnicodeString("Parse Failed: Field ") + UnicodeString(ch
) + UnicodeString(", err ") + UnicodeString(u_errorName(status
)));
128 handleParseValue(inheritFrom
, field
, kv
[1], status
);
130 if(U_FAILURE(status
)) {
132 const UChar
*u
= kv
[1].getBuffer();
133 int32_t len
= kv
[1].length();
134 u_UCharsToChars(u
, ch
, len
);
135 ch
[len
] = 0; /* include terminating \0 */
136 it_errln(UnicodeString("Parse Failed: Value ") + UnicodeString(ch
) + UnicodeString(", err ") + UnicodeString(u_errorName(status
)));
153 UBool
FieldsSet::isSameType(const FieldsSet
& other
) const {
154 return((&other
==this)||
155 ((other
.fFieldCount
==fFieldCount
) && (other
.fEnum
==fEnum
)));
158 void FieldsSet::clear() {
159 for (int i
=0; i
<fieldCount(); i
++) {
165 void FieldsSet::clear(int32_t field
) {
166 if (field
<0|| field
>=fieldCount()) {
170 fIsSet
[field
] = FALSE
;
172 void FieldsSet::set(int32_t field
, int32_t amount
) {
173 if (field
<0|| field
>=fieldCount()) {
176 fValue
[field
] = amount
;
177 fIsSet
[field
] = TRUE
;
180 UBool
FieldsSet::isSet(int32_t field
) const {
181 if (field
<0|| field
>=fieldCount()) {
184 return fIsSet
[field
];
186 int32_t FieldsSet::get(int32_t field
) const {
187 if (field
<0|| field
>=fieldCount()) {
190 return fValue
[field
];
194 int32_t FieldsSet::handleParseName(const FieldsSet
* /* inheritFrom */, const UnicodeString
& name
, const UnicodeString
& /* substr*/ , UErrorCode
& status
) {
196 int32_t which
= udbg_enumByString(fEnum
, name
);
197 if(which
== UDBG_INVALID_ENUM
) {
198 status
= U_UNSUPPORTED_ERROR
;
202 status
= U_UNSUPPORTED_ERROR
;
207 void FieldsSet::parseValueDefault(const FieldsSet
* inheritFrom
, int32_t field
, const UnicodeString
& substr
, UErrorCode
& status
) {
209 if(substr
.length()==0) { // inherit requested
211 if((inheritFrom
== NULL
) || !inheritFrom
->isSet((UCalendarDateFields
)field
)) {
212 // couldn't inherit from field
213 it_errln(UnicodeString("Parse Failed: Couldn't inherit field ") + field
+ UnicodeString(" [") + UnicodeString(udbg_enumName(fEnum
, field
)) + UnicodeString("]"));
214 status
= U_ILLEGAL_ARGUMENT_ERROR
;
217 value
= inheritFrom
->get((UCalendarDateFields
)field
);
219 value
= udbg_stoi(substr
);
224 void FieldsSet::parseValueEnum(UDebugEnumType type
, const FieldsSet
* inheritFrom
, int32_t field
, const UnicodeString
& substr
, UErrorCode
& status
) {
225 int32_t value
= udbg_enumByString(type
, substr
);
230 parseValueDefault(inheritFrom
,field
,substr
,status
);
234 void FieldsSet::handleParseValue(const FieldsSet
* inheritFrom
, int32_t field
, const UnicodeString
& substr
, UErrorCode
& status
) {
235 parseValueDefault(inheritFrom
, field
, substr
, status
);
241 CalendarFieldsSet::CalendarFieldsSet() :
242 FieldsSet(UDBG_UCalendarDateFields
) {
243 // base class will call clear.
246 CalendarFieldsSet::~CalendarFieldsSet() {
249 void CalendarFieldsSet::handleParseValue(const FieldsSet
* inheritFrom
, int32_t field
, const UnicodeString
& substr
, UErrorCode
& status
) {
250 if(field
==UCAL_MONTH
) {
251 parseValueEnum(UDBG_UCalendarMonths
, inheritFrom
, field
, substr
, status
);
252 // will fallback to default.
254 parseValueDefault(inheritFrom
, field
, substr
, status
);
259 * set the specified fields on this calendar. Doesn't clear first. Returns any errors the caller
261 void CalendarFieldsSet::setOnCalendar(Calendar
*cal
, UErrorCode
& /*status*/) const {
262 for (int i
=0; i
<UDAT_FIELD_COUNT
; i
++) {
263 if (isSet((UCalendarDateFields
)i
)) {
264 int32_t value
= get((UCalendarDateFields
)i
);
265 cal
->set((UCalendarDateFields
)i
, value
);
271 * return true if the calendar matches in these fields
273 UBool
CalendarFieldsSet::matches(Calendar
*cal
, CalendarFieldsSet
&diffSet
,
274 UErrorCode
& status
) const {
276 if (U_FAILURE(status
)) {
279 for (int i
=0; i
<UDAT_FIELD_COUNT
; i
++) {
280 if (isSet((UCalendarDateFields
)i
)) {
281 int32_t calVal
= cal
->get((UCalendarDateFields
)i
, status
);
282 if (U_FAILURE(status
))
284 if (calVal
!= get((UCalendarDateFields
)i
)) {
286 diffSet
.set((UCalendarDateFields
)i
, calVal
);
287 //fprintf(stderr, "match failed: %s#%d=%d != %d\n",udbg_enumName(UDBG_UCalendarDateFields,i),i,cal->get((UCalendarDateFields)i,status), get((UCalendarDateFields)i));;
296 * DateTimeStyleSet has two 'fields' -- date, and time.
298 enum DateTimeStyleSetFields
{
299 DTS_DATE
= 0, /** Field one: the date (long, medium, short, etc). */
300 DTS_TIME
, /** Field two: the time (long, medium, short, etc). */
301 DTS_COUNT
/** The number of fields */
307 DateTimeStyleSet::DateTimeStyleSet() :
308 FieldsSet(DTS_COUNT
) {
311 DateTimeStyleSet::~DateTimeStyleSet() {
315 UDateFormatStyle
DateTimeStyleSet::getDateStyle() const {
316 if(!isSet(DTS_DATE
)) {
319 return (UDateFormatStyle
)get(DTS_DATE
);
324 UDateFormatStyle
DateTimeStyleSet::getTimeStyle() const {
325 if(!isSet(DTS_TIME
)) {
328 return (UDateFormatStyle
)get(DTS_TIME
);
332 void DateTimeStyleSet::handleParseValue(const FieldsSet
* inheritFrom
, int32_t field
, const UnicodeString
& substr
, UErrorCode
& status
) {
333 UnicodeString
kRELATIVE_("RELATIVE_");
334 if(substr
.startsWith(kRELATIVE_
)) {
335 UnicodeString
relativeas(substr
,kRELATIVE_
.length());
336 parseValueEnum(UDBG_UDateFormatStyle
, inheritFrom
, field
, relativeas
, status
);
337 // fix relative value
338 if(isSet(field
) && U_SUCCESS(status
)) {
339 set(field
, get(field
) | UDAT_RELATIVE
);
342 parseValueEnum(UDBG_UDateFormatStyle
, inheritFrom
, field
, substr
, status
);
346 int32_t DateTimeStyleSet::handleParseName(const FieldsSet
* /* inheritFrom */, const UnicodeString
& name
, const UnicodeString
& /* substr */, UErrorCode
& status
) {
347 UnicodeString
kDATE("DATE"); // TODO: static
348 UnicodeString
kTIME("TIME"); // TODO: static
351 } else if(name
== kTIME
) {
354 status
= U_ILLEGAL_ARGUMENT_ERROR
;
359 #endif /*!UCONFIG_NO_FORMAT*/